stdlib: fix the return value of exit()
[neatlibc.git] / stdio.c
blob85dd69a6dfcb3a83e49f426d49b937090f414b18
1 #include <errno.h>
2 #include <stdarg.h>
3 #include <stdio.h>
4 #include <unistd.h>
6 static char *putstr(char *d, char *s)
8 while (*s)
9 *d++ = *s++;
10 return d;
13 static int digits(unsigned long n, int base)
15 int i;
16 for (i = 0; n; i++)
17 n /= base;
18 return i ? i : 1;
21 static char *digs = "0123456789abcdef";
23 static char *putint(char *s, unsigned long n, int base, int sign)
25 int d;
26 int i;
27 if (sign && n & 0x80000000) {
28 *s++ = '-';
29 n = -n;
31 d = digits(n, base);
32 for (i = 0; i < d; i++) {
33 s[d - i - 1] = digs[n % base];
34 n /= base;
36 return s + d;
39 int vsprintf(char *dst, char *fmt, va_list ap)
41 char *d = dst;
42 char *s = fmt;
43 while (*s) {
44 int c = *s++;
45 if (c != '%') {
46 *d++ = c;
47 continue;
49 if (*s == 'l')
50 s++;
51 switch ((c = *s++)) {
52 case 'd':
53 d = putint(d, va_arg(ap, long), 10, 1);
54 break;
55 case 'u':
56 d = putint(d, va_arg(ap, long), 10, 0);
57 break;
58 case 'x':
59 case 'p':
60 d = putint(d, va_arg(ap, long), 16, 0);
61 break;
62 case 'c':
63 *d++ = va_arg(ap, int);
64 break;
65 case 's':
66 d = putstr(d, va_arg(ap, char *));
67 break;
68 case '\0':
69 s--;
70 break;
71 default:
72 *d++ = c;
75 *d = '\0';
76 return d - dst;
79 static char buf[1 << 12];
81 static FILE _stdout = {1};
82 static FILE _stderr = {2};
83 FILE *stdout = &_stdout;
84 FILE *stderr = &_stderr;
86 int printf(char *fmt, ...)
88 va_list ap;
89 int ret;
90 va_start(ap, fmt);
91 ret = vsprintf(buf, fmt, ap);
92 va_end(ap);
93 return write(1, buf, ret);
96 int fprintf(FILE *filp, char *fmt, ...)
98 va_list ap;
99 int ret;
100 va_start(ap, fmt);
101 ret = vsprintf(buf, fmt, ap);
102 va_end(ap);
103 return write(filp->fd, buf, ret);
106 int sprintf(char *dst, char *fmt, ...)
108 va_list ap;
109 int ret;
110 va_start(ap, fmt);
111 ret = vsprintf(dst, fmt, ap);
112 va_end(ap);
113 return ret;
116 void perror(char *s)
118 int idx = errno;
119 if (idx >= sys_nerr)
120 idx = 0;
121 fprintf(stderr, "%s: %s\n", s, sys_errlist[idx]);