23 #include "config_auto.h" 33 #include <sys/types.h> 71 return CHAR_BIT *
sizeof(
long);
77 while (isspace(p = fgetc(s)));
83 SetBit(
unsigned long *bitmap,
unsigned int bit) {
88 TestBit(
unsigned long *bitmap,
unsigned int bit) {
89 return static_cast<int>(bitmap[bit/
LongBit()] >> (bit%
LongBit())) & 1;
92 static inline int DigitValue(
int ch,
int base) {
93 if (ch >=
'0' && ch <=
'9') {
94 if (base >= 10 || ch <=
'7')
96 }
else if (ch >=
'A' && ch <=
'Z' && base == 16) {
98 }
else if (ch >=
'a' && ch <=
'z' && base == 16) {
111 isspace(static_cast<unsigned char>(c)) && (c != EOF);
115 if (c ==
'-' || c ==
'+') {
124 if (c ==
'x' || c ==
'X') {
131 }
else if (base == 16) {
134 if (c ==
'x' || c ==
'X') c = fgetc(s);
139 for (; (c != EOF) && (d = DigitValue(c, base)) >= 0; c = fgetc(s))
143 return minus ? -
v :
v;
154 isspace(static_cast<unsigned char>(c)) && (c != EOF);
158 if (c ==
'-' || c ==
'+') {
164 for (; c != EOF && (d = DigitValue(c, 10)) >= 0; c = fgetc(s))
167 for (c = fgetc(s); c != EOF && (d = DigitValue(c, 10)) >= 0; c = fgetc(s)) {
172 double f =
static_cast<double>(
v)
173 + static_cast<double>(w) /
static_cast<double>(k);
174 if (c ==
'e' || c ==
'E') {
177 if (c ==
'-' || c ==
'+') {
178 expsign = (c ==
'-') ? -1 : 1;
182 for (; (c != EOF) && (d = DigitValue(c, 10)) >= 0; c = fgetc(s)) {
183 exponent = exponent * 10 + d;
186 f *= pow(10.0, static_cast<double>(exponent));
190 return minus ? -f : f;
200 while(*s && isspace(static_cast<unsigned char>(*s))) s++;
203 if (*s ==
'-' || *s ==
'+') {
209 for (; *s && (d = DigitValue(*s, 10)) >= 0; s++)
212 for (++s; *s && (d = DigitValue(*s, 10)) >= 0; s++) {
217 if (*s ==
'e' || *s ==
'E')
218 tprintf(
"WARNING: Scientific Notation not supported!");
220 double f =
static_cast<double>(
v)
221 + static_cast<double>(w) /
static_cast<double>(k);
223 return minus ? -f : f;
226 static int tvfscanf(FILE*
stream,
const char *format, va_list ap);
232 va_start(ap, format);
233 rv = tvfscanf(stream, format, ap);
241 int fscanf(FILE*
stream,
const char *format, ...) {
245 va_start(ap, format);
246 rv = tvfscanf(
stream, format, ap);
252 int vfscanf(FILE*
stream,
const char *format, ...) {
256 va_start(ap, format);
257 rv = tvfscanf(
stream, format, ap);
264 static int tvfscanf(FILE*
stream,
const char *format, va_list ap) {
265 const char *p = format;
270 unsigned int width = UINT_MAX;
285 unsigned long matchmap[((1 << CHAR_BIT)+(CHAR_BIT *
sizeof(
long) - 1)) /
286 (CHAR_BIT *
sizeof(
long))];
288 unsigned char range_start = 0;
289 off_t start_off = ftell(
stream);
294 while ((ch = *p++) && !bail) {
299 flags = 0; rank =
RANK_INT; width = UINT_MAX;
300 }
else if (isspace(static_cast<unsigned char>(ch))) {
311 }
else if (
'0' <= ch && ch <=
'9') {
316 state = ST_MODIFIERS;
322 if (ch >=
'0' && ch <=
'9') {
323 width = width*10+(ch-
'0');
325 state = ST_MODIFIERS;
390 val = ftell(
stream) - start_off;
407 *va_arg(ap,
unsigned char *)
408 =
static_cast<unsigned char>(val);
411 *va_arg(ap,
unsigned short *)
412 =
static_cast<unsigned short>(val);
415 *va_arg(ap,
unsigned int *)
416 =
static_cast<unsigned int>(val);
419 *va_arg(ap,
unsigned long *)
420 =
static_cast<unsigned long>(val);
423 *va_arg(ap,
unsigned long long *)
424 =
static_cast<unsigned long long>(val);
428 =
reinterpret_cast<void *
>(
static_cast<uintptr_t
>(val));
447 if (!(flags & FL_SPLAT)) {
449 *va_arg(ap,
float *) =
static_cast<float>(fval);
451 *va_arg(ap,
double *) =
static_cast<double>(fval);
458 width = (flags &
FL_WIDTH) ? width : 1;
459 sarg = va_arg(ap,
char *);
461 if ((q = fgetc(
stream)) <= 0) {
465 if (!(flags & FL_SPLAT)) {
475 sp = sarg = va_arg(ap,
char *);
478 if (isspace(static_cast<unsigned char>(q)) || q <= 0) {
482 if (!(flags & FL_SPLAT)) *sp = q;
487 }
else if (!(flags & FL_SPLAT)) {
496 sarg = va_arg(ap,
char *);
497 state = ST_MATCH_INIT;
499 memset(matchmap, 0,
sizeof matchmap);
503 if (fgetc(
stream) !=
'%' )
515 if (ch ==
'^' && !(flags &
FL_INV)) {
518 SetBit(matchmap, static_cast<unsigned char>(ch));
526 }
else if (ch ==
'-') {
527 range_start =
static_cast<unsigned char>(ch);
528 state = ST_MATCH_RANGE;
530 SetBit(matchmap, static_cast<unsigned char>(ch));
536 SetBit(matchmap, static_cast<unsigned char>(
'-'));
540 for (i = range_start ; i < (static_cast<unsigned char>(ch)) ; i++)
550 unsigned char qc =
static_cast<unsigned char>(q);
551 if (q <= 0 || !(TestBit(matchmap, qc)^matchinv)) {
575 int creat(
const char *pathname, mode_t
mode) {
576 return open(pathname, O_CREAT | O_TRUNC | O_WRONLY, mode);
int tfscanf(FILE *stream, const char *format,...)
typedef long(ZCALLBACK *tell_file_func) OF((voidpf opaque
double streamtofloat(FILE *s)
uintmax_t streamtoumax(FILE *s, int base)
double strtofloat(const char *s)