update for HEAD-2003091401
[reactos.git] / lib / crtdll / stdio / ungetc.c
1 /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
2 /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
3 #include <msvcrt/stdio.h>
4 #include <msvcrt/wchar.h>
5 #include <msvcrt/errno.h>
6 #include <msvcrt/internal/file.h>
7
8
9 /*
10  * @implemented
11  */
12 int ungetc(int c, FILE *f)
13 {
14   if (!__validfp (f) || !OPEN4READING(f)) {
15       __set_errno (EINVAL);
16       return EOF;
17   }
18
19   if (c == EOF )
20         return EOF;
21     
22   if ( f->_ptr == NULL || f->_base == NULL)
23          return EOF;
24
25   if (f->_ptr == f->_base)
26   {
27     if (f->_cnt == 0)
28       f->_ptr++;
29     else
30       return EOF;
31   }
32
33   f->_cnt++;
34   f->_ptr--;
35   if(*f->_ptr != c)
36   {
37     f->_flag |= _IOUNGETC;
38     *f->_ptr = c;
39   }
40   return c;
41 }
42
43
44 /*
45  * @implemented
46  */
47 wint_t
48 ungetwc(wchar_t c, FILE *f)
49 {
50   if (!__validfp (f) || !OPEN4READING(f)) {
51       __set_errno (EINVAL);
52       return EOF;
53   }
54
55   if (c == (wchar_t)EOF )
56         return EOF;
57
58   if ( f->_ptr == NULL || f->_base == NULL)
59          return EOF;
60
61   if (f->_ptr == f->_base)
62   {
63     if (f->_cnt == 0)
64       f->_ptr+=sizeof(wchar_t);
65     else
66       return EOF;
67   }
68
69   f->_cnt+=sizeof(wchar_t);
70   f->_ptr-=sizeof(wchar_t);
71
72   f->_flag |= _IOUNGETC;
73   *((wchar_t *)(f->_ptr)) = c;
74
75   return c;
76 }