11 static char _ibuf
[BUFSZ
], _obuf
[BUFSZ
], _ebuf
[BUFSZ
];
12 static FILE _stdin
= {0, EOF
, _ibuf
, NULL
, BUFSZ
, 0};
13 static FILE _stdout
= {1, EOF
, NULL
, _obuf
, 0, BUFSZ
};
14 static FILE _stderr
= {2, EOF
, NULL
, _ebuf
, 0, 1};
15 FILE *stdin
= &_stdin
;
16 FILE *stdout
= &_stdout
;
17 FILE *stderr
= &_stderr
;
19 FILE *fopen(char *path
, char *mode
)
24 if (strchr(mode
, '+'))
27 flags
= *mode
== 'r' ? O_RDONLY
: O_WRONLY
;
35 fp
= malloc(sizeof(*fp
));
36 memset(fp
, 0, sizeof(*fp
));
37 fp
->fd
= open(path
, flags
, 0600);
43 fp
->ibuf
= malloc(BUFSZ
);
44 fp
->obuf
= malloc(BUFSZ
);
54 int ret
= close(fp
->fd
);
67 if (write(fp
->fd
, fp
->obuf
, fp
->olen
) != fp
->olen
)
73 static int oc(FILE *fp
, int c
)
75 if (fp
->olen
< fp
->osize
) {
76 fp
->obuf
[fp
->olen
++] = c
;
79 if (c
== '\n' || fp
->olen
== fp
->osize
)
84 static void ostr(FILE *fp
, char *s
, int wid
)
86 int fill
= wid
- strlen(s
);
93 static int digits(unsigned long n
, int base
)
101 static char *digs
= "0123456789abcdef";
103 static void oint(FILE *fp
, unsigned long n
, int base
, int sign
,
104 int wid
, int fill
, int psign
)
111 if (sign
&& (signed long) n
< 0) {
116 for (i
= 0; i
< d
; i
++) {
117 s
[d
- i
- 1] = digs
[n
% base
];
121 for (i
= d
+ neg
; i
< wid
; i
++)
124 oc(fp
, neg
? '-' : '+');
128 int vfprintf(FILE *fp
, char *fmt
, va_list ap
)
136 int psign
= 0; /* add sign as in %+d */
145 while (isdigit(*s
)) {
153 if (*s
== 'l' || *s
== 'h')
155 switch ((c
= *s
++)) {
157 oint(fp
, va_arg(ap
, long), 10, 1, wid
, fill
, psign
);
160 oint(fp
, va_arg(ap
, long), 10, 0, wid
, fill
, 0);
164 oint(fp
, va_arg(ap
, long), 16, 0, wid
, fill
, 0);
167 oc(fp
, va_arg(ap
, int));
170 ostr(fp
, va_arg(ap
, char *), wid
);
179 return fp
->ostat
- beg
;
187 fprintf(stderr
, "%s: %s\n", s
, sys_errlist
[idx
]);
190 int vsnprintf(char *dst
, int sz
, char *fmt
, va_list ap
)
196 ret
= vfprintf(&f
, fmt
, ap
);
201 int vsprintf(char *dst
, char *fmt
, va_list ap
)
203 return vsnprintf(dst
, 1 << 20, fmt
, ap
);
206 int printf(char *fmt
, ...)
211 ret
= vfprintf(stdout
, fmt
, ap
);
216 int fprintf(FILE *fp
, char *fmt
, ...)
221 ret
= vfprintf(fp
, fmt
, ap
);
226 int sprintf(char *dst
, char *fmt
, ...)
231 ret
= vsprintf(dst
, fmt
, ap
);
236 int snprintf(char *dst
, int sz
, char *fmt
, ...)
241 ret
= vsnprintf(dst
, sz
, fmt
, ap
);