[PATCH]: Implement fwide (was Re: swprintf() and friends?)

Corinna Vinschen vinschen@redhat.com
Fri Nov 7 17:44:00 GMT 2008


On Nov  3 16:26, Jeff Johnston wrote:
> Adding additional fields to __sFILE and __sFILE64 should be ok and no, I 
> wouldn't just support wide I/O only on large files.
>
> I would start by adding a _flags2 field in a regular __sFILE which makes it 
> consistent with __sFILE64.  This will be outside of the fake std stream 
> support.  Anything that can be checked on a non-resolved fake std stream 
> "has" to be in _flags.  This includes operations where we don't want to 
> resolve the stream (e.g. checking the error or EOF flags).  After that, it 
> is optional where a flag goes.
>
> At quick glance, the __SMOD flag can definitely be moved to _flags2 as it 
> is never set in newlib code and never checked except by fseek and only 
> after resolving any std stream.  I assume it is a Cygwin creation as it was 
> added by  cgf in 2000 for fgetline.c which doesn't exist in newlib.  If 
> this is not used by Cygwin, we should toss it altogether.  Either way, it 
> frees up one bit.
>
> For fwide support, I assume you mean two bits and yes, I believe two bits 
> would work.  One bit would mean decided (0 = undecided) and this should 
> take the free bit I mention above.  The __srefill_r and __sfvwrite_r 
> functions could be modified to stamp a file as being narrow/wide and 
> decided, if currently undecided (an extra argument would be needed to these 
> functions to say which type of fn was calling).  If setting and the file is 
> already undecided, then we must resolve any std stream first.  The decided 
> orientation bit would be in _flags (0 = narrow, 1 = wide).
>
> Mixing of narrow/wide functions is undefined behavior.

As a starting point I removed the __SMOD flag and created two new flags
__SORD and __SWID, the latter for _flags2 and using the same bit mask
as __SORD.  I also created two functions fwide and _fwide_r.  Other than
that the new orientation bits are not used so far.  We can build the other
missing functionality slowly around this.

Is that ok?


Thanks,
Corinna


	* libc/include/stdio.h (__SMOD): Remove.
	(__SORD): Add using the same bit mask as the former __SMOD.
	(__SWID): Add as first flag for the _flags2 member.
	* libc/include/wchar.h (fwide): Declare.
	(_fwide_r): Declare.
	* libc/include/sys/reent.h (struct __sFILE): Add _flags2 member.
	(struct __sFILE64): Tweak _flags2 comment.
	* libc/stdio/Makefile.am: Accommodate new fwide.c.
	* libc/stdio/Makefile.in: Regenerate.
	* libc/stdio/findfp.c (std): Set _flags2 to 0.
	(__sfp): Ditto.
	* libc/stdio/fwide.c: New file implementing fwide and _fwide_r.
	* libc/stdio/refill.c (__srefill_r): Drop resetting __SMOD flag.
	* libc/stdio/vfscanf.c (__ssrefill_r): Ditto.
	* libc/stdio/fseek.c (_fseek_r): Drop checking __SMOD flag.
	* libc/stdio64/fseeko64.c (_fseeko64_r): Ditto.


Index: libc/include/stdio.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/stdio.h,v
retrieving revision 1.49
diff -u -p -r1.49 stdio.h
--- libc/include/stdio.h	23 Apr 2008 11:13:24 -0000	1.49
+++ libc/include/stdio.h	7 Nov 2008 14:07:05 -0000
@@ -78,12 +78,15 @@ typedef _fpos64_t fpos64_t;
 #define	__SOPT	0x0400		/* do fseek() optimisation */
 #define	__SNPT	0x0800		/* do not do fseek() optimisation */
 #define	__SOFF	0x1000		/* set iff _offset is in fact correct */
-#define	__SMOD	0x2000		/* true => fgetline modified _p text */
+#define	__SORD	0x2000		/* true => stream orientation (byte/wide) decided */
 #if defined(__CYGWIN__)
 #  define __SCLE  0x4000        /* convert line endings CR/LF <-> NL */
 #endif
 #define	__SL64	0x8000		/* is 64-bit offset large file */
 
+/* _flags2 flags */
+#define	__SWID	0x2000		/* true => stream orientation wide, false => byte, only valid if __SORD in _flags is true */
+
 /*
  * The following three definitions are for ANSI C, which took them
  * from System V, which stupidly took internal interface macros and
Index: libc/include/wchar.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/wchar.h,v
retrieving revision 1.16
diff -u -p -r1.16 wchar.h
--- libc/include/wchar.h	19 Dec 2007 17:33:11 -0000	1.16
+++ libc/include/wchar.h	7 Nov 2008 14:07:05 -0000
@@ -90,6 +90,9 @@ long long _EXFUN(_wcstoll_r, (struct _re
 unsigned long _EXFUN(_wcstoul_r, (struct _reent *, const wchar_t *, wchar_t **, int));
 unsigned long long _EXFUN(_wcstoull_r, (struct _reent *, const wchar_t *, wchar_t **, int));
 
+int _EXFUN (fwide, (FILE *, int));
+int _EXFUN (_fwide_r, (struct _reent *, FILE *, int));
+
 _END_STD_C
 
 #endif /* _WCHAR_H_ */
Index: libc/include/sys/reent.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/sys/reent.h,v
retrieving revision 1.43
diff -u -p -r1.43 reent.h
--- libc/include/sys/reent.h	2 Oct 2008 16:43:23 -0000	1.43
+++ libc/include/sys/reent.h	7 Nov 2008 14:07:05 -0000
@@ -212,6 +212,7 @@ struct __sFILE {
 #ifndef __SINGLE_THREAD__
   _flock_t _lock;	/* for thread-safety locking */
 #endif
+  int   _flags2;        /* More flags. */
 };
 
 #ifdef __CUSTOM_FILE_IO__
@@ -256,7 +257,7 @@ struct __sFILE64 {
 
   /* Unix stdio files get aligned to block boundaries on fseek() */
   int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
-  int   _flags2;        /* for future use */
+  int   _flags2;        /* More flags. */
 
   _off64_t _offset;     /* current lseek offset */
   _fpos64_t _EXFUN((*_seek64),(struct _reent *, _PTR, _fpos64_t, int));
Index: libc/stdio/Makefile.am
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/Makefile.am,v
retrieving revision 1.28
diff -u -p -r1.28 Makefile.am
--- libc/stdio/Makefile.am	14 Apr 2008 21:14:55 -0000	1.28
+++ libc/stdio/Makefile.am	7 Nov 2008 14:07:05 -0000
@@ -31,6 +31,7 @@ GENERAL_SOURCES = \
 	ftell.c			\
 	fvwrite.c			\
 	fwalk.c			\
+	fwide.c			\
 	fwrite.c			\
 	getc.c				\
 	getchar.c			\
@@ -206,6 +207,7 @@ CHEWOUT_FILES = \
 	fsetpos.def		\
 	ftell.def		\
 	funopen.def		\
+	fwide.def		\
 	fwrite.def		\
 	getc.def		\
 	getc_u.def		\
@@ -273,6 +275,7 @@ $(lpfx)ftell.$(oext): local.h
 $(lpfx)funopen.$(oext): local.h
 $(lpfx)fvwrite.$(oext): local.h fvwrite.h
 $(lpfx)fwalk.$(oext): local.h
+$(lpfx)fwide.$(oext): local.h
 $(lpfx)fwrite.$(oext): local.h fvwrite.h
 $(lpfx)iscanf.$(oext): local.h
 $(lpfx)makebuf.$(oext): local.h
Index: libc/stdio/Makefile.in
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/Makefile.in,v
retrieving revision 1.42
diff -u -p -r1.42 Makefile.in
--- libc/stdio/Makefile.in	29 Sep 2008 15:40:41 -0000	1.42
+++ libc/stdio/Makefile.in	7 Nov 2008 14:07:05 -0000
@@ -74,33 +74,33 @@ am__objects_1 = lib_a-clearerr.$(OBJEXT)
 	lib_a-fiscanf.$(OBJEXT) lib_a-fseek.$(OBJEXT) \
 	lib_a-fsetpos.$(OBJEXT) lib_a-ftell.$(OBJEXT) \
 	lib_a-fvwrite.$(OBJEXT) lib_a-fwalk.$(OBJEXT) \
-	lib_a-fwrite.$(OBJEXT) lib_a-getc.$(OBJEXT) \
-	lib_a-getchar.$(OBJEXT) lib_a-getc_u.$(OBJEXT) \
-	lib_a-getchar_u.$(OBJEXT) lib_a-getdelim.$(OBJEXT) \
-	lib_a-getline.$(OBJEXT) lib_a-gets.$(OBJEXT) \
-	lib_a-iprintf.$(OBJEXT) lib_a-iscanf.$(OBJEXT) \
-	lib_a-makebuf.$(OBJEXT) lib_a-perror.$(OBJEXT) \
-	lib_a-printf.$(OBJEXT) lib_a-putc.$(OBJEXT) \
-	lib_a-putchar.$(OBJEXT) lib_a-putc_u.$(OBJEXT) \
-	lib_a-putchar_u.$(OBJEXT) lib_a-puts.$(OBJEXT) \
-	lib_a-refill.$(OBJEXT) lib_a-remove.$(OBJEXT) \
-	lib_a-rename.$(OBJEXT) lib_a-rewind.$(OBJEXT) \
-	lib_a-rget.$(OBJEXT) lib_a-scanf.$(OBJEXT) \
-	lib_a-sccl.$(OBJEXT) lib_a-setbuf.$(OBJEXT) \
-	lib_a-setbuffer.$(OBJEXT) lib_a-setlinebuf.$(OBJEXT) \
-	lib_a-setvbuf.$(OBJEXT) lib_a-siprintf.$(OBJEXT) \
-	lib_a-siscanf.$(OBJEXT) lib_a-sniprintf.$(OBJEXT) \
-	lib_a-snprintf.$(OBJEXT) lib_a-sprintf.$(OBJEXT) \
-	lib_a-sscanf.$(OBJEXT) lib_a-stdio.$(OBJEXT) \
-	lib_a-tmpfile.$(OBJEXT) lib_a-tmpnam.$(OBJEXT) \
-	lib_a-ungetc.$(OBJEXT) lib_a-vdiprintf.$(OBJEXT) \
-	lib_a-vdprintf.$(OBJEXT) lib_a-viprintf.$(OBJEXT) \
-	lib_a-viscanf.$(OBJEXT) lib_a-vprintf.$(OBJEXT) \
-	lib_a-vscanf.$(OBJEXT) lib_a-vsiprintf.$(OBJEXT) \
-	lib_a-vsiscanf.$(OBJEXT) lib_a-vsnprintf.$(OBJEXT) \
-	lib_a-vsniprintf.$(OBJEXT) lib_a-vsprintf.$(OBJEXT) \
-	lib_a-vsscanf.$(OBJEXT) lib_a-wbuf.$(OBJEXT) \
-	lib_a-wsetup.$(OBJEXT)
+	lib_a-fwide.$(OBJEXT) lib_a-fwrite.$(OBJEXT) \
+	lib_a-getc.$(OBJEXT) lib_a-getchar.$(OBJEXT) \
+	lib_a-getc_u.$(OBJEXT) lib_a-getchar_u.$(OBJEXT) \
+	lib_a-getdelim.$(OBJEXT) lib_a-getline.$(OBJEXT) \
+	lib_a-gets.$(OBJEXT) lib_a-iprintf.$(OBJEXT) \
+	lib_a-iscanf.$(OBJEXT) lib_a-makebuf.$(OBJEXT) \
+	lib_a-perror.$(OBJEXT) lib_a-printf.$(OBJEXT) \
+	lib_a-putc.$(OBJEXT) lib_a-putchar.$(OBJEXT) \
+	lib_a-putc_u.$(OBJEXT) lib_a-putchar_u.$(OBJEXT) \
+	lib_a-puts.$(OBJEXT) lib_a-refill.$(OBJEXT) \
+	lib_a-remove.$(OBJEXT) lib_a-rename.$(OBJEXT) \
+	lib_a-rewind.$(OBJEXT) lib_a-rget.$(OBJEXT) \
+	lib_a-scanf.$(OBJEXT) lib_a-sccl.$(OBJEXT) \
+	lib_a-setbuf.$(OBJEXT) lib_a-setbuffer.$(OBJEXT) \
+	lib_a-setlinebuf.$(OBJEXT) lib_a-setvbuf.$(OBJEXT) \
+	lib_a-siprintf.$(OBJEXT) lib_a-siscanf.$(OBJEXT) \
+	lib_a-sniprintf.$(OBJEXT) lib_a-snprintf.$(OBJEXT) \
+	lib_a-sprintf.$(OBJEXT) lib_a-sscanf.$(OBJEXT) \
+	lib_a-stdio.$(OBJEXT) lib_a-tmpfile.$(OBJEXT) \
+	lib_a-tmpnam.$(OBJEXT) lib_a-ungetc.$(OBJEXT) \
+	lib_a-vdiprintf.$(OBJEXT) lib_a-vdprintf.$(OBJEXT) \
+	lib_a-viprintf.$(OBJEXT) lib_a-viscanf.$(OBJEXT) \
+	lib_a-vprintf.$(OBJEXT) lib_a-vscanf.$(OBJEXT) \
+	lib_a-vsiprintf.$(OBJEXT) lib_a-vsiscanf.$(OBJEXT) \
+	lib_a-vsnprintf.$(OBJEXT) lib_a-vsniprintf.$(OBJEXT) \
+	lib_a-vsprintf.$(OBJEXT) lib_a-vsscanf.$(OBJEXT) \
+	lib_a-wbuf.$(OBJEXT) lib_a-wsetup.$(OBJEXT)
 @ELIX_LEVEL_1_FALSE@am__objects_2 = lib_a-asiprintf.$(OBJEXT) \
 @ELIX_LEVEL_1_FALSE@	lib_a-asprintf.$(OBJEXT) \
 @ELIX_LEVEL_1_FALSE@	lib_a-fcloseall.$(OBJEXT) \
@@ -129,7 +129,7 @@ am__objects_4 = clearerr.lo fclose.lo fd
 	fflush.lo fgetc.lo fgetpos.lo fgets.lo fileno.lo findfp.lo \
 	fiprintf.lo flags.lo fopen.lo fprintf.lo fputc.lo fputs.lo \
 	fread.lo freopen.lo fscanf.lo fiscanf.lo fseek.lo fsetpos.lo \
-	ftell.lo fvwrite.lo fwalk.lo fwrite.lo getc.lo getchar.lo \
+	ftell.lo fvwrite.lo fwalk.lo fwide.lo fwrite.lo getc.lo getchar.lo \
 	getc_u.lo getchar_u.lo getdelim.lo getline.lo gets.lo \
 	iprintf.lo iscanf.lo makebuf.lo perror.lo printf.lo putc.lo \
 	putchar.lo putc_u.lo putchar_u.lo puts.lo refill.lo remove.lo \
@@ -370,6 +370,7 @@ GENERAL_SOURCES = \
 	ftell.c			\
 	fvwrite.c			\
 	fwalk.c			\
+	fwide.c			\
 	fwrite.c			\
 	getc.c				\
 	getchar.c			\
@@ -497,6 +498,7 @@ CHEWOUT_FILES = \
 	fsetpos.def		\
 	ftell.def		\
 	funopen.def		\
+	fwide.def		\
 	fwrite.def		\
 	getc.def		\
 	getc_u.def		\
@@ -761,6 +763,12 @@ lib_a-fwalk.o: fwalk.c
 lib_a-fwalk.obj: fwalk.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-fwalk.obj `if test -f 'fwalk.c'; then $(CYGPATH_W) 'fwalk.c'; else $(CYGPATH_W) '$(srcdir)/fwalk.c'; fi`
 
+lib_a-fwide.o: fwide.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-fwide.o `test -f 'fwide.c' || echo '$(srcdir)/'`fwide.c
+
+lib_a-fwide.obj: fwide.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-fwide.obj `if test -f 'fwide.c'; then $(CYGPATH_W) 'fwide.c'; else $(CYGPATH_W) '$(srcdir)/fwide.c'; fi`
+
 lib_a-fwrite.o: fwrite.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-fwrite.o `test -f 'fwrite.c' || echo '$(srcdir)/'`fwrite.c
 
@@ -1402,6 +1410,7 @@ $(lpfx)ftell.$(oext): local.h
 $(lpfx)funopen.$(oext): local.h
 $(lpfx)fvwrite.$(oext): local.h fvwrite.h
 $(lpfx)fwalk.$(oext): local.h
+$(lpfx)fwide.$(oext): local.h
 $(lpfx)fwrite.$(oext): local.h fvwrite.h
 $(lpfx)iscanf.$(oext): local.h
 $(lpfx)makebuf.$(oext): local.h
Index: libc/stdio/findfp.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/findfp.c,v
retrieving revision 1.19
diff -u -p -r1.19 findfp.c
--- libc/stdio/findfp.c	31 Jul 2007 20:49:40 -0000	1.19
+++ libc/stdio/findfp.c	7 Nov 2008 14:07:05 -0000
@@ -46,6 +46,7 @@ _DEFUN(std, (ptr, flags, file, data),
   ptr->_r = 0;
   ptr->_w = 0;
   ptr->_flags = flags;
+  ptr->_flags2 = 0;
   ptr->_file = file;
   ptr->_bf._base = 0;
   ptr->_bf._size = 0;
@@ -126,6 +127,7 @@ _DEFUN(__sfp, (d),
 found:
   fp->_file = -1;		/* no file */
   fp->_flags = 1;		/* reserve this slot; caller sets real flags */
+  fp->_flags2 = 0;
 #ifndef __SINGLE_THREAD__
   __lock_init_recursive (fp->_lock);
 #endif
Index: libc/stdio/fseek.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/fseek.c,v
retrieving revision 1.18
diff -u -p -r1.18 fseek.c
--- libc/stdio/fseek.c	13 Jul 2007 20:37:53 -0000	1.18
+++ libc/stdio/fseek.c	7 Nov 2008 14:07:05 -0000
@@ -304,12 +304,10 @@ _DEFUN(_fseek_r, (ptr, fp, offset, whenc
   /*
    * If the target offset is within the current buffer,
    * simply adjust the pointers, clear EOF, undo ungetc(),
-   * and return.  (If the buffer was modified, we have to
-   * skip this; see fgetline.c.)
+   * and return.
    */
 
-  if ((fp->_flags & __SMOD) == 0 &&
-      target >= curoff && target < curoff + n)
+  if (target >= curoff && target < curoff + n)
     {
       register int o = target - curoff;
 
Index: libc/stdio/fwide.c
===================================================================
RCS file: libc/stdio/fwide.c
diff -N libc/stdio/fwide.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libc/stdio/fwide.c	7 Nov 2008 14:07:05 -0000
@@ -0,0 +1,92 @@
+/*
+FUNCTION
+<<fwide>>---set and determine the orientation of a FILE stream
+
+INDEX
+	fwide
+INDEX
+	_fwide_r
+
+ANSI_SYNOPSIS
+	#include <wchar.h>
+	int fwide(FILE *<[fp]>, int <[mode]>)
+
+	int _fwide_r(struct _reent *<[ptr]>, FILE *<[fp]>, int <[mode]>)
+
+TRAD_SYNOPSIS
+	#include <wchar.h>
+	int fwide(<[fp]>, <[mode]>)
+	FILE *<[fp]>;
+	int <[mode]>;
+
+	int fwide(<[ptr]>, <[fp]>, <[mode]>)
+	struct _reent *<[ptr]>;
+	FILE *<[fp]>;
+	int <[mode]>;
+
+DESCRIPTION
+When <[mode]> is zero, the <<fwide>> function determines the current
+orientation of <[fp]>. It returns a value > 0 if <[fp]> is
+wide-character oriented, i.e. if wide character I/O is permitted but
+char I/O is disallowed. It returns a value < 0 if <[fp]> is byte
+oriented, i.e. if char I/O is permitted but wide character I/O is
+disallowed. It returns zero if <[fp]> has no orientation yet; in
+this case the next I/O operation might change the orientation (to byte
+oriented if it is a char I/O operation, or to wide-character oriented
+if it is a wide character I/O operation).
+
+Once a stream has an orientation, it cannot be changed and persists
+until the stream is closed.
+
+When <[mode]> is non-zero, the <<fwide>> function first attempts to set
+<[fp]>'s orientation (to wide-character oriented if <[mode]> > 0, or to
+byte oriented if <[mode]> < 0). It then returns a value denoting the
+current orientation, as above.
+
+RETURNS
+The <<fwide>> function returns <[fp]>'s orientation, after possibly
+changing it. A return value > 0 means wide-character oriented. A return
+value < 0 means byte oriented. A return value of zero means undecided.
+
+PORTABILITY
+C99, POSIX.1-2001.
+
+*/
+
+#include <_ansi.h>
+#include "local.h"
+
+int
+_DEFUN(_fwide_r, (ptr, fp, mode),
+	struct _reent *ptr _AND
+	FILE *fp _AND
+	int mode)
+{
+  int ret;
+
+  CHECK_INIT(ptr, fp);
+
+  _flockfile (fp);
+  if (mode && !(fp->_flags & __SORD))
+    {
+      fp->_flags |= __SORD;
+      if (mode > 0)
+	fp->_flags2 |= __SWID;
+      else
+	fp->_flags2 &= ~__SWID;
+    }
+  if (!(fp->_flags & __SORD))
+    ret = 0;
+  else
+    ret = (fp->_flags2 & __SWID) ? 1 : -1;
+  _funlockfile (fp);
+  return ret;
+}
+
+int
+_DEFUN(fwide, (fp, mode),
+	FILE *fp _AND
+	int mode)
+{
+  return _fwide_r (_REENT, fp, mode);
+}
Index: libc/stdio/refill.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/refill.c,v
retrieving revision 1.11
diff -u -p -r1.11 refill.c
--- libc/stdio/refill.c	13 Jul 2007 20:37:53 -0000	1.11
+++ libc/stdio/refill.c	7 Nov 2008 14:07:05 -0000
@@ -105,7 +105,6 @@ _DEFUN(__srefill_r, (ptr, fp),
     _CAST_VOID _fwalk (_GLOBAL_REENT, lflush);
   fp->_p = fp->_bf._base;
   fp->_r = fp->_read (ptr, fp->_cookie, (char *) fp->_p, fp->_bf._size);
-  fp->_flags &= ~__SMOD;	/* buffer contents are again pristine */
 #ifndef __CYGWIN__
   if (fp->_r <= 0)
 #else
Index: libc/stdio/vfscanf.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/vfscanf.c,v
retrieving revision 1.42
diff -u -p -r1.42 vfscanf.c
--- libc/stdio/vfscanf.c	31 Oct 2008 21:08:03 -0000	1.42
+++ libc/stdio/vfscanf.c	7 Nov 2008 14:07:05 -0000
@@ -379,7 +379,6 @@ _DEFUN(__ssrefill_r, (ptr, fp),
   /* Otherwise we are out of character input.  */
   fp->_p = fp->_bf._base;
   fp->_r = 0;
-  fp->_flags &= ~__SMOD;	/* buffer contents are again pristine */
   fp->_flags |= __SEOF;
   return EOF;
 }
Index: libc/stdio64/fseeko64.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio64/fseeko64.c,v
retrieving revision 1.12
diff -u -p -r1.12 fseeko64.c
--- libc/stdio64/fseeko64.c	13 Jul 2007 20:37:53 -0000	1.12
+++ libc/stdio64/fseeko64.c	7 Nov 2008 14:07:05 -0000
@@ -282,12 +282,10 @@ _DEFUN (_fseeko64_r, (ptr, fp, offset, w
   /*
    * If the target offset is within the current buffer,
    * simply adjust the pointers, clear EOF, undo ungetc(),
-   * and return.  (If the buffer was modified, we have to
-   * skip this; see fgetline.c.)
+   * and return.
    */
 
-  if ((fp->_flags & __SMOD) == 0 &&
-      target >= curoff && target < curoff + n)
+  if (target >= curoff && target < curoff + n)
     {
       register int o = target - curoff;
 

-- 
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat



More information about the Newlib mailing list