:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / lib / msvcrt / stdio / fseek.c
1 /* Copyright (C) 1997 DJ Delorie, see COPYING.DJ for details */
2 /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
3 /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
4
5 #include <msvcrt/stdio.h>
6 #include <msvcrt/errno.h>
7 #include <msvcrt/fcntl.h>
8 #include <msvcrt/io.h>
9 #include <msvcrt/internal/file.h>
10
11
12 int fseek(FILE *f, long offset, int ptrname)
13 {
14   long p = -1;                  /* can't happen? */
15   if ( f == NULL ) {
16         __set_errno (EINVAL);
17        return -1;
18   }
19   
20   f->_flag &= ~_IOEOF;
21   if (!OPEN4WRITING(f))
22   {
23     if (f->_base && !(f->_flag & _IONBF))
24     {
25       p = ftell(f);
26       if (ptrname == SEEK_CUR)
27       {
28         offset += p;
29         ptrname = SEEK_SET;
30       }
31       /* check if the target position is in the buffer and
32         optimize seek by moving inside the buffer */
33       if (ptrname == SEEK_SET && (f->_flag & (_IOUNGETC|_IOREAD|_IOWRT )) == 0
34       && p-offset <= f->_ptr-f->_base && offset-p <= f->_cnt)
35       {
36         f->_ptr+=offset-p;
37         f->_cnt+=p-offset;
38         return 0;
39       }
40     }
41
42     p = lseek(fileno(f), offset, ptrname);
43     f->_cnt = 0;
44     f->_ptr = f->_base;
45     f->_flag &= ~_IOUNGETC;
46   }
47   else 
48   {
49     p = fflush(f);
50     return lseek(fileno(f), offset, ptrname) == -1 || p == EOF ?
51       -1 : 0;
52   }
53   return p==-1 ? -1 : 0;
54 }