From 3ea06a4a2a75f3e1b6800f4c4c8bc28d2cec9aa8 Mon Sep 17 00:00:00 2001 From: ceriel Date: Fri, 7 Aug 1987 14:35:21 +0000 Subject: [PATCH] ran out of another static list; made length dynamic --- util/LLgen/src/LLgen.g | 8 ++++---- util/LLgen/src/gencode.c | 30 ++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/util/LLgen/src/LLgen.g b/util/LLgen/src/LLgen.g index 5ef6f6c1a..b2b0b6e6c 100644 --- a/util/LLgen/src/LLgen.g +++ b/util/LLgen/src/LLgen.g @@ -295,11 +295,11 @@ simpleproduction(p_gram *p; register int *conflres;) | C_AVOID { *conflres |= AVOIDING; } ]? [ %persistent elem(&elem) - { if (p_rule - rule >= n_rule - 1) { + { if (p_rule - rule >= n_rule - 2) { rule = (p_gram) ralloc( (p_mem) rule, (n_rule+100)*sizeof(t_gram)); - p_rule = rule + n_rule - 1; + p_rule = rule + n_rule - 2; n_rule += 100; } kind = FIXED; @@ -323,11 +323,11 @@ simpleproduction(p_gram *p; register int *conflres;) g_gettype(q->t_rule) != EORULE) { while (g_gettype(q->t_rule) != EORULE) { *p_rule++ = *q->t_rule++; - if (p_rule - rule >= n_rule - 1) { + if (p_rule - rule >= n_rule - 2) { rule = (p_gram) ralloc( (p_mem) rule, (n_rule+100)*sizeof(t_gram)); - p_rule = rule + n_rule - 1; + p_rule = rule + n_rule - 2; n_rule += 100; } } diff --git a/util/LLgen/src/gencode.c b/util/LLgen/src/gencode.c index 59ff77899..0040a7233 100644 --- a/util/LLgen/src/gencode.c +++ b/util/LLgen/src/gencode.c @@ -71,7 +71,7 @@ STATIC genincrdecr(); # define NOPOP -20000 -p_mem alloc(); +p_mem alloc(), ralloc(); doclose(f) FILE *f; @@ -393,16 +393,15 @@ rulecode(p,safety,mustscan,mustpop) register p_gram p; { register int toplevel = 1; register FILE *f; register int *ppu; - int pushlist[100]; + int *pushlist; int *ppushlist; /* * First generate code to push the contains sets of this rule * on a stack */ - ppu = pushlist; - ppushlist = dopush(p,safety,1,ppu); - if (mustpop != NOPOP) for (; ppu < ppushlist; ppu++) { + ppushlist = dopush(p,safety,1, &pushlist); + if (mustpop != NOPOP) for (ppu = pushlist; ppu < ppushlist; ppu++) { if (*ppu == mustpop) { *ppu = mustpop = NOPOP; break; @@ -413,6 +412,7 @@ rulecode(p,safety,mustscan,mustpop) register p_gram p; { mustpop = NOPOP; } for (ppu = pushlist; ppu < ppushlist; ppu++) genpush(*ppu); + free((p_mem) pushlist); f = fpars; for (;;) { switch (g_gettype(p)) { @@ -595,16 +595,26 @@ alternation(p, safety, mustscan, mustpop, lb) register p_gram p; { } STATIC int * -dopush(p,safety,toplevel,pp) register p_gram p; register int *pp; { +dopush(p,safety,toplevel,pp) register p_gram p; int **pp; { /* * The safety only matters if toplevel != 0 */ + unsigned int i = 100; + register int *ip = (int *) alloc(100 * sizeof(int)); + + *pp = ip; for (;;) { + if (ip - *pp >= i) { + *pp = (int *) + ralloc((p_mem) (*pp), (i + 100) * sizeof(int)); + ip = *pp + i; + i += 100; + } switch(g_gettype(p)) { case EORULE : case ALTERNATION : - return pp; + return ip; case TERM : { register p_term q; int rep, cnt; @@ -614,7 +624,7 @@ dopush(p,safety,toplevel,pp) register p_gram p; register int *pp; { cnt = r_getnum(q); if (!(toplevel > 0 && safety <= SAFESCANDONE && (rep == OPT || (rep == FIXED && cnt == 0)))) { - *pp++ = findindex(q->t_contains); + *ip++ = findindex(q->t_contains); } break; } case LITERAL : @@ -625,7 +635,7 @@ dopush(p,safety,toplevel,pp) register p_gram p; register int *pp; { safety = NOSCANDONE; continue; } - if (toplevel == 0) *pp++ = -(g_getcont(p)+1); + if (toplevel == 0) *ip++ = -(g_getcont(p)+1); break; case NONTERM : { register p_nont n; @@ -634,7 +644,7 @@ dopush(p,safety,toplevel,pp) register p_gram p; register int *pp; { if (toplevel == 0 || (g_gettype(n->n_rule) == ALTERNATION && getntsafe(n) > SAFESCANDONE)) { - *pp++ = findindex(n->n_contains); + *ip++ = findindex(n->n_contains); } break; } case ACTION : -- 2.34.1