X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/176f95481102941f215f5b36a17e8b43f6bd513e..d274495f584e38e4210ea8616120b2c3e3e3e8b8:/input.c diff --git a/input.c b/input.c index d8d44f9..337517d 100644 --- a/input.c +++ b/input.c @@ -610,7 +610,7 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx, stack_style = 2, /* \e, \c, \cw */ stack_idx = 4, /* \I, \i, \ii */ stack_hyper = 8, /* \W */ - stack_quote = 16, /* \q */ + stack_quote = 16 /* \q */ } type; word **whptr; /* to restore from \u alternatives */ word **idximplicit; /* to restore from \u alternatives */ @@ -903,7 +903,21 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx, /* Get keywords. */ dtor(t), t = get_token(in); fp = t.pos; - while (t.type == tok_lbrace) { + while (t.type == tok_lbrace || + (t.type == tok_white && (needkw & 24))) { + /* + * In paragraph types which can't accept any + * body text (such as \cfg), we are lenient + * about whitespace between keywords. This is + * important for \cfg in particular since it + * can often have many keywords which are long + * pieces of text, so it's useful to permit the + * user to wrap the line between them. + */ + if (t.type == tok_white) { + dtor(t), t = get_token(in); /* eat the space */ + continue; + } /* This is a keyword. */ nkeys++; /* FIXME: there will be bugs if anyone specifies an @@ -1539,8 +1553,6 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx, */ if (par.words) { addpara(par, ret); - } else { - error(err_emptypara, &par.fpos); } if (t.type == tok_eof) already = TRUE; @@ -1563,10 +1575,26 @@ 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 }, + { "\x80\x01", 2, &read_pfb_file }, + { "StartFontMetrics", 16, &read_afm_file }, + { "\x00\x01\x00\x00", 4, &read_sfnt_file }, + { "true", 4, &read_sfnt_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); @@ -1578,7 +1606,20 @@ paragraph *read_input(input *in, indexdata *idx) { in->csstate = charset_init_state; in->wcpos = in->nwc = 0; in->pushback_chars = NULL; - read_file(&hptr, in, idx, macros); + 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++; }