stdio: fix stderr and stdout values
[neatlibc.git] / stdio.c
bloba48641d95daba02af5f5fba2d870d3475907c26f
1 #include <stdarg.h>
2 #include <stdio.h>
3 #include <unistd.h>
5 static char *putstr(char *d, char *s)
7 while (*s)
8 *d++ = *s++;
9 return d;
12 static int digits(unsigned long n, int base)
14 int i;
15 for (i = 0; n; i++)
16 n /= base;
17 return i ? i : 1;
20 static char *digs = "0123456789abcdef";
22 static char *putint(char *s, unsigned long n, int base, int sign)
24 int d;
25 int i;
26 if (sign && n & 0x80000000) {
27 *s++ = '-';
28 n = -n;
30 d = digits(n, base);
31 for (i = 0; i < d; i++) {
32 s[d - i - 1] = digs[n % base];
33 n /= base;
35 return s + d;
38 int vsprintf(char *dst, char *fmt, va_list ap)
40 char *d = dst;
41 char *s = fmt;
42 while (*s) {
43 int c = *s++;
44 if (c != '%') {
45 *d++ = c;
46 continue;
48 switch ((c = *s++)) {
49 case 'd':
50 d = putint(d, va_arg(ap, long), 10, 1);
51 break;
52 case 'u':
53 d = putint(d, va_arg(ap, long), 10, 0);
54 break;
55 case 'x':
56 case 'p':
57 d = putint(d, va_arg(ap, long), 16, 0);
58 break;
59 case 'c':
60 *d++ = va_arg(ap, int);
61 break;
62 case 's':
63 d = putstr(d, va_arg(ap, char *));
64 break;
65 case '\0':
66 s--;
67 break;
68 default:
69 *d++ = c;
72 *d = '\0';
73 return d - dst;
76 static char buf[1 << 12];
78 static FILE _stdout = {1};
79 static FILE _stderr = {2};
80 FILE *stdout = &_stdout;
81 FILE *stderr = &_stderr;
83 int printf(char *fmt, ...)
85 va_list ap;
86 int ret;
87 va_start(ap, fmt);
88 ret = vsprintf(buf, fmt, ap);
89 va_end(ap);
90 return write(1, buf, ret);
93 int fprintf(FILE *filp, char *fmt, ...)
95 va_list ap;
96 int ret;
97 va_start(ap, fmt);
98 ret = vsprintf(buf, fmt, ap);
99 va_end(ap);
100 return write(filp->fd, buf, ret);
103 int sprintf(char *dst, char *fmt, ...)
105 va_list ap;
106 int ret;
107 va_start(ap, fmt);
108 ret = vsprintf(dst, fmt, ap);
109 va_end(ap);
110 return ret;