From 167217bec15c9c7aa70ba2a3dc9c689b3cd91872 Mon Sep 17 00:00:00 2001 From: Guillaume Cottenceau Date: Mon, 14 May 2001 14:19:32 +0000 Subject: import new version of dietlibc --- mdk-stage1/dietlibc/lib/vsscanf.c | 68 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 4 deletions(-) (limited to 'mdk-stage1/dietlibc/lib/vsscanf.c') diff --git a/mdk-stage1/dietlibc/lib/vsscanf.c b/mdk-stage1/dietlibc/lib/vsscanf.c index a646ad92d..108555b33 100644 --- a/mdk-stage1/dietlibc/lib/vsscanf.c +++ b/mdk-stage1/dietlibc/lib/vsscanf.c @@ -3,6 +3,7 @@ #include #include #include +#include const char *skip_ws(const char *str) { @@ -15,15 +16,15 @@ extern double strtod(const char *s,char **f); int vsscanf(const char *str, const char *format, va_list arg_ptr) { int n=0,div; - char ch; + unsigned char ch; char flag_discard, flag_malloc, flag_half, flag_long, flag_longlong; char flag_width; unsigned long width; -#ifdef WANT_FLOATING_POINT_IN_SCANF /* arg_ptr tmps */ +#ifdef WANT_FLOATING_POINT_IN_SCANF double d,*pd; float *pf; #endif @@ -216,15 +217,74 @@ inn_vsscanf: } if (*(str=skip_ws(str))) { - while (width && *str && (!isspace(*str))) + while (width && (!isspace(*str))) { if (!flag_discard) *(s++)=*(str); + if (!*str) break; ++str; --width; } - *s = '\0'; } break; + +#ifdef WANT_CHARACTER_CLASSES_IN_SCANF + case '[': + { + char cset[256]; + int flag_not=0; + int flag_dash=0; + memset(cset,0,sizeof(cset)); + ch=*format++; + + /* first char specials */ + if (ch=='^') + { + flag_not=1; + ch=*format++; + } + if ((ch=='-')||(ch==']')) + { + cset[ch]=1; + ch=*format++; + } + + /* almost all non special chars */ + for (;(*format) && (*format!=']');++format) { + if (flag_dash) + { + register unsigned char tmp=*format; + for (;ch<=tmp;++ch) cset[ch]=1; + flag_dash=0; + ch=*(++format); + } + else if (*format=='-') flag_dash=1; + else + { + cset[ch]=1; + ch=*format; + } + } + + /* last char specials */ + if (flag_dash) cset['-']=1; + else cset[ch]=1; + + /* like %c or %s */ + if (!flag_discard) + { + s=(char *)va_arg(arg_ptr,char*); + ++n; + } + while (width && (cset[(unsigned char)(*str)]-flag_not)) + { + if (!flag_discard) *(s++)=*(str); + if (!*str) break; + ++str; + --width; + } + } + break; +#endif } break; -- cgit v1.2.1