|
|
1.1 root 1: /*
2: * libc/stdio/ungetc.c
3: * ANSI-compliant C standard i/o library.
4: * ungetc()
5: * ANSI 4.9.7.11.
6: * Unget a character.
7: */
8:
9: #include <stdio.h>
10: #include <string.h>
11: #include "stdio.int.h"
12:
13: extern int _fungotc();
14: extern int _funungetc();
15:
16: int
17: ungetc(c, stream) int c; register FILE *stream;
18: {
19: register _FILE2 *f2p;
20:
21: f2p = stream->_f2p;
22: if (c == EOF || (stream->_ff1 & _FWONLY))
23: return EOF; /* Leave input stream unchanged */
24: f2p->_gt = &_fungotc; /* Replace get function */
25: if (!(stream->_ff1 & _FRONLY))
26: f2p->_pt = &_funungetc; /* Replace put function */
27: stream->_cc = 0;
28: stream->_ff2 |= _FUNGOT; /* Set ungot flag */
29: stream->_ff1 &= ~_FEOF; /* ANSI 4.9.7.11 (24) */
30: f2p->_uc = c; /* Store ungot character */
31: return c;
32: }
33:
34: /*
35: * Get ungetc character.
36: * Restore the appropriate get and put functions.
37: */
38: static
39: int
40: _fungotc(fp) register FILE *fp;
41: {
42: register _FILE2 *f2p;
43:
44: f2p = fp->_f2p;
45:
46: #if _ASCII
47: register int isascii;
48:
49: isascii = fp->_ff2 & _FASCII;
50: #endif
51:
52: switch (fp->_mode) {
53: case _MODE_UNINIT: /* Uninitialized */
54: f2p->_gt = &_fginit;
55: f2p->_pt = &_fpinit;
56: break;
57:
58: case _MODE_FBUF:
59: case _MODE_LBUF:
60: /* Fully buffered or line buffered */
61: if (fp->_mode == _MODE_FBUF) {
62: /* Fully buffered output */
63: #if _ASCII
64: f2p->_pt = isascii ? &_fputba : &_fputb;
65: #else
66: f2p->_pt = &_fputb;
67: #endif
68: } else {
69: /* Line buffered output */
70: #if _ASCII
71: f2p->_pt = isascii ? &_fputta : &_fputt;
72: #else
73: f2p->_pt = &_fputt;
74: #endif
75: }
76: #if _ASCII
77: f2p->_gt = isascii ? &_fgetba : &_fgetb;
78: #else
79: f2p->_gt = &_fgetb;
80: #endif
81: if ((fp->_cc = -(fp->_cp - f2p->_dp)) < 0)
82: fp->_cc = f2p->_ep - fp->_cp;
83: break;
84:
85: case _MODE_NBUF:
86: /* Unbuffered */
87: #if _ASCII
88: f2p->_gt = isascii ? &_fgetca : &_fgetc;
89: f2p->_pt = isascii ? &_fputca : &_fputc;
90: #else
91: f2p->_gt = &_fgetc;
92: f2p->_pt = &_fputc;
93: #endif
94: break;
95:
96: case _MODE_STR:
97: /* String */
98: f2p->_gt = &_fgetstr;
99: fp->_cc = strlen(fp->_cp);
100: break;
101: }
102:
103: if (fp->_ff1 & _FRONLY)
104: f2p->_pt = &_fpute;
105: fp->_ff2 &= ~_FUNGOT; /* Clear the ungot flag */
106: return f2p->_uc; /* Return the ungot character */
107: }
108:
109: /*
110: * Undo unget.
111: * This occurs after an ungetc()
112: * when put function is done before get function.
113: */
114: static
115: int
116: _funungetc(c, fp) register int c; register FILE *fp;
117: {
118: register _FILE2 *f2p;
119:
120: f2p = fp->_f2p;
121: (*f2p->_gt)(fp); /* Undo the unget */
122: return putc(c, fp); /* and do the put */
123: }
124:
125: /* end of libc/stdio/ungetc.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.