Add an error check for correct formatting in Deflate uncompressed
[sgt/halibut] / input.c
diff --git a/input.c b/input.c
index 337517d..1410022 100644 (file)
--- a/input.c
+++ b/input.c
@@ -119,7 +119,8 @@ static int get(input *in, filepos *pos, rdstringc *rsc) {
            int c = getc(in->currfp);
 
            if (c == EOF) {
-               fclose(in->currfp);
+               if (in->wantclose)
+                   fclose(in->currfp);
                in->currfp = NULL;
                return EOF;
            }
@@ -835,8 +836,10 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx,
                needkw = 4;
                break;
              case c__comment:
-               if (isbrace(in))
+               if (isbrace(in)) {
+                   needkw = -1;
                    break;             /* `\#{': isn't a comment para */
+               }
                do {
                    dtor(t), t = get_token(in);
                } while (t.type != tok_eop && t.type != tok_eof);
@@ -975,7 +978,8 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx,
                            rdadd(&macrotext, L'\n');
                        rdadds(&macrotext, t.text);
                        dtor(t), t = get_token(in);
-                       if (t.type == tok_eop) break;
+                       if (t.type == tok_eop || t.type == tok_eof)
+                            break;
                    }
                    macrodef(macros, rs.text, macrotext.text, fp);
                    continue;          /* next paragraph */
@@ -1578,14 +1582,15 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx,
 struct {
     char const *magic;
     size_t nmagic;
+    int binary;
     void (*reader)(input *);
 } magics[] = {
-    { "%!FontType1-",     12, &read_pfa_file },
-    { "%!PS-AdobeFont-",  15, &read_pfa_file },
-    { "\x80\x01",          2, &read_pfb_file },
-    { "StartFontMetrics", 16, &read_afm_file },
-    { "\x00\x01\x00\x00",  4, &read_sfnt_file },
-    { "true",             4, &read_sfnt_file },
+    { "%!FontType1-",     12, FALSE, &read_pfa_file },
+    { "%!PS-AdobeFont-",  15, FALSE, &read_pfa_file },
+    { "\x80\x01",          2, TRUE,  &read_pfb_file },
+    { "StartFontMetrics", 16, FALSE, &read_afm_file },
+    { "\x00\x01\x00\x00",  4, TRUE,  &read_sfnt_file },
+    { "true",             4, TRUE,  &read_sfnt_file },
 };
 
 paragraph *read_input(input *in, indexdata *idx) {
@@ -1594,32 +1599,60 @@ paragraph *read_input(input *in, indexdata *idx) {
     tree234 *macros;
     char mag[16];
     size_t len, i;
+    int binary;
     void (*reader)(input *);
 
     macros = newtree234(macrocmp);
 
     while (in->currindex < in->nfiles) {
-       in->currfp = fopen(in->filenames[in->currindex], "r");
-       if (in->currfp) {
-           setpos(in, in->filenames[in->currindex]);
-           in->charset = in->defcharset;
-           in->csstate = charset_init_state;
-           in->wcpos = in->nwc = 0;
-           in->pushback_chars = NULL;
+       setpos(in, in->filenames[in->currindex]);
+       in->charset = in->defcharset;
+       in->csstate = charset_init_state;
+       in->wcpos = in->nwc = 0;
+       in->pushback_chars = NULL;
+
+       if (!in->filenames[in->currindex]) {
+           in->currfp = stdin;
+           in->wantclose = FALSE;     /* don't fclose stdin */
+           /*
+            * When reading standard input, we always expect to see
+            * an actual Halibut file and not any of the unusual
+            * input types like fonts.
+            */
            reader = NULL;
-           len = fread(mag, 1, sizeof(mag), in->currfp);
-           for (i = 0; i < lenof(magics); i++) {
-               if (len >= magics[i].nmagic &&
-                   memcmp(mag, magics[i].magic, magics[i].nmagic) == 0) {
-                   reader = magics[i].reader;
-                   break;
+       } else {
+           /*
+            * Open the file in binary mode to look for magic
+            * numbers. We'll switch to text mode if we find we're
+            * looking at a text file type.
+            */
+           in->currfp = fopen(in->filenames[in->currindex], "rb");
+           binary = FALSE; /* default to Halibut source, which is text */
+           if (in->currfp) {
+               in->wantclose = TRUE;
+               reader = NULL;
+               len = fread(mag, 1, sizeof(mag), in->currfp);
+               for (i = 0; i < lenof(magics); i++) {
+                   if (len >= magics[i].nmagic &&
+                       memcmp(mag, magics[i].magic, magics[i].nmagic) == 0) {
+                       reader = magics[i].reader;
+                       binary = magics[i].binary;
+                       break;
+                   }
                }
+               rewind(in->currfp);
+           }
+           if (!binary) {
+               fclose(in->currfp);
+               in->currfp = fopen(in->filenames[in->currindex], "r");
            }
-           rewind(in->currfp);
-           if (reader == NULL)
+       }
+       if (in->currfp) {
+           if (reader == NULL) {
                read_file(&hptr, in, idx, macros);
-           else
+           } else {
                (*reader)(in);
+           }
        }
        in->currindex++;
     }