X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/086907e6ca01e2afc2529397afd8d81746f7d33b..c9b4e60f1501a9d1c2eb29ab141694f95b70c1da:/input.c diff --git a/input.c b/input.c index 98a3034..1e132b4 100644 --- a/input.c +++ b/input.c @@ -426,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 { @@ -591,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; @@ -631,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(); @@ -808,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. @@ -1524,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; } @@ -1542,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); } @@ -1550,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"); @@ -1559,10 +1576,12 @@ 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); + read_file(&hptr, in, idx, macros); } in->currindex++; } + macrocleanup(macros); + return head; }