Distingush font files from other input by magic number rather than name.
authorben <ben@cda61777-01e9-0310-a592-d414129be87e>
Tue, 5 Dec 2006 00:04:18 +0000 (00:04 +0000)
committerben <ben@cda61777-01e9-0310-a592-d414129be87e>
Tue, 5 Dec 2006 00:04:18 +0000 (00:04 +0000)
This prevents one having Halibut files that begin "StartFontMetrics",
"%!FontType1-", or "%!PS-AdobeFont-", but I doubt that will be a great
hardship.

git-svn-id: svn://svn.tartarus.org/sgt/halibut@6960 cda61777-01e9-0310-a592-d414129be87e

input.c

diff --git a/input.c b/input.c
index d1b529d..47d475a 100644 (file)
--- a/input.c
+++ b/input.c
@@ -1561,10 +1561,23 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx,
     stk_free(crossparastk);
 }
 
+struct {
+    char const *magic;
+    size_t nmagic;
+    void (*reader)(input *);
+} magics[] = {
+    { "%!FontType1-",     12, &read_pfa_file },
+    { "%!PS-AdobeFont-",  15, &read_pfa_file },
+    { "StartFontMetrics", 16, &read_afm_file },
+};
+
 paragraph *read_input(input *in, indexdata *idx) {
     paragraph *head = NULL;
     paragraph **hptr = &head;
     tree234 *macros;
+    char mag[16];
+    size_t len, i;
+    void (*reader)(input *);
 
     macros = newtree234(macrocmp);
 
@@ -1576,14 +1589,20 @@ paragraph *read_input(input *in, indexdata *idx) {
            in->csstate = charset_init_state;
            in->wcpos = in->nwc = 0;
            in->pushback_chars = NULL;
-           if (strcmp(in->filenames[in->currindex] +
-                      strlen(in->filenames[in->currindex]) - 4, ".afm") == 0)
-               read_afm_file(in);
-           else if (strcmp(in->filenames[in->currindex] +
-                      strlen(in->filenames[in->currindex]) - 4, ".pfa") == 0)
-               read_pfa_file(in);
-           else
+           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;
+               }
+           }
+           rewind(in->currfp);
+           if (reader == NULL)
                read_file(&hptr, in, idx, macros);
+           else
+               (*reader)(in);
        }
        in->currindex++;
     }