OSDN Git Service

Hack long long support into scanf. For now, will fail for unsigned long longs
authorManuel Novoa III <mjn3@codepoet.org>
Mon, 12 Mar 2001 10:09:06 +0000 (10:09 -0000)
committerManuel Novoa III <mjn3@codepoet.org>
Mon, 12 Mar 2001 10:09:06 +0000 (10:09 -0000)
that are greater that long long max, but works well enough to support interface
in busybox.  Just a temporary measure until scanf.c is rewritten.

libc/stdio/Makefile
libc/stdio/scanf.c

index c7fb2e4..67ef71f 100644 (file)
@@ -25,13 +25,16 @@ include $(TOPDIR)Rules.mak
 LIBC=$(TOPDIR)libc.a
 
 PRINTF_FLAGS =
+SCANF_FLAGS =
 
 ifeq ($(HAS_FLOATS),true)
        PRINTF_FLAGS += -DWANT_DOUBLE
+       SCANF_FLAGS += -DWANT_DOUBLE
 endif
 
 ifeq ($(HAS_LONG_LONG),true)
        PRINTF_FLAGS += -DWANT_LONG_LONG
+       SCANF_FLAGS += -DWANT_LONG_LONG
 endif
 
 MSRC=stdio.c
@@ -72,7 +75,7 @@ $(MOBJ2): $(MSRC2)
        $(STRIPTOOL) -x -R .note -R .comment $*.o
 
 $(MOBJ3): $(MSRC3)
-       $(CC) $(CFLAGS) -DL_$* $< -c -o $*.o
+       $(CC) $(CFLAGS) $(SCANF_FLAGS) -DL_$* $< -c -o $*.o
        $(STRIPTOOL) -x -R .note -R .comment $*.o
 
 $(COBJS): %.o : %.c
index 5ed7f83..9e7ccef 100644 (file)
@@ -169,7 +169,11 @@ register const char *fmt;
 va_list ap;
 
 {
+#if WANT_LONG_LONG
+       long long n;
+#else
        register long n;
+#endif
        register int c, width, lval, cnt = 0;
        int store, neg, base, wide1, endnull, rngflag, c2;
        register unsigned char *p;
@@ -219,9 +223,13 @@ va_list ap;
                        case '*':
                                endnull = store = 0;
                                goto fmtnxt;
-
                        case 'l':                       /* long data */
                                lval = 1;
+#if WANT_LONG_LONG
+                           if (*fmt == 'L') { /* long long data */
+                                       lval = 2;
+                               }
+#endif
                                goto fmtnxt;
                        case 'h':                       /* short data */
                                lval = 0;
@@ -250,8 +258,10 @@ va_list ap;
                        case 'u':                       /* unsigned decimal */
                          numfmt:skip();
 
+#if 0
                                if (isupper(*fmt))
                                        lval = 1;
+#endif
 
                                if (!base) {
                                        base = 10;
@@ -300,7 +310,13 @@ va_list ap;
                                if (store) {
                                        if (neg == 1)
                                                n = -n;
-                                       if (lval)
+#if WANT_LONG_LONG
+                                       if (lval == 2)
+                                               *va_arg(ap, long long *) = n;
+
+                                       else
+#endif
+                                       if (lval == 1)
                                                *va_arg(ap, long *) = n;
 
                                        else
@@ -316,9 +332,10 @@ va_list ap;
                        case 'g':
                                skip();
                                fprintf(stderr, "LIBM:SCANF");
-
+#if 0
                                if (isupper(*fmt))
                                        lval = 1;
+#endif
 
                                fstate = FS_INIT;
                                neg = 0;