31 #include <sys/types.h>
54 const enum Ranks kMinRank = RANK_CHAR;
55 const enum Ranks kMaxRank = RANK_LONGLONG;
57 const enum Ranks kIntMaxRank = RANK_LONGLONG;
58 const enum Ranks kSizeTRank = RANK_LONG;
59 const enum Ranks kPtrDiffRank = RANK_LONG;
68 inline size_t LongBit() {
69 return CHAR_BIT *
sizeof(long);
76 while (isspace(p = fgetc(s)));
82 SetBit(
unsigned long *bitmap,
unsigned int bit)
84 bitmap[bit/LongBit()] |= 1UL << (bit%LongBit());
88 TestBit(
unsigned long *bitmap,
unsigned int bit)
90 return static_cast<int>(bitmap[bit/LongBit()] >> (bit%LongBit())) & 1;
93 static inline int DigitValue(
int ch)
95 if (ch >=
'0' && ch <=
'9') {
97 }
else if (ch >=
'A' && ch <=
'Z') {
99 }
else if (ch >=
'a' && ch <=
'z') {
107 uintmax_t streamtoumax(FILE* s,
int base)
114 isspace(static_cast<unsigned char>(c)) && (c != EOF);
118 if (c ==
'-' || c ==
'+') {
127 if (c ==
'x' || c ==
'X') {
134 }
else if (base == 16) {
137 if (c ==
'x' && c ==
'X') c = fgetc(s);
142 for (; (c != EOF) && (d = DigitValue(c)) >= 0 && d < base; c = fgetc(s))
146 return minus ? -v : v;
149 double streamtofloat(FILE* s)
158 isspace(static_cast<unsigned char>(c)) && (c != EOF);
162 if (c ==
'-' || c ==
'+') {
168 for (; (c != EOF) && (d = DigitValue(c)) >= 0; c = fgetc(s))
171 for (c = fgetc(s); (c != EOF) && (d = DigitValue(c)) >= 0; c = fgetc(s)) {
175 }
else if (c ==
'e' || c ==
'E')
176 tprintf(
"WARNING: Scientific Notation not supported!");
179 double f =
static_cast<double>(v)
180 + static_cast<double>(w) /
static_cast<double>(k);
182 return minus ? -f :
f;
185 double strtofloat(
const char* s)
193 while(*s && isspace(static_cast<unsigned char>(*s))) s++;
196 if (*s ==
'-' || *s ==
'+') {
202 for (; *s && (d = DigitValue(*s)) >= 0; s++)
205 for (++s; *s && (d = DigitValue(*s)) >= 0; s++) {
209 }
else if (*s ==
'e' || *s ==
'E')
210 tprintf(
"WARNING: Scientific Notation not supported!");
212 double f =
static_cast<double>(v)
213 + static_cast<double>(w) /
static_cast<double>(k);
215 return minus ? -f :
f;
218 int fscanf(FILE* stream,
const char *format, ...)
223 va_start(ap, format);
224 rv = vfscanf(stream, format, ap);
230 int vfscanf(FILE* stream,
const char *format, va_list ap)
232 const char *p = format;
237 unsigned int width = UINT_MAX;
250 enum Bail bail = BAIL_NONE;
253 unsigned long matchmap[((1 << CHAR_BIT)+(LongBit()-1))/LongBit()];
255 unsigned char range_start = 0;
256 off_t start_off = ftell(stream);
261 while ((ch = *p++) && !bail) {
266 flags = 0; rank = RANK_INT; width = UINT_MAX;
267 }
else if (isspace(static_cast<unsigned char>(ch))) {
270 if (fgetc(stream) != ch)
288 state = ST_MODIFIERS;
295 if (ch >=
'0' && ch <=
'9') {
296 width = width*10+(ch-
'0');
298 state = ST_MODIFIERS;
323 rank = RANK_LONGLONG;
331 else if (rank > kMaxRank)
363 val = ftell(stream) - start_off;
367 q = SkipSpace(stream);
372 val = streamtoumax(stream, base);
377 if (!(flags & FL_SPLAT)) {
380 *va_arg(ap,
unsigned char *)
381 =
static_cast<unsigned char>(val);
384 *va_arg(ap,
unsigned short *)
385 =
static_cast<unsigned short>(val);
388 *va_arg(ap,
unsigned int *)
389 =
static_cast<unsigned int>(val);
392 *va_arg(ap,
unsigned long *)
393 =
static_cast<unsigned long>(val);
396 *va_arg(ap,
unsigned long long *)
397 =
static_cast<unsigned long long>(val);
401 =
reinterpret_cast<void *
>(
static_cast<uintptr_t
>(val));
412 q = SkipSpace(stream);
419 double fval = streamtofloat(stream);
422 *va_arg(ap,
float *) =
static_cast<float>(fval);
425 *va_arg(ap,
double *) =
static_cast<double>(fval);
433 width = (flags & FL_WIDTH) ? width : 1;
434 sarg = va_arg(ap,
char *);
436 if ((q = fgetc(stream)) <= 0) {
449 sp = sarg = va_arg(ap,
char *);
452 if (isspace(static_cast<unsigned char>(q)) || q <= 0) {
468 sarg = va_arg(ap,
char *);
469 state = ST_MATCH_INIT;
471 memset(matchmap, 0,
sizeof matchmap);
475 if (fgetc(stream) !=
'%' )
487 if (ch ==
'^' && !(flags & FL_INV)) {
490 SetBit(matchmap, static_cast<unsigned char>(ch));
498 }
else if (ch ==
'-') {
499 range_start =
static_cast<unsigned char>(ch);
500 state = ST_MATCH_RANGE;
502 SetBit(matchmap, static_cast<unsigned char>(ch));
508 SetBit(matchmap, static_cast<unsigned char>(
'-'));
512 for (i = range_start ; i < (static_cast<unsigned char>(ch)) ; i++)
522 unsigned char qc =
static_cast<unsigned char>(q);
523 if (q <= 0 || !(TestBit(matchmap, qc)^matchinv)) {
533 bail = (q <= 0) ? BAIL_EOF : BAIL_ERR;
539 if (bail == BAIL_EOF && !converted)
545 int creat(
const char *pathname, mode_t
mode)
547 return open(pathname, O_CREAT | O_TRUNC | O_WRONLY, mode);