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
)
85 static void ostr(FILE *fp
, char *s
, int wid
)
87 int fill
= wid
- strlen(s
);
91 oc(fp
, (unsigned char) *s
++);
94 static int digits(unsigned long n
, int base
)
102 static char *digs
= "0123456789abcdef";
104 static void oint(FILE *fp
, unsigned long n
, int base
, int sign
,
105 int wid
, int fill
, int psign
, int bytes
)
112 if (sign
&& (signed long) n
< 0) {
123 for (i
= 0; i
< d
; i
++) {
124 s
[d
- i
- 1] = digs
[n
% base
];
128 for (i
= d
+ neg
; i
< wid
; i
++)
131 oc(fp
, neg
? '-' : '+');
135 int vfprintf(FILE *fp
, char *fmt
, va_list ap
)
140 int c
= (unsigned char) *s
++;
143 int psign
= 0; /* add sign as in %+d */
144 int bytes
= sizeof(int);
153 while (isdigit(*s
)) {
162 bytes
= sizeof(long);
166 bytes
= bytes
< sizeof(int) ? sizeof(char) : sizeof(short);
169 switch ((c
= *s
++)) {
171 oint(fp
, va_arg(ap
, long), 10, 1, wid
, fill
, psign
, bytes
);
174 oint(fp
, va_arg(ap
, long), 10, 0, wid
, fill
, 0, bytes
);
178 oint(fp
, va_arg(ap
, long), 16, 0, wid
, fill
, 0, bytes
);
181 oc(fp
, va_arg(ap
, int));
184 ostr(fp
, va_arg(ap
, char *), wid
);
193 return fp
->ostat
- beg
;
201 fprintf(stderr
, "%s: %s\n", s
, sys_errlist
[idx
]);
204 int vsnprintf(char *dst
, int sz
, char *fmt
, va_list ap
)
210 ret
= vfprintf(&f
, fmt
, ap
);
215 int vsprintf(char *dst
, char *fmt
, va_list ap
)
217 return vsnprintf(dst
, 1 << 20, fmt
, ap
);
220 int printf(char *fmt
, ...)
225 ret
= vfprintf(stdout
, fmt
, ap
);
230 int fprintf(FILE *fp
, char *fmt
, ...)
235 ret
= vfprintf(fp
, fmt
, ap
);
240 int sprintf(char *dst
, char *fmt
, ...)
245 ret
= vsprintf(dst
, fmt
, ap
);
250 int snprintf(char *dst
, int sz
, char *fmt
, ...)
255 ret
= vsnprintf(dst
, sz
, fmt
, ap
);
260 int fputs(char *s
, FILE *fp
)
263 oc(fp
, (unsigned char) *s
++);