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