33 #include <sys/types.h>
41 #if !defined(HAVE_OFF_T)
76 return CHAR_BIT *
sizeof(long);
82 while (isspace(p = fgetc(s)));
88 SetBit(
unsigned long *bitmap,
unsigned int bit) {
93 TestBit(
unsigned long *bitmap,
unsigned int bit) {
94 return static_cast<int>(bitmap[bit/
LongBit()] >> (bit%
LongBit())) & 1;
97 static inline int DigitValue(
int ch,
int base) {
98 if (ch >=
'0' && ch <=
'9') {
99 if (base >= 10 || ch <=
'7')
101 }
else if (ch >=
'A' && ch <=
'Z' && base == 16) {
103 }
else if (ch >=
'a' && ch <=
'z' && base == 16) {
116 isspace(static_cast<unsigned char>(c)) && (c != EOF);
120 if (c ==
'-' || c ==
'+') {
129 if (c ==
'x' || c ==
'X') {
136 }
else if (base == 16) {
139 if (c ==
'x' || c ==
'X') c = fgetc(s);
144 for (; (c != EOF) && (d = DigitValue(c, base)) >= 0; c = fgetc(s))
148 return minus ? -v : v;
159 isspace(static_cast<unsigned char>(c)) && (c != EOF);
163 if (c ==
'-' || c ==
'+') {
169 for (; c != EOF && (d = DigitValue(c, 10)) >= 0; c = fgetc(s))
172 for (c = fgetc(s); c != EOF && (d = DigitValue(c, 10)) >= 0; c = fgetc(s)) {
177 double f =
static_cast<double>(v)
178 + static_cast<double>(w) /
static_cast<double>(k);
179 if (c ==
'e' || c ==
'E') {
182 if (c ==
'-' || c ==
'+') {
183 expsign = (c ==
'-') ? -1 : 1;
187 for (; (c != EOF) && (d = DigitValue(c, 10)) >= 0; c = fgetc(s)) {
188 exponent = exponent * 10 + d;
191 f *= pow(10.0, static_cast<double>(exponent));
195 return minus ? -f : f;
205 while(*s && isspace(static_cast<unsigned char>(*s))) s++;
208 if (*s ==
'-' || *s ==
'+') {
214 for (; *s && (d = DigitValue(*s, 10)) >= 0; s++)
217 for (++s; *s && (d = DigitValue(*s, 10)) >= 0; s++) {
222 if (*s ==
'e' || *s ==
'E')
223 tprintf(
"WARNING: Scientific Notation not supported!");
225 double f =
static_cast<double>(v)
226 + static_cast<double>(w) /
static_cast<double>(k);
228 return minus ? -f : f;
231 static int tvfscanf(FILE* stream,
const char *format, va_list ap);
233 int tfscanf(FILE* stream,
const char *format, ...) {
237 va_start(ap, format);
238 rv = tvfscanf(stream, format, ap);
246 int fscanf(FILE* stream,
const char *format, ...) {
250 va_start(ap, format);
251 rv = tvfscanf(stream, format, ap);
257 int vfscanf(FILE* stream,
const char *format, ...) {
261 va_start(ap, format);
262 rv = tvfscanf(stream, format, ap);
269 static int tvfscanf(FILE* stream,
const char *format, va_list ap) {
270 const char *p = format;
275 unsigned int width = UINT_MAX;
291 unsigned long matchmap[((1 << CHAR_BIT)+(CHAR_BIT *
sizeof(
long) - 1)) /
292 (CHAR_BIT *
sizeof(long))];
294 unsigned char range_start = 0;
295 off_t start_off = ftell(stream);
300 while ((ch = *p++) && !bail) {
305 flags = 0; rank =
RANK_INT; width = UINT_MAX;
306 }
else if (isspace(static_cast<unsigned char>(ch))) {
309 if (fgetc(stream) != ch)
317 }
else if (
'0' <= ch && ch <=
'9') {
322 state = ST_MODIFIERS;
328 if (ch >=
'0' && ch <=
'9') {
329 width = width*10+(ch-
'0');
331 state = ST_MODIFIERS;
396 val = ftell(stream) - start_off;
400 q = SkipSpace(stream);
413 *va_arg(ap,
unsigned char *)
414 =
static_cast<unsigned char>(val);
417 *va_arg(ap,
unsigned short *)
418 =
static_cast<unsigned short>(val);
421 *va_arg(ap,
unsigned int *)
422 =
static_cast<unsigned int>(val);
425 *va_arg(ap,
unsigned long *)
426 =
static_cast<unsigned long>(val);
429 *va_arg(ap,
unsigned long long *)
430 =
static_cast<unsigned long long>(val);
434 =
reinterpret_cast<void *
>(
static_cast<uintptr_t
>(val));
445 q = SkipSpace(stream);
453 if (!(flags & FL_SPLAT)) {
455 *va_arg(ap,
float *) =
static_cast<float>(fval);
457 *va_arg(ap,
double *) =
static_cast<double>(fval);
464 width = (flags &
FL_WIDTH) ? width : 1;
465 sarg = va_arg(ap,
char *);
467 if ((q = fgetc(stream)) <= 0) {
471 if (!(flags & FL_SPLAT)) {
481 sp = sarg = va_arg(ap,
char *);
484 if (isspace(static_cast<unsigned char>(q)) || q <= 0) {
488 if (!(flags & FL_SPLAT)) *sp = q;
493 }
else if (!(flags & FL_SPLAT)) {
502 sarg = va_arg(ap,
char *);
503 state = ST_MATCH_INIT;
505 memset(matchmap, 0,
sizeof matchmap);
509 if (fgetc(stream) !=
'%' )
521 if (ch ==
'^' && !(flags &
FL_INV)) {
524 SetBit(matchmap, static_cast<unsigned char>(ch));
532 }
else if (ch ==
'-') {
533 range_start =
static_cast<unsigned char>(ch);
534 state = ST_MATCH_RANGE;
536 SetBit(matchmap, static_cast<unsigned char>(ch));
542 SetBit(matchmap, static_cast<unsigned char>(
'-'));
546 for (i = range_start ; i < (static_cast<unsigned char>(ch)) ; i++)
556 unsigned char qc =
static_cast<unsigned char>(q);
557 if (q <= 0 || !(TestBit(matchmap, qc)^matchinv)) {
561 if (!(flags & FL_SPLAT)) *sarg = q;
566 }
else if (!(flags & FL_SPLAT)) {
581 int creat(
const char *pathname, mode_t
mode) {
582 return open(pathname, O_CREAT | O_TRUNC | O_WRONLY, mode);
double streamtofloat(FILE *s)
double strtofloat(const char *s)
uintmax_t streamtoumax(FILE *s, int base)
int tfscanf(FILE *stream, const char *format,...)