ceriel@cs.vu.nl (07/28/89)
There is a bug in the ungetc library routine, as demonstrated by the following program. #include <stdio.h> ------------8<-------------8<---------------8<------------8<------------ main() { FILE *f; int c; f = fopen("/tmp/xxx", "w"); if (f == NULL) { fprintf(stderr, "Could not open /tmp/xxx\n"); exit(1); } for (c = 0; c < 10000; c++) { putc(c % 256, f); } fclose(f); f = fopen("/tmp/xxx", "r"); if (f == NULL) { fprintf(stderr, "Could not re-open /tmp/xxx\n"); exit(1); } for (c = 0; c < 10000; c++) { int ch, ch1; ch = getc(f); if (ch != EOF) { if (ungetc(ch, f) == EOF) { fprintf(stderr, "ungetc() failed 1, count = %d\n", c); } else { ch1 = getc(f); if (ch1 != ch) { fprintf(stderr, "ungetc() failed 2, count = %d\n", c); } } } } unlink("/tmp/xxx"); exit(0); } ------------8<-------------8<---------------8<------------8<------------ Below is a fix: ------------8<-------------8<---------------8<------------8<------------ *** ungetc.c.old Mon Sep 26 13:05:25 1988 --- ungetc.c Fri Jul 28 12:48:17 1989 *************** *** 7,13 **** if ( ch < 0 || !testflag(iop,READMODE) || testflag(iop,UNBUFF) ) return( EOF ); ! if ( iop->_count >= BUFSIZ) return(EOF); if ( iop->_ptr == iop->_buf) --- 7,13 ---- if ( ch < 0 || !testflag(iop,READMODE) || testflag(iop,UNBUFF) ) return( EOF ); ! if ( iop->_count > BUFSIZ) return(EOF); if ( iop->_ptr == iop->_buf) ------------8<-------------8<---------------8<------------8<------------