improved userhook handling, This required some changes in the semantics
of LLnext and LLskip.
This commit is contained in:
parent
78303cdc07
commit
451c0d6679
1 changed files with 27 additions and 5 deletions
|
@ -92,13 +92,29 @@ LLfirst(x, d) {
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
LLnext(n) {
|
LLnext(n) {
|
||||||
|
/* returns: 0 if the current symbol is'nt skipped, and it
|
||||||
|
is'nt a member of "n",
|
||||||
|
1 if we have a new symbol, but it is'nt a member,
|
||||||
|
2 if the current symbol is a member,
|
||||||
|
and 3 if we have a new symbol and it is a member.
|
||||||
|
So, the low order bit indicates wether we have a new symbol,
|
||||||
|
and the next bit indicates wether it is a member of "n".
|
||||||
|
*/
|
||||||
|
|
||||||
if (LLskip()) /* nothing */;
|
int retval = 0;
|
||||||
if (n <= 0) return (LLsets[(LLcsymb >> 3) - n] & (1 << (LLcsymb & 07)));
|
|
||||||
return LLsymb == n;
|
if (LLskip()) retval = 1;
|
||||||
|
if (n <= 0 && LLsets[(LLcsymb >> 3) - n] & (1 << (LLcsymb & 07))) {
|
||||||
|
retval |= 2;
|
||||||
|
}
|
||||||
|
else if (LLsymb == n) retval |= 2;
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
LLskip() {
|
LLskip() {
|
||||||
|
/* returns 0 if the current symbol is'nt skipped, and
|
||||||
|
1 if it is, t.i., we have a new symbol
|
||||||
|
*/
|
||||||
#ifdef LL_USERHOOK
|
#ifdef LL_USERHOOK
|
||||||
return LLdoskip(0);
|
return LLdoskip(0);
|
||||||
}
|
}
|
||||||
|
@ -112,16 +128,18 @@ LLuserhook(exp)
|
||||||
}
|
}
|
||||||
|
|
||||||
LLdoskip(exp) {
|
LLdoskip(exp) {
|
||||||
|
int LLx;
|
||||||
#endif LL_USERHOOK
|
#endif LL_USERHOOK
|
||||||
register int i;
|
register int i;
|
||||||
int retval;
|
int retval;
|
||||||
int LLi, LLb;
|
int LLi, LLb;
|
||||||
|
|
||||||
retval = 0;
|
retval = 0;
|
||||||
for (;;) {
|
|
||||||
#ifdef LL_USERHOOK
|
#ifdef LL_USERHOOK
|
||||||
if (LLuserhook(exp)) continue;
|
LLx = LLuserhook(exp);
|
||||||
|
if (LLx) retval = 1;
|
||||||
#endif LL_USERHOOK
|
#endif LL_USERHOOK
|
||||||
|
for (;;) {
|
||||||
if (LLtcnt[LLcsymb] != 0) return retval;
|
if (LLtcnt[LLcsymb] != 0) return retval;
|
||||||
LLi = LLcsymb >> 3;
|
LLi = LLcsymb >> 3;
|
||||||
LLb = 1 << (LLcsymb & 07);
|
LLb = 1 << (LLcsymb & 07);
|
||||||
|
@ -132,6 +150,10 @@ LLdoskip(exp) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef LL_USERHOOK
|
||||||
|
if (LLx) LLx = LLuserhook(exp);
|
||||||
|
if (LLx) continue;
|
||||||
|
#endif LL_USERHOOK
|
||||||
LLmessage(0);
|
LLmessage(0);
|
||||||
retval = 1;
|
retval = 1;
|
||||||
LLread();
|
LLread();
|
||||||
|
|
Loading…
Reference in a new issue