12 static char _ibuf
[BUFSZ
], _obuf
[BUFSZ
], _ebuf
[BUFSZ
];
13 static FILE _stdin
= {0, EOF
, _ibuf
, NULL
, BUFSZ
, 0};
14 static FILE _stdout
= {1, EOF
, NULL
, _obuf
, 0, BUFSZ
};
15 static FILE _stderr
= {2, EOF
, NULL
, _ebuf
, 0, 1};
16 FILE *stdin
= &_stdin
;
17 FILE *stdout
= &_stdout
;
18 FILE *stderr
= &_stderr
;
20 FILE *fopen(char *path
, char *mode
)
25 if (strchr(mode
, '+'))
28 flags
= *mode
== 'r' ? O_RDONLY
: O_WRONLY
;
36 fp
= malloc(sizeof(*fp
));
37 memset(fp
, 0, sizeof(*fp
));
38 fp
->fd
= open(path
, flags
, 0600);
44 fp
->ibuf
= malloc(BUFSZ
);
45 fp
->obuf
= malloc(BUFSZ
);
55 int ret
= close(fp
->fd
);
68 if (write(fp
->fd
, fp
->obuf
, fp
->olen
) != fp
->olen
)
74 static int oc(FILE *fp
, int c
)
76 if (fp
->olen
< fp
->osize
) {
77 fp
->obuf
[fp
->olen
++] = c
;
80 if (c
== '\n' || fp
->olen
== fp
->osize
)
86 static void ostr(FILE *fp
, char *s
, int wid
)
88 int fill
= wid
- strlen(s
);
92 oc(fp
, (unsigned char) *s
++);
95 static int digits(unsigned long n
, int base
)
103 static char *digs
= "0123456789abcdef";
105 static void oint(FILE *fp
, unsigned long n
, int base
, int sign
,
106 int wid
, int fill
, int psign
, int bytes
)
113 if (sign
&& (signed long) n
< 0) {
124 for (i
= 0; i
< d
; i
++) {
125 s
[d
- i
- 1] = digs
[n
% base
];
129 for (i
= d
+ neg
; i
< wid
; i
++)
132 oc(fp
, neg
? '-' : '+');
136 int vfprintf(FILE *fp
, char *fmt
, va_list ap
)
141 int c
= (unsigned char) *s
++;
144 int psign
= 0; /* add sign as in %+d */
145 int bytes
= sizeof(int);
154 while (isdigit(*s
)) {
163 bytes
= sizeof(long);
167 bytes
= bytes
< sizeof(int) ? sizeof(char) : sizeof(short);
170 switch ((c
= *s
++)) {
172 oint(fp
, va_arg(ap
, long), 10, 1, wid
, fill
, psign
, bytes
);
175 oint(fp
, va_arg(ap
, long), 10, 0, wid
, fill
, 0, bytes
);
179 oint(fp
, va_arg(ap
, long), 16, 0, wid
, fill
, 0, bytes
);
182 oc(fp
, va_arg(ap
, int));
185 ostr(fp
, va_arg(ap
, char *), wid
);
194 return fp
->ostat
- beg
;
202 fprintf(stderr
, "%s: %s\n", s
, sys_errlist
[idx
]);
205 int vsnprintf(char *dst
, int sz
, char *fmt
, va_list ap
)
211 ret
= vfprintf(&f
, fmt
, ap
);
216 int vsprintf(char *dst
, char *fmt
, va_list ap
)
218 return vsnprintf(dst
, 1 << 20, fmt
, ap
);
221 int printf(char *fmt
, ...)
226 ret
= vfprintf(stdout
, fmt
, ap
);
231 int vprintf(char *fmt
, va_list ap
)
233 return vfprintf(stdout
, fmt
, ap
);
236 int fprintf(FILE *fp
, char *fmt
, ...)
241 ret
= vfprintf(fp
, fmt
, ap
);
246 int sprintf(char *dst
, char *fmt
, ...)
251 ret
= vsprintf(dst
, fmt
, ap
);
256 int snprintf(char *dst
, int sz
, char *fmt
, ...)
261 ret
= vsnprintf(dst
, sz
, fmt
, ap
);
266 int fputs(char *s
, FILE *fp
)
269 oc(fp
, (unsigned char) *s
++);
275 int ret
= fputs(s
, stdout
);
281 long fwrite(void *v
, long sz
, long n
, FILE *fp
)
283 unsigned char *s
= v
;
286 if (oc(fp
, *s
++) == EOF
)
287 return n
* sz
- i
- 1;