- if (f->_flag & _IOLBF)
- {
- /* in line-buffering mode we get here on each character */
- *f->_ptr++ = c;
- rn = f->_ptr - base;
- if (c == '\n' || rn >= f->_bufsiz)
- {
- /* time for real flush */
- f->_ptr = base;
- f->_cnt = 0;
+ if (f->_flag & _IOLBF) {
+ /* in line-buffering mode we get here on each character */
+ *f->_ptr++ = c;
+ rn = f->_ptr - base;
+ if (c == '\n' || rn >= f->_bufsiz) {
+ /* time for real flush */
+ f->_ptr = base;
+ f->_cnt = 0;
+ } else {
+ /* we got here because _cnt is wrong, so fix it */
+ /* Negative _cnt causes all output functions to call */
+ /* _flsbuf for each character, thus realizing line-buffering */
+ f->_cnt = -rn;
+ return c;
+ }
+ } else if (f->_flag & _IONBF) {
+ c1 = c;
+ rn = 1;
+ base = &c1;
+ f->_cnt = 0;
+ } else { /* _IOFBF */
+ rn = f->_ptr - base;
+ f->_ptr = base;
+ if ((f->_flag & _IOAHEAD) == _IOAHEAD)
+ _lseek(fileno(f), -(rn+f->_cnt), SEEK_CUR);
+ f->_cnt = f->_bufsiz;
+ f->_flag &= ~_IOAHEAD;