summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2004-11-17 18:11:12 +0000
committerSimon Tatham <anakin@pobox.com>2004-11-17 18:11:12 +0000
commit310cf5b5cbbe492a67a0a54fbf0b985db455b92c (patch)
treebb895c7409b2fc9a0afaed97269af9dffc5879dc
parent765f04a95ddec81a89734749071cc41a0f784e21 (diff)
downloadhalibut-310cf5b5cbbe492a67a0a54fbf0b985db455b92c.zip
halibut-310cf5b5cbbe492a67a0a54fbf0b985db455b92c.tar.gz
halibut-310cf5b5cbbe492a67a0a54fbf0b985db455b92c.tar.bz2
halibut-310cf5b5cbbe492a67a0a54fbf0b985db455b92c.tar.xz
Allow macros to work (a) at the very start of a paragraph, and (b)
across files (defining a macro in one source file and invoking it in a later one). [originally from svn r4803]
-rw-r--r--input.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/input.c b/input.c
index 98a3034..a616ac9 100644
--- a/input.c
+++ b/input.c
@@ -591,11 +591,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 +631,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 +807,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.
@@ -1542,7 +1546,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 +1553,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 +1565,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;
}