Jonathan Larmour wrote:
I agree with your analysis, but I think I would prefer a fix like:
Index: include/stream.inl
===================================================================
RCS file:
/cvs/ecos/ecos/packages/language/c/libc/stdio/current/include/stream.inl,v
retrieving revision 1.7
diff -u -5 -p -r1.7 stream.inl
--- include/stream.inl 29 Mar 2004 11:24:38 -0000 1.7
+++ include/stream.inl 27 Sep 2006 15:14:52 -0000
@@ -440,10 +440,11 @@ Cyg_StdioStream::set_position( fpos_t po
return ENOERR;
} // endif (bytesavail > posdiff)
if (whence == SEEK_CUR) {
position += bytesavail;
+ pos -= bytesavail;
}
} //endif (whence != SEEK_END)
Cyg_ErrNo err;
What do you think?
Actually since at worst it doesn't cause any test regressions, I'll check
it in, because I'm an optimist. Full patch attached.
Jifl
--
eCosCentric http://www.eCosCentric.com/ The eCos and RedBoot experts
------["The best things in life aren't things."]------ Opinions==mine
Index: ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libc/stdio/current/ChangeLog,v
retrieving revision 1.32.10004.9
diff -u -5 -p -r1.32.10004.9 ChangeLog
--- ChangeLog 26 Sep 2006 18:47:19 -0000 1.32.10004.9
+++ ChangeLog 27 Sep 2006 16:16:05 -0000
@@ -1,5 +1,15 @@
+2006-09-27 Jonathan Larmour <[EMAIL PROTECTED]>
+
+ * include/stdio.h: Make fpos_t be signed to allow negative
+ SEEK_CUR offsets to fseek().
+ * include/stream.inl (set_position): If SEEK_CUR, then if
+ having to reconcile difference between position and underlying
+ file position, then requested seek position needs adjusting
+ for buffer size.
+ Both above reported and analysed by Ivan Djelic.
+
2006-09-26 Jonathan Larmour <[EMAIL PROTECTED]>
* src/common/stream.cxx (read): Only update position after direct
reads from I/O system so it's updated by the correct number of
bytes.
Index: include/stdio.h
===================================================================
RCS file:
/cvs/ecos/ecos/packages/language/c/libc/stdio/current/include/stdio.h,v
retrieving revision 1.6.10012.1
diff -u -5 -p -r1.6.10012.1 stdio.h
--- include/stdio.h 14 Sep 2006 12:21:43 -0000 1.6.10012.1
+++ include/stdio.h 27 Sep 2006 16:16:06 -0000
@@ -87,11 +87,11 @@
// TYPE DEFINITIONS
// A type capable of specifying uniquely every file position - ISO C
// standard chap 7.9.1
-typedef cyg_ucount32 fpos_t;
+typedef cyg_count32 fpos_t;
// FILE is just cast to an address here. It is uncast internally to the
// C library in stream.hxx as the C++ Cyg_StdioStream class.
// Optional run-time checking can be enabled to ensure that the cast is
Index: include/stream.inl
===================================================================
RCS file:
/cvs/ecos/ecos/packages/language/c/libc/stdio/current/include/stream.inl,v
retrieving revision 1.7
diff -u -5 -p -r1.7 stream.inl
--- include/stream.inl 29 Mar 2004 11:24:38 -0000 1.7
+++ include/stream.inl 27 Sep 2006 16:16:06 -0000
@@ -440,10 +440,11 @@ Cyg_StdioStream::set_position( fpos_t po
return ENOERR;
} // endif (bytesavail > posdiff)
if (whence == SEEK_CUR) {
position += bytesavail;
+ pos -= bytesavail;
}
} //endif (whence != SEEK_END)
Cyg_ErrNo err;