2001-04-20 Jeff Johnston <jjohnstn@redhat.com>
* libc/include/stdio.h[!_REENT_ONLY]: Moved various functions together into one list. [!__STRICT_ANSI__]: Moved non-ANSI I/O functions in this list. (vfscanf, vscanf, vsscanf, _vfscanf_r, _vscanf_r, _vsscanf_r): New function prototypes. (_fscanf_r, _sscanf_r): Ditto. * libc/include/stdlib.h: Added _strtod_r prototype. * libc/stdio/Makefile.am: Add new v*scanf functions. * libc/stdio/Makefile.in: Regenerate. * libc/stdio/fscanf.c: Reorganized so HAVE_STDC only affects prototype and code is shared. Added reentrant _fscanf_r which calls __svfscanf_r. * libc/stdio/scanf.c: Changed to call __svfscanf_r. * libc/stdio/sscanf.c: Changed documentation to add reentrant routines. (sscanf): Changed to call __svfscanf_r with _REENT argument. (_sscanf_r): New routine. * libc/stdio/local.h: Removed __svfscanf prototype and replaced it with __svfscanf_r prototype. * libc/stdio/vfscanf.c (vfscanf, _vfscanf_r: New routines. (__svfscanf_r): Reentrant version of __svfscanf which takes reetrancy structure as argument as calls reentrant versions of helper functions (e.g. _strtol_r, _strtoul_r). Also replaced calls to atol and atof to _strtol_r and _strtod_r respectively. * libc/stdio/vfscanf.c: Also changed __svfscanf to call __svfscanf_r. * libc/stdlib/strtod.c (strtod): Changed to call _strtod_r with _REENT argument. * libc/stdio/vscanf.c: New file. * libc/stdio/vsscanf.c: Ditto.
This commit is contained in:
parent
3c8e92d9fc
commit
52cb9e6934
|
@ -1,3 +1,34 @@
|
|||
2001-04-20 Jeff Johnston <jjohnstn@redhat.com>
|
||||
|
||||
* libc/include/stdio.h[!_REENT_ONLY]: Moved various functions together
|
||||
into one list.
|
||||
[!__STRICT_ANSI__]: Moved non-ANSI I/O functions in this list.
|
||||
(vfscanf, vscanf, vsscanf, _vfscanf_r, _vscanf_r, _vsscanf_r): New
|
||||
function prototypes.
|
||||
(_fscanf_r, _sscanf_r): Ditto.
|
||||
* libc/include/stdlib.h: Added _strtod_r prototype.
|
||||
* libc/stdio/Makefile.am: Add new v*scanf functions.
|
||||
* libc/stdio/Makefile.in: Regenerate.
|
||||
* libc/stdio/fscanf.c: Reorganized so HAVE_STDC only affects prototype
|
||||
and code is shared. Added reentrant _fscanf_r which calls __svfscanf_r.
|
||||
* libc/stdio/scanf.c: Changed to call __svfscanf_r.
|
||||
* libc/stdio/sscanf.c: Changed documentation to add reentrant routines.
|
||||
(sscanf): Changed to call __svfscanf_r with _REENT argument.
|
||||
(_sscanf_r): New routine.
|
||||
* libc/stdio/local.h: Removed __svfscanf prototype and replaced it
|
||||
with __svfscanf_r prototype.
|
||||
* libc/stdio/vfscanf.c (vfscanf, _vfscanf_r: New
|
||||
routines.
|
||||
(__svfscanf_r): Reentrant version of __svfscanf which takes reetrancy
|
||||
structure as argument as calls reentrant versions of helper functions
|
||||
(e.g. _strtol_r, _strtoul_r). Also replaced calls to atol and atof
|
||||
to _strtol_r and _strtod_r respectively.
|
||||
* libc/stdio/vfscanf.c: Also changed __svfscanf to call __svfscanf_r.
|
||||
* libc/stdlib/strtod.c (strtod): Changed to call _strtod_r with
|
||||
_REENT argument.
|
||||
* libc/stdio/vscanf.c: New file.
|
||||
* libc/stdio/vsscanf.c: Ditto.
|
||||
|
||||
2001-04-19 Robert Collins <rbtcollins@hotmail.com>
|
||||
|
||||
* include/time.h[__CYGWIN__]: Define tzname to _tzname if not defined.
|
||||
|
|
|
@ -142,11 +142,6 @@ typedef struct __sFILE FILE;
|
|||
#define __VALIST char*
|
||||
#endif
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
int _EXFUN(remove, (const char *));
|
||||
int _EXFUN(rename, (const char *, const char *));
|
||||
#endif
|
||||
char * _EXFUN(tempnam, (const char *, const char *));
|
||||
FILE * _EXFUN(tmpfile, (void));
|
||||
char * _EXFUN(tmpnam, (char *));
|
||||
int _EXFUN(fclose, (FILE *));
|
||||
|
@ -162,7 +157,6 @@ int _EXFUN(sscanf, (const char *, const char *, ...));
|
|||
int _EXFUN(vfprintf, (FILE *, const char *, __VALIST));
|
||||
int _EXFUN(vprintf, (const char *, __VALIST));
|
||||
int _EXFUN(vsprintf, (char *, const char *, __VALIST));
|
||||
int _EXFUN(vsnprintf, (char *, size_t, const char *, __VALIST));
|
||||
int _EXFUN(fgetc, (FILE *));
|
||||
char * _EXFUN(fgets, (char *, int, FILE *));
|
||||
int _EXFUN(fputc, (int, FILE *));
|
||||
|
@ -188,13 +182,22 @@ void _EXFUN(perror, (const char *));
|
|||
#ifndef _REENT_ONLY
|
||||
FILE * _EXFUN(fopen, (const char *_name, const char *_type));
|
||||
int _EXFUN(sprintf, (char *, const char *, ...));
|
||||
int _EXFUN(snprintf, (char *, size_t, const char *, ...));
|
||||
int _EXFUN(remove, (const char *));
|
||||
int _EXFUN(rename, (const char *, const char *));
|
||||
#endif
|
||||
#ifndef __STRICT_ANSI__
|
||||
int _EXFUN(vfiprintf, (FILE *, const char *, __VALIST));
|
||||
int _EXFUN(iprintf, (const char *, ...));
|
||||
int _EXFUN(fiprintf, (FILE *, const char *, ...));
|
||||
int _EXFUN(siprintf, (char *, const char *, ...));
|
||||
char * _EXFUN(tempnam, (const char *, const char *));
|
||||
int _EXFUN(vsnprintf, (char *, size_t, const char *, __VALIST));
|
||||
int _EXFUN(vfscanf, (FILE *, const char *, __VALIST));
|
||||
int _EXFUN(vscanf, (const char *, __VALIST));
|
||||
int _EXFUN(vsscanf, (const char *, const char *, __VALIST));
|
||||
#ifndef _REENT_ONLY
|
||||
int _EXFUN(snprintf, (char *, size_t, const char *, ...));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -220,6 +223,7 @@ int _EXFUN(setlinebuf, (FILE *));
|
|||
|
||||
FILE * _EXFUN(_fdopen_r, (struct _reent *, int, const char *));
|
||||
FILE * _EXFUN(_fopen_r, (struct _reent *, const char *, const char *));
|
||||
int _EXFUN(_fscanf_r, (struct _reent *, FILE *, const char *, ...));
|
||||
int _EXFUN(_getchar_r, (struct _reent *));
|
||||
char * _EXFUN(_gets_r, (struct _reent *, char *));
|
||||
int _EXFUN(_iprintf_r, (struct _reent *, const char *, ...));
|
||||
|
@ -235,6 +239,7 @@ int _EXFUN(_rename_r, (struct _reent *,
|
|||
int _EXFUN(_scanf_r, (struct _reent *, const char *, ...));
|
||||
int _EXFUN(_sprintf_r, (struct _reent *, char *, const char *, ...));
|
||||
int _EXFUN(_snprintf_r, (struct _reent *, char *, size_t, 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 *));
|
||||
|
@ -242,6 +247,9 @@ int _EXFUN(_vfprintf_r, (struct _reent *, FILE *, const char *, __VALIST));
|
|||
int _EXFUN(_vprintf_r, (struct _reent *, const char *, __VALIST));
|
||||
int _EXFUN(_vsprintf_r, (struct _reent *, char *, const char *, __VALIST));
|
||||
int _EXFUN(_vsnprintf_r, (struct _reent *, char *, size_t, const char *, __VALIST));
|
||||
int _EXFUN(_vfscanf_r, (struct _reent *, FILE *, const char *, __VALIST));
|
||||
int _EXFUN(_vscanf_r, (struct _reent *, const char *, __VALIST));
|
||||
int _EXFUN(_vsscanf_r, (struct _reent *, const char *, const char *, __VALIST));
|
||||
|
||||
/*
|
||||
* Routines internal to the implementation.
|
||||
|
|
|
@ -93,6 +93,7 @@ double _EXFUN(strtod,(const char *__n, char **_end_PTR));
|
|||
float _EXFUN(strtodf,(const char *__n, char **_end_PTR));
|
||||
#endif
|
||||
long _EXFUN(strtol,(const char *__n, char **_end_PTR, int __base));
|
||||
long _EXFUN(_strtol_r,(struct _reent *,const char *__n, char **_end_PTR, int __base));
|
||||
unsigned long _EXFUN(strtoul,(const char *_n_PTR, char **_end_PTR, int __base));
|
||||
unsigned long _EXFUN(_strtoul_r,(struct _reent *,const char *_n_PTR, char **_end_PTR, int __base));
|
||||
int _EXFUN(system,(const char *__string));
|
||||
|
|
|
@ -65,8 +65,10 @@ lib_a_SOURCES = \
|
|||
vfprintf.c \
|
||||
vfscanf.c \
|
||||
vprintf.c \
|
||||
vscanf.c \
|
||||
vsnprintf.c \
|
||||
vsprintf.c \
|
||||
vsscanf.c \
|
||||
wbuf.c \
|
||||
wsetup.c
|
||||
|
||||
|
@ -117,7 +119,8 @@ CHEWOUT_FILES = \
|
|||
sscanf.def \
|
||||
tmpfile.def \
|
||||
tmpnam.def \
|
||||
vfprintf.def
|
||||
vfprintf.def \
|
||||
vfscanf.def
|
||||
|
||||
SUFFIXES = .def
|
||||
|
||||
|
@ -161,5 +164,7 @@ ungetc.o: local.h
|
|||
vfiprintf.o: local.h
|
||||
vfprintf.o: local.h
|
||||
vfscanf.o: local.h floatio.h
|
||||
vscanf.o: local.h
|
||||
vsscanf.o: local.h
|
||||
wbuf.o: local.h fvwrite.h
|
||||
wsetup.o: local.h
|
||||
|
|
|
@ -147,8 +147,10 @@ lib_a_SOURCES = \
|
|||
vfprintf.c \
|
||||
vfscanf.c \
|
||||
vprintf.c \
|
||||
vscanf.c \
|
||||
vsnprintf.c \
|
||||
vsprintf.c \
|
||||
vsscanf.c \
|
||||
wbuf.c \
|
||||
wsetup.c
|
||||
|
||||
|
@ -197,7 +199,8 @@ CHEWOUT_FILES = \
|
|||
sscanf.def \
|
||||
tmpfile.def \
|
||||
tmpnam.def \
|
||||
vfprintf.def
|
||||
vfprintf.def \
|
||||
vfscanf.def
|
||||
|
||||
|
||||
SUFFIXES = .def
|
||||
|
@ -220,11 +223,12 @@ lib_a_DEPENDENCIES = vfiprintf.o
|
|||
lib_a_OBJECTS = clearerr.o fclose.o fdopen.o feof.o ferror.o fflush.o \
|
||||
fgetc.o fgetpos.o fgets.o fileno.o findfp.o fiprintf.o flags.o fopen.o \
|
||||
fprintf.o fputc.o fputs.o fread.o freopen.o fscanf.o fseek.o fsetpos.o \
|
||||
ftell.o fvwrite.o fwalk.o fwrite.o getc.o getchar.o gets.o getw.o iprintf.o \
|
||||
makebuf.o mktemp.o perror.o printf.o putc.o putchar.o puts.o putw.o refill.o \
|
||||
remove.o rename.o rewind.o rget.o scanf.o setbuf.o setvbuf.o siprintf.o \
|
||||
snprintf.o sprintf.o sscanf.o stdio.o tmpfile.o tmpnam.o ungetc.o \
|
||||
vfprintf.o vfscanf.o vprintf.o vsnprintf.o vsprintf.o wbuf.o wsetup.o
|
||||
ftell.o fvwrite.o fwalk.o fwrite.o getc.o getchar.o gets.o getw.o \
|
||||
iprintf.o makebuf.o mktemp.o perror.o printf.o putc.o putchar.o puts.o \
|
||||
putw.o refill.o remove.o rename.o rewind.o rget.o scanf.o setbuf.o \
|
||||
setvbuf.o siprintf.o snprintf.o sprintf.o sscanf.o stdio.o tmpfile.o \
|
||||
tmpnam.o ungetc.o vfprintf.o vfscanf.o vprintf.o vscanf.o vsnprintf.o \
|
||||
vsprintf.o vsscanf.o wbuf.o wsetup.o
|
||||
CFLAGS = @CFLAGS@
|
||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
CCLD = $(CC)
|
||||
|
@ -234,7 +238,7 @@ DIST_COMMON = Makefile.am Makefile.in
|
|||
|
||||
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||
|
||||
TAR = tar
|
||||
TAR = gtar
|
||||
GZIP_ENV = --best
|
||||
SOURCES = $(lib_a_SOURCES)
|
||||
OBJECTS = $(lib_a_OBJECTS)
|
||||
|
@ -320,7 +324,7 @@ distdir: $(DISTFILES)
|
|||
@for file in $(DISTFILES); do \
|
||||
if test -f $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
cp -pr $$/$$file $(distdir)/$$file; \
|
||||
cp -pr $$d/$$file $(distdir)/$$file; \
|
||||
else \
|
||||
test -f $(distdir)/$$file \
|
||||
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||
|
@ -437,6 +441,8 @@ ungetc.o: local.h
|
|||
vfiprintf.o: local.h
|
||||
vfprintf.o: local.h
|
||||
vfscanf.o: local.h floatio.h
|
||||
vscanf.o: local.h
|
||||
vsscanf.o: local.h
|
||||
wbuf.o: local.h fvwrite.h
|
||||
wsetup.o: local.h
|
||||
|
||||
|
|
|
@ -19,42 +19,61 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#ifdef _HAVE_STDC
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
extern int __svfscanf ();
|
||||
|
||||
int
|
||||
fscanf (FILE * fp, const char *fmt, ...)
|
||||
{
|
||||
int ret;
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, fmt);
|
||||
ret = __svfscanf (fp, fmt, ap);
|
||||
va_end (ap);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
extern int __svfscanf ();
|
||||
#include "local.h"
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
||||
int
|
||||
fscanf (fp, fmt, va_alist)
|
||||
#ifdef _HAVE_STDC
|
||||
fscanf (FILE *fp, const char *fmt, ...)
|
||||
#else
|
||||
fscanf (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);
|
||||
ret = __svfscanf (fp, fmt, ap);
|
||||
#endif
|
||||
ret = __svfscanf_r (_REENT, fp, fmt, ap);
|
||||
va_end (ap);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* !_REENT_ONLY */
|
||||
|
||||
int
|
||||
#ifdef _HAVE_STDC
|
||||
_fscanf_r (struct _reent *ptr, FILE *fp, const char *fmt, ...)
|
||||
#else
|
||||
_fscanf_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 = __svfscanf_r (ptr, fp, fmt, ap);
|
||||
va_end (ap);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#include <reent.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern int _EXFUN(__svfscanf,(FILE *, _CONST char *,va_list));
|
||||
extern int _EXFUN(__svfscanf_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 *));
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
#include "local.h"
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
||||
int
|
||||
|
@ -44,12 +46,12 @@ scanf (fmt, va_alist)
|
|||
#else
|
||||
va_start (ap);
|
||||
#endif
|
||||
ret = __svfscanf (_stdin_r (_REENT), fmt, ap);
|
||||
ret = __svfscanf_r (_REENT, _stdin_r (_REENT), fmt, ap);
|
||||
va_end (ap);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* !_REENT_ONLY */
|
||||
|
||||
int
|
||||
#ifdef _HAVE_STDC
|
||||
|
@ -69,7 +71,9 @@ _scanf_r (ptr, fmt, va_alist)
|
|||
#else
|
||||
va_start (ap);
|
||||
#endif
|
||||
ret = __svfscanf (_stdin_r (ptr), fmt, ap);
|
||||
ret = __svfscanf_r (ptr, _stdin_r (ptr), fmt, ap);
|
||||
va_end (ap);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -35,6 +35,11 @@ ANSI_SYNOPSIS
|
|||
int sscanf(const char *<[str]>, const char *<[format]>
|
||||
[, <[arg]>, ...]);
|
||||
|
||||
int _scanf_r(struct _reent *<[ptr]>, const char *<[format]> [, <[arg]>, ...]);
|
||||
int _fscanf_r(struct _reent *<[ptr]>, FILE *<[fd]>, const char *<[format]> [, <[arg]>, ...]);
|
||||
int _sscanf_r(struct _reent *<[ptr]>, const char *<[str]>, const char *<[format]>
|
||||
[, <[arg]>, ...]);
|
||||
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <stdio.h>
|
||||
|
@ -50,6 +55,20 @@ TRAD_SYNOPSIS
|
|||
char *<[str]>;
|
||||
char *<[format]>;
|
||||
|
||||
int _scanf_r(<[ptr]>, <[format]> [, <[arg]>, ...])
|
||||
struct _reent *<[ptr]>;
|
||||
char *<[format]>;
|
||||
|
||||
int _fscanf_r(<[ptr]>, <[fd]>, <[format]> [, <[arg]>, ...]);
|
||||
struct _reent *<[ptr]>;
|
||||
FILE *<[fd]>;
|
||||
char *<[format]>;
|
||||
|
||||
int _sscanf_r(<[ptr]>, <[str]>, <[format]> [, <[arg]>, ...]);
|
||||
struct _reent *<[ptr]>;
|
||||
char *<[str]>;
|
||||
char *<[format]>;
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
<<scanf>> scans a series of input fields from standard input,
|
||||
|
@ -74,6 +93,10 @@ DESCRIPTION
|
|||
source of input: <<fscanf>> reads from a file, and <<sscanf>>
|
||||
from a string.
|
||||
|
||||
The routines <<_scanf_r>>, <<_fscanf_r>>, and <<_sscanf_r>> are reentrant
|
||||
versions of <<scanf>>, <<fscanf>>, and <<sscanf>> that take an additional
|
||||
first argument pointing to a reentrancy structure.
|
||||
|
||||
The string at <<*<[format]>>> is a character sequence composed
|
||||
of zero or more directives. Directives are composed of
|
||||
one or more whitespace characters, non-whitespace characters,
|
||||
|
@ -353,6 +376,8 @@ eofread (cookie, buf, len)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
||||
#ifdef _HAVE_STDC
|
||||
int
|
||||
_DEFUN (sscanf, (str, fmt), _CONST char *str _AND _CONST char *fmt _DOTS)
|
||||
|
@ -380,7 +405,42 @@ sscanf (str, fmt, va_alist)
|
|||
#else
|
||||
va_start (ap);
|
||||
#endif
|
||||
ret = __svfscanf (&f, fmt, ap);
|
||||
ret = __svfscanf_r (_REENT, &f, fmt, ap);
|
||||
va_end (ap);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* !_REENT_ONLY */
|
||||
|
||||
#ifdef _HAVE_STDC
|
||||
int
|
||||
_DEFUN (_sscanf_r, (ptr, str, fmt), struct _reent *ptr _AND _CONST char *str _AND _CONST char *fmt _DOTS)
|
||||
#else
|
||||
int
|
||||
_sscanf_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;
|
||||
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._data = _REENT;
|
||||
#ifdef _HAVE_STDC
|
||||
va_start (ap, fmt);
|
||||
#else
|
||||
va_start (ap);
|
||||
#endif
|
||||
ret = __svfscanf_r (ptr, &f, fmt, ap);
|
||||
va_end (ap);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,91 @@
|
|||
/* No user fns here. Pesch 15apr92. */
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
<<vscanf>>, <<vfscanf>>, <<vsscanf>>---format argument list
|
||||
|
||||
INDEX
|
||||
vscanf
|
||||
INDEX
|
||||
vfscanf
|
||||
INDEX
|
||||
vsscanf
|
||||
|
||||
ANSI_SYNOPSIS
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
int vscanf(const char *<[fmt]>, va_list <[list]>);
|
||||
int vfscanf(FILE *<[fp]>, const char *<[fmt]>, va_list <[list]>);
|
||||
int vsscanf(const char *<[str]>, const char *<[fmt]>, va_list <[list]>);
|
||||
|
||||
int _vscanf_r(void *<[reent]>, const char *<[fmt]>,
|
||||
va_list <[list]>);
|
||||
int _vfscanf_r(void *<[reent]>, FILE *<[fp]>, const char *<[fmt]>,
|
||||
va_list <[list]>);
|
||||
int _vsscanf_r(void *<[reent]>, const char *<[str]>, const char *<[fmt]>,
|
||||
va_list <[list]>);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <stdio.h>
|
||||
#include <varargs.h>
|
||||
int vscanf( <[fmt]>, <[ist]>)
|
||||
char *<[fmt]>;
|
||||
va_list <[list]>;
|
||||
|
||||
int vfscanf( <[fp]>, <[fmt]>, <[list]>)
|
||||
FILE *<[fp]>;
|
||||
char *<[fmt]>;
|
||||
va_list <[list]>;
|
||||
|
||||
int vsscanf( <[str]>, <[fmt]>, <[list]>)
|
||||
char *<[str]>;
|
||||
char *<[fmt]>;
|
||||
va_list <[list]>;
|
||||
|
||||
int _vscanf_r( <[reent]>, <[fmt]>, <[ist]>)
|
||||
char *<[reent]>;
|
||||
char *<[fmt]>;
|
||||
va_list <[list]>;
|
||||
|
||||
int _vfscanf_r( <[reent]>, <[fp]>, <[fmt]>, <[list]>)
|
||||
char *<[reent]>;
|
||||
FILE *<[fp]>;
|
||||
char *<[fmt]>;
|
||||
va_list <[list]>;
|
||||
|
||||
int _vsscanf_r( <[reent]>, <[str]>, <[fmt]>, <[list]>)
|
||||
char *<[reent]>;
|
||||
char *<[str]>;
|
||||
char *<[fmt]>;
|
||||
va_list <[list]>;
|
||||
|
||||
DESCRIPTION
|
||||
<<vscanf>>, <<vfscanf>>, and <<vsscanf>> are (respectively) variants
|
||||
of <<scanf>>, <<fscanf>>, and <<sscanf>>. They differ only in
|
||||
allowing their caller to pass the variable argument list as a
|
||||
<<va_list>> object (initialized by <<va_start>>) rather than
|
||||
directly accepting a variable number of arguments.
|
||||
|
||||
RETURNS
|
||||
The return values are consistent with the corresponding functions:
|
||||
<<vscanf>> returns the number of input fields successfully scanned,
|
||||
converted, and stored; the return value does not include scanned
|
||||
fields which were not stored.
|
||||
|
||||
If <<vscanf>> attempts to read at end-of-file, the return value
|
||||
is <<EOF>>.
|
||||
|
||||
If no fields were stored, the return value is <<0>>.
|
||||
|
||||
The routines <<_vscanf_r>>, <<_vfscanf_f>>, and <<_vsscanf_r>> are
|
||||
reentrant versions which take an additional first parameter which points to the
|
||||
reentrancy structure.
|
||||
|
||||
PORTABILITY
|
||||
These are GNU extensions.
|
||||
|
||||
Supporting OS subroutines required:
|
||||
*/
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1990 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
|
@ -104,11 +189,46 @@ extern _LONG_DOUBLE _strtold _PARAMS((char *s, char **sptr));
|
|||
|
||||
#define BufferEmpty (fp->_r <= 0 && __srefill(fp))
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
||||
int
|
||||
_DEFUN (vfscanf, (fp, fmt, ap),
|
||||
register FILE *fp _AND
|
||||
_CONST char *fmt _AND
|
||||
va_list ap)
|
||||
{
|
||||
CHECK_INIT(fp);
|
||||
return __svfscanf_r (fp->_data, fp, fmt, ap);
|
||||
}
|
||||
|
||||
int
|
||||
__svfscanf (fp, fmt0, ap)
|
||||
register FILE *fp;
|
||||
char _CONST *fmt0;
|
||||
va_list ap;
|
||||
{
|
||||
return __svfscanf_r (_REENT, fp, fmt0, ap);
|
||||
}
|
||||
|
||||
#endif /* !_REENT_ONLY */
|
||||
|
||||
int
|
||||
_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);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__svfscanf_r (rptr, fp, fmt0, ap)
|
||||
struct _reent *rptr;
|
||||
register FILE *fp;
|
||||
char _CONST *fmt0;
|
||||
va_list ap;
|
||||
{
|
||||
register u_char *fmt = (u_char *) fmt0;
|
||||
register int c; /* character from format, or conversion */
|
||||
|
@ -149,7 +269,7 @@ __svfscanf (fp, fmt0, ap)
|
|||
#ifndef MB_CAPABLE
|
||||
wc = *fmt;
|
||||
#else
|
||||
nbytes = _mbtowc_r (_REENT, &wc, fmt, MB_CUR_MAX, &state);
|
||||
nbytes = _mbtowc_r (rptr, &wc, fmt, MB_CUR_MAX, &state);
|
||||
#endif
|
||||
fmt += nbytes;
|
||||
if (wc == 0)
|
||||
|
@ -235,13 +355,13 @@ __svfscanf (fp, fmt0, ap)
|
|||
/* FALLTHROUGH */
|
||||
case 'd':
|
||||
c = CT_INT;
|
||||
ccfn = (u_long (*)())strtol;
|
||||
ccfn = (u_long (*)())_strtol_r;
|
||||
base = 10;
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
c = CT_INT;
|
||||
ccfn = (u_long (*)())strtol;
|
||||
ccfn = (u_long (*)())_strtol_r;
|
||||
base = 0;
|
||||
break;
|
||||
|
||||
|
@ -250,13 +370,13 @@ __svfscanf (fp, fmt0, ap)
|
|||
/* FALLTHROUGH */
|
||||
case 'o':
|
||||
c = CT_INT;
|
||||
ccfn = strtoul;
|
||||
ccfn = _strtoul_r;
|
||||
base = 8;
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
c = CT_INT;
|
||||
ccfn = strtoul;
|
||||
ccfn = _strtoul_r;
|
||||
base = 10;
|
||||
break;
|
||||
|
||||
|
@ -264,7 +384,7 @@ __svfscanf (fp, fmt0, ap)
|
|||
case 'x':
|
||||
flags |= PFXOK; /* enable 0x prefixing */
|
||||
c = CT_INT;
|
||||
ccfn = strtoul;
|
||||
ccfn = _strtoul_r;
|
||||
base = 16;
|
||||
break;
|
||||
|
||||
|
@ -298,7 +418,7 @@ __svfscanf (fp, fmt0, ap)
|
|||
case 'p': /* pointer format is like hex */
|
||||
flags |= POINTER | PFXOK;
|
||||
c = CT_INT;
|
||||
ccfn = strtoul;
|
||||
ccfn = _strtoul_r;
|
||||
base = 16;
|
||||
break;
|
||||
|
||||
|
@ -332,7 +452,7 @@ __svfscanf (fp, fmt0, ap)
|
|||
if (isupper (c))
|
||||
flags |= LONG;
|
||||
c = CT_INT;
|
||||
ccfn = (u_long (*)())strtol;
|
||||
ccfn = (u_long (*)())_strtol_r;
|
||||
base = 10;
|
||||
break;
|
||||
}
|
||||
|
@ -663,7 +783,7 @@ __svfscanf (fp, fmt0, ap)
|
|||
u_long res;
|
||||
|
||||
*p = 0;
|
||||
res = (*ccfn) (buf, (char **) NULL, base);
|
||||
res = (*ccfn) (rptr, buf, (char **) NULL, base);
|
||||
if (flags & POINTER)
|
||||
*(va_arg (ap, _PTR *)) = (_PTR) (unsigned _POINTER_INT) res;
|
||||
else if (flags & SHORT)
|
||||
|
@ -835,7 +955,7 @@ __svfscanf (fp, fmt0, ap)
|
|||
exp_start = p;
|
||||
}
|
||||
else if (exp_adjust)
|
||||
new_exp = atol (exp_start + 1) - exp_adjust;
|
||||
new_exp = _strtol_r (rptr, (exp_start + 1), NULL, 10) - exp_adjust;
|
||||
if (exp_adjust)
|
||||
{
|
||||
|
||||
|
@ -846,7 +966,7 @@ __svfscanf (fp, fmt0, ap)
|
|||
sprintf (exp_start, "e%ld", new_exp);
|
||||
}
|
||||
#ifdef _NO_LONGDBL
|
||||
res = atof (buf);
|
||||
res = _strtod_r (rptr, buf, NULL);
|
||||
#else /* !_NO_LONGDBL */
|
||||
res = _strtold (buf, NULL);
|
||||
#endif /* !_NO_LONGDBL */
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
/*-
|
||||
* Code created by modifying scanf.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 <stdio.h>
|
||||
#include "local.h"
|
||||
|
||||
#ifdef _HAVE_STDC
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* vscanf
|
||||
*/
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
||||
int
|
||||
_DEFUN (vscanf, (fmt, ap),
|
||||
_CONST char *fmt _AND
|
||||
va_list ap)
|
||||
{
|
||||
return __svfscanf_r (_REENT, _stdin_r (_REENT), fmt, ap);
|
||||
}
|
||||
|
||||
#endif /* !_REENT_ONLY */
|
||||
|
||||
int
|
||||
_DEFUN (_vscanf_r, (ptr, fmt, ap),
|
||||
struct _reent *ptr _AND
|
||||
_CONST char *fmt _AND
|
||||
va_list ap)
|
||||
{
|
||||
return __svfscanf_r (ptr, _stdin_r (ptr), fmt, ap);
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* Code created by modifying scanf.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 <reent.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#ifdef _HAVE_STDC
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
#include "local.h"
|
||||
|
||||
static
|
||||
_READ_WRITE_RETURN_TYPE
|
||||
eofread1 (cookie, buf, len)
|
||||
_PTR cookie;
|
||||
char *buf;
|
||||
int len;
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* vsscanf
|
||||
*/
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
||||
int
|
||||
_DEFUN (vsscanf, (str, fmt, ap),
|
||||
_CONST char *str _AND
|
||||
_CONST char *fmt _AND
|
||||
va_list ap)
|
||||
{
|
||||
return _vsscanf_r (_REENT, str, fmt, ap);
|
||||
}
|
||||
|
||||
#endif /* !_REENT_ONLY */
|
||||
|
||||
int
|
||||
_DEFUN (_vsscanf_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;
|
||||
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._data = ptr;
|
||||
return __svfscanf_r (ptr, &f, fmt, ap);
|
||||
}
|
||||
|
|
@ -725,7 +725,7 @@ _DEFUN (strtodf, (s00, se),
|
|||
_CONST char *s00 _AND
|
||||
char **se)
|
||||
{
|
||||
return strtod (s00, se);
|
||||
return _strtod_r (_REENT, s00, se);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue