12 #include "../../gfx.h"
14 #if GFX_USE_GFILE && GFILE_NEED_SCANG
16 int fscang(
GFILE *f,
const char *fmt, ...) {
21 res = vfscang(f, fmt, ap);
26 int vfscang(
GFILE *f,
const char *fmt, va_list arg) {
27 int res, width, size, base;
33 for(res = 0; *fmt; fmt++) {
35 case ' ':
case '\t':
case '\r':
case '\n':
case '\v':
case '\f':
50 while(*fmt >=
'0' && *fmt <=
'9')
51 width = width * 10 + (*fmt++ -
'0');
55 }
else if (*fmt ==
'l') {
58 }
else if (*fmt ==
'L') {
72 case ' ':
case '\t':
case '\r':
73 case '\n':
case '\v':
case '\f':
continue;
82 p = va_arg(arg,
char *);
95 case ' ':
case '\t':
case '\r':
96 case '\n':
case '\v':
case '\f':
continue;
101 p = va_arg(arg,
char *);
108 if (assign) *((
char *)p) = 0;
111 if (assign) *p++ = c;
116 if (assign) *((
char *)p) = 0;
120 case ' ':
case '\t':
case '\r':
121 case '\n':
case '\v':
case '\f':
break;
123 if (assign) *p++ = c;
132 case 'd': base = 10;
goto getnum;
133 case 'i': base = -1;
goto getnum;
134 case 'o': base = 8;
goto getnum;
135 case 'u': base = 10;
goto getnum;
136 case 'x': base = 16;
goto getnum;
142 case ' ':
case '\t':
case '\r':
143 case '\n':
case '\v':
case '\f':
continue;
147 if (c ==
'-' && *fmt !=
'u') {
149 if ((width && !--width) || !
gfileRead(f, &c, 1))
return res;
153 if ((width && !--width) || !
gfileRead(f, &c, 1))
goto assignnum;
157 if ((width && !--width) || !
gfileRead(f, &c, 1))
return res;
161 if ((width && !--width) || !
gfileRead(f, &c, 1))
return res;
171 if (c >=
'0' && c <=
'9' && c -
'0' < base)
172 num = num * base + (c -
'0');
173 else if (c >=
'A' && c <=
'F' && base == 16)
174 num = num * base + (c - (
'A'-10));
175 else if (c >=
'a' && c <=
'f' && base == 16)
176 num = num * base + (c - (
'a'-10));
181 if ((width && !--width) || !
gfileRead(f, &c, 1))
192 p = (
char *)va_arg(arg,
short *);
194 *((
short *)p) = (short)num;
196 p = (
char *)va_arg(arg,
int *);
198 *((
int *)p) = (int)num;
200 p = (
char *)va_arg(arg,
long *);
202 *((
long *)p) = (long)num;
207 #if GFILE_ALLOW_FLOATS
208 case 'e':
case 'f':
case 'g':
222 case ' ':
case '\t':
case '\r':
223 case '\n':
case '\v':
case '\f':
continue;
227 if (c != *fmt)
return res;
gMemSize gfileRead(GFILE *f, void *buf, gMemSize len)
Read from file.
struct GFILE GFILE
A file pointer.