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:
Jeff Johnston 2001-04-20 22:50:51 +00:00
parent 3c8e92d9fc
commit 52cb9e6934
13 changed files with 441 additions and 57 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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));

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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 *));

View 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);
}

View File

@ -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;
}

View File

@ -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 */

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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