Browse Source

Test for Config features using features.h.

Manuel Novoa III 23 years ago
parent
commit
6893f5d8b3
3 changed files with 46 additions and 62 deletions
  1. 2 15
      libc/stdio/Makefile
  2. 27 27
      libc/stdio/printf.c
  3. 17 20
      libc/stdio/scanf.c

+ 2 - 15
libc/stdio/Makefile

@@ -24,19 +24,6 @@ TOPDIR=../
 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
 MOBJ=_stdio_init.o \
      _alloc_stdio_buffer.o _free_stdio_buffer_of_file.o _free_stdio_stream.o \
@@ -71,11 +58,11 @@ $(MOBJ): $(MSRC)
 	$(STRIPTOOL) -x -R .note -R .comment $*.o
 
 $(MOBJ2): $(MSRC2)
-	$(CC) $(CFLAGS) $(PRINTF_FLAGS) -DL_$* $< -c -o $*.o
+	$(CC) $(CFLAGS) -DL_$* $< -c -o $*.o
 	$(STRIPTOOL) -x -R .note -R .comment $*.o
 
 $(MOBJ3): $(MSRC3)
-	$(CC) $(CFLAGS) $(SCANF_FLAGS) -DL_$* $< -c -o $*.o
+	$(CC) $(CFLAGS) -DL_$* $< -c -o $*.o
 	$(STRIPTOOL) -x -R .note -R .comment $*.o
 
 $(COBJS): %.o : %.c

+ 27 - 27
libc/stdio/printf.c

@@ -88,8 +88,8 @@
 
 /* These are now set in the Makefile based on Config. */
 /*
-#define WANT_LONG_LONG         0
-#define WANT_DOUBLE            0
+#define __UCLIBC_HAS_LONG_LONG__         0
+#define __UCLIBC_HAS_FLOATS__            0
 */
 
 /*   2) An error message is inserted into the stream, an arg of the
@@ -101,7 +101,7 @@
  */
 
 #define WANT_LONG_LONG_ERROR   0
-#define WANT_DOUBLE_ERROR      0
+#define WANT_FLOAT_ERROR      0
 
 /*
  * Set to support GNU extension of %m to print string corresponding to errno.
@@ -317,21 +317,21 @@ enum {
 /* layout                   01234  */
 static const char spec[] = "+-#0 ";
 
-#if WANT_LONG_LONG || WANT_LONG_LONG_ERROR
+#if __UCLIBC_HAS_LONG_LONG__ || WANT_LONG_LONG_ERROR
 static const char qual[] = "hlLq";
 #else
 static const char qual[] = "hl";
 #endif
 
-#if !WANT_LONG_LONG && WANT_LONG_LONG_ERROR
+#if !__UCLIBC_HAS_LONG_LONG__ && WANT_LONG_LONG_ERROR
 static const char ll_err[] = "<LONG-LONG>";
 #endif
 
-#if !WANT_DOUBLE && WANT_DOUBLE_ERROR
+#if !__UCLIBC_HAS_FLOATS__ && WANT_FLOAT_ERROR
 static const char dbl_err[] = "<DOUBLE>";
 #endif
 
-#if WANT_DOUBLE || WANT_DOUBLE_ERROR
+#if __UCLIBC_HAS_FLOATS__ || WANT_FLOAT_ERROR
 /* layout                     012345678901234567   */
 static const char u_spec[] = "%nbopxXudicsfgGeEaA";
 #else
@@ -352,7 +352,7 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
 	int preci, width;
 #define upcase i
 	int radix, dpoint /*, upcase*/;
-#if WANT_LONG_LONG
+#if __UCLIBC_HAS_LONG_LONG__
 	char tmp[65];
 #else
 	char tmp[33];
@@ -435,12 +435,12 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
 				if (*p == *fmt) {
 					lval = p - qual;
 					++fmt;
-#if WANT_LONG_LONG || WANT_LONG_LONG_ERROR
+#if __UCLIBC_HAS_LONG_LONG__ || WANT_LONG_LONG_ERROR
 					if ((*p == 'l') && (*fmt == *p)) {
 						++lval;
 						++fmt;
 					}
-#endif /* WANT_LONG_LONG || WANT_LONG_LONG_ERROR */
+#endif /* __UCLIBC_HAS_LONG_LONG__ || WANT_LONG_LONG_ERROR */
 				}
 			}
 
@@ -470,18 +470,18 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
 						lval = (sizeof(char *) == sizeof(long));
 						upcase = 0;
 					}
-#if WANT_LONG_LONG || WANT_LONG_LONG_ERROR
+#if __UCLIBC_HAS_LONG_LONG__ || WANT_LONG_LONG_ERROR
 					if (lval >= 2) {
-#if WANT_LONG_LONG
+#if __UCLIBC_HAS_LONG_LONG__
 						p = __ulltostr(tmp + sizeof(tmp) - 1,
 									   va_arg(ap, unsigned long long),
 									   radix, upcase);
 #else
 						(void) va_arg(ap, unsigned long long);	/* cary on */
 						p = (char *) ll_err;
-#endif /* WANT_LONG_LONG */
+#endif /* __UCLIBC_HAS_LONG_LONG__ */
 					} else {
-#endif /* WANT_LONG_LONG || WANT_LONG_LONG_ERROR */
+#endif /* __UCLIBC_HAS_LONG_LONG__ || WANT_LONG_LONG_ERROR */
 #if UINT_MAX != ULONG_MAX
 						/* sizeof(unsigned int) != sizeof(unsigned long) */
 						p = __ultostr(tmp + sizeof(tmp) - 1, (unsigned long)
@@ -495,9 +495,9 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
 									  va_arg(ap, unsigned long),
 									  radix, upcase);
 #endif
-#if WANT_LONG_LONG || WANT_LONG_LONG_ERROR
+#if __UCLIBC_HAS_LONG_LONG__ || WANT_LONG_LONG_ERROR
 					}
-#endif /* WANT_LONG_LONG || WANT_LONG_LONG_ERROR */
+#endif /* __UCLIBC_HAS_LONG_LONG__ || WANT_LONG_LONG_ERROR */
 					flag[FLAG_PLUS] = '\0';	/* meaningless for unsigned */
 					if (flag[FLAG_HASH] && (*p != '0')) { /* non-zero */
 						if (radix == 8) {
@@ -514,17 +514,17 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
 						}
 					}
 				} else if (p-u_spec < 10) { /* signed conversion */
-#if WANT_LONG_LONG || WANT_LONG_LONG_ERROR
+#if __UCLIBC_HAS_LONG_LONG__ || WANT_LONG_LONG_ERROR
 					if (lval >= 2) {
-#if WANT_LONG_LONG
+#if __UCLIBC_HAS_LONG_LONG__
 						p = __lltostr(tmp + sizeof(tmp) - 1,
 									  va_arg(ap, long long), 10, 0);
 #else
 						(void) va_arg(ap, long long); /* carry on */
 						p = (char *) ll_err;
-#endif /* WANT_LONG_LONG */
+#endif /* __UCLIBC_HAS_LONG_LONG__ */
 					} else {
-#endif /* WANT_LONG_LONG || WANT_LONG_LONG_ERROR */
+#endif /* __UCLIBC_HAS_LONG_LONG__ || WANT_LONG_LONG_ERROR */
 #if INT_MAX != LONG_MAX
 						/* sizeof(int) != sizeof(long) */
 						p = __ltostr(tmp + sizeof(tmp) - 1, (long)
@@ -536,9 +536,9 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
 						p = __ltostr(tmp + sizeof(tmp) - 1, (long)
 									 va_arg(ap, long), 10, 0);
 #endif
-#if WANT_LONG_LONG || WANT_LONG_LONG_ERROR
+#if __UCLIBC_HAS_LONG_LONG__ || WANT_LONG_LONG_ERROR
 					}
-#endif /* WANT_LONG_LONG || WANT_LONG_LONG_ERROR */
+#endif /* __UCLIBC_HAS_LONG_LONG__ || WANT_LONG_LONG_ERROR */
 				} else if (p-u_spec < 12) {	/* character or string */
 					flag[FLAG_PLUS] = '\0';
 					flag[FLAG_0_PAD] = ' ';
@@ -551,10 +551,10 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
 							p = "(null)";
 						}
 					}
-#if WANT_DOUBLE || WANT_DOUBLE_ERROR
+#if __UCLIBC_HAS_FLOATS__ || WANT_FLOAT_ERROR
 				} else if (p-u_spec < 27) {		/* floating point */
-#endif /* WANT_DOUBLE || WANT_DOUBLE_ERROR */
-#if WANT_DOUBLE
+#endif /* __UCLIBC_HAS_FLOATS__ || WANT_FLOAT_ERROR */
+#if __UCLIBC_HAS_FLOATS__
 					if (preci < 0) {
 						preci = 6;
 					}
@@ -565,11 +565,11 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
 									 : va_arg(ap, double)),
 									flag, width,  preci, *fmt);
 					goto nextfmt;
-#elif WANT_DOUBLE_ERROR
+#elif WANT_FLOAT_ERROR
 					(void) ((lval > 1) ? va_arg(ap, long double)
 							: va_arg(ap, double)); /* carry on */
 					p = (char *) dbl_err;
-#endif /* WANT_DOUBLE */
+#endif /* __UCLIBC_HAS_FLOATS__ */
 				}
 
 #if WANT_GNU_ERRNO

+ 17 - 20
libc/stdio/scanf.c

@@ -135,9 +135,15 @@ _strto_ll(const char *str, char **endptr, int base, int uflag);
 extern unsigned long
 _strto_l(const char *str, char **endptr, int base, int uflag);
 
-/* #define	skip()	do{c=getc(fp); if (c<1) goto done;}while(isspace(c))*/
+struct scan_cookie {
+	FILE *fp;
+	int nread;
+	int width;
+	int ungot_char;
+	int ungot_flag;
+};
 
-#if WANT_LONG_LONG || WANT_LONG_LONG_ERROR
+#if __UCLIBC_HAS_LONG_LONG__
 static const char qual[] = "hl" /* "jtz" */ "Lq";
 /* char = -2, short = -1, int = 0, long = 1, long long = 2 */
 static const char qsz[] = { -1, 1,           2, 2 };
@@ -146,7 +152,8 @@ static const char qual[] = "hl" /* "jtz" */;
 static const char qsz[] = { -1, 1,         };
 #endif
 
-#if WANT_DOUBLE || WANT_DOUBLE_ERROR
+#if __UCLIBC_HAS_FLOATS__
+static int __strtold(long double *ld, struct scan_cookie *sc);
 						   /*01234567890123456 */
 static const char spec[]  = "%n[csoupxXidfeEgG";
 #else
@@ -155,16 +162,6 @@ static const char spec[]  = "%n[csoupxXid";
 /* radix[i] <-> spec[i+5]     o   u   p   x   X  i   d */
 static const char radix[] = { 8, 10, 16, 16, 16, 0, 10 };
 
-struct scan_cookie {
-	FILE *fp;
-	int nread;
-	int width;
-	int ungot_char;
-	int ungot_flag;
-};
-
-static int __strtold(long double *ld, struct scan_cookie *sc);
-
 static void init_scan_cookie(struct scan_cookie *sc, FILE *fp)
 {
 	sc->fp = fp;
@@ -228,7 +225,7 @@ FILE *fp;
 const char *format;
 va_list ap;
 {
-#if WANT_LONG_LONG
+#if __UCLIBC_HAS_LONG_LONG__
 #define STRTO_L_(s,e,b,u) _strto_ll(s,e,b,u)
 #define MAX_DIGITS 64
 #define UV_TYPE unsigned long long
@@ -239,7 +236,7 @@ va_list ap;
 #define UV_TYPE unsigned long
 #define V_TYPE long
 #endif
-#if WANT_DOUBLE
+#if __UCLIBC_HAS_FLOATS__
 	long double ld;
 #endif
 	UV_TYPE uv;
@@ -429,7 +426,7 @@ va_list ap;
 						vp = va_arg(ap, void *);
 						switch (lval) {
 							case 2:	/* If no long long, treat as long . */
-#if WANT_LONG_LONG
+#if __UCLIBC_HAS_LONG_LONG__
 								*((unsigned long long *)vp) = uv;
 								break;
 #endif
@@ -437,7 +434,7 @@ va_list ap;
 #if ULONG_MAX == UINT_MAX
 							case 0:	/* int and long int are the same */
 #endif
-#if WANT_LONG_LONG
+#if __UCLIBC_HAS_LONG_LONG__
 								if (usflag) {
 									if (uv > ULONG_MAX) {
 										uv = ULONG_MAX;
@@ -495,7 +492,7 @@ va_list ap;
 					}
 					goto nextfmt;
 				}
-#if WANT_DOUBLE
+#if __UCLIBC_HAS_FLOATS__
 				else {			/* floating point */
 					if (sc.width <= 0) {
 						goto done;
@@ -555,7 +552,7 @@ va_list ap;
 }
 
 /*****************************************************************************/
-#if WANT_DOUBLE
+#if __UCLIBC_HAS_FLOATS__
 
 #include <float.h>
 
@@ -690,5 +687,5 @@ int __strtold(long double *ld, struct scan_cookie *sc)
 	scan_ungetc(sc);
 	return 0;
 }
-#endif /* WANT_DOUBLE */
+#endif /* __UCLIBC_HAS_FLOATS__ */
 #endif