diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2006-09-26 21:22:19 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2006-09-26 21:22:19 +0000 |
commit | e5e148d15bacc36f205aa49edea0fc53df2a38c0 (patch) | |
tree | b3daac4ea5f2db51fa5c5e10722e04f3b63a57c5 /newlib/libc/stdio | |
parent | 1aeca89244e9560c7494792cf4524547038504e8 (diff) | |
download | newlib-e5e148d15bacc36f205aa49edea0fc53df2a38c0.zip newlib-e5e148d15bacc36f205aa49edea0fc53df2a38c0.tar.gz newlib-e5e148d15bacc36f205aa49edea0fc53df2a38c0.tar.bz2 |
2006-09-26 Jeff Johnston <jjohnstn@redhat.com>
* libc/include/stdio.h[_REENT_SMALL]: Do not allow macros
for clearerr, feof, or fileno.
* libc/include/sys/reent.h[_REENT_SMALL](struct _reent): Change
the dummy std stream scheme to use pointers to const external
fake files, one for each standard stream.
* libc/stdio/local.h (CHECK_INIT): Change to take a file pointer
argument. For _REENT_SMALL, reset the file pointer if it
matches one of the fake std stream pointers.
* libc/stdio/clearerr.c: Fix CHECK_INIT macro to add file pointer
argument.
* libc/stdio/fclose.c: Ditto.
* libc/stdio/feof.c: Ditto.
* libc/stdio/ferror.c: Ditto.
* libc/stdio/fflush.c: Ditto.
* libc/stdio/fgetc.c: Ditto.
* libc/stdio/fgets.c: Ditto.
* libc/stdio/fileno.c: Ditto.
* libc/stdio/findfp.c: Ditto.
* libc/stdio/fputc.c: Ditto.
* libc/stdio/fputs.c: Ditto.
* libc/stdio/fread.c: Ditto.
* libc/stdio/freopen.c: Ditto.
* libc/stdio/fseek.c: Ditto.
* libc/stdio/ftell.c: Ditto.
* libc/stdio/fwrite.c: Ditto.
* libc/stdio/getc.c: Ditto.
* libc/stdio/getdelim.c: Ditto.
* libc/stdio/putc.c: Ditto.
* libc/stdio/refill.c: Ditto.
* libc/stdio/setvbuf.c: Ditto.
* libc/stdio/ungetc.c: Ditto.
* libc/stdio/vfprintf.c: Ditto.
* libc/stdio/vfscanf.c: Ditto.
* libc/stdio/wbuf.c: Ditto.: Ditto.
* libc/stdio/wsetup.c: Ditto.
* libc/stdio64/freopen64.c: Ditto.
* libc/stdio64/fseeko64.c: Ditto.
* libc/stdio64/ftello64.c: Ditto.
* libc/machine/powerpc/vfprintf.c: Ditto.
* libc/machine/powerpc/vfscanf.c: Ditto.
Diffstat (limited to 'newlib/libc/stdio')
27 files changed, 64 insertions, 31 deletions
diff --git a/newlib/libc/stdio/clearerr.c b/newlib/libc/stdio/clearerr.c index 0923ff8..d3b620b 100644 --- a/newlib/libc/stdio/clearerr.c +++ b/newlib/libc/stdio/clearerr.c @@ -64,7 +64,7 @@ _VOID _DEFUN(clearerr, (fp), FILE * fp) { - CHECK_INIT(_REENT); + CHECK_INIT(_REENT, fp); _flockfile (fp); __sclearerr (fp); _funlockfile (fp); diff --git a/newlib/libc/stdio/fclose.c b/newlib/libc/stdio/fclose.c index 66d71c2..bb3acb6 100644 --- a/newlib/libc/stdio/fclose.c +++ b/newlib/libc/stdio/fclose.c @@ -76,7 +76,7 @@ _DEFUN(_fclose_r, (rptr, fp), __sfp_lock_acquire (); - CHECK_INIT (rptr); + CHECK_INIT (rptr, fp); _flockfile (fp); diff --git a/newlib/libc/stdio/feof.c b/newlib/libc/stdio/feof.c index aff4e84..e8db65b 100644 --- a/newlib/libc/stdio/feof.c +++ b/newlib/libc/stdio/feof.c @@ -57,7 +57,7 @@ _DEFUN(feof, (fp), FILE * fp) { int result; - CHECK_INIT(_REENT); + CHECK_INIT(_REENT, fp); _flockfile (fp); result = __sfeof (fp); _funlockfile (fp); diff --git a/newlib/libc/stdio/ferror.c b/newlib/libc/stdio/ferror.c index ea701be..72b7ce2 100644 --- a/newlib/libc/stdio/ferror.c +++ b/newlib/libc/stdio/ferror.c @@ -66,7 +66,7 @@ _DEFUN(ferror, (fp), FILE * fp) { int result; - CHECK_INIT(_REENT); + CHECK_INIT(_REENT, fp); _flockfile (fp); result = __sferror (fp); _funlockfile (fp); diff --git a/newlib/libc/stdio/fflush.c b/newlib/libc/stdio/fflush.c index 05084dd..bac4980 100644 --- a/newlib/libc/stdio/fflush.c +++ b/newlib/libc/stdio/fflush.c @@ -67,7 +67,7 @@ _DEFUN(fflush, (fp), if (fp == NULL) return _fwalk (_GLOBAL_REENT, fflush); - CHECK_INIT (_REENT); + CHECK_INIT (_REENT, fp); _flockfile (fp); diff --git a/newlib/libc/stdio/fgetc.c b/newlib/libc/stdio/fgetc.c index 1802acf..e275cfe 100644 --- a/newlib/libc/stdio/fgetc.c +++ b/newlib/libc/stdio/fgetc.c @@ -77,7 +77,7 @@ _DEFUN(_fgetc_r, (ptr, fp), FILE * fp) { int result; - CHECK_INIT(ptr); + CHECK_INIT(ptr, fp); _flockfile (fp); result = __sgetc_r (ptr, fp); _funlockfile (fp); @@ -92,7 +92,7 @@ _DEFUN(fgetc, (fp), { #if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) int result; - CHECK_INIT(_REENT); + CHECK_INIT(_REENT, fp); _flockfile (fp); result = __sgetc_r (_REENT, fp); _funlockfile (fp); diff --git a/newlib/libc/stdio/fgets.c b/newlib/libc/stdio/fgets.c index 7416187..7f02e3f 100644 --- a/newlib/libc/stdio/fgets.c +++ b/newlib/libc/stdio/fgets.c @@ -96,7 +96,7 @@ _DEFUN(_fgets_r, (ptr, buf, n, fp), s = buf; - CHECK_INIT(ptr); + CHECK_INIT(ptr, fp); _flockfile (fp); #ifdef __SCLE diff --git a/newlib/libc/stdio/fileno.c b/newlib/libc/stdio/fileno.c index b202cc5..db399eb 100644 --- a/newlib/libc/stdio/fileno.c +++ b/newlib/libc/stdio/fileno.c @@ -54,7 +54,7 @@ _DEFUN(fileno, (f), FILE * f) { int result; - CHECK_INIT (_REENT); + CHECK_INIT (_REENT, f); _flockfile (f); result = __sfileno (f); _funlockfile (f); diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c index e3270af..ac13546 100644 --- a/newlib/libc/stdio/findfp.c +++ b/newlib/libc/stdio/findfp.c @@ -26,6 +26,15 @@ #include <sys/lock.h> #include "local.h" +#ifdef _REENT_SMALL +const struct __sFILE_fake __sf_fake_stdin = + {_NULL, 0, 0, 0, 0, {_NULL, 0}, 0, _NULL}; +const struct __sFILE_fake __sf_fake_stdout = + {_NULL, 0, 0, 0, 0, {_NULL, 0}, 0, _NULL}; +const struct __sFILE_fake __sf_fake_stderr = + {_NULL, 0, 0, 0, 0, {_NULL, 0}, 0, _NULL}; +#endif + static _VOID _DEFUN(std, (ptr, flags, file, data), FILE *ptr _AND diff --git a/newlib/libc/stdio/fputc.c b/newlib/libc/stdio/fputc.c index 520fc02..777a342 100644 --- a/newlib/libc/stdio/fputc.c +++ b/newlib/libc/stdio/fputc.c @@ -82,7 +82,7 @@ _DEFUN(_fputc_r, (ptr, ch, file), FILE * file) { int result; - CHECK_INIT(ptr); + CHECK_INIT(ptr, file); _flockfile (file); result = _putc_r (ptr, ch, file); _funlockfile (file); @@ -97,7 +97,7 @@ _DEFUN(fputc, (ch, file), { #if !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) int result; - CHECK_INIT(_REENT); + CHECK_INIT(_REENT, file); _flockfile (file); result = _putc_r (_REENT, ch, file); _funlockfile (file); diff --git a/newlib/libc/stdio/fputs.c b/newlib/libc/stdio/fputs.c index 93537b9..24a108b 100644 --- a/newlib/libc/stdio/fputs.c +++ b/newlib/libc/stdio/fputs.c @@ -86,7 +86,7 @@ _DEFUN(_fputs_r, (ptr, s, fp), uio.uio_iov = &iov; uio.uio_iovcnt = 1; - CHECK_INIT(ptr); + CHECK_INIT(ptr, fp); _flockfile (fp); result = __sfvwrite_r (ptr, fp, &uio); diff --git a/newlib/libc/stdio/fread.c b/newlib/libc/stdio/fread.c index d87d9f9..c2c2489 100644 --- a/newlib/libc/stdio/fread.c +++ b/newlib/libc/stdio/fread.c @@ -145,7 +145,7 @@ _DEFUN(_fread_r, (ptr, buf, size, count, fp), if ((resid = count * size) == 0) return 0; - CHECK_INIT(ptr); + CHECK_INIT(ptr, fp); _flockfile (fp); if (fp->_r < 0) diff --git a/newlib/libc/stdio/freopen.c b/newlib/libc/stdio/freopen.c index f1fc9da..445baf1 100644 --- a/newlib/libc/stdio/freopen.c +++ b/newlib/libc/stdio/freopen.c @@ -99,7 +99,7 @@ _DEFUN(_freopen_r, (ptr, file, mode, fp), __sfp_lock_acquire (); - CHECK_INIT (ptr); + CHECK_INIT (ptr, fp); _flockfile (fp); diff --git a/newlib/libc/stdio/fseek.c b/newlib/libc/stdio/fseek.c index 09edc42..9944fd8 100644 --- a/newlib/libc/stdio/fseek.c +++ b/newlib/libc/stdio/fseek.c @@ -131,7 +131,7 @@ _DEFUN(_fseek_r, (ptr, fp, offset, whence), /* Make sure stdio is set up. */ - CHECK_INIT (ptr); + CHECK_INIT (ptr, fp); _flockfile (fp); diff --git a/newlib/libc/stdio/ftell.c b/newlib/libc/stdio/ftell.c index 74d6d90..de5d55d 100644 --- a/newlib/libc/stdio/ftell.c +++ b/newlib/libc/stdio/ftell.c @@ -107,7 +107,7 @@ _DEFUN(_ftell_r, (ptr, fp), /* Ensure stdio is set up. */ - CHECK_INIT (ptr); + CHECK_INIT (ptr, fp); _flockfile (fp); diff --git a/newlib/libc/stdio/fwrite.c b/newlib/libc/stdio/fwrite.c index dd739d6..3443d95 100644 --- a/newlib/libc/stdio/fwrite.c +++ b/newlib/libc/stdio/fwrite.c @@ -117,7 +117,7 @@ _DEFUN(_fwrite_r, (ptr, buf, size, count, fp), * generally slow and since this occurs whenever size==0. */ - CHECK_INIT(ptr); + CHECK_INIT(ptr, fp); _flockfile (fp); if (__sfvwrite_r (ptr, fp, &uio) == 0) diff --git a/newlib/libc/stdio/getc.c b/newlib/libc/stdio/getc.c index c02fe6b..5b1fa88 100644 --- a/newlib/libc/stdio/getc.c +++ b/newlib/libc/stdio/getc.c @@ -91,7 +91,7 @@ _DEFUN(_getc_r, (ptr, fp), register FILE *fp) { int result; - CHECK_INIT (ptr); + CHECK_INIT (ptr, fp); _flockfile (fp); result = __sgetc_r (ptr, fp); _funlockfile (fp); @@ -105,7 +105,7 @@ _DEFUN(getc, (fp), register FILE *fp) { int result; - CHECK_INIT (_REENT); + CHECK_INIT (_REENT, fp); _flockfile (fp); result = __sgetc_r (_REENT, fp); _funlockfile (fp); diff --git a/newlib/libc/stdio/getdelim.c b/newlib/libc/stdio/getdelim.c index 0fdfb3a..23fc502 100644 --- a/newlib/libc/stdio/getdelim.c +++ b/newlib/libc/stdio/getdelim.c @@ -79,7 +79,7 @@ _DEFUN(__getdelim, (bufptr, n, delim, fp), *n = DEFAULT_LINE_SIZE; } - CHECK_INIT (_REENT); + CHECK_INIT (_REENT, fp); _flockfile (fp); diff --git a/newlib/libc/stdio/local.h b/newlib/libc/stdio/local.h index 301abce..9ae9b40 100644 --- a/newlib/libc/stdio/local.h +++ b/newlib/libc/stdio/local.h @@ -48,7 +48,31 @@ struct _glue * _EXFUN(__sfmoreglue,(struct _reent *,int n)); /* Called by the main entry point fns to ensure stdio has been initialized. */ -#define CHECK_INIT(ptr) \ +#ifdef _REENT_SMALL +#define CHECK_INIT(ptr, fp) \ + do \ + { \ + if ((ptr) && !(ptr)->__sdidinit) \ + __sinit (ptr); \ + if ((fp) == (FILE *)&__sf_fake_stdin) \ + (fp) = stdin; \ + else if ((fp) == (FILE *)&__sf_fake_stdout) \ + (fp) = stdout; \ + else if ((fp) == (FILE *)&__sf_fake_stderr) \ + (fp) = stderr; \ + } \ + while (0) +#else /* !_REENT_SMALL */ +#define CHECK_INIT(ptr, fp) \ + do \ + { \ + if ((ptr) && !(ptr)->__sdidinit) \ + __sinit (ptr); \ + } \ + while (0) +#endif /* !_REENT_SMALL */ + +#define CHECK_STD_INIT(ptr) \ do \ { \ if ((ptr) && !(ptr)->__sdidinit) \ diff --git a/newlib/libc/stdio/putc.c b/newlib/libc/stdio/putc.c index b3008e2..667324d 100644 --- a/newlib/libc/stdio/putc.c +++ b/newlib/libc/stdio/putc.c @@ -96,7 +96,7 @@ _DEFUN(_putc_r, (ptr, c, fp), register FILE *fp) { int result; - CHECK_INIT (ptr); + CHECK_INIT (ptr, fp); _flockfile (fp); result = __sputc_r (ptr, c, fp); _funlockfile (fp); @@ -111,7 +111,7 @@ _DEFUN(putc, (c, fp), { #if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) int result; - CHECK_INIT (_REENT); + CHECK_INIT (_REENT, fp); _flockfile (fp); result = __sputc_r (_REENT, c, fp); _funlockfile (fp); diff --git a/newlib/libc/stdio/refill.c b/newlib/libc/stdio/refill.c index 047387e..75ba056 100644 --- a/newlib/libc/stdio/refill.c +++ b/newlib/libc/stdio/refill.c @@ -43,7 +43,7 @@ _DEFUN(__srefill_r, (ptr, fp), { /* make sure stdio is set up */ - CHECK_INIT (_REENT); + CHECK_INIT (_REENT, fp); fp->_r = 0; /* largely a convenience for callers */ diff --git a/newlib/libc/stdio/setvbuf.c b/newlib/libc/stdio/setvbuf.c index f6871c5..561f68b 100644 --- a/newlib/libc/stdio/setvbuf.c +++ b/newlib/libc/stdio/setvbuf.c @@ -104,7 +104,7 @@ _DEFUN(setvbuf, (fp, buf, mode, size), { int ret = 0; - CHECK_INIT (_REENT); + CHECK_INIT (_REENT, fp); _flockfile (fp); diff --git a/newlib/libc/stdio/ungetc.c b/newlib/libc/stdio/ungetc.c index fc6fa31..333baa2 100644 --- a/newlib/libc/stdio/ungetc.c +++ b/newlib/libc/stdio/ungetc.c @@ -81,7 +81,7 @@ _DEFUN(_ungetc_r, (rptr, c, fp), ??? Might be able to remove this as some other stdio routine should have already been called to get the char we are un-getting. */ - CHECK_INIT (rptr); + CHECK_INIT (rptr, fp); _flockfile (fp); diff --git a/newlib/libc/stdio/vfprintf.c b/newlib/libc/stdio/vfprintf.c index 9e5477a..91b2c23 100644 --- a/newlib/libc/stdio/vfprintf.c +++ b/newlib/libc/stdio/vfprintf.c @@ -540,7 +540,7 @@ _DEFUN(_VFPRINTF_R, (data, fp, fmt0, ap), (u_long)GET_ARG (N, ap, u_int)) #endif - CHECK_INIT (data); + CHECK_INIT (data, fp); _flockfile (fp); /* sorry, fprintf(read_only_file, "") returns EOF, not 0 */ diff --git a/newlib/libc/stdio/vfscanf.c b/newlib/libc/stdio/vfscanf.c index 7bf0aaf..c9808bb 100644 --- a/newlib/libc/stdio/vfscanf.c +++ b/newlib/libc/stdio/vfscanf.c @@ -231,7 +231,7 @@ _DEFUN(VFSCANF, (fp, fmt, ap), _CONST char *fmt _AND va_list ap) { - CHECK_INIT(_REENT); + CHECK_INIT(_REENT, fp); return __SVFSCANF_R (_REENT, fp, fmt, ap); } @@ -253,7 +253,7 @@ _DEFUN(_VFSCANF_R, (data, fp, fmt, ap), _CONST char *fmt _AND va_list ap) { - CHECK_INIT(data); + CHECK_INIT(data, fp); return __SVFSCANF_R (data, fp, fmt, ap); } diff --git a/newlib/libc/stdio/wbuf.c b/newlib/libc/stdio/wbuf.c index 0d2b72e..5f1e85a 100644 --- a/newlib/libc/stdio/wbuf.c +++ b/newlib/libc/stdio/wbuf.c @@ -42,7 +42,7 @@ _DEFUN(__swbuf_r, (ptr, c, fp), /* Ensure stdio has been initialized. */ - CHECK_INIT (ptr); + CHECK_INIT (ptr, fp); /* * In case we cannot write, or longjmp takes us out early, diff --git a/newlib/libc/stdio/wsetup.c b/newlib/libc/stdio/wsetup.c index cf56c2a..ba98813 100644 --- a/newlib/libc/stdio/wsetup.c +++ b/newlib/libc/stdio/wsetup.c @@ -34,7 +34,7 @@ _DEFUN(__swsetup, (fp), { /* Make sure stdio is set up. */ - CHECK_INIT (_REENT); + CHECK_INIT (_REENT, fp); /* * If we are not writing, we had better be reading and writing. |