From 8a167b62e3533029e733bbd08b00bce25ac49ae3 Mon Sep 17 00:00:00 2001 From: jjohnstn Date: Wed, 24 Nov 2004 00:45:40 +0000 Subject: [PATCH] 2004-11-23 Jeff Johnston * libc/include/stdio.h: Add new iprintf and iscanf variants. Also do some reordering. * libc/machine/powerpc/vfscanf.c: Remove __sccl function. * libc/stdio/Makefile.am: Add support for new iprintf and iscanf family functions. * libc/stdio/Makefile.in: Regenerated. * libc/stdio/fiprintf.c: Remove doc to siprintf.c. * libc/stdio/iprintf.c: Ditto. * libc/stdio/local.h (__svfiscanf_r): New prototype. * libc/stdio/siprintf.c: Add docs for various iprintf family functions. * libc/stdio/sniprintf.c: Move docs to siprintf.c. * libc/stdio/stdio.tex: Add new functions. * libc/stdio/vfscanf.c: Split out __sccl function to separate file and add special name defines so this file can be used to build vfiscanf.o. * libc/stdio/asiprintf.c: New file. * libc/stdio/fiscanf.c: Ditto. * libc/stdio/iscanf.c: Ditto. * libc/stdio/sccl.c: Ditto. * libc/stdio/siscanf.c: Ditto. * libc/stdio/vasiprintf.c: Ditto. * libc/stdio/viprintf.c: Ditto. * libc/stdio/viscanf.c: Ditto. * libc/stdio/vsiprintf.c: Ditto. * libc/stdio/vsiscanf.c: Ditto. * libc/stdio/vsniprintf.c: Ditto. --- newlib/ChangeLog | 29 +++++ newlib/libc/include/stdio.h | 36 +++++-- newlib/libc/machine/powerpc/vfscanf.c | 103 ------------------ newlib/libc/stdio/Makefile.am | 34 +++++- newlib/libc/stdio/Makefile.in | 72 ++++++++----- newlib/libc/stdio/asiprintf.c | 100 ++++++++++++++++++ newlib/libc/stdio/fiprintf.c | 39 ------- newlib/libc/stdio/fiscanf.c | 78 ++++++++++++++ newlib/libc/stdio/iprintf.c | 38 ------- newlib/libc/stdio/iscanf.c | 78 ++++++++++++++ newlib/libc/stdio/local.h | 1 + newlib/libc/stdio/sccl.c | 127 ++++++++++++++++++++++ newlib/libc/stdio/siprintf.c | 96 +++++++++++------ newlib/libc/stdio/siscanf.c | 193 ++++++++++++++++++++++++++++++++++ newlib/libc/stdio/sniprintf.c | 39 ------- newlib/libc/stdio/stdio.tex | 33 +++--- newlib/libc/stdio/vasiprintf.c | 75 +++++++++++++ newlib/libc/stdio/vfscanf.c | 131 ++++------------------- newlib/libc/stdio/viprintf.c | 162 ++++++++++++++++++++++++++++ newlib/libc/stdio/viscanf.c | 139 ++++++++++++++++++++++++ newlib/libc/stdio/vsiprintf.c | 73 +++++++++++++ newlib/libc/stdio/vsiscanf.c | 74 +++++++++++++ newlib/libc/stdio/vsniprintf.c | 115 ++++++++++++++++++++ 23 files changed, 1445 insertions(+), 420 deletions(-) create mode 100644 newlib/libc/stdio/asiprintf.c create mode 100644 newlib/libc/stdio/fiscanf.c create mode 100644 newlib/libc/stdio/iscanf.c create mode 100644 newlib/libc/stdio/sccl.c create mode 100644 newlib/libc/stdio/siscanf.c create mode 100644 newlib/libc/stdio/vasiprintf.c create mode 100644 newlib/libc/stdio/viprintf.c create mode 100644 newlib/libc/stdio/viscanf.c create mode 100644 newlib/libc/stdio/vsiprintf.c create mode 100644 newlib/libc/stdio/vsiscanf.c create mode 100644 newlib/libc/stdio/vsniprintf.c diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 2d17000c3f..2fcf0e5a25 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,32 @@ +2004-11-23 Jeff Johnston + + * libc/include/stdio.h: Add new iprintf and iscanf variants. Also + do some reordering. + * libc/machine/powerpc/vfscanf.c: Remove __sccl function. + * libc/stdio/Makefile.am: Add support for new iprintf and iscanf + family functions. + * libc/stdio/Makefile.in: Regenerated. + * libc/stdio/fiprintf.c: Remove doc to siprintf.c. + * libc/stdio/iprintf.c: Ditto. + * libc/stdio/local.h (__svfiscanf_r): New prototype. + * libc/stdio/siprintf.c: Add docs for various iprintf family functions. + * libc/stdio/sniprintf.c: Move docs to siprintf.c. + * libc/stdio/stdio.tex: Add new functions. + * libc/stdio/vfscanf.c: Split out __sccl function to separate + file and add special name defines so this file can be used + to build vfiscanf.o. + * libc/stdio/asiprintf.c: New file. + * libc/stdio/fiscanf.c: Ditto. + * libc/stdio/iscanf.c: Ditto. + * libc/stdio/sccl.c: Ditto. + * libc/stdio/siscanf.c: Ditto. + * libc/stdio/vasiprintf.c: Ditto. + * libc/stdio/viprintf.c: Ditto. + * libc/stdio/viscanf.c: Ditto. + * libc/stdio/vsiprintf.c: Ditto. + * libc/stdio/vsiscanf.c: Ditto. + * libc/stdio/vsniprintf.c: Ditto. + 2004-11-19 Shaun Jackman * libc/include/stdio.h: Add sniprintf. diff --git a/newlib/libc/include/stdio.h b/newlib/libc/include/stdio.h index c33dfe0d08..b70772ab0a 100644 --- a/newlib/libc/include/stdio.h +++ b/newlib/libc/include/stdio.h @@ -219,7 +219,6 @@ int _EXFUN(remove, (const char *)); int _EXFUN(rename, (const char *, const char *)); #endif #ifndef __STRICT_ANSI__ -int _EXFUN(asprintf, (char **, const char *, ...)); #ifdef _COMPILING_NEWLIB int _EXFUN(fseeko, (FILE *, _off_t, int)); _off_t _EXFUN(ftello, ( FILE *)); @@ -227,20 +226,27 @@ _off_t _EXFUN(ftello, ( FILE *)); int _EXFUN(fseeko, (FILE *, off_t, int)); off_t _EXFUN(ftello, ( FILE *)); #endif -int _EXFUN(vfiprintf, (FILE *, const char *, __VALIST)); -int _EXFUN(iprintf, (const char *, ...)); +#ifndef _REENT_ONLY +int _EXFUN(asiprintf, (char **, const char *, ...)); +int _EXFUN(asprintf, (char **, const char *, ...)); +int _EXFUN(fcloseall, (_VOID)); int _EXFUN(fiprintf, (FILE *, const char *, ...)); +int _EXFUN(iprintf, (const char *, ...)); int _EXFUN(siprintf, (char *, const char *, ...)); +int _EXFUN(snprintf, (char *, size_t, const char *, ...)); +int _EXFUN(sniprintf, (char *, size_t, const char *, ...)); char * _EXFUN(tempnam, (const char *, const char *)); +int _EXFUN(vasiprintf, (char **, const char *, __VALIST)); int _EXFUN(vasprintf, (char **, const char *, __VALIST)); +int _EXFUN(vsniprintf, (char *, size_t, const char *, __VALIST)); int _EXFUN(vsnprintf, (char *, size_t, const char *, __VALIST)); +int _EXFUN(vfiprintf, (FILE *, const char *, __VALIST)); +int _EXFUN(vfiscanf, (FILE *, const char *, __VALIST)); int _EXFUN(vfscanf, (FILE *, const char *, __VALIST)); +int _EXFUN(viscanf, (const char *, __VALIST)); int _EXFUN(vscanf, (const char *, __VALIST)); +int _EXFUN(vsiscanf, (const char *, const char *, __VALIST)); int _EXFUN(vsscanf, (const char *, const char *, __VALIST)); -#ifndef _REENT_ONLY -int _EXFUN(fcloseall, (_VOID)); -int _EXFUN(snprintf, (char *, size_t, const char *, ...)); -int _EXFUN(sniprintf, (char *, size_t, const char *, ...)); #endif #endif @@ -272,18 +278,20 @@ int _EXFUN(putchar_unlocked, (int)); * Recursive versions of the above. */ +int _EXFUN(_asiprintf_r, (struct _reent *, char **, const char *, ...)); int _EXFUN(_asprintf_r, (struct _reent *, char **, const char *, ...)); int _EXFUN(_fcloseall_r, (struct _reent *)); FILE * _EXFUN(_fdopen_r, (struct _reent *, int, const char *)); FILE * _EXFUN(_fopen_r, (struct _reent *, const char *, const char *)); int _EXFUN(_fclose_r, (struct _reent *, FILE *)); +int _EXFUN(_fiscanf_r, (struct _reent *, FILE *, const char *, ...)); int _EXFUN(_fscanf_r, (struct _reent *, FILE *, const char *, ...)); int _EXFUN(_fseek_r, (struct _reent *, FILE *, long, int)); long _EXFUN(_ftell_r, (struct _reent *, FILE *)); int _EXFUN(_getchar_r, (struct _reent *)); char * _EXFUN(_gets_r, (struct _reent *, char *)); int _EXFUN(_iprintf_r, (struct _reent *, const char *, ...)); -int _EXFUN(_siprintf_r, (struct _reent *, char *, const char *, ...)); +int _EXFUN(_iscanf_r, (struct _reent *, const char *, ...)); int _EXFUN(_mkstemp_r, (struct _reent *, char *)); char * _EXFUN(_mktemp_r, (struct _reent *, char *)); void _EXFUN(_perror_r, (struct _reent *, const char *)); @@ -294,22 +302,32 @@ int _EXFUN(_remove_r, (struct _reent *, const char *)); int _EXFUN(_rename_r, (struct _reent *, const char *_old, const char *_new)); int _EXFUN(_scanf_r, (struct _reent *, const char *, ...)); -int _EXFUN(_sprintf_r, (struct _reent *, char *, const char *, ...)); +int _EXFUN(_siprintf_r, (struct _reent *, char *, const char *, ...)); +int _EXFUN(_siscanf_r, (struct _reent *, const char *, const char *, ...)); +int _EXFUN(_sniprintf_r, (struct _reent *, char *, size_t, const char *, ...)); int _EXFUN(_snprintf_r, (struct _reent *, char *, size_t, const char *, ...)); +int _EXFUN(_sprintf_r, (struct _reent *, char *, const char *, ...)); int _EXFUN(_sscanf_r, (struct _reent *, const char *, const char *, ...)); char * _EXFUN(_tempnam_r, (struct _reent *, const char *, const char *)); FILE * _EXFUN(_tmpfile_r, (struct _reent *)); char * _EXFUN(_tmpnam_r, (struct _reent *, char *)); int _EXFUN(_ungetc_r, (struct _reent *, int, FILE *)); +int _EXFUN(_vasiprintf_r, (struct _reent *, char **, const char *, __VALIST)); int _EXFUN(_vasprintf_r, (struct _reent *, char **, const char *, __VALIST)); int _EXFUN(_vfiprintf_r, (struct _reent *, FILE *, const char *, __VALIST)); int _EXFUN(_vfprintf_r, (struct _reent *, FILE *, const char *, __VALIST)); +int _EXFUN(_viprintf_r, (struct _reent *, const char *, __VALIST)); int _EXFUN(_vprintf_r, (struct _reent *, const char *, __VALIST)); +int _EXFUN(_vsiprintf_r, (struct _reent *, char *, const char *, __VALIST)); int _EXFUN(_vsprintf_r, (struct _reent *, char *, const char *, __VALIST)); +int _EXFUN(_vsniprintf_r, (struct _reent *, char *, size_t, const char *, __VALIST)); int _EXFUN(_vsnprintf_r, (struct _reent *, char *, size_t, const char *, __VALIST)); +int _EXFUN(_vfiscanf_r, (struct _reent *, FILE *, const char *, __VALIST)); int _EXFUN(_vfscanf_r, (struct _reent *, FILE *, const char *, __VALIST)); +int _EXFUN(_viscanf_r, (struct _reent *, const char *, __VALIST)); int _EXFUN(_vscanf_r, (struct _reent *, const char *, __VALIST)); int _EXFUN(_vsscanf_r, (struct _reent *, const char *, const char *, __VALIST)); +int _EXFUN(_vsiscanf_r, (struct _reent *, const char *, const char *, __VALIST)); ssize_t _EXFUN(__getdelim, (char **, size_t *, int, FILE *)); ssize_t _EXFUN(__getline, (char **, size_t *, FILE *)); diff --git a/newlib/libc/machine/powerpc/vfscanf.c b/newlib/libc/machine/powerpc/vfscanf.c index 63855edcd4..052bbad679 100644 --- a/newlib/libc/machine/powerpc/vfscanf.c +++ b/newlib/libc/machine/powerpc/vfscanf.c @@ -1260,106 +1260,3 @@ match_failure: return nassigned; } -/* - * Fill in the given table from the scanset at the given format - * (just after `['). Return a pointer to the character past the - * closing `]'. The table has a 1 wherever characters should be - * considered part of the scanset. - */ - -/*static*/ -u_char * -__sccl (tab, fmt) - register char *tab; - register u_char *fmt; -{ - register int c, n, v; - - /* first `clear' the whole table */ - c = *fmt++; /* first char hat => negated scanset */ - if (c == '^') - { - v = 1; /* default => accept */ - c = *fmt++; /* get new first char */ - } - else - v = 0; /* default => reject */ - /* should probably use memset here */ - for (n = 0; n < 256; n++) - tab[n] = v; - if (c == 0) - return fmt - 1; /* format ended before closing ] */ - - /* - * Now set the entries corresponding to the actual scanset to the - * opposite of the above. - * - * The first character may be ']' (or '-') without being special; the - * last character may be '-'. - */ - - v = 1 - v; - for (;;) - { - tab[c] = v; /* take character c */ - doswitch: - n = *fmt++; /* and examine the next */ - switch (n) - { - - case 0: /* format ended too soon */ - return fmt - 1; - - case '-': - /* - * A scanset of the form [01+-] is defined as `the digit 0, the - * digit 1, the character +, the character -', but the effect of a - * scanset such as [a-zA-Z0-9] is implementation defined. The V7 - * Unix scanf treats `a-z' as `the letters a through z', but treats - * `a-a' as `the letter a, the character -, and the letter a'. - * - * For compatibility, the `-' is not considerd to define a range if - * the character following it is either a close bracket (required by - * ANSI) or is not numerically greater than the character we just - * stored in the table (c). - */ - n = *fmt; - if (n == ']' || n < c) - { - c = '-'; - break; /* resume the for(;;) */ - } - fmt++; - do - { /* fill in the range */ - tab[++c] = v; - } - while (c < n); -#if 1 /* XXX another disgusting compatibility hack */ - /* - * Alas, the V7 Unix scanf also treats formats such - * as [a-c-e] as `the letters a through e'. This too - * is permitted by the standard.... - */ - goto doswitch; -#else - c = *fmt++; - if (c == 0) - return fmt - 1; - if (c == ']') - return fmt; -#endif - - break; - - - case ']': /* end of scanset */ - return fmt; - - default: /* just another character */ - c = n; - break; - } - } - /* NOTREACHED */ -} diff --git a/newlib/libc/stdio/Makefile.am b/newlib/libc/stdio/Makefile.am index c8d689e25b..f09ed22e89 100644 --- a/newlib/libc/stdio/Makefile.am +++ b/newlib/libc/stdio/Makefile.am @@ -25,6 +25,7 @@ GENERAL_SOURCES = \ fread.c \ freopen.c \ fscanf.c \ + fiscanf.c \ fseek.c \ fsetpos.c \ ftell.c \ @@ -39,6 +40,7 @@ GENERAL_SOURCES = \ getline.c \ gets.c \ iprintf.c \ + iscanf.c \ makebuf.c \ perror.c \ printf.c \ @@ -53,11 +55,13 @@ GENERAL_SOURCES = \ rewind.c \ rget.c \ scanf.c \ + sccl.c \ setbuf.c \ setbuffer.c \ setlinebuf.c \ setvbuf.c \ siprintf.c \ + siscanf.c \ sniprintf.c \ snprintf.c \ sprintf.c \ @@ -66,10 +70,14 @@ GENERAL_SOURCES = \ tmpfile.c \ tmpnam.c \ ungetc.c \ - vfscanf.c \ + viprintf.c \ + viscanf.c \ vprintf.c \ vscanf.c \ + vsiprintf.c \ + vsiscanf.c \ vsnprintf.c \ + vsniprintf.c \ vsprintf.c \ vsscanf.c \ wbuf.c \ @@ -80,6 +88,7 @@ if ELIX_LEVEL_1 LIB_OBJS = else LIB_OBJS = \ + asiprintf.$(oext) \ asprintf.$(oext) \ fcloseall.$(oext) \ fseeko.$(oext) \ @@ -87,10 +96,11 @@ LIB_OBJS = \ getw.$(oext) \ mktemp.$(oext) \ putw.$(oext) \ + vasiprintf.$(oext) \ vasprintf.$(oext) endif -LIBADD_OBJS = vfiprintf.$(oext) vfprintf.$(oext) +LIBADD_OBJS = vfiprintf.$(oext) vfprintf.$(oext) vfiscanf.$(oext) libstdio_la_LDFLAGS = -Xcompiler -nostdlib @@ -121,6 +131,12 @@ vfprintf.$(oext): vfprintf.c vfiprintf.$(oext): vfprintf.c $(LIB_COMPILE) -fshort-enums -DINTEGER_ONLY -c $(srcdir)/vfprintf.c -o $@ +vfscanf.$(oext): vfscanf.c + $(LIB_COMPILE) -c $(srcdir)/vfscanf.c + +vfiscanf.$(oext): vfscanf.c + $(LIB_COMPILE) -DINTEGER_ONLY -c $(srcdir)/vfscanf.c -o $@ + CHEWOUT_FILES = \ clearerr.def \ fclose.def \ @@ -151,7 +167,6 @@ CHEWOUT_FILES = \ getline.def \ gets.def \ getw.def \ - iprintf.def \ mktemp.def \ perror.def \ putc.def \ @@ -168,13 +183,15 @@ CHEWOUT_FILES = \ setlinebuf.def \ setvbuf.def \ siprintf.def \ - sniprintf.def \ + siscanf.def \ sprintf.def \ sscanf.def \ tmpfile.def \ tmpnam.def \ vfprintf.def \ - vfscanf.def + vfscanf.def \ + viprintf.def \ + viscanf.def SUFFIXES = .def @@ -204,6 +221,7 @@ ftell.$(oext): local.h fvwrite.$(oext): local.h fvwrite.h fwalk.$(oext): local.h fwrite.$(oext): local.h fvwrite.h +iscanf.$(oext): local.h makebuf.$(oext): local.h puts.$(oext): fvwrite.h refill.$(oext): local.h @@ -211,14 +229,20 @@ scanf.$(oext): local.h setbuf.$(oext): local.h setvbuf.$(oext): local.h siprintf.$(oext): local.h +sniprintf.$(oext): local.h sprintf.$(oext): local.h +siscanf.$(oext): local.h sscanf.$(oext): local.h stdio.$(oext): local.h ungetc.$(oext): local.h vfiprintf.$(oext): local.h vfprintf.$(oext): local.h +vfiscanf.$(oext): local.h floatio.h vfscanf.$(oext): local.h floatio.h +viscanf.$(oext): local.h vscanf.$(oext): local.h +vsniprintf.$(oext): local.h +vsiscanf.$(oext): local.h vsscanf.$(oext): local.h wbuf.$(oext): local.h fvwrite.h wsetup.$(oext): local.h diff --git a/newlib/libc/stdio/Makefile.in b/newlib/libc/stdio/Makefile.in index c79f5cd88e..e6c8d94041 100644 --- a/newlib/libc/stdio/Makefile.in +++ b/newlib/libc/stdio/Makefile.in @@ -110,12 +110,12 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) -GENERAL_SOURCES = clearerr.c fclose.c fdopen.c feof.c ferror.c fflush.c fgetc.c fgetpos.c fgets.c fileno.c findfp.c fiprintf.c flags.c fopen.c fprintf.c fputc.c fputs.c fread.c freopen.c fscanf.c fseek.c fsetpos.c ftell.c fvwrite.c fwalk.c fwrite.c getc.c getchar.c getc_u.c getchar_u.c getdelim.c getline.c gets.c iprintf.c makebuf.c perror.c printf.c putc.c putchar.c putc_u.c putchar_u.c puts.c refill.c remove.c rename.c rewind.c rget.c scanf.c setbuf.c setbuffer.c setlinebuf.c setvbuf.c siprintf.c sniprintf.c snprintf.c sprintf.c sscanf.c stdio.c tmpfile.c tmpnam.c ungetc.c vfscanf.c vprintf.c vscanf.c vsnprintf.c vsprintf.c vsscanf.c wbuf.c wsetup.c +GENERAL_SOURCES = clearerr.c fclose.c fdopen.c feof.c ferror.c fflush.c fgetc.c fgetpos.c fgets.c fileno.c findfp.c fiprintf.c flags.c fopen.c fprintf.c fputc.c fputs.c fread.c freopen.c fscanf.c fiscanf.c fseek.c fsetpos.c ftell.c fvwrite.c fwalk.c fwrite.c getc.c getchar.c getc_u.c getchar_u.c getdelim.c getline.c gets.c iprintf.c iscanf.c makebuf.c perror.c printf.c putc.c putchar.c putc_u.c putchar_u.c puts.c refill.c remove.c rename.c rewind.c rget.c scanf.c sccl.c setbuf.c setbuffer.c setlinebuf.c setvbuf.c siprintf.c siscanf.c sniprintf.c snprintf.c sprintf.c sscanf.c stdio.c tmpfile.c tmpnam.c ungetc.c viprintf.c viscanf.c vprintf.c vscanf.c vsiprintf.c vsiscanf.c vsnprintf.c vsniprintf.c vsprintf.c vsscanf.c wbuf.c wsetup.c @ELIX_LEVEL_1_TRUE@LIB_OBJS = -@ELIX_LEVEL_1_FALSE@LIB_OBJS = asprintf.$(oext) fcloseall.$(oext) fseeko.$(oext) ftello.$(oext) getw.$(oext) mktemp.$(oext) putw.$(oext) vasprintf.$(oext) +@ELIX_LEVEL_1_FALSE@LIB_OBJS = asiprintf.$(oext) asprintf.$(oext) fcloseall.$(oext) fseeko.$(oext) ftello.$(oext) getw.$(oext) mktemp.$(oext) putw.$(oext) vasiprintf.$(oext) vasprintf.$(oext) -LIBADD_OBJS = vfiprintf.$(oext) vfprintf.$(oext) +LIBADD_OBJS = vfiprintf.$(oext) vfprintf.$(oext) vfiscanf.$(oext) libstdio_la_LDFLAGS = -Xcompiler -nostdlib @@ -132,7 +132,7 @@ libstdio_la_LDFLAGS = -Xcompiler -nostdlib @USE_LIBTOOL_FALSE@lib_a_LIBADD = $(LIBADD_OBJS) $(LIB_OBJS) @USE_LIBTOOL_FALSE@lib_a_DEPENDENCIES = $(LIBADD_OBJS) $(LIB_OBJS) -CHEWOUT_FILES = clearerr.def fclose.def fcloseall.def fdopen.def feof.def ferror.def fflush.def fgetc.def fgetpos.def fgets.def fileno.def fiprintf.def fopen.def fputc.def fputs.def fread.def freopen.def fseek.def fsetpos.def ftell.def fwrite.def getc.def getchar.def getc_u.def getchar_u.def getdelim.def getline.def gets.def getw.def iprintf.def mktemp.def perror.def putc.def putchar.def putc_u.def putchar_u.def puts.def putw.def remove.def rename.def rewind.def setbuf.def setbuffer.def setlinebuf.def setvbuf.def siprintf.def sniprintf.def sprintf.def sscanf.def tmpfile.def tmpnam.def vfprintf.def vfscanf.def +CHEWOUT_FILES = clearerr.def fclose.def fcloseall.def fdopen.def feof.def ferror.def fflush.def fgetc.def fgetpos.def fgets.def fileno.def fiprintf.def fopen.def fputc.def fputs.def fread.def freopen.def fseek.def fsetpos.def ftell.def fwrite.def getc.def getchar.def getc_u.def getchar_u.def getdelim.def getline.def gets.def getw.def mktemp.def perror.def putc.def putchar.def putc_u.def putchar_u.def puts.def putw.def remove.def rename.def rewind.def setbuf.def setbuffer.def setlinebuf.def setvbuf.def siprintf.def siscanf.def sprintf.def sscanf.def tmpfile.def tmpnam.def vfprintf.def vfscanf.def viprintf.def viscanf.def SUFFIXES = .def @@ -157,40 +157,47 @@ LIBS = @LIBS@ @USE_LIBTOOL_FALSE@fiprintf.$(OBJEXT) flags.$(OBJEXT) fopen.$(OBJEXT) \ @USE_LIBTOOL_FALSE@fprintf.$(OBJEXT) fputc.$(OBJEXT) fputs.$(OBJEXT) \ @USE_LIBTOOL_FALSE@fread.$(OBJEXT) freopen.$(OBJEXT) fscanf.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@fseek.$(OBJEXT) fsetpos.$(OBJEXT) ftell.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@fvwrite.$(OBJEXT) fwalk.$(OBJEXT) fwrite.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@getc.$(OBJEXT) getchar.$(OBJEXT) getc_u.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@getchar_u.$(OBJEXT) getdelim.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@getline.$(OBJEXT) gets.$(OBJEXT) iprintf.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@makebuf.$(OBJEXT) perror.$(OBJEXT) printf.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@putc.$(OBJEXT) putchar.$(OBJEXT) putc_u.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@fiscanf.$(OBJEXT) fseek.$(OBJEXT) fsetpos.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@ftell.$(OBJEXT) fvwrite.$(OBJEXT) fwalk.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@fwrite.$(OBJEXT) getc.$(OBJEXT) getchar.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@getc_u.$(OBJEXT) getchar_u.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@getdelim.$(OBJEXT) getline.$(OBJEXT) gets.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@iprintf.$(OBJEXT) iscanf.$(OBJEXT) makebuf.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@perror.$(OBJEXT) printf.$(OBJEXT) putc.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@putchar.$(OBJEXT) putc_u.$(OBJEXT) \ @USE_LIBTOOL_FALSE@putchar_u.$(OBJEXT) puts.$(OBJEXT) refill.$(OBJEXT) \ @USE_LIBTOOL_FALSE@remove.$(OBJEXT) rename.$(OBJEXT) rewind.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@rget.$(OBJEXT) scanf.$(OBJEXT) setbuf.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@setbuffer.$(OBJEXT) setlinebuf.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@setvbuf.$(OBJEXT) siprintf.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@rget.$(OBJEXT) scanf.$(OBJEXT) sccl.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@setbuf.$(OBJEXT) setbuffer.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@setlinebuf.$(OBJEXT) setvbuf.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@siprintf.$(OBJEXT) siscanf.$(OBJEXT) \ @USE_LIBTOOL_FALSE@sniprintf.$(OBJEXT) snprintf.$(OBJEXT) \ @USE_LIBTOOL_FALSE@sprintf.$(OBJEXT) sscanf.$(OBJEXT) stdio.$(OBJEXT) \ @USE_LIBTOOL_FALSE@tmpfile.$(OBJEXT) tmpnam.$(OBJEXT) ungetc.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@vfscanf.$(OBJEXT) vprintf.$(OBJEXT) vscanf.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@vsnprintf.$(OBJEXT) vsprintf.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@vsscanf.$(OBJEXT) wbuf.$(OBJEXT) wsetup.$(OBJEXT) +@USE_LIBTOOL_FALSE@viprintf.$(OBJEXT) viscanf.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@vprintf.$(OBJEXT) vscanf.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@vsiprintf.$(OBJEXT) vsiscanf.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@vsnprintf.$(OBJEXT) vsniprintf.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@vsprintf.$(OBJEXT) vsscanf.$(OBJEXT) wbuf.$(OBJEXT) \ +@USE_LIBTOOL_FALSE@wsetup.$(OBJEXT) LTLIBRARIES = $(noinst_LTLIBRARIES) @USE_LIBTOOL_TRUE@libstdio_la_OBJECTS = clearerr.lo fclose.lo fdopen.lo \ @USE_LIBTOOL_TRUE@feof.lo ferror.lo fflush.lo fgetc.lo fgetpos.lo \ @USE_LIBTOOL_TRUE@fgets.lo fileno.lo findfp.lo fiprintf.lo flags.lo \ @USE_LIBTOOL_TRUE@fopen.lo fprintf.lo fputc.lo fputs.lo fread.lo \ -@USE_LIBTOOL_TRUE@freopen.lo fscanf.lo fseek.lo fsetpos.lo ftell.lo \ -@USE_LIBTOOL_TRUE@fvwrite.lo fwalk.lo fwrite.lo getc.lo getchar.lo \ -@USE_LIBTOOL_TRUE@getc_u.lo getchar_u.lo getdelim.lo getline.lo gets.lo \ -@USE_LIBTOOL_TRUE@iprintf.lo makebuf.lo perror.lo printf.lo putc.lo \ -@USE_LIBTOOL_TRUE@putchar.lo putc_u.lo putchar_u.lo puts.lo refill.lo \ -@USE_LIBTOOL_TRUE@remove.lo rename.lo rewind.lo rget.lo scanf.lo \ -@USE_LIBTOOL_TRUE@setbuf.lo setbuffer.lo setlinebuf.lo setvbuf.lo \ -@USE_LIBTOOL_TRUE@siprintf.lo sniprintf.lo snprintf.lo sprintf.lo \ +@USE_LIBTOOL_TRUE@freopen.lo fscanf.lo fiscanf.lo fseek.lo fsetpos.lo \ +@USE_LIBTOOL_TRUE@ftell.lo fvwrite.lo fwalk.lo fwrite.lo getc.lo \ +@USE_LIBTOOL_TRUE@getchar.lo getc_u.lo getchar_u.lo getdelim.lo \ +@USE_LIBTOOL_TRUE@getline.lo gets.lo iprintf.lo iscanf.lo makebuf.lo \ +@USE_LIBTOOL_TRUE@perror.lo printf.lo putc.lo putchar.lo putc_u.lo \ +@USE_LIBTOOL_TRUE@putchar_u.lo puts.lo refill.lo remove.lo rename.lo \ +@USE_LIBTOOL_TRUE@rewind.lo rget.lo scanf.lo sccl.lo setbuf.lo \ +@USE_LIBTOOL_TRUE@setbuffer.lo setlinebuf.lo setvbuf.lo siprintf.lo \ +@USE_LIBTOOL_TRUE@siscanf.lo sniprintf.lo snprintf.lo sprintf.lo \ @USE_LIBTOOL_TRUE@sscanf.lo stdio.lo tmpfile.lo tmpnam.lo ungetc.lo \ -@USE_LIBTOOL_TRUE@vfscanf.lo vprintf.lo vscanf.lo vsnprintf.lo \ +@USE_LIBTOOL_TRUE@viprintf.lo viscanf.lo vprintf.lo vscanf.lo \ +@USE_LIBTOOL_TRUE@vsiprintf.lo vsiscanf.lo vsnprintf.lo vsniprintf.lo \ @USE_LIBTOOL_TRUE@vsprintf.lo vsscanf.lo wbuf.lo wsetup.lo CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -432,6 +439,12 @@ vfprintf.$(oext): vfprintf.c vfiprintf.$(oext): vfprintf.c $(LIB_COMPILE) -fshort-enums -DINTEGER_ONLY -c $(srcdir)/vfprintf.c -o $@ +vfscanf.$(oext): vfscanf.c + $(LIB_COMPILE) -c $(srcdir)/vfscanf.c + +vfiscanf.$(oext): vfscanf.c + $(LIB_COMPILE) -DINTEGER_ONLY -c $(srcdir)/vfscanf.c -o $@ + .c.def: $(CHEW) < $< > $*.def 2> $*.ref touch stmp-def @@ -452,6 +465,7 @@ ftell.$(oext): local.h fvwrite.$(oext): local.h fvwrite.h fwalk.$(oext): local.h fwrite.$(oext): local.h fvwrite.h +iscanf.$(oext): local.h makebuf.$(oext): local.h puts.$(oext): fvwrite.h refill.$(oext): local.h @@ -459,14 +473,20 @@ scanf.$(oext): local.h setbuf.$(oext): local.h setvbuf.$(oext): local.h siprintf.$(oext): local.h +sniprintf.$(oext): local.h sprintf.$(oext): local.h +siscanf.$(oext): local.h sscanf.$(oext): local.h stdio.$(oext): local.h ungetc.$(oext): local.h vfiprintf.$(oext): local.h vfprintf.$(oext): local.h +vfiscanf.$(oext): local.h floatio.h vfscanf.$(oext): local.h floatio.h +viscanf.$(oext): local.h vscanf.$(oext): local.h +vsniprintf.$(oext): local.h +vsiscanf.$(oext): local.h vsscanf.$(oext): local.h wbuf.$(oext): local.h fvwrite.h wsetup.$(oext): local.h diff --git a/newlib/libc/stdio/asiprintf.c b/newlib/libc/stdio/asiprintf.c new file mode 100644 index 0000000000..e8e10bf38e --- /dev/null +++ b/newlib/libc/stdio/asiprintf.c @@ -0,0 +1,100 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* This code was copied from asprintf.c */ + +#include <_ansi.h> +#include +#include +#ifdef _HAVE_STDC +#include +#else +#include +#endif +#include +#include "local.h" + +int +#ifdef _HAVE_STDC +_DEFUN(_asiprintf_r, (ptr, strp, fmt), + struct _reent *ptr _AND + char **strp _AND + _CONST char *fmt _DOTS) +#else +_asiprintf_r(ptr, strp, fmt, va_alist) + struct _reent *ptr; + char **strp; + _CONST char *fmt; + va_dcl +#endif +{ + int ret; + va_list ap; + FILE f; + + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + f._bf._base = f._p = NULL; + f._bf._size = f._w = 0; + f._file = -1; /* No file. */ +#ifdef _HAVE_STDC + va_start (ap, fmt); +#else + va_start (ap); +#endif + ret = vfiprintf (&f, fmt, ap); + va_end (ap); + *f._p = 0; + *strp = f._bf._base; + return (ret); +} + +#ifndef _REENT_ONLY + +int +#ifdef _HAVE_STDC +_DEFUN(asiprintf, (strp, fmt), + char **strp _AND + _CONST char *fmt _DOTS) +#else +asiprintf(strp, fmt, va_alist) + char **strp; + _CONST char *fmt; + va_dcl +#endif +{ + int ret; + va_list ap; + FILE f; + + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + f._bf._base = f._p = NULL; + f._bf._size = f._w = 0; + f._file = -1; /* No file. */ +#ifdef _HAVE_STDC + va_start (ap, fmt); +#else + va_start (ap); +#endif + ret = vfiprintf (&f, fmt, ap); + va_end (ap); + *f._p = 0; + *strp = f._bf._base; + return (ret); +} + +#endif diff --git a/newlib/libc/stdio/fiprintf.c b/newlib/libc/stdio/fiprintf.c index 4bf60948b1..3529e7f190 100644 --- a/newlib/libc/stdio/fiprintf.c +++ b/newlib/libc/stdio/fiprintf.c @@ -15,45 +15,6 @@ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -/* -FUNCTION -<>---format output to file (integer only) - -INDEX - fiprintf - -ANSI_SYNOPSIS - #include - - int fiprintf(FILE *<[fd]>, const char *<[format]>, ...); - -TRAD_SYNOPSIS - #include - - int fiprintf(<[fd]>, <[format]> [, <[arg]>, ...]); - FILE *<[fd]>; - char *<[format]>; - -DESCRIPTION -<> is a restricted version of <>: it has the same -arguments and behavior, save that it cannot perform any floating-point -formatting---the <>, <>, <>, <>, and <> type specifiers -are not recognized. - -RETURNS - <> returns the number of bytes in the output string, - save that the concluding <> is not counted. - <> returns when the end of the format string is - encountered. If an error occurs, <> - returns <>. - -PORTABILITY -<> is not required by ANSI C. - -Supporting OS subroutines required: <>, <>, <>, -<>, <>, <>, <>. -*/ - #include <_ansi.h> #include #ifdef _HAVE_STDC diff --git a/newlib/libc/stdio/fiscanf.c b/newlib/libc/stdio/fiscanf.c new file mode 100644 index 0000000000..53fee84548 --- /dev/null +++ b/newlib/libc/stdio/fiscanf.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#ifdef _HAVE_STDC +#include +#else +#include +#endif +#include "local.h" + +#ifndef _REENT_ONLY + +int +#ifdef _HAVE_STDC +fiscanf(FILE *fp, _CONST char *fmt, ...) +#else +fiscanf(FILE *fp, fmt, va_alist) + FILE *fp; + char *fmt; + va_dcl +#endif +{ + int ret; + va_list ap; + +#ifdef _HAVE_STDC + va_start (ap, fmt); +#else + va_start (ap); +#endif + ret = __svfiscanf_r (_REENT, fp, fmt, ap); + va_end (ap); + return ret; +} + +#endif /* !_REENT_ONLY */ + +int +#ifdef _HAVE_STDC +_fiscanf_r(struct _reent *ptr, FILE *fp, _CONST char *fmt, ...) +#else +_fiscanf_r(ptr, FILE *fp, fmt, va_alist) + struct _reent *ptr; + FILE *fp; + char *fmt; + va_dcl +#endif +{ + int ret; + va_list ap; + +#ifdef _HAVE_STDC + va_start (ap, fmt); +#else + va_start (ap); +#endif + ret = __svfiscanf_r (ptr, fp, fmt, ap); + va_end (ap); + return (ret); +} + diff --git a/newlib/libc/stdio/iprintf.c b/newlib/libc/stdio/iprintf.c index 4b698ad7fe..5dcf9a7590 100644 --- a/newlib/libc/stdio/iprintf.c +++ b/newlib/libc/stdio/iprintf.c @@ -15,44 +15,6 @@ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -/* -FUNCTION -<>---write formatted output (integer only) - -INDEX - iprintf - -ANSI_SYNOPSIS - #include - - int iprintf(const char *<[format]>, ...); - -TRAD_SYNOPSIS - #include - - int iprintf(<[format]> [, <[arg]>, ...]) - char *<[format]>; - -DESCRIPTION -<> is a restricted version of <>: it has the same -arguments and behavior, save that it cannot perform any floating-point -formatting: the <>, <>, <>, <>, and <> type specifiers -are not recognized. - -RETURNS - <> returns the number of bytes in the output string, - save that the concluding <> is not counted. - <> returns when the end of the format string is - encountered. If an error occurs, <> - returns <>. - -PORTABILITY -<> is not required by ANSI C. - -Supporting OS subroutines required: <>, <>, <>, -<>, <>, <>, <>. -*/ - #include <_ansi.h> #include #include diff --git a/newlib/libc/stdio/iscanf.c b/newlib/libc/stdio/iscanf.c new file mode 100644 index 0000000000..2c50efaba4 --- /dev/null +++ b/newlib/libc/stdio/iscanf.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#ifdef _HAVE_STDC +#include +#else +#include +#endif +#include "local.h" + +#ifndef _REENT_ONLY + +int +#ifdef _HAVE_STDC +iscanf(_CONST char *fmt, ...) +#else +iscanf(fmt, va_alist) + char *fmt; + va_dcl +#endif +{ + int ret; + va_list ap; + + _REENT_SMALL_CHECK_INIT (_stdin_r (_REENT)); +#ifdef _HAVE_STDC + va_start (ap, fmt); +#else + va_start (ap); +#endif + ret = __svfiscanf_r (_REENT, _stdin_r (_REENT), fmt, ap); + va_end (ap); + return ret; +} + +#endif /* !_REENT_ONLY */ + +int +#ifdef _HAVE_STDC +_iscanf_r(struct _reent *ptr, _CONST char *fmt, ...) +#else +_iscanf_r(ptr, fmt, va_alist) + struct _reent *ptr; + char *fmt; + va_dcl +#endif +{ + int ret; + va_list ap; + + _REENT_SMALL_CHECK_INIT (_stdin_r (ptr)); +#ifdef _HAVE_STDC + va_start (ap, fmt); +#else + va_start (ap); +#endif + ret = __svfiscanf_r (ptr, _stdin_r (ptr), fmt, ap); + va_end (ap); + return (ret); +} + diff --git a/newlib/libc/stdio/local.h b/newlib/libc/stdio/local.h index c4176eb2a5..76c2604736 100644 --- a/newlib/libc/stdio/local.h +++ b/newlib/libc/stdio/local.h @@ -30,6 +30,7 @@ #include extern int _EXFUN(__svfscanf_r,(struct _reent *,FILE *, _CONST char *,va_list)); +extern int _EXFUN(__svfiscanf_r,(struct _reent *,FILE *, _CONST char *,va_list)); extern FILE *_EXFUN(__sfp,(struct _reent *)); extern int _EXFUN(__sflags,(struct _reent *,_CONST char*, int*)); extern int _EXFUN(__srefill,(FILE *)); diff --git a/newlib/libc/stdio/sccl.c b/newlib/libc/stdio/sccl.c new file mode 100644 index 0000000000..b018011455 --- /dev/null +++ b/newlib/libc/stdio/sccl.c @@ -0,0 +1,127 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* Split from vfscanf.c */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +/* + * Fill in the given table from the scanset at the given format + * (just after `['). Return a pointer to the character past the + * closing `]'. The table has a 1 wherever characters should be + * considered part of the scanset. + */ + +u_char * +_DEFUN(__sccl, (tab, fmt), + register char *tab _AND + register u_char *fmt) +{ + register int c, n, v; + + /* first `clear' the whole table */ + c = *fmt++; /* first char hat => negated scanset */ + if (c == '^') + { + v = 1; /* default => accept */ + c = *fmt++; /* get new first char */ + } + else + v = 0; /* default => reject */ + /* should probably use memset here */ + for (n = 0; n < 256; n++) + tab[n] = v; + if (c == 0) + return fmt - 1; /* format ended before closing ] */ + + /* + * Now set the entries corresponding to the actual scanset to the + * opposite of the above. + * + * The first character may be ']' (or '-') without being special; the + * last character may be '-'. + */ + + v = 1 - v; + for (;;) + { + tab[c] = v; /* take character c */ + doswitch: + n = *fmt++; /* and examine the next */ + switch (n) + { + + case 0: /* format ended too soon */ + return fmt - 1; + + case '-': + /* + * A scanset of the form [01+-] is defined as `the digit 0, the + * digit 1, the character +, the character -', but the effect of a + * scanset such as [a-zA-Z0-9] is implementation defined. The V7 + * Unix scanf treats `a-z' as `the letters a through z', but treats + * `a-a' as `the letter a, the character -, and the letter a'. + * + * For compatibility, the `-' is not considerd to define a range if + * the character following it is either a close bracket (required by + * ANSI) or is not numerically greater than the character we just + * stored in the table (c). + */ + n = *fmt; + if (n == ']' || n < c) + { + c = '-'; + break; /* resume the for(;;) */ + } + fmt++; + do + { /* fill in the range */ + tab[++c] = v; + } + while (c < n); +#if 1 /* XXX another disgusting compatibility hack */ + /* + * Alas, the V7 Unix scanf also treats formats such + * as [a-c-e] as `the letters a through e'. This too + * is permitted by the standard.... + */ + goto doswitch; +#else + c = *fmt++; + if (c == 0) + return fmt - 1; + if (c == ']') + return fmt; +#endif + + break; + + + case ']': /* end of scanset */ + return fmt; + + default: /* just another character */ + c = n; + break; + } + } + /* NOTREACHED */ +} diff --git a/newlib/libc/stdio/siprintf.c b/newlib/libc/stdio/siprintf.c index 838200805e..18ba489b73 100644 --- a/newlib/libc/stdio/siprintf.c +++ b/newlib/libc/stdio/siprintf.c @@ -17,37 +17,68 @@ /* FUNCTION -<>---write formatted output (integer only) + <>, <>, <>, <>, <>---format output INDEX + fiprintf +INDEX + iprintf +INDEX + asiprintf +INDEX siprintf +INDEX + sniprintf ANSI_SYNOPSIS #include + int iprintf(const char *<[format]> [, <[arg]>, ...]); + int fiprintf(FILE *<[fd]>, const char *<[format]> [, <[arg]>, ...]); int siprintf(char *<[str]>, const char *<[format]> [, <[arg]>, ...]); + int asiprintf(char **<[strp]>, const char *<[format]> [, <[arg]>, ...]); + int sniprintf(char *<[str]>, size_t <[size]>, const char *<[format]> [, <[arg]>, ...]); TRAD_SYNOPSIS - #include + #include - int siprintf(<[str]>, <[format]>, [, <[arg]>, ...]) - char *<[str]>; - const char *<[format]>; + int iprintf(<[format]> [, <[arg]>, ...]) + char *<[format]>; + + int fiprintf(<[fd]>, <[format]> [, <[arg]>, ...]); + FILE *<[fd]>; + char *<[format]>; + + int asiprintf(<[strp]>, <[format]> [, <[arg]>, ...]); + char **<[strp]>; + char *<[format]>; + + int siprintf(<[str]>, <[format]> [, <[arg]>, ...]); + char *<[str]>; + char *<[format]>; + + int sniprintf(<[str]>, size_t <[size]>, <[format]> [, <[arg]>, ...]); + char *<[str]>; + size_t <[size]>; + char *<[format]>; DESCRIPTION -<> is a restricted version of <>: it has the same -arguments and behavior, save that it cannot perform any floating-point -formatting: the <>, <>, <>, <>, and <> type specifiers -are not recognized. + <>, <>, <>, <>, + <>, are the same as <>, <>, + <>, <>, and <>, respectively, + only that they restrict usage to non-floating-point format + specifiers. RETURNS - <> returns the number of bytes in the output string, - save that the concluding <> is not counted. - <> returns when the end of the format string is - encountered. +<> and <> return the number of bytes in the output string, +save that the concluding <> is not counted. +<> and <> return the number of characters transmitted. +If an error occurs, <> and <> return <> and +<> returns -1. No error returns occur for <>. PORTABILITY -<> is not required by ANSI C. +<>, <>, <>, <>, and <> +are newlib extensions. Supporting OS subroutines required: <>, <>, <>, <>, <>, <>, <>. @@ -64,18 +95,18 @@ Supporting OS subroutines required: <>, <>, <>, #include #include "local.h" -#ifndef _REENT_ONLY - int #ifdef _HAVE_STDC -_DEFUN(siprintf, (str, fmt), - char *str _AND +_DEFUN(_siprintf_r, (ptr, str, fmt), + struct _reent *ptr _AND + char *str _AND _CONST char *fmt _DOTS) #else -siprintf(str, fmt, va_alist) - char *str; - _CONST char *fmt; - va_dcl +_siprintf_r(ptr, str, fmt, va_alist) + struct _reent *ptr; + char *str; + _CONST char *fmt; + va_dcl #endif { int ret; @@ -91,26 +122,24 @@ siprintf(str, fmt, va_alist) #else va_start (ap); #endif - ret = vfiprintf (&f, fmt, ap); + ret = _vfiprintf_r (ptr, &f, fmt, ap); va_end (ap); *f._p = 0; return (ret); } -#endif /* ! _REENT_ONLY */ +#ifndef _REENT_ONLY int #ifdef _HAVE_STDC -_DEFUN(_siprintf_r, (rptr, str, fmt), - struct _reent *rptr _AND - char *str _AND +_DEFUN(siprintf, (str, fmt), + char *str _AND _CONST char *fmt _DOTS) #else -_siprintf_r(rptr, str, fmt, va_alist) - struct _reent *rptr; - char *str; - _CONST char *fmt; - va_dcl +siprintf(str, fmt, va_alist) + char *str; + _CONST char *fmt; + va_dcl #endif { int ret; @@ -126,9 +155,10 @@ _siprintf_r(rptr, str, fmt, va_alist) #else va_start (ap); #endif - ret = _vfiprintf_r (rptr, &f, fmt, ap); + ret = _vfiprintf_r (_REENT, &f, fmt, ap); va_end (ap); *f._p = 0; return (ret); } +#endif diff --git a/newlib/libc/stdio/siscanf.c b/newlib/libc/stdio/siscanf.c new file mode 100644 index 0000000000..b87a5ea498 --- /dev/null +++ b/newlib/libc/stdio/siscanf.c @@ -0,0 +1,193 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>---scan and format non-floating input + +INDEX + iscanf +INDEX + fiscanf +INDEX + siscanf + +ANSI_SYNOPSIS + #include + + int iscanf(const char *<[format]> [, <[arg]>, ...]); + int fiscanf(FILE *<[fd]>, const char *<[format]> [, <[arg]>, ...]); + int siscanf(const char *<[str]>, const char *<[format]> + [, <[arg]>, ...]); + + int _iscanf_r(struct _reent *<[ptr]>, const char *<[format]> [, <[arg]>, ...]); + int _fiscanf_r(struct _reent *<[ptr]>, FILE *<[fd]>, const char *<[format]> [, <[arg]>, ...]); + int _siscanf_r(struct _reent *<[ptr]>, const char *<[str]>, const char *<[format]> + [, <[arg]>, ...]); + + +TRAD_SYNOPSIS + #include + + int iscanf(<[format]> [, <[arg]>, ...]) + char *<[format]>; + + int fiscanf(<[fd]>, <[format]> [, <[arg]>, ...]); + FILE *<[fd]>; + char *<[format]>; + + int siscanf(<[str]>, <[format]> [, <[arg]>, ...]); + char *<[str]>; + char *<[format]>; + + int _iscanf_r(<[ptr]>, <[format]> [, <[arg]>, ...]) + struct _reent *<[ptr]>; + char *<[format]>; + + int _fiscanf_r(<[ptr]>, <[fd]>, <[format]> [, <[arg]>, ...]); + struct _reent *<[ptr]>; + FILE *<[fd]>; + char *<[format]>; + + int _siscanf_r(<[ptr]>, <[str]>, <[format]> [, <[arg]>, ...]); + struct _reent *<[ptr]>; + char *<[str]>; + char *<[format]>; + + +DESCRIPTION + <>, <>, and <> are the same as + <>, <>, and <> respectively, only that + they restrict the available formats to non-floating-point + format specifiers. + + The routines <<_iscanf_r>>, <<_fiscanf_r>>, and <<_siscanf_r>> are reentrant + versions of <>, <>, and <> that take an additional + first argument pointing to a reentrancy structure. + +RETURNS + <> returns the number of input fields successfully + scanned, converted and stored; the return value does + not include scanned fields which were not stored. + + If <> attempts to read at end-of-file, the return + value is <>. + + If no fields were stored, the return value is <<0>>. + +PORTABILITY +<>, <>, and <> are newlib extensions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#ifdef _HAVE_STDC +#include +#else +#include +#endif +#include "local.h" + +/* | ARGSUSED */ +/*SUPPRESS 590*/ +static _READ_WRITE_RETURN_TYPE +_DEFUN(eofread, (cookie, buf, len), + _PTR cookie _AND + char *buf _AND + int len) +{ + return 0; +} + +#ifndef _REENT_ONLY + +#ifdef _HAVE_STDC +int +_DEFUN(siscanf, (str, fmt), + _CONST char *str _AND + _CONST char *fmt _DOTS) +#else +int +siscanf(str, fmt, va_alist) + _CONST char *str; + _CONST char *fmt; + va_dcl +#endif +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = strlen (str); + f._read = eofread; + f._ub._base = NULL; + f._lb._base = NULL; + f._file = -1; /* No file. */ +#ifdef _HAVE_STDC + va_start (ap, fmt); +#else + va_start (ap); +#endif + ret = __svfiscanf_r (_REENT, &f, fmt, ap); + va_end (ap); + return ret; +} + +#endif /* !_REENT_ONLY */ + +#ifdef _HAVE_STDC +int +_DEFUN(_siscanf_r, (ptr, str, fmt), + struct _reent *ptr _AND + _CONST char *str _AND + _CONST char *fmt _DOTS) +#else +int +_siscanf_r(ptr, str, fmt, va_alist) + struct _reent *ptr; + _CONST char *str; + _CONST char *fmt; + va_dcl +#endif +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = strlen (str); + f._read = eofread; + f._ub._base = NULL; + f._lb._base = NULL; + f._file = -1; /* No file. */ +#ifdef _HAVE_STDC + va_start (ap, fmt); +#else + va_start (ap); +#endif + ret = __svfiscanf_r (ptr, &f, fmt, ap); + va_end (ap); + return ret; +} diff --git a/newlib/libc/stdio/sniprintf.c b/newlib/libc/stdio/sniprintf.c index 042a42e794..7650cd0800 100644 --- a/newlib/libc/stdio/sniprintf.c +++ b/newlib/libc/stdio/sniprintf.c @@ -17,45 +17,6 @@ /* This code created by modifying snprintf.c so copyright inherited. */ -/* -FUNCTION -<>---write formatted output (integer only) - -INDEX - sniprintf - -ANSI_SYNOPSIS - #include - - int sniprintf(char *<[str]>, size_t <[size]>, const char *<[format]> [, <[arg]>, ...]); - -TRAD_SYNOPSIS - #include - - int sniprintf(<[str]>, size_t <[size]>, <[format]> [, <[arg]>, ...]); - char *<[str]>; - size_t <[size]>; - char *<[format]>; - -DESCRIPTION -<> is a restricted version of <>: it has the same -arguments and behavior, save that it cannot perform any floating-point -formatting: the <>, <>, <>, <>, and <> type specifiers -are not recognized. - -RETURNS - <> returns the number of bytes in the output string, - save that the concluding <> is not counted. - <> returns when the end of the format string is - encountered. - -PORTABILITY -<> is not required by ANSI C. - -Supporting OS subroutines required: <>, <>, <>, -<>, <>, <>, <>. -*/ - #include <_ansi.h> #include #include diff --git a/newlib/libc/stdio/stdio.tex b/newlib/libc/stdio/stdio.tex index f5f092f2ec..67be503741 100644 --- a/newlib/libc/stdio/stdio.tex +++ b/newlib/libc/stdio/stdio.tex @@ -34,7 +34,6 @@ structure. * fgetpos:: Record position in a stream or file * fgets:: Get character string from a file or stream * fileno:: Get file descriptor associated with stream -* fiprintf:: Write formatted output to file (integer only) * fopen:: Open a file * fdopen:: Turn an open file into a stream * fputc:: Write a character on a stream or file @@ -53,7 +52,6 @@ structure. * getline:: Get character string from a file or stream * gets:: Get character string from standard input (obsolete) * getw:: Get a word (int) from a file or stream -* iprintf:: Write formatted output (integer only) * mktemp:: Generate unused file name * perror:: Print an error message on standard error * putc:: Write a character on a stream or file (macro) @@ -69,12 +67,14 @@ structure. * setbuffer:: Specify full buffering for a file or stream with size * setlinebuf:: Specify line buffering for a file or stream * setvbuf:: Specify buffering for a file or stream -* siprintf:: Write formatted output to string (integer only) -* sniprintf:: Write formatted output to string up to max size (integer only) * printf:: Write formatted output * scanf:: Scan and format input +* iprintf:: Write formatted output (integer only) +* iscanf:: Scan and format input (integer only) * tmpfile:: Create a temporary file * tmpnam:: Generate name for a temporary file +* viprintf:: Format variable argument list for non-floating-point output +* viscanf:: Scan variable format list for non-floating-point input * vprintf:: Format variable argument list * vscanf:: Format variable argument list @end menu @@ -110,9 +110,6 @@ structure. @include stdio/fileno.def @page -@include stdio/fiprintf.def - -@page @include stdio/fopen.def @page @@ -167,9 +164,6 @@ structure. @include stdio/getw.def @page -@include stdio/iprintf.def - -@page @include stdio/mktemp.def @page @@ -215,17 +209,17 @@ structure. @include stdio/setvbuf.def @page -@include stdio/siprintf.def - -@page -@include stdio/sniprintf.def - -@page @include stdio/sprintf.def @page @include stdio/sscanf.def +@page +@include stdio/siprintf.def + +@page +@include stdio/siscanf.def + @page @include stdio/tmpfile.def @@ -237,3 +231,10 @@ structure. @page @include stdio/vfscanf.def + +@page +@include stdio/viprintf.def + +@page +@include stdio/viscanf.def + diff --git a/newlib/libc/stdio/vasiprintf.c b/newlib/libc/stdio/vasiprintf.c new file mode 100644 index 0000000000..721d6fb29e --- /dev/null +++ b/newlib/libc/stdio/vasiprintf.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* This code was based on vsiprintf.c */ +/* doc in vfprintf.c */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#ifdef _HAVE_STDC +#include +#else +#include +#endif + +#ifndef _REENT_ONLY + +int +_DEFUN(vasiprintf, (strp, fmt, ap), + char **strp _AND + _CONST char *fmt _AND + va_list ap) +{ + int ret; + FILE f; + + f._flags = __SWR | __SSTR | __SMBF; + f._bf._base = f._p = NULL; + f._bf._size = f._w = 0; + f._file = -1; /* No file. */ + ret = _vfiprintf_r (_REENT, &f, fmt, ap); + *f._p = 0; + *strp = f._bf._base; + return ret; +} + +#endif /* !_REENT_ONLY */ + +int +_DEFUN(_vasiprintf_r, (ptr, strp, fmt, ap), + struct _reent *ptr _AND + char **strp _AND + _CONST char *fmt _AND + va_list ap) +{ + int ret; + FILE f; + + f._flags = __SWR | __SSTR | __SMBF ; + f._bf._base = f._p = NULL; + f._bf._size = f._w = 0; + f._file = -1; /* No file. */ + ret = _vfiprintf_r (ptr, &f, fmt, ap); + *f._p = 0; + *strp = f._bf._base; + return ret; +} + diff --git a/newlib/libc/stdio/vfscanf.c b/newlib/libc/stdio/vfscanf.c index f13181af72..9e04e2b71c 100644 --- a/newlib/libc/stdio/vfscanf.c +++ b/newlib/libc/stdio/vfscanf.c @@ -119,9 +119,20 @@ Supporting OS subroutines required: #endif #include "local.h" -#ifndef NO_FLOATING_POINT +#ifdef INTEGER_ONLY +#define VFSCANF vfiscanf +#define _VFSCANF_R _vfiscanf_r +#define __SVFSCANF __svfiscanf +#define __SVFSCANF_R __svfiscanf_r +#else +#define VFSCANF vfscanf +#define _VFSCANF_R _vfscanf_r +#define __SVFSCANF __svfscanf +#define __SVFSCANF_R __svfscanf_r +#ifndef NO_FLOATING_POINT #define FLOATING_POINT #endif +#endif #ifdef FLOATING_POINT #include @@ -214,39 +225,39 @@ typedef unsigned long long u_long_long; #ifndef _REENT_ONLY int -_DEFUN(vfscanf, (fp, fmt, ap), +_DEFUN(VFSCANF, (fp, fmt, ap), register FILE *fp _AND _CONST char *fmt _AND va_list ap) { CHECK_INIT(fp); - return __svfscanf_r (_REENT, fp, fmt, ap); + return __SVFSCANF_R (_REENT, fp, fmt, ap); } int -_DEFUN(__svfscanf, (fp, fmt0, ap), +_DEFUN(__SVFSCANF, (fp, fmt0, ap), register FILE *fp _AND char _CONST *fmt0 _AND va_list ap) { - return __svfscanf_r (_REENT, fp, fmt0, ap); + return __SVFSCANF_R (_REENT, fp, fmt0, ap); } #endif /* !_REENT_ONLY */ int -_DEFUN(_vfscanf_r, (data, fp, fmt, ap), +_DEFUN(_VFSCANF_R, (data, fp, fmt, ap), struct _reent *data _AND register FILE *fp _AND _CONST char *fmt _AND va_list ap) { - return __svfscanf_r (data, fp, fmt, ap); + return __SVFSCANF_R (data, fp, fmt, ap); } int -_DEFUN(__svfscanf_r, (rptr, fp, fmt0, ap), +_DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap), struct _reent *rptr _AND register FILE *fp _AND char _CONST *fmt0 _AND @@ -1169,107 +1180,3 @@ all_done: _funlockfile (fp); return nassigned; } - -/* - * Fill in the given table from the scanset at the given format - * (just after `['). Return a pointer to the character past the - * closing `]'. The table has a 1 wherever characters should be - * considered part of the scanset. - */ - -/*static*/ -u_char * -_DEFUN(__sccl, (tab, fmt), - register char *tab _AND - register u_char *fmt) -{ - register int c, n, v; - - /* first `clear' the whole table */ - c = *fmt++; /* first char hat => negated scanset */ - if (c == '^') - { - v = 1; /* default => accept */ - c = *fmt++; /* get new first char */ - } - else - v = 0; /* default => reject */ - /* should probably use memset here */ - for (n = 0; n < 256; n++) - tab[n] = v; - if (c == 0) - return fmt - 1; /* format ended before closing ] */ - - /* - * Now set the entries corresponding to the actual scanset to the - * opposite of the above. - * - * The first character may be ']' (or '-') without being special; the - * last character may be '-'. - */ - - v = 1 - v; - for (;;) - { - tab[c] = v; /* take character c */ - doswitch: - n = *fmt++; /* and examine the next */ - switch (n) - { - - case 0: /* format ended too soon */ - return fmt - 1; - - case '-': - /* - * A scanset of the form [01+-] is defined as `the digit 0, the - * digit 1, the character +, the character -', but the effect of a - * scanset such as [a-zA-Z0-9] is implementation defined. The V7 - * Unix scanf treats `a-z' as `the letters a through z', but treats - * `a-a' as `the letter a, the character -, and the letter a'. - * - * For compatibility, the `-' is not considerd to define a range if - * the character following it is either a close bracket (required by - * ANSI) or is not numerically greater than the character we just - * stored in the table (c). - */ - n = *fmt; - if (n == ']' || n < c) - { - c = '-'; - break; /* resume the for(;;) */ - } - fmt++; - do - { /* fill in the range */ - tab[++c] = v; - } - while (c < n); -#if 1 /* XXX another disgusting compatibility hack */ - /* - * Alas, the V7 Unix scanf also treats formats such - * as [a-c-e] as `the letters a through e'. This too - * is permitted by the standard.... - */ - goto doswitch; -#else - c = *fmt++; - if (c == 0) - return fmt - 1; - if (c == ']') - return fmt; -#endif - - break; - - - case ']': /* end of scanset */ - return fmt; - - default: /* just another character */ - c = n; - break; - } - } - /* NOTREACHED */ -} diff --git a/newlib/libc/stdio/viprintf.c b/newlib/libc/stdio/viprintf.c new file mode 100644 index 0000000000..523292d396 --- /dev/null +++ b/newlib/libc/stdio/viprintf.c @@ -0,0 +1,162 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>---format argument list + +INDEX + viprintf +INDEX + vfiprintf +INDEX + vsiprintf +INDEX + vsniprintf + +ANSI_SYNOPSIS + #include + #include + int viprintf(const char *<[fmt]>, va_list <[list]>); + int vfiprintf(FILE *<[fp]>, const char *<[fmt]>, va_list <[list]>); + int vsiprintf(char *<[str]>, const char *<[fmt]>, va_list <[list]>); + int vasiprintf(char **<[strp]>, const char *<[fmt]>, va_list <[list]>); + int vsniprintf(char *<[str]>, size_t <[size]>, const char *<[fmt]>, va_list <[list]>); + + int _viprintf_r(struct _reent *<[reent]>, const char *<[fmt]>, + va_list <[list]>); + int _vfiprintf_r(struct _reent *<[reent]>, FILE *<[fp]>, const char *<[fmt]>, + va_list <[list]>); + int _vasiprintf_r(struct _reent *<[reent]>, char **<[str]>, const char *<[fmt]>, + va_list <[list]>); + int _vsiprintf_r(struct _reent *<[reent]>, char *<[str]>, const char *<[fmt]>, + va_list <[list]>); + int _vsniprintf_r(struct _reent *<[reent]>, char *<[str]>, size_t <[size]>, const char *<[fmt]>, + va_list <[list]>); + +TRAD_SYNOPSIS + #include + #include + int viprintf( <[fmt]>, <[list]>) + char *<[fmt]>; + va_list <[list]>; + + int vfiprintf(<[fp]>, <[fmt]>, <[list]>) + FILE *<[fp]>; + char *<[fmt]>; + va_list <[list]>; + + int vasiprintf(<[strp]>, <[fmt]>, <[list]>) + char **<[strp]>; + char *<[fmt]>; + va_list <[list]>; + + int vsiprintf(<[str]>, <[fmt]>, <[list]>) + char *<[str]>; + char *<[fmt]>; + va_list <[list]>; + + int vsniprintf(<[str]>, <[size]>, <[fmt]>, <[list]>) + char *<[str]>; + size_t <[size]>; + char *<[fmt]>; + va_list <[list]>; + + int _viprintf_r(<[reent]>, <[fmt]>, <[list]>) + struct _reent *<[reent]>; + char *<[fmt]>; + va_list <[list]>; + + int _vfiprintf_r(<[reent]>, <[fp]>, <[fmt]>, <[list]>) + struct _reent *<[reent]>; + FILE *<[fp]>; + char *<[fmt]>; + va_list <[list]>; + + int _vasiprintf_r(<[reent]>, <[strp]>, <[fmt]>, <[list]>) + struct _reent *<[reent]>; + char **<[strp]>; + char *<[fmt]>; + va_list <[list]>; + + int _vsiprintf_r(<[reent]>, <[str]>, <[fmt]>, <[list]>) + struct _reent *<[reent]>; + char *<[str]>; + char *<[fmt]>; + va_list <[list]>; + + int _vsniprintf_r(<[reent]>, <[str]>, <[size]>, <[fmt]>, <[list]>) + struct _reent *<[reent]>; + char *<[str]>; + size_t <[size]>; + char *<[fmt]>; + va_list <[list]>; + +DESCRIPTION +<>, <>, <>, <> and +<> are (respectively) variants of <>, <>, +<>, <>, and <>. They differ only in +restricting the caller to use non-floating-point format specifiers. + +RETURNS +The return values are consistent with the corresponding functions: +<>/<> returns the number of bytes in the output string, +save that the concluding <> is not counted. +<> and <> return the number of characters transmitted. +If an error occurs, <> and <> return <> and +<> returns -1. No error returns occur for <>. + +PORTABILITY +<>, <>, <>, <> and <> +are newlib extensions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#ifdef _HAVE_STDC +#include +#else +#include +#endif +#include "local.h" + +#ifndef _REENT_ONLY + +int +_DEFUN(viprintf, (fmt, ap), + _CONST char *fmt _AND + va_list ap) +{ + _REENT_SMALL_CHECK_INIT (_stdout_r (_REENT)); + return _vfiprintf_r (_REENT, _stdout_r (_REENT), fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_DEFUN(_viprintf_r, (ptr, fmt, ap), + struct _reent *ptr _AND + _CONST char *fmt _AND + va_list ap) +{ + _REENT_SMALL_CHECK_INIT (_stdout_r (ptr)); + return _vfiprintf_r (ptr, _stdout_r (ptr), fmt, ap); +} diff --git a/newlib/libc/stdio/viscanf.c b/newlib/libc/stdio/viscanf.c new file mode 100644 index 0000000000..15388a4040 --- /dev/null +++ b/newlib/libc/stdio/viscanf.c @@ -0,0 +1,139 @@ +/*- + * Code created by modifying iscanf.c which has following copyright. + * + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>---format argument list + +INDEX + viscanf +INDEX + vfiscanf +INDEX + vsiscanf + +ANSI_SYNOPSIS + #include + #include + int viscanf(const char *<[fmt]>, va_list <[list]>); + int vfiscanf(FILE *<[fp]>, const char *<[fmt]>, va_list <[list]>); + int vsiscanf(const char *<[str]>, const char *<[fmt]>, va_list <[list]>); + + int _viscanf_r(struct _reent *<[reent]>, const char *<[fmt]>, + va_list <[list]>); + int _vfiscanf_r(struct _reent *<[reent]>, FILE *<[fp]>, const char *<[fmt]>, + va_list <[list]>); + int _vsiscanf_r(struct _reent *<[reent]>, const char *<[str]>, const char *<[fmt]>, + va_list <[list]>); + +TRAD_SYNOPSIS + #include + #include + int viscanf( <[fmt]>, <[ist]>) + char *<[fmt]>; + va_list <[list]>; + + int vfiscanf( <[fp]>, <[fmt]>, <[list]>) + FILE *<[fp]>; + char *<[fmt]>; + va_list <[list]>; + + int vsiscanf( <[str]>, <[fmt]>, <[list]>) + char *<[str]>; + char *<[fmt]>; + va_list <[list]>; + + int _viscanf_r( <[reent]>, <[fmt]>, <[ist]>) + struct _reent *<[reent]>; + char *<[fmt]>; + va_list <[list]>; + + int _vfiscanf_r( <[reent]>, <[fp]>, <[fmt]>, <[list]>) + struct _reent *<[reent]>; + FILE *<[fp]>; + char *<[fmt]>; + va_list <[list]>; + + int _vsiscanf_r( <[reent]>, <[str]>, <[fmt]>, <[list]>) + struct _reent *<[reent]>; + char *<[str]>; + char *<[fmt]>; + va_list <[list]>; + +DESCRIPTION +<>, <>, and <> are (respectively) variants +of <>, <>, and <>. They differ only in +allowing their caller to pass the variable argument list as a +<> object (initialized by <>) rather than +directly accepting a variable number of arguments. + +RETURNS +The return values are consistent with the corresponding functions: +<> returns the number of input fields successfully scanned, +converted, and stored; the return value does not include scanned +fields which were not stored. + +If <> attempts to read at end-of-file, the return value +is <>. + +If no fields were stored, the return value is <<0>>. + +The routines <<_viscanf_r>>, <<_vfiscanf_f>>, and <<_vsiscanf_r>> are +reentrant versions which take an additional first parameter which points to the +reentrancy structure. + +PORTABILITY +These are newlib extensions. + +Supporting OS subroutines required: +*/ + +#include <_ansi.h> +#include +#include +#ifdef _HAVE_STDC +#include +#else +#include +#endif +#include "local.h" + +#ifndef _REENT_ONLY + +int +_DEFUN(viscanf, (fmt, ap), + _CONST char *fmt _AND + va_list ap) +{ + _REENT_SMALL_CHECK_INIT (_stdin_r (_REENT)); + return __svfiscanf_r (_REENT, _stdin_r (_REENT), fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_DEFUN(_viscanf_r, (ptr, fmt, ap), + struct _reent *ptr _AND + _CONST char *fmt _AND + va_list ap) +{ + _REENT_SMALL_CHECK_INIT (_stdin_r (ptr)); + return __svfiscanf_r (ptr, _stdin_r (ptr), fmt, ap); +} + diff --git a/newlib/libc/stdio/vsiprintf.c b/newlib/libc/stdio/vsiprintf.c new file mode 100644 index 0000000000..c9d263803f --- /dev/null +++ b/newlib/libc/stdio/vsiprintf.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in vfiprintf.c */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#ifdef _HAVE_STDC +#include +#else +#include +#endif + +#ifndef _REENT_ONLY + +int +_DEFUN(vsiprintf, (str, fmt, ap), + char *str _AND + _CONST char *fmt _AND + va_list ap) +{ + int ret; + FILE f; + + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = INT_MAX; + f._file = -1; /* No file. */ + ret = _vfiprintf_r (_REENT, &f, fmt, ap); + *f._p = 0; + return ret; +} + +#endif /* !_REENT_ONLY */ + +int +_DEFUN(_vsiprintf_r, (ptr, str, fmt, ap), + struct _reent *ptr _AND + char *str _AND + _CONST char *fmt _AND + va_list ap) +{ + int ret; + FILE f; + + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = INT_MAX; + f._file = -1; /* No file. */ + ret = _vfiprintf_r (ptr, &f, fmt, ap); + *f._p = 0; + return ret; +} + diff --git a/newlib/libc/stdio/vsiscanf.c b/newlib/libc/stdio/vsiscanf.c new file mode 100644 index 0000000000..c6201847ae --- /dev/null +++ b/newlib/libc/stdio/vsiscanf.c @@ -0,0 +1,74 @@ +/* + * Code created by modifying iscanf.c which has following copyright. + * + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#include +#ifdef _HAVE_STDC +#include +#else +#include +#endif +#include "local.h" + +static _READ_WRITE_RETURN_TYPE +_DEFUN(eofread1, (cookie, buf, len), + _PTR cookie _AND + char *buf _AND + int len) +{ + return 0; +} + +/* + * vsiscanf + */ + +#ifndef _REENT_ONLY + +int +_DEFUN(vsiscanf, (str, fmt, ap), + _CONST char *str _AND + _CONST char *fmt _AND + va_list ap) +{ + return _vsiscanf_r (_REENT, str, fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_DEFUN(_vsiscanf_r, (ptr, str, fmt, ap), + struct _reent *ptr _AND + _CONST char *str _AND + _CONST char *fmt _AND + va_list ap) +{ + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = strlen (str); + f._read = eofread1; + f._ub._base = NULL; + f._lb._base = NULL; + f._file = -1; /* No file. */ + return __svfiscanf_r (ptr, &f, fmt, ap); +} diff --git a/newlib/libc/stdio/vsniprintf.c b/newlib/libc/stdio/vsniprintf.c new file mode 100644 index 0000000000..6a5bd45bb5 --- /dev/null +++ b/newlib/libc/stdio/vsniprintf.c @@ -0,0 +1,115 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---write formatted output (integer only) + +INDEX + vsniprintf + +ANSI_SYNOPSIS + #include + + int vsniprintf(char *<[str]>, size_t <[size]>, const char *<[fmt]>, va_list <[list]>); + +TRAD_SYNOPSIS + #include + + int vsnprintf(<[str]>, <[size]>, <[fmt]>, <[list]>) + char *<[str]>; + size_t <[size]>; + char *<[fmt]>; + va_list <[list]>; + +DESCRIPTION +<> is a restricted version of <>: it has the same +arguments and behavior, save that it cannot perform any floating-point +formatting: the <>, <>, <>, <>, and <> type specifiers +are not recognized. + +RETURNS + <> returns the number of bytes in the output string, + save that the concluding <> is not counted. + <> returns when the end of the format string is + encountered. + +PORTABILITY +<> is not required by ANSI C. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#ifdef _HAVE_STDC +#include +#else +#include +#endif + +#ifndef _REENT_ONLY + +int +_DEFUN(vsniprintf, (str, size, fmt, ap), + char *str _AND + size_t size _AND + _CONST char *fmt _AND + va_list ap) +{ + int ret; + FILE f; + + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = (size > 0 ? size - 1 : 0); + f._file = -1; /* No file. */ + ret = _vfiprintf_r (_REENT, &f, fmt, ap); + if (size > 0) + *f._p = 0; + return ret; +} + +#endif /* !_REENT_ONLY */ + +int +_DEFUN(_vsniprintf_r, (ptr, str, size, fmt, ap), + struct _reent *ptr _AND + char *str _AND + size_t size _AND + _CONST char *fmt _AND + va_list ap) +{ + int ret; + FILE f; + + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = (size > 0 ? size - 1 : 0); + f._file = -1; /* No file. */ + ret = _vfiprintf_r (ptr, &f, fmt, ap); + if (size > 0) + *f._p = 0; + return ret; +} -- 2.11.0