From f36b52f2aa0d7748e19de546a3c75813870b7325 Mon Sep 17 00:00:00 2001 From: cuz Date: Thu, 13 May 2004 21:29:18 +0000 Subject: [PATCH] Make fseek support ungetc, fix non standard compliant behaviour git-svn-id: svn://svn.cc65.org/cc65/trunk@3035 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/common/fseek.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/libsrc/common/fseek.c b/libsrc/common/fseek.c index 3ad4b1f85..0fa1a525d 100644 --- a/libsrc/common/fseek.c +++ b/libsrc/common/fseek.c @@ -1,7 +1,8 @@ /* * fseek.c * - * Christian Groessler, 07-Aug-2000 + * Christian Groessler, 2000-08-07 + * Ullrich von Bassewitz, 2004-05-12 */ @@ -11,7 +12,7 @@ #include #include "_file.h" - + /*****************************************************************************/ /* Code */ @@ -19,7 +20,7 @@ -int __fastcall__ fseek (FILE* f, long offset, int whence) +int __fastcall__ fseek (register FILE* f, long offset, int whence) { long res; @@ -29,8 +30,31 @@ int __fastcall__ fseek (FILE* f, long offset, int whence) return -1; } + /* If we have a pushed back character, and whence is relative to the + * current position, correct the offset. + */ + if ((f->f_flags & _FPUSHBACK) && whence == SEEK_CUR) { + --offset; + } + + /* Do the seek */ res = lseek(f->f_fd, offset, whence); - if (res == -1L) return -1; + + /* If we had an error, set the error indicator on the stream, and + * return -1. We will check for < 0 here, because that saves some code, + * and we don't have files with 2 gigabytes in size anyway:-) + */ + if (res < 0) { + f->f_flags |= _FERROR; + return -1; + } + + /* The seek was successful. Discard any effects of the ungetc function, + * and clear the end-of-file indicator. + */ + f->f_flags &= ~(_FEOF | _FPUSHBACK); + + /* Done */ return 0; } -- 2.39.5