X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/b774705014b73abf1052a937deef534d34ca259d..f6220253b2e31a88862b8beae822ff11cc5576ab:/input.c diff --git a/input.c b/input.c index 365fec0..d1b529d 100644 --- a/input.c +++ b/input.c @@ -103,6 +103,8 @@ static int get(input *in, filepos *pos, rdstringc *rsc) { } else if (in->stack) { wchar_t c = in->stack->text[in->stack->ptr]; + if (pos) + *pos = in->stack->pos; if (in->stack->text[++in->stack->ptr] == L'\0') { macrostack *tmp = in->stack; in->stack = tmp->next; @@ -424,6 +426,7 @@ token get_token(input *in) { c == '#' || c == '{' || c == '}' || c == '.') { /* single-char command */ rdadd(&rs, c); + prevpos = rsc.pos; } else if (c == 'u') { int len = 0; do { @@ -589,11 +592,11 @@ static paragraph *addpara(paragraph newpara, paragraph ***hptrptr) { /* * Reads a single file (ie until get() returns EOF) */ -static void read_file(paragraph ***ret, input *in, indexdata *idx) { +static void read_file(paragraph ***ret, input *in, indexdata *idx, + tree234 *macros) { token t; paragraph par; word wd, **whptr, **idximplicit; - tree234 *macros; wchar_t utext[2], *wdtext; int style, spcstyle; int already; @@ -607,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 */ @@ -629,7 +632,6 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) { t.text = NULL; t.origtext = NULL; - macros = newtree234(macrocmp); already = FALSE; crossparastk = stk_new(); @@ -806,6 +808,11 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) { continue; } + while (t.type == tok_cmd && + macrolookup(macros, in, t.text, &t.pos)) { + dtor(t), t = get_token(in); + } + /* * This token begins a paragraph. See if it's one of the * special commands that define a paragraph type. @@ -1522,7 +1529,17 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) { } stk_free(parsestk); prev_para_type = par.type; - addpara(par, ret); + /* + * Before we add the paragraph to the output list, we + * should check that there was any text in it at all; there + * might not be if (for example) the paragraph contained + * nothing but an unrecognised command sequence, and if we + * put an empty paragraph on the list it may confuse the + * back ends later on. + */ + if (par.words) { + addpara(par, ret); + } if (t.type == tok_eof) already = TRUE; } @@ -1540,7 +1557,6 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) { * this cleanup doesn't happen. */ dtor(t); - macrocleanup(macros); stk_free(crossparastk); } @@ -1548,6 +1564,9 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) { paragraph *read_input(input *in, indexdata *idx) { paragraph *head = NULL; paragraph **hptr = &head; + tree234 *macros; + + macros = newtree234(macrocmp); while (in->currindex < in->nfiles) { in->currfp = fopen(in->filenames[in->currindex], "r"); @@ -1557,10 +1576,19 @@ 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); + 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 + read_file(&hptr, in, idx, macros); } in->currindex++; } + macrocleanup(macros); + return head; }