diff options
| author | Richard M. Stallman | 2002-03-21 09:44:43 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 2002-03-21 09:44:43 +0000 |
| commit | f6df485fd77a79b73dea20183d24663ac9213561 (patch) | |
| tree | 8d8138d31eb4306f26e26e8a04ae46790829272f /src | |
| parent | bed0fc913cfff3f02eba6c7ee5e2fe144f3f1465 (diff) | |
| download | emacs-f6df485fd77a79b73dea20183d24663ac9213561.tar.gz emacs-f6df485fd77a79b73dea20183d24663ac9213561.zip | |
(DISCARD_FAILURE_REG_OR_COUNT): New macro.
(CHECK_INFINITE_LOOP): Use DISCARD_FAILURE_REG_OR_COUNT
when jumping to `fail' to avoid undoing reg changes in the
last iteration of the loop.
(GET_UNSIGNED_NUMBER): Skip spaces around the number.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 6 | ||||
| -rw-r--r-- | src/regex.c | 44 |
2 files changed, 43 insertions, 7 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 9d4dfa7dda0..d215a29bd70 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,5 +1,11 @@ | |||
| 1 | 2002-03-21 Richard M. Stallman <rms@gnu.org> | 1 | 2002-03-21 Richard M. Stallman <rms@gnu.org> |
| 2 | 2 | ||
| 3 | * regex.c (DISCARD_FAILURE_REG_OR_COUNT): New macro. | ||
| 4 | (CHECK_INFINITE_LOOP): Use DISCARD_FAILURE_REG_OR_COUNT | ||
| 5 | when jumping to `fail' to avoid undoing reg changes in the | ||
| 6 | last iteration of the loop. | ||
| 7 | (GET_UNSIGNED_NUMBER): Skip spaces around the number. | ||
| 8 | |||
| 3 | * Makefile.in (dispnew.o, sysdep.o, xdisp.o, xselect.o, alloc.o): | 9 | * Makefile.in (dispnew.o, sysdep.o, xdisp.o, xselect.o, alloc.o): |
| 4 | Depend on process.h. | 10 | Depend on process.h. |
| 5 | 11 | ||
diff --git a/src/regex.c b/src/regex.c index 37436fffba0..cd05bf8860b 100644 --- a/src/regex.c +++ b/src/regex.c | |||
| @@ -1518,19 +1518,43 @@ do { \ | |||
| 1518 | } \ | 1518 | } \ |
| 1519 | } while (0) | 1519 | } while (0) |
| 1520 | 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 | |||
| 1521 | /* Check that we are not stuck in an infinite loop. */ | 1541 | /* Check that we are not stuck in an infinite loop. */ |
| 1522 | #define CHECK_INFINITE_LOOP(pat_cur, string_place) \ | 1542 | #define CHECK_INFINITE_LOOP(pat_cur, string_place) \ |
| 1523 | do { \ | 1543 | do { \ |
| 1524 | int failure = TOP_FAILURE_HANDLE(); \ | 1544 | int failure = TOP_FAILURE_HANDLE (); \ |
| 1525 | /* Check for infinite matching loops */ \ | 1545 | /* Check for infinite matching loops */ \ |
| 1526 | while (failure > 0 && \ | 1546 | while (failure > 0 \ |
| 1527 | (FAILURE_STR (failure) == string_place \ | 1547 | && (FAILURE_STR (failure) == string_place \ |
| 1528 | || FAILURE_STR (failure) == NULL)) \ | 1548 | || FAILURE_STR (failure) == NULL)) \ |
| 1529 | { \ | 1549 | { \ |
| 1530 | assert (FAILURE_PAT (failure) >= bufp->buffer \ | 1550 | assert (FAILURE_PAT (failure) >= bufp->buffer \ |
| 1531 | && FAILURE_PAT (failure) <= bufp->buffer + bufp->used); \ | 1551 | && FAILURE_PAT (failure) <= bufp->buffer + bufp->used); \ |
| 1532 | if (FAILURE_PAT (failure) == pat_cur) \ | 1552 | if (FAILURE_PAT (failure) == pat_cur) \ |
| 1533 | goto fail; \ | 1553 | { \ |
| 1554 | while (fail_stack.frame < fail_stack.avail) \ | ||
| 1555 | DISCARD_FAILURE_REG_OR_COUNT (); \ | ||
| 1556 | goto fail; \ | ||
| 1557 | } \ | ||
| 1534 | DEBUG_PRINT2 (" Other pattern: %p\n", FAILURE_PAT (failure)); \ | 1558 | DEBUG_PRINT2 (" Other pattern: %p\n", FAILURE_PAT (failure)); \ |
| 1535 | failure = NEXT_FAILURE_HANDLE(failure); \ | 1559 | failure = NEXT_FAILURE_HANDLE(failure); \ |
| 1536 | } \ | 1560 | } \ |
| @@ -1920,15 +1944,21 @@ struct range_table_work_area | |||
| 1920 | do { if (p != pend) \ | 1944 | do { if (p != pend) \ |
| 1921 | { \ | 1945 | { \ |
| 1922 | PATFETCH (c); \ | 1946 | PATFETCH (c); \ |
| 1947 | while (c == ' ') PATFETCH (c); \ | ||
| 1923 | while ('0' <= c && c <= '9') \ | 1948 | while ('0' <= c && c <= '9') \ |
| 1924 | { \ | 1949 | { \ |
| 1950 | int prev; \ | ||
| 1925 | if (num < 0) \ | 1951 | if (num < 0) \ |
| 1926 | num = 0; \ | 1952 | num = 0; \ |
| 1953 | prev = num; \ | ||
| 1927 | num = num * 10 + c - '0'; \ | 1954 | num = num * 10 + c - '0'; \ |
| 1955 | if (num / 10 != prev) \ | ||
| 1956 | FREE_STACK_RETURN (REG_BADBR); \ | ||
| 1928 | if (p == pend) \ | 1957 | if (p == pend) \ |
| 1929 | break; \ | 1958 | break; \ |
| 1930 | PATFETCH (c); \ | 1959 | PATFETCH (c); \ |
| 1931 | } \ | 1960 | } \ |
| 1961 | while (c == ' ') PATFETCH (c); \ | ||
| 1932 | } \ | 1962 | } \ |
| 1933 | } while (0) | 1963 | } while (0) |
| 1934 | 1964 | ||