improved _doscan(); fflush() doesn't call fseek() anymore
authoreck <none@none>
Wed, 4 Apr 1990 15:52:01 +0000 (15:52 +0000)
committereck <none@none>
Wed, 4 Apr 1990 15:52:01 +0000 (15:52 +0000)
lang/cem/libcc.ansi/stdio/doscan.c
lang/cem/libcc.ansi/stdio/fflush.c

index 8c4fffb..51ac50d 100644 (file)
@@ -266,7 +266,8 @@ _doscan(register FILE *stream, const char *format, va_list ap)
                                return done;
                        }
                        str = o_collect(ic, stream, kind, width, &base);
-                       if (str < inp_buf) return done;
+                       if (str < inp_buf
+                           || (str == inp_buf && *str == '-')) return done;
                        nrchars += str - inp_buf + 1;
                        if (!(flags & FL_NOASSIGN)) {
                                if (kind == 'd' || kind == 'i')
@@ -415,7 +416,8 @@ _doscan(register FILE *stream, const char *format, va_list ap)
 
                        if (!width) return done;
                        str = f_collect(ic, stream, width);
-                       if (str < inp_buf) return done;
+                       if (str < inp_buf
+                           || (str == inp_buf && *str == '-')) return done;
                        nrchars += str - inp_buf + 1;
                        if (!(flags & FL_NOASSIGN)) {
                                ld_val = strtod(inp_buf, &tmp_string);
@@ -433,5 +435,5 @@ _doscan(register FILE *stream, const char *format, va_list ap)
                }               /* end switch */
                ++format;
        }
-       return conv ? done : EOF;
+       return conv || (ic != EOF) ? done : EOF;
 }
index 24f1a38..018ff2c 100644 (file)
@@ -27,7 +27,15 @@ fflush(FILE *stream)
                && !io_testflag(stream, _IOWRITING)))
                return 0;
        if (io_testflag(stream, _IOREADING)) {
-               (void) fseek(stream, 0L, SEEK_CUR);
+               /* (void) fseek(stream, 0L, SEEK_CUR); */
+               int adjust = 0;
+               if (stream->_buf && !io_testflag(stream,_IONBF))
+                       adjust = stream->_count;
+               stream->_count = 0;
+               _lseek(fileno(stream), (off_t) adjust, SEEK_CUR);
+               if (io_testflag(stream, _IOWRITE))
+                       stream->_flags &= ~(_IOREADING | _IOWRITING);
+               stream->_ptr = stream->_buf;
                return 0;
        } else if (io_testflag(stream, _IONBF)) return 0;