:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[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 int ungetc(int c, FILE *f)
9 {
10   if (!__validfp (f) || !OPEN4READING(f))
11     {
12       __set_errno (EINVAL);
13       return EOF;
14     }
15
16   if (c == EOF)
17     return EOF;
18
19   if (f->_ptr == NULL || f->_base == NULL)
20     return EOF;
21
22   if (f->_ptr == f->_base)
23     {
24       if (f->_cnt == 0)
25         f->_ptr++;
26       else
27         return EOF;
28     }
29
30   f->_cnt++;
31   f->_ptr--;
32   if (*f->_ptr != c)
33     {
34       f->_flag |= _IOUNGETC;
35       *f->_ptr = c;
36     }
37   return c;
38 }
39
40
41 wint_t
42 ungetwc(wchar_t c, FILE *f)
43 {
44   if (!__validfp (f) || !OPEN4READING(f))
45     {
46       __set_errno(EINVAL);
47       return EOF;
48     }
49
50   if (c == (wchar_t)EOF)
51     return EOF;
52
53   if (f->_ptr == NULL || f->_base == NULL)
54     return EOF;
55
56   if (f->_ptr == f->_base)
57     {
58       if (f->_cnt == 0)
59         f->_ptr+=sizeof(wchar_t);
60       else
61         return EOF;
62     }
63
64   f->_cnt+=sizeof(wchar_t);
65   f->_ptr-=sizeof(wchar_t);
66
67   f->_flag |= _IOUNGETC;
68   *((wchar_t *)(f->_ptr)) = c;
69
70   return c;
71 }