1518 |
} \ |
} \ |
1519 |
} while (0) |
} while (0) |
1520 |
|
|
1521 |
|
/* Discard a saved register off the stack. */ |
1522 |
|
#define DISCARD_FAILURE_REG_OR_COUNT() \ |
1523 |
|
do { \ |
1524 |
|
int reg = POP_FAILURE_INT (); \ |
1525 |
|
if (reg == -1) \ |
1526 |
|
{ \ |
1527 |
|
/* It's a counter. */ \ |
1528 |
|
POP_FAILURE_POINTER (); \ |
1529 |
|
reg = POP_FAILURE_INT (); \ |
1530 |
|
DEBUG_PRINT3 (" Discard counter %p = %d\n", ptr, reg); \ |
1531 |
|
} \ |
1532 |
|
else \ |
1533 |
|
{ \ |
1534 |
|
POP_FAILURE_POINTER (); \ |
1535 |
|
POP_FAILURE_POINTER (); \ |
1536 |
|
DEBUG_PRINT4 (" Discard reg %d (spanning %p -> %p)\n", \ |
1537 |
|
reg, regstart[reg], regend[reg]); \ |
1538 |
|
} \ |
1539 |
|
} while (0) |
1540 |
|
|
1541 |
/* Check that we are not stuck in an infinite loop. */ |
/* Check that we are not stuck in an infinite loop. */ |
1542 |
#define CHECK_INFINITE_LOOP(pat_cur, string_place) \ |
#define CHECK_INFINITE_LOOP(pat_cur, string_place) \ |
1543 |
do { \ |
do { \ |
1544 |
int failure = TOP_FAILURE_HANDLE(); \ |
int failure = TOP_FAILURE_HANDLE (); \ |
1545 |
/* Check for infinite matching loops */ \ |
/* Check for infinite matching loops */ \ |
1546 |
while (failure > 0 && \ |
while (failure > 0 \ |
1547 |
(FAILURE_STR (failure) == string_place \ |
&& (FAILURE_STR (failure) == string_place \ |
1548 |
|| FAILURE_STR (failure) == NULL)) \ |
|| FAILURE_STR (failure) == NULL)) \ |
1549 |
{ \ |
{ \ |
1550 |
assert (FAILURE_PAT (failure) >= bufp->buffer \ |
assert (FAILURE_PAT (failure) >= bufp->buffer \ |
1551 |
&& FAILURE_PAT (failure) <= bufp->buffer + bufp->used); \ |
&& FAILURE_PAT (failure) <= bufp->buffer + bufp->used); \ |
1552 |
if (FAILURE_PAT (failure) == pat_cur) \ |
if (FAILURE_PAT (failure) == pat_cur) \ |
1553 |
goto fail; \ |
{ \ |
1554 |
|
while (fail_stack.frame < fail_stack.avail) \ |
1555 |
|
DISCARD_FAILURE_REG_OR_COUNT (); \ |
1556 |
|
goto fail; \ |
1557 |
|
} \ |
1558 |
DEBUG_PRINT2 (" Other pattern: %p\n", FAILURE_PAT (failure)); \ |
DEBUG_PRINT2 (" Other pattern: %p\n", FAILURE_PAT (failure)); \ |
1559 |
failure = NEXT_FAILURE_HANDLE(failure); \ |
failure = NEXT_FAILURE_HANDLE(failure); \ |
1560 |
} \ |
} \ |
1944 |
do { if (p != pend) \ |
do { if (p != pend) \ |
1945 |
{ \ |
{ \ |
1946 |
PATFETCH (c); \ |
PATFETCH (c); \ |
1947 |
|
while (c == ' ') PATFETCH (c); \ |
1948 |
while ('0' <= c && c <= '9') \ |
while ('0' <= c && c <= '9') \ |
1949 |
{ \ |
{ \ |
1950 |
|
int prev; \ |
1951 |
if (num < 0) \ |
if (num < 0) \ |
1952 |
num = 0; \ |
num = 0; \ |
1953 |
|
prev = num; \ |
1954 |
num = num * 10 + c - '0'; \ |
num = num * 10 + c - '0'; \ |
1955 |
|
if (num / 10 != prev) \ |
1956 |
|
FREE_STACK_RETURN (REG_BADBR); \ |
1957 |
if (p == pend) \ |
if (p == pend) \ |
1958 |
break; \ |
break; \ |
1959 |
PATFETCH (c); \ |
PATFETCH (c); \ |
1960 |
} \ |
} \ |
1961 |
|
while (c == ' ') PATFETCH (c); \ |
1962 |
} \ |
} \ |
1963 |
} while (0) |
} while (0) |
1964 |
|
|