branch update for HEAD-2003021201
[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 int ungetc(int c, FILE *f)
10 {
11   if (!__validfp (f) || !OPEN4READING(f)) {
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       __set_errno(EINVAL);
46       return EOF;
47     }
48
49   if (c == (wchar_t)EOF)
50     return EOF;
51
52   if (f->_ptr == NULL || f->_base == NULL)
53     return EOF;
54
55   if (f->_ptr == f->_base)
56     {
57       if (f->_cnt == 0)
58         f->_ptr+=sizeof(wchar_t);
59       else
60         return EOF;
61     }
62
63   f->_cnt+=sizeof(wchar_t);
64   f->_ptr-=sizeof(wchar_t);
65
66   f->_flag |= _IOUNGETC;
67   *((wchar_t *)(f->_ptr)) = c;
68
69   return c;
70 }