| 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;
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;
}
}
# define NOPOP -20000
-p_mem alloc();
+p_mem alloc(), ralloc();
doclose(f)
FILE *f;
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;
mustpop = NOPOP;
}
for (ppu = pushlist; ppu < ppushlist; ppu++) genpush(*ppu);
+ free((p_mem) pushlist);
f = fpars;
for (;;) {
switch (g_gettype(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;
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 :
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;
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 :