scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

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 }