summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Novoa III <mjn3@codepoet.org>2001-03-12 10:09:06 +0000
committerManuel Novoa III <mjn3@codepoet.org>2001-03-12 10:09:06 +0000
commit485ed9315e18b58ba686c3eb9e8c285c549dc98a (patch)
tree3850e425f8dd469b716fd8042b6f521e86627b8f
parentffba231886579aa74a21710e815b2025caf15e87 (diff)
Hack long long support into scanf. For now, will fail for unsigned long longs
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.
-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;