diff options
Diffstat (limited to 'libc')
-rw-r--r-- | libc/stdio/Makefile | 5 | ||||
-rw-r--r-- | libc/stdio/scanf.c | 23 |
2 files changed, 24 insertions, 4 deletions
diff --git a/libc/stdio/Makefile b/libc/stdio/Makefile index c7fb2e44c..67ef71ff8 100644 --- a/libc/stdio/Makefile +++ b/libc/stdio/Makefile @@ -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 diff --git a/libc/stdio/scanf.c b/libc/stdio/scanf.c index 5ed7f8366..9e7ccef3c 100644 --- a/libc/stdio/scanf.c +++ b/libc/stdio/scanf.c @@ -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; |