7 static int ic(FILE *fp
)
10 if (fp
->back
!= EOF
) {
15 while (fp
->fd
>= 0 && fp
->icur
== fp
->ilen
) {
16 int nr
= read(fp
->fd
, fp
->ibuf
, fp
->isize
);
22 return fp
->icur
< fp
->ilen
? (unsigned char) fp
->ibuf
[fp
->icur
++] : EOF
;
25 void setbuf(FILE *fp
, char *buf
)
39 int ungetc(int c
, FILE *fp
)
46 /* t is 1 for char, 2 for short, 4 for int, and 8 for long */
47 static int iint(FILE *fp
, void *dst
, int t
, int wid
)
55 if ((c
== '-' || c
== '+') && wid
-- > 0)
57 if (!isdigit(c
) || wid
<= 0) {
63 } while (isdigit(c
= ic(fp
)) && --wid
> 0);
66 *(long *) dst
= neg
? -n
: n
;
68 *(int *) dst
= neg
? -n
: n
;
70 *(short *) dst
= neg
? -n
: n
;
72 *(char *) dst
= neg
? -n
: n
;
76 static int istr(FILE *fp
, char *dst
, int wid
)
80 while ((c
= ic(fp
)) != EOF
&& wid
-- > 0 && !isspace(c
))
87 int vfscanf(FILE *fp
, char *fmt
, va_list ap
)
93 while (isspace((unsigned char) *fmt
))
95 while (isspace(c
= ic(fp
)))
98 while (*fmt
&& *fmt
!= '%' && !isspace((unsigned char) *fmt
))
104 if (isdigit((unsigned char) *fmt
)) {
106 while (isdigit((unsigned char) *fmt
))
107 wid
= wid
* 10 + *fmt
++ - '0';
110 while (*fmt
== 'l') {
114 while (*fmt
== 'h') {
115 t
= t
< sizeof(int) ? sizeof(char) : sizeof(short);
121 if (iint(fp
, va_arg(ap
, long *), t
, wid
))
126 if (istr(fp
, va_arg(ap
, char *), wid
))
135 int fscanf(FILE *fp
, char *fmt
, ...)
140 ret
= vfscanf(fp
, fmt
, ap
);
145 int scanf(char *fmt
, ...)
150 ret
= vfscanf(stdin
, fmt
, ap
);
155 int vsscanf(char *s
, char *fmt
, va_list ap
)
160 return vfscanf(&f
, fmt
, ap
);
163 int sscanf(char *s
, char *fmt
, ...)
168 ret
= vsscanf(s
, fmt
, ap
);
173 char *fgets(char *s
, int sz
, FILE *fp
)
177 while (i
+ 1 < sz
&& (c
= ic(fp
)) != EOF
) {