ungetc.c (1088B)
1 #include <stdio.h> 2 3 /** 4 * ungetc() - push back one character to a input stream 5 * 6 * Context: A stream just opened has rp, wp, lp and buf pointing to NULL, 7 * in the same way that a closed stream. In both cases we have to 8 * return EOF, so the check fp->rp == fp->buf detects both cases. 9 * An input stream can be either a read only input or a read and 10 * write input in read state, and we can detect the write state 11 * when wp does not point to the beginning of buf. _IOSTRG is used 12 * in sprintf/sscanf functions, where it is possible rp points to 13 * a constant string, so we cannot write back c, but it is safe 14 * because in those functions we are going to push back always 15 * the same character that the one contained in the string. 16 */ 17 int 18 ungetc(int c, FILE *fp) 19 { 20 if (c == EOF) 21 return EOF; 22 23 if ((fp->flags & _IOWRITE) != 0) 24 return EOF; 25 26 if (fp->rp == fp->buf || fp->wp != fp->buf) 27 return EOF; 28 29 --fp->rp; 30 if ((fp->flags & _IOSTRG) == 0) 31 *fp->rp = c; 32 fp->flags &= ~_IOEOF; 33 34 return c; 35 }