load: Handle EOF correctly
authorPetri Lehtinen <petri@digip.org>
Tue, 8 Sep 2009 13:22:16 +0000 (16:22 +0300)
committerPetri Lehtinen <petri@digip.org>
Tue, 8 Sep 2009 13:41:07 +0000 (16:41 +0300)
In stream_get(), EOF never got it to stream->buffer and because of
this, stream_unget() failed on some situations. This patch makes
stream_get() handle EOF just like any other byte.

As a "side effect", lex_scan_string() now needs to unget the EOF, or
otherwise it ends up in error message on premature end of input.

src/load.c

index 25df182..fc3679d 100644 (file)
@@ -134,10 +134,7 @@ static char stream_get(stream_t *stream, json_error_t *error)
 
         c = stream->buffer[0];
 
-        if(c == EOF && stream->eof(stream->data))
-            return EOF;
-
-        if(c < 0)
+        if(c < 0 && c != EOF)
         {
             /* multi-byte UTF-8 sequence */
             int i, count;
@@ -257,11 +254,11 @@ static void lex_scan_string(lex_t *lex, json_error_t *error)
     lex->value.string = NULL;
     lex->token = TOKEN_INVALID;
 
-    /* skip the " */
     c = lex_get_save(lex, error);
 
     while(c != '"') {
         if(c == EOF) {
+            lex_unget_unsave(lex, c);
             if(lex_eof(lex))
                 error_set(error, lex, "premature end of input");
             goto out;