summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/stdio/Makefile5
-rw-r--r--libc/stdio/scanf.c23
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;