diff options
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/stdio/Makefile | 17 | ||||
| -rw-r--r-- | libc/stdio/printf.c | 54 | ||||
| -rw-r--r-- | libc/stdio/scanf.c | 37 | 
3 files changed, 46 insertions, 62 deletions
diff --git a/libc/stdio/Makefile b/libc/stdio/Makefile index 67ef71ff8..26ab9cfcc 100644 --- a/libc/stdio/Makefile +++ b/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 diff --git a/libc/stdio/printf.c b/libc/stdio/printf.c index ca3ffb772..245a78519 100644 --- a/libc/stdio/printf.c +++ b/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 diff --git a/libc/stdio/scanf.c b/libc/stdio/scanf.c index dbb6f8d61..6fd802c73 100644 --- a/libc/stdio/scanf.c +++ b/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  | 
