X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/1d1da251ac6656094a13788ff273d9922d58f927..c437c4c4d294b54c99a58f3130c82013a1bf7024:/input.c diff --git a/input.c b/input.c index 4978bb9..8556d9f 100644 --- a/input.c +++ b/input.c @@ -1581,14 +1581,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) { @@ -1597,6 +1598,7 @@ paragraph *read_input(input *in, indexdata *idx) { tree234 *macros; char mag[16]; size_t len, i; + int binary; void (*reader)(input *); macros = newtree234(macrocmp); @@ -1618,7 +1620,13 @@ paragraph *read_input(input *in, indexdata *idx) { */ reader = NULL; } else { - in->currfp = fopen(in->filenames[in->currindex], "r"); + /* + * 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; @@ -1627,17 +1635,23 @@ paragraph *read_input(input *in, indexdata *idx) { 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"); + } } if (in->currfp) { - if (reader == NULL) + if (reader == NULL) { read_file(&hptr, in, idx, macros); - else + } else { (*reader)(in); + } } in->currindex++; }