update for HEAD-2003091401
[reactos.git] / lib / msvcrt / 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 }