summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/lib/vsscanf.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/lib/vsscanf.c')
-rw-r--r--mdk-stage1/dietlibc/lib/vsscanf.c68
1 files changed, 64 insertions, 4 deletions
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 <sys/types.h>
#include <ctype.h>
#include <stdlib.h>
+#include <string.h>
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;