:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[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 <crtdll/stdio.h>
4 #include <crtdll/internal/file.h>
5 #include <crtdll/wchar.h>
6 #include <crtdll/errno.h>
7
8 int
9 ungetc(int c, FILE *f)
10 {
11
12   if (!__validfp (f) || !OPEN4READING(f)) {
13       __set_errno (EINVAL);
14       return EOF;
15   }
16
17   if (c == EOF )
18         return EOF;
19
20   
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 wint_t
45 ungetwc(wchar_t c, FILE *f)
46 {
47   if (!__validfp (f) || !OPEN4READING(f)) {
48       __set_errno (EINVAL);
49       return EOF;
50   }
51
52   if (c == (wchar_t)EOF )
53         return EOF;
54
55   
56     
57   if ( f->_ptr == NULL || f->_base == NULL)
58          return EOF;
59
60   if (f->_ptr == f->_base)
61   {
62     if (f->_cnt == 0)
63       f->_ptr+=sizeof(wchar_t);
64     else
65       return EOF;
66   }
67
68   f->_cnt+=sizeof(wchar_t);
69   f->_ptr-=sizeof(wchar_t);
70
71   f->_flag |= _IOUNGETC;
72   *((wchar_t *)(f->_ptr)) = c;
73
74   return c;
75 }