GNUregex.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:140k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: GNUregex.c,v 1.11 1998/09/23 17:14:20 wessels Exp $
  3.  */
  4. /* Extended regular expression matching and search library,
  5.  * version 0.12.
  6.  * (Implements POSIX draft P10003.2/D11.2, except for
  7.  * internationalization features.)
  8.  * 
  9.  * Copyright (C) 1993 Free Software Foundation, Inc.
  10.  * 
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2, or (at your option)
  14.  * any later version.
  15.  * 
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  * 
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.  */
  24. /* AIX requires this to be the first thing in the file. */
  25. #if defined (_AIX) && !defined (REGEX_MALLOC)
  26. #pragma alloca
  27. #endif
  28. #ifndef _GNU_SOURCE
  29. #define _GNU_SOURCE 1
  30. #endif
  31. #include "config.h"
  32. #if !HAVE_ALLOCA
  33. #define REGEX_MALLOC 1
  34. #endif
  35. /* The `emacs' switch turns on certain matching commands
  36.  * that make sense only in Emacs. */
  37. #ifdef emacs
  38. #include "lisp.h"
  39. #include "buffer.h"
  40. #include "syntax.h"
  41. /* Emacs uses `NULL' as a predicate.  */
  42. #undef NULL
  43. #else /* not emacs */
  44. /* We used to test for `BSTRING' here, but only GCC and Emacs define
  45.  * `BSTRING', as far as I know, and neither of them use this code.  */
  46. #if HAVE_STRING_H || STDC_HEADERS
  47. #include <string.h>
  48. #else
  49. #include <strings.h>
  50. #endif
  51. #ifdef STDC_HEADERS
  52. #include <stdlib.h>
  53. #else
  54. char *malloc();
  55. char *realloc();
  56. #endif
  57. /* Define the syntax stuff for <, >, etc.  */
  58. /* This must be nonzero for the wordchar and notwordchar pattern
  59.  * commands in re_match_2.  */
  60. #ifndef Sword
  61. #define Sword 1
  62. #endif
  63. #ifdef SYNTAX_TABLE
  64. extern char *re_syntax_table;
  65. #else /* not SYNTAX_TABLE */
  66. /* How many characters in the character set.  */
  67. #define CHAR_SET_SIZE 256
  68. static char re_syntax_table[CHAR_SET_SIZE];
  69. static void
  70. init_syntax_once()
  71. {
  72.     register int c;
  73.     static int done = 0;
  74.     if (done)
  75. return;
  76.     memset(re_syntax_table, 0, sizeof re_syntax_table);
  77.     for (c = 'a'; c <= 'z'; c++)
  78. re_syntax_table[c] = Sword;
  79.     for (c = 'A'; c <= 'Z'; c++)
  80. re_syntax_table[c] = Sword;
  81.     for (c = '0'; c <= '9'; c++)
  82. re_syntax_table[c] = Sword;
  83.     re_syntax_table['_'] = Sword;
  84.     done = 1;
  85. }
  86. #endif /* not SYNTAX_TABLE */
  87. #define SYNTAX(c) re_syntax_table[c]
  88. #endif /* not emacs */
  89. /* Get the interface, including the syntax bits.  */
  90. #include "GNUregex.h"
  91. /* isalpha etc. are used for the character classes.  */
  92. #include <ctype.h>
  93. #ifndef isascii
  94. #define isascii(c) 1
  95. #endif
  96. #ifdef isblank
  97. #define ISBLANK(c) (isascii (c) && isblank (c))
  98. #else
  99. #define ISBLANK(c) ((c) == ' ' || (c) == 't')
  100. #endif
  101. #ifdef isgraph
  102. #define ISGRAPH(c) (isascii (c) && isgraph (c))
  103. #else
  104. #define ISGRAPH(c) (isascii (c) && isprint (c) && !isspace (c))
  105. #endif
  106. #define ISPRINT(c) (isascii (c) && isprint (c))
  107. #define ISDIGIT(c) (isascii (c) && isdigit (c))
  108. #define ISALNUM(c) (isascii (c) && isalnum (c))
  109. #define ISALPHA(c) (isascii (c) && isalpha (c))
  110. #define ISCNTRL(c) (isascii (c) && iscntrl (c))
  111. #define ISLOWER(c) (isascii (c) && islower (c))
  112. #define ISPUNCT(c) (isascii (c) && ispunct (c))
  113. #define ISSPACE(c) (isascii (c) && isspace (c))
  114. #define ISUPPER(c) (isascii (c) && isupper (c))
  115. #define ISXDIGIT(c) (isascii (c) && isxdigit (c))
  116. #ifndef NULL
  117. #define NULL 0
  118. #endif
  119. /* We remove any previous definition of `SIGN_EXTEND_CHAR',
  120.  * since ours (we hope) works properly with all combinations of
  121.  * machines, compilers, `char' and `unsigned char' argument types.
  122.  * (Per Bothner suggested the basic approach.)  */
  123. #undef SIGN_EXTEND_CHAR
  124. #ifdef __STDC__
  125. #define SIGN_EXTEND_CHAR(c) ((signed char) (c))
  126. #else /* not __STDC__ */
  127. /* As in Harbison and Steele.  */
  128. #define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
  129. #endif
  130. /* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
  131.  * use `alloca' instead of `malloc'.  This is because using malloc in
  132.  * re_search* or re_match* could cause memory leaks when C-g is used in
  133.  * Emacs; also, malloc is slower and causes storage fragmentation.  On
  134.  * the other hand, malloc is more portable, and easier to debug.  
  135.  * 
  136.  * Because we sometimes use alloca, some routines have to be macros,
  137.  * not functions -- `alloca'-allocated space disappears at the end of the
  138.  * function it is called in.  */
  139. #ifdef REGEX_MALLOC
  140. #define REGEX_ALLOCATE malloc
  141. #define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
  142. #else /* not REGEX_MALLOC  */
  143. /* Emacs already defines alloca, sometimes.  */
  144. #ifndef alloca
  145. /* Make alloca work the best possible way.  */
  146. #ifdef __GNUC__
  147. #define alloca __builtin_alloca
  148. #else /* not __GNUC__ */
  149. #if HAVE_ALLOCA_H
  150. #include <alloca.h>
  151. #else /* not __GNUC__ or HAVE_ALLOCA_H */
  152. #ifndef _AIX /* Already did AIX, up at the top.  */
  153. char *alloca();
  154. #endif /* not _AIX */
  155. #endif /* not HAVE_ALLOCA_H */
  156. #endif /* not __GNUC__ */
  157. #endif /* not alloca */
  158. #define REGEX_ALLOCATE alloca
  159. /* Assumes a `char *destination' variable.  */
  160. #define REGEX_REALLOCATE(source, osize, nsize)
  161.   (destination = (char *) alloca (nsize),
  162.    xmemcpy (destination, source, osize),
  163.    destination)
  164. #endif /* not REGEX_MALLOC */
  165. /* True if `size1' is non-NULL and PTR is pointing anywhere inside
  166.  * `string1' or just past its end.  This works if PTR is NULL, which is
  167.  * a good thing.  */
  168. #define FIRST_STRING_P(ptr) 
  169.   (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
  170. /* (Re)Allocate N items of type T using malloc, or fail.  */
  171. #define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
  172. #define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
  173. #define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
  174. #define BYTEWIDTH 8 /* In bits.  */
  175. #define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
  176. #define MAX(a, b) ((a) > (b) ? (a) : (b))
  177. #define MIN(a, b) ((a) < (b) ? (a) : (b))
  178. typedef char boolean;
  179. #define false 0
  180. #define true 1
  181. /* These are the command codes that appear in compiled regular
  182.  * expressions.  Some opcodes are followed by argument bytes.  A
  183.  * command code can specify any interpretation whatsoever for its
  184.  * arguments.  Zero bytes may appear in the compiled regular expression.
  185.  * 
  186.  * The value of `exactn' is needed in search.c (search_buffer) in Emacs.
  187.  * So regex.h defines a symbol `RE_EXACTN_VALUE' to be 1; the value of
  188.  * `exactn' we use here must also be 1.  */
  189. typedef enum {
  190.     no_op = 0,
  191.     /* Followed by one byte giving n, then by n literal bytes.  */
  192.     exactn = 1,
  193.     /* Matches any (more or less) character.  */
  194.     anychar,
  195.     /* Matches any one char belonging to specified set.  First
  196.      * following byte is number of bitmap bytes.  Then come bytes
  197.      * for a bitmap saying which chars are in.  Bits in each byte
  198.      * are ordered low-bit-first.  A character is in the set if its
  199.      * bit is 1.  A character too large to have a bit in the map is
  200.      * automatically not in the set.  */
  201.     charset,
  202.     /* Same parameters as charset, but match any character that is
  203.      * not one of those specified.  */
  204.     charset_not,
  205.     /* Start remembering the text that is matched, for storing in a
  206.      * register.  Followed by one byte with the register number, in
  207.      * the range 0 to one less than the pattern buffer's re_nsub
  208.      * field.  Then followed by one byte with the number of groups
  209.      * inner to this one.  (This last has to be part of the
  210.      * start_memory only because we need it in the on_failure_jump
  211.      * of re_match_2.)  */
  212.     start_memory,
  213.     /* Stop remembering the text that is matched and store it in a
  214.      * memory register.  Followed by one byte with the register
  215.      * number, in the range 0 to one less than `re_nsub' in the
  216.      * pattern buffer, and one byte with the number of inner groups,
  217.      * just like `start_memory'.  (We need the number of inner
  218.      * groups here because we don't have any easy way of finding the
  219.      * corresponding start_memory when we're at a stop_memory.)  */
  220.     stop_memory,
  221.     /* Match a duplicate of something remembered. Followed by one
  222.      * byte containing the register number.  */
  223.     duplicate,
  224.     /* Fail unless at beginning of line.  */
  225.     begline,
  226.     /* Fail unless at end of line.  */
  227.     endline,
  228.     /* Succeeds if at beginning of buffer (if emacs) or at beginning
  229.      * of string to be matched (if not).  */
  230.     begbuf,
  231.     /* Analogously, for end of buffer/string.  */
  232.     endbuf,
  233.     /* Followed by two byte relative address to which to jump.  */
  234.     jump,
  235.     /* Same as jump, but marks the end of an alternative.  */
  236.     jump_past_alt,
  237.     /* Followed by two-byte relative address of place to resume at
  238.      * in case of failure.  */
  239.     on_failure_jump,
  240.     /* Like on_failure_jump, but pushes a placeholder instead of the
  241.      * current string position when executed.  */
  242.     on_failure_keep_string_jump,
  243.     /* Throw away latest failure point and then jump to following
  244.      * two-byte relative address.  */
  245.     pop_failure_jump,
  246.     /* Change to pop_failure_jump if know won't have to backtrack to
  247.      * match; otherwise change to jump.  This is used to jump
  248.      * back to the beginning of a repeat.  If what follows this jump
  249.      * clearly won't match what the repeat does, such that we can be
  250.      * sure that there is no use backtracking out of repetitions
  251.      * already matched, then we change it to a pop_failure_jump.
  252.      * Followed by two-byte address.  */
  253.     maybe_pop_jump,
  254.     /* Jump to following two-byte address, and push a dummy failure
  255.      * point. This failure point will be thrown away if an attempt
  256.      * is made to use it for a failure.  A `+' construct makes this
  257.      * before the first repeat.  Also used as an intermediary kind
  258.      * of jump when compiling an alternative.  */
  259.     dummy_failure_jump,
  260.     /* Push a dummy failure point and continue.  Used at the end of
  261.      * alternatives.  */
  262.     push_dummy_failure,
  263.     /* Followed by two-byte relative address and two-byte number n.
  264.      * After matching N times, jump to the address upon failure.  */
  265.     succeed_n,
  266.     /* Followed by two-byte relative address, and two-byte number n.
  267.      * Jump to the address N times, then fail.  */
  268.     jump_n,
  269.     /* Set the following two-byte relative address to the
  270.      * subsequent two-byte number.  The address *includes* the two
  271.      * bytes of number.  */
  272.     set_number_at,
  273.     wordchar, /* Matches any word-constituent character.  */
  274.     notwordchar, /* Matches any char that is not a word-constituent.  */
  275.     wordbeg, /* Succeeds if at word beginning.  */
  276.     wordend, /* Succeeds if at word end.  */
  277.     wordbound, /* Succeeds if at a word boundary.  */
  278.     notwordbound /* Succeeds if not at a word boundary.  */
  279. #ifdef emacs
  280.     ,before_dot, /* Succeeds if before point.  */
  281.     at_dot, /* Succeeds if at point.  */
  282.     after_dot, /* Succeeds if after point.  */
  283.     /* Matches any character whose syntax is specified.  Followed by
  284.      * a byte which contains a syntax code, e.g., Sword.  */
  285.     syntaxspec,
  286.     /* Matches any character whose syntax is not that specified.  */
  287.     notsyntaxspec
  288. #endif /* emacs */
  289. } re_opcode_t;
  290. /* Common operations on the compiled pattern.  */
  291. /* Store NUMBER in two contiguous bytes starting at DESTINATION.  */
  292. #define STORE_NUMBER(destination, number)
  293.   do {
  294.     (destination)[0] = (number) & 0377;
  295.     (destination)[1] = (number) >> 8;
  296.   } while (0)
  297. /* Same as STORE_NUMBER, except increment DESTINATION to
  298.  * the byte after where the number is stored.  Therefore, DESTINATION
  299.  * must be an lvalue.  */
  300. #define STORE_NUMBER_AND_INCR(destination, number)
  301.   do {
  302.     STORE_NUMBER (destination, number);
  303.     (destination) += 2;
  304.   } while (0)
  305. /* Put into DESTINATION a number stored in two contiguous bytes starting
  306.  * at SOURCE.  */
  307. #define EXTRACT_NUMBER(destination, source)
  308.   do {
  309.     (destination) = *(source) & 0377;
  310.     (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8;
  311.   } while (0)
  312. #ifdef DEBUG
  313. static void
  314. extract_number(dest, source)
  315.      int *dest;
  316.      unsigned char *source;
  317. {
  318.     int temp = SIGN_EXTEND_CHAR(*(source + 1));
  319.     *dest = *source & 0377;
  320.     *dest += temp << 8;
  321. }
  322. #ifndef EXTRACT_MACROS /* To debug the macros.  */
  323. #undef EXTRACT_NUMBER
  324. #define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
  325. #endif /* not EXTRACT_MACROS */
  326. #endif /* DEBUG */
  327. /* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
  328.  * SOURCE must be an lvalue.  */
  329. #define EXTRACT_NUMBER_AND_INCR(destination, source)
  330.   do {
  331.     EXTRACT_NUMBER (destination, source);
  332.     (source) += 2; 
  333.   } while (0)
  334. #ifdef DEBUG
  335. static void
  336. extract_number_and_incr(destination, source)
  337.      int *destination;
  338.      unsigned char **source;
  339. {
  340.     extract_number(destination, *source);
  341.     *source += 2;
  342. }
  343. #ifndef EXTRACT_MACROS
  344. #undef EXTRACT_NUMBER_AND_INCR
  345. #define EXTRACT_NUMBER_AND_INCR(dest, src) 
  346.   extract_number_and_incr (&dest, &src)
  347. #endif /* not EXTRACT_MACROS */
  348. #endif /* DEBUG */
  349. /* If DEBUG is defined, Regex prints many voluminous messages about what
  350.  * it is doing (if the variable `debug' is nonzero).  If linked with the
  351.  * main program in `iregex.c', you can enter patterns and strings
  352.  * interactively.  And if linked with the main program in `main.c' and
  353.  * the other test files, you can run the already-written tests.  */
  354. #ifdef DEBUG
  355. /* We use standard I/O for debugging.  */
  356. #include <stdio.h>
  357. /* It is useful to test things that ``must'' be true when debugging.  */
  358. #include <assert.h>
  359. static int debug = 0;
  360. #define DEBUG_STATEMENT(e) e
  361. #define DEBUG_PRINT1(x) if (debug) printf (x)
  362. #define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
  363. #define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
  364. #define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
  365. #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) 
  366.   if (debug) print_partial_compiled_pattern (s, e)
  367. #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
  368.   if (debug) print_double_string (w, s1, sz1, s2, sz2)
  369. extern void printchar();
  370. /* Print the fastmap in human-readable form.  */
  371. void
  372. print_fastmap(fastmap)
  373.      char *fastmap;
  374. {
  375.     unsigned was_a_range = 0;
  376.     unsigned i = 0;
  377.     while (i < (1 << BYTEWIDTH)) {
  378. if (fastmap[i++]) {
  379.     was_a_range = 0;
  380.     printchar(i - 1);
  381.     while (i < (1 << BYTEWIDTH) && fastmap[i]) {
  382. was_a_range = 1;
  383. i++;
  384.     }
  385.     if (was_a_range) {
  386. printf("-");
  387. printchar(i - 1);
  388.     }
  389. }
  390.     }
  391.     putchar('n');
  392. }
  393. /* Print a compiled pattern string in human-readable form, starting at
  394.  * the START pointer into it and ending just before the pointer END.  */
  395. void
  396. print_partial_compiled_pattern(start, end)
  397.      unsigned char *start;
  398.      unsigned char *end;
  399. {
  400.     int mcnt, mcnt2;
  401.     unsigned char *p = start;
  402.     unsigned char *pend = end;
  403.     if (start == NULL) {
  404. printf("(null)n");
  405. return;
  406.     }
  407.     /* Loop over pattern commands.  */
  408.     while (p < pend) {
  409. switch ((re_opcode_t) * p++) {
  410. case no_op:
  411.     printf("/no_op");
  412.     break;
  413. case exactn:
  414.     mcnt = *p++;
  415.     printf("/exactn/%d", mcnt);
  416.     do {
  417. putchar('/');
  418. printchar(*p++);
  419.     }
  420.     while (--mcnt);
  421.     break;
  422. case start_memory:
  423.     mcnt = *p++;
  424.     printf("/start_memory/%d/%d", mcnt, *p++);
  425.     break;
  426. case stop_memory:
  427.     mcnt = *p++;
  428.     printf("/stop_memory/%d/%d", mcnt, *p++);
  429.     break;
  430. case duplicate:
  431.     printf("/duplicate/%d", *p++);
  432.     break;
  433. case anychar:
  434.     printf("/anychar");
  435.     break;
  436. case charset:
  437. case charset_not:
  438.     {
  439. register int c;
  440. printf("/charset%s",
  441.     (re_opcode_t) * (p - 1) == charset_not ? "_not" : "");
  442. assert(p + *p < pend);
  443. for (c = 0; c < *p; c++) {
  444.     unsigned bit;
  445.     unsigned char map_byte = p[1 + c];
  446.     putchar('/');
  447.     for (bit = 0; bit < BYTEWIDTH; bit++)
  448. if (map_byte & (1 << bit))
  449.     printchar(c * BYTEWIDTH + bit);
  450. }
  451. p += 1 + *p;
  452. break;
  453.     }
  454. case begline:
  455.     printf("/begline");
  456.     break;
  457. case endline:
  458.     printf("/endline");
  459.     break;
  460. case on_failure_jump:
  461.     extract_number_and_incr(&mcnt, &p);
  462.     printf("/on_failure_jump/0/%d", mcnt);
  463.     break;
  464. case on_failure_keep_string_jump:
  465.     extract_number_and_incr(&mcnt, &p);
  466.     printf("/on_failure_keep_string_jump/0/%d", mcnt);
  467.     break;
  468. case dummy_failure_jump:
  469.     extract_number_and_incr(&mcnt, &p);
  470.     printf("/dummy_failure_jump/0/%d", mcnt);
  471.     break;
  472. case push_dummy_failure:
  473.     printf("/push_dummy_failure");
  474.     break;
  475. case maybe_pop_jump:
  476.     extract_number_and_incr(&mcnt, &p);
  477.     printf("/maybe_pop_jump/0/%d", mcnt);
  478.     break;
  479. case pop_failure_jump:
  480.     extract_number_and_incr(&mcnt, &p);
  481.     printf("/pop_failure_jump/0/%d", mcnt);
  482.     break;
  483. case jump_past_alt:
  484.     extract_number_and_incr(&mcnt, &p);
  485.     printf("/jump_past_alt/0/%d", mcnt);
  486.     break;
  487. case jump:
  488.     extract_number_and_incr(&mcnt, &p);
  489.     printf("/jump/0/%d", mcnt);
  490.     break;
  491. case succeed_n:
  492.     extract_number_and_incr(&mcnt, &p);
  493.     extract_number_and_incr(&mcnt2, &p);
  494.     printf("/succeed_n/0/%d/0/%d", mcnt, mcnt2);
  495.     break;
  496. case jump_n:
  497.     extract_number_and_incr(&mcnt, &p);
  498.     extract_number_and_incr(&mcnt2, &p);
  499.     printf("/jump_n/0/%d/0/%d", mcnt, mcnt2);
  500.     break;
  501. case set_number_at:
  502.     extract_number_and_incr(&mcnt, &p);
  503.     extract_number_and_incr(&mcnt2, &p);
  504.     printf("/set_number_at/0/%d/0/%d", mcnt, mcnt2);
  505.     break;
  506. case wordbound:
  507.     printf("/wordbound");
  508.     break;
  509. case notwordbound:
  510.     printf("/notwordbound");
  511.     break;
  512. case wordbeg:
  513.     printf("/wordbeg");
  514.     break;
  515. case wordend:
  516.     printf("/wordend");
  517. #ifdef emacs
  518. case before_dot:
  519.     printf("/before_dot");
  520.     break;
  521. case at_dot:
  522.     printf("/at_dot");
  523.     break;
  524. case after_dot:
  525.     printf("/after_dot");
  526.     break;
  527. case syntaxspec:
  528.     printf("/syntaxspec");
  529.     mcnt = *p++;
  530.     printf("/%d", mcnt);
  531.     break;
  532. case notsyntaxspec:
  533.     printf("/notsyntaxspec");
  534.     mcnt = *p++;
  535.     printf("/%d", mcnt);
  536.     break;
  537. #endif /* emacs */
  538. case wordchar:
  539.     printf("/wordchar");
  540.     break;
  541. case notwordchar:
  542.     printf("/notwordchar");
  543.     break;
  544. case begbuf:
  545.     printf("/begbuf");
  546.     break;
  547. case endbuf:
  548.     printf("/endbuf");
  549.     break;
  550. default:
  551.     printf("?%d", *(p - 1));
  552. }
  553.     }
  554.     printf("/n");
  555. }
  556. void
  557. print_compiled_pattern(bufp)
  558.      struct re_pattern_buffer *bufp;
  559. {
  560.     unsigned char *buffer = bufp->buffer;
  561.     print_partial_compiled_pattern(buffer, buffer + bufp->used);
  562.     printf("%d bytes used/%d bytes allocated.n", bufp->used, bufp->allocated);
  563.     if (bufp->fastmap_accurate && bufp->fastmap) {
  564. printf("fastmap: ");
  565. print_fastmap(bufp->fastmap);
  566.     }
  567.     printf("re_nsub: %dt", bufp->re_nsub);
  568.     printf("regs_alloc: %dt", bufp->regs_allocated);
  569.     printf("can_be_null: %dt", bufp->can_be_null);
  570.     printf("newline_anchor: %dn", bufp->newline_anchor);
  571.     printf("no_sub: %dt", bufp->no_sub);
  572.     printf("not_bol: %dt", bufp->not_bol);
  573.     printf("not_eol: %dt", bufp->not_eol);
  574.     printf("syntax: %dn", bufp->syntax);
  575.     /* Perhaps we should print the translate table?  */
  576. }
  577. void
  578. print_double_string(where, string1, size1, string2, size2)
  579.      const char *where;
  580.      const char *string1;
  581.      const char *string2;
  582.      int size1;
  583.      int size2;
  584. {
  585.     unsigned this_char;
  586.     if (where == NULL)
  587. printf("(null)");
  588.     else {
  589. if (FIRST_STRING_P(where)) {
  590.     for (this_char = where - string1; this_char < size1; this_char++)
  591. printchar(string1[this_char]);
  592.     where = string2;
  593. }
  594. for (this_char = where - string2; this_char < size2; this_char++)
  595.     printchar(string2[this_char]);
  596.     }
  597. }
  598. #else /* not DEBUG */
  599. #undef assert
  600. #define assert(e)
  601. #define DEBUG_STATEMENT(e)
  602. #define DEBUG_PRINT1(x)
  603. #define DEBUG_PRINT2(x1, x2)
  604. #define DEBUG_PRINT3(x1, x2, x3)
  605. #define DEBUG_PRINT4(x1, x2, x3, x4)
  606. #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
  607. #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
  608. #endif /* not DEBUG */
  609. /* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
  610.  * also be assigned to arbitrarily: each pattern buffer stores its own
  611.  * syntax, so it can be changed between regex compilations.  */
  612. reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS;
  613. /* Specify the precise syntax of regexps for compilation.  This provides
  614.  * for compatibility for various utilities which historically have
  615.  * different, incompatible syntaxes.
  616.  * 
  617.  * The argument SYNTAX is a bit mask comprised of the various bits
  618.  * defined in regex.h.  We return the old syntax.  */
  619. reg_syntax_t
  620. re_set_syntax(syntax)
  621.      reg_syntax_t syntax;
  622. {
  623.     reg_syntax_t ret = re_syntax_options;
  624.     re_syntax_options = syntax;
  625.     return ret;
  626. }
  627. /* This table gives an error message for each of the error codes listed
  628.  * in regex.h.  Obviously the order here has to be same as there.  */
  629. static const char *re_error_msg[] =
  630. {NULL, /* REG_NOERROR */
  631.     "No match", /* REG_NOMATCH */
  632.     "Invalid regular expression", /* REG_BADPAT */
  633.     "Invalid collation character", /* REG_ECOLLATE */
  634.     "Invalid character class name", /* REG_ECTYPE */
  635.     "Trailing backslash", /* REG_EESCAPE */
  636.     "Invalid back reference", /* REG_ESUBREG */
  637.     "Unmatched [ or [^", /* REG_EBRACK */
  638.     "Unmatched ( or \(", /* REG_EPAREN */
  639.     "Unmatched \{", /* REG_EBRACE */
  640.     "Invalid content of \{\}", /* REG_BADBR */
  641.     "Invalid range end", /* REG_ERANGE */
  642.     "Memory exhausted", /* REG_ESPACE */
  643.     "Invalid preceding regular expression", /* REG_BADRPT */
  644.     "Premature end of regular expression", /* REG_EEND */
  645.     "Regular expression too big", /* REG_ESIZE */
  646.     "Unmatched ) or \)", /* REG_ERPAREN */
  647. };
  648. /* Subroutine declarations and macros for regex_compile.  */
  649. static void store_op1(), store_op2();
  650. static void insert_op1(), insert_op2();
  651. static boolean at_begline_loc_p(), at_endline_loc_p();
  652. static boolean group_in_compile_stack();
  653. static reg_errcode_t compile_range();
  654. /* Fetch the next character in the uncompiled pattern---translating it 
  655.  * if necessary.  Also cast from a signed character in the constant
  656.  * string passed to us by the user to an unsigned char that we can use
  657.  * as an array index (in, e.g., `translate').  */
  658. #define PATFETCH(c)
  659.   do {if (p == pend) return REG_EEND;
  660.     c = (unsigned char) *p++;
  661.     if (translate) c = translate[c]; 
  662.   } while (0)
  663. /* Fetch the next character in the uncompiled pattern, with no
  664.  * translation.  */
  665. #define PATFETCH_RAW(c)
  666.   do {if (p == pend) return REG_EEND;
  667.     c = (unsigned char) *p++; 
  668.   } while (0)
  669. /* Go backwards one character in the pattern.  */
  670. #define PATUNFETCH p--
  671. /* If `translate' is non-null, return translate[D], else just D.  We
  672.  * cast the subscript to translate because some data is declared as
  673.  * `char *', to avoid warnings when a string constant is passed.  But
  674.  * when we use a character as a subscript we must make it unsigned.  */
  675. #define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d))
  676. /* Macros for outputting the compiled pattern into `buffer'.  */
  677. /* If the buffer isn't allocated when it comes in, use this.  */
  678. #define INIT_BUF_SIZE  32
  679. /* Make sure we have at least N more bytes of space in buffer.  */
  680. #define GET_BUFFER_SPACE(n)
  681.     while (b - bufp->buffer + (n) > bufp->allocated)
  682.       EXTEND_BUFFER ()
  683. /* Make sure we have one more byte of buffer space and then add C to it.  */
  684. #define BUF_PUSH(c)
  685.   do {
  686.     GET_BUFFER_SPACE (1);
  687.     *b++ = (unsigned char) (c);
  688.   } while (0)
  689. /* Ensure we have two more bytes of buffer space and then append C1 and C2.  */
  690. #define BUF_PUSH_2(c1, c2)
  691.   do {
  692.     GET_BUFFER_SPACE (2);
  693.     *b++ = (unsigned char) (c1);
  694.     *b++ = (unsigned char) (c2);
  695.   } while (0)
  696. /* As with BUF_PUSH_2, except for three bytes.  */
  697. #define BUF_PUSH_3(c1, c2, c3)
  698.   do {
  699.     GET_BUFFER_SPACE (3);
  700.     *b++ = (unsigned char) (c1);
  701.     *b++ = (unsigned char) (c2);
  702.     *b++ = (unsigned char) (c3);
  703.   } while (0)
  704. /* Store a jump with opcode OP at LOC to location TO.  We store a
  705.  * relative address offset by the three bytes the jump itself occupies.  */
  706. #define STORE_JUMP(op, loc, to) 
  707.   store_op1 (op, loc, (to) - (loc) - 3)
  708. /* Likewise, for a two-argument jump.  */
  709. #define STORE_JUMP2(op, loc, to, arg) 
  710.   store_op2 (op, loc, (to) - (loc) - 3, arg)
  711. /* Like `STORE_JUMP', but for inserting.  Assume `b' is the buffer end.  */
  712. #define INSERT_JUMP(op, loc, to) 
  713.   insert_op1 (op, loc, (to) - (loc) - 3, b)
  714. /* Like `STORE_JUMP2', but for inserting.  Assume `b' is the buffer end.  */
  715. #define INSERT_JUMP2(op, loc, to, arg) 
  716.   insert_op2 (op, loc, (to) - (loc) - 3, arg, b)
  717. /* This is not an arbitrary limit: the arguments which represent offsets
  718.  * into the pattern are two bytes long.  So if 2^16 bytes turns out to
  719.  * be too small, many things would have to change.  */
  720. #define MAX_BUF_SIZE (1L << 16)
  721. /* Extend the buffer by twice its current size via realloc and
  722.  * reset the pointers that pointed into the old block to point to the
  723.  * correct places in the new one.  If extending the buffer results in it
  724.  * being larger than MAX_BUF_SIZE, then flag memory exhausted.  */
  725. #define EXTEND_BUFFER()
  726.   do { 
  727.     unsigned char *old_buffer = bufp->buffer;
  728.     if (bufp->allocated == MAX_BUF_SIZE) 
  729.       return REG_ESIZE;
  730.     bufp->allocated <<= 1;
  731.     if (bufp->allocated > MAX_BUF_SIZE)
  732.       bufp->allocated = MAX_BUF_SIZE; 
  733.     bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);
  734.     if (bufp->buffer == NULL)
  735.       return REG_ESPACE;
  736.     /* If the buffer moved, move all the pointers into it.  */
  737.     if (old_buffer != bufp->buffer)
  738.       {
  739.         b = (b - old_buffer) + bufp->buffer;
  740.         begalt = (begalt - old_buffer) + bufp->buffer;
  741.         if (fixup_alt_jump)
  742.           fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;
  743.         if (laststart)
  744.           laststart = (laststart - old_buffer) + bufp->buffer;
  745.         if (pending_exact)
  746.           pending_exact = (pending_exact - old_buffer) + bufp->buffer;
  747.       }
  748.   } while (0)
  749. /* Since we have one byte reserved for the register number argument to
  750.  * {start,stop}_memory, the maximum number of groups we can report
  751.  * things about is what fits in that byte.  */
  752. #define MAX_REGNUM 255
  753. /* But patterns can have more than `MAX_REGNUM' registers.  We just
  754.  * ignore the excess.  */
  755. typedef unsigned regnum_t;
  756. /* Macros for the compile stack.  */
  757. /* Since offsets can go either forwards or backwards, this type needs to
  758.  * be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.  */
  759. typedef int pattern_offset_t;
  760. typedef struct {
  761.     pattern_offset_t begalt_offset;
  762.     pattern_offset_t fixup_alt_jump;
  763.     pattern_offset_t inner_group_offset;
  764.     pattern_offset_t laststart_offset;
  765.     regnum_t regnum;
  766. } compile_stack_elt_t;
  767. typedef struct {
  768.     compile_stack_elt_t *stack;
  769.     unsigned size;
  770.     unsigned avail; /* Offset of next open position.  */
  771. } compile_stack_type;
  772. #define INIT_COMPILE_STACK_SIZE 32
  773. #define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
  774. #define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
  775. /* The next available element.  */
  776. #define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
  777. /* Set the bit for character C in a list.  */
  778. #define SET_LIST_BIT(c)                               
  779.   (b[((unsigned char) (c)) / BYTEWIDTH]               
  780.    |= 1 << (((unsigned char) c) % BYTEWIDTH))
  781. /* Get the next unsigned number in the uncompiled pattern.  */
  782. #define GET_UNSIGNED_NUMBER(num) 
  783.   { if (p != pend)
  784.      {
  785.        PATFETCH (c); 
  786.        while (ISDIGIT (c)) 
  787.          { 
  788.            if (num < 0)
  789.               num = 0;
  790.            num = num * 10 + c - '0'; 
  791.            if (p == pend) 
  792.               break; 
  793.            PATFETCH (c);
  794.          } 
  795.        } 
  796.     }
  797. #define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
  798. #define IS_CHAR_CLASS(string)
  799.    (STREQ (string, "alpha") || STREQ (string, "upper")
  800.     || STREQ (string, "lower") || STREQ (string, "digit")
  801.     || STREQ (string, "alnum") || STREQ (string, "xdigit")
  802.     || STREQ (string, "space") || STREQ (string, "print")
  803.     || STREQ (string, "punct") || STREQ (string, "graph")
  804.     || STREQ (string, "cntrl") || STREQ (string, "blank"))
  805. /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
  806.  * Returns one of error codes defined in `regex.h', or zero for success.
  807.  * 
  808.  * Assumes the `allocated' (and perhaps `buffer') and `translate'
  809.  * fields are set in BUFP on entry.
  810.  * 
  811.  * If it succeeds, results are put in BUFP (if it returns an error, the
  812.  * contents of BUFP are undefined):
  813.  * `buffer' is the compiled pattern;
  814.  * `syntax' is set to SYNTAX;
  815.  * `used' is set to the length of the compiled pattern;
  816.  * `fastmap_accurate' is zero;
  817.  * `re_nsub' is the number of subexpressions in PATTERN;
  818.  * `not_bol' and `not_eol' are zero;
  819.  * 
  820.  * The `fastmap' and `newline_anchor' fields are neither
  821.  * examined nor set.  */
  822. static reg_errcode_t
  823. regex_compile(pattern, size, syntax, bufp)
  824.      const char *pattern;
  825.      int size;
  826.      reg_syntax_t syntax;
  827.      struct re_pattern_buffer *bufp;
  828. {
  829.     /* We fetch characters from PATTERN here.  Even though PATTERN is
  830.      * `char *' (i.e., signed), we declare these variables as unsigned, so
  831.      * they can be reliably used as array indices.  */
  832.     register unsigned char c, c1;
  833.     /* A random tempory spot in PATTERN.  */
  834.     const char *p1;
  835.     /* Points to the end of the buffer, where we should append.  */
  836.     register unsigned char *b;
  837.     /* Keeps track of unclosed groups.  */
  838.     compile_stack_type compile_stack;
  839.     /* Points to the current (ending) position in the pattern.  */
  840.     const char *p = pattern;
  841.     const char *pend = pattern + size;
  842.     /* How to translate the characters in the pattern.  */
  843.     char *translate = bufp->translate;
  844.     /* Address of the count-byte of the most recently inserted `exactn'
  845.      * command.  This makes it possible to tell if a new exact-match
  846.      * character can be added to that command or if the character requires
  847.      * a new `exactn' command.  */
  848.     unsigned char *pending_exact = 0;
  849.     /* Address of start of the most recently finished expression.
  850.      * This tells, e.g., postfix * where to find the start of its
  851.      * operand.  Reset at the beginning of groups and alternatives.  */
  852.     unsigned char *laststart = 0;
  853.     /* Address of beginning of regexp, or inside of last group.  */
  854.     unsigned char *begalt;
  855.     /* Place in the uncompiled pattern (i.e., the {) to
  856.      * which to go back if the interval is invalid.  */
  857.     const char *beg_interval;
  858.     /* Address of the place where a forward jump should go to the end of
  859.      * the containing expression.  Each alternative of an `or' -- except the
  860.      * last -- ends with a forward jump of this sort.  */
  861.     unsigned char *fixup_alt_jump = 0;
  862.     /* Counts open-groups as they are encountered.  Remembered for the
  863.      * matching close-group on the compile stack, so the same register
  864.      * number is put in the stop_memory as the start_memory.  */
  865.     regnum_t regnum = 0;
  866. #ifdef DEBUG
  867.     DEBUG_PRINT1("nCompiling pattern: ");
  868.     if (debug) {
  869. unsigned debug_count;
  870. for (debug_count = 0; debug_count < size; debug_count++)
  871.     printchar(pattern[debug_count]);
  872. putchar('n');
  873.     }
  874. #endif /* DEBUG */
  875.     /* Initialize the compile stack.  */
  876.     compile_stack.stack = TALLOC(INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
  877.     if (compile_stack.stack == NULL)
  878. return REG_ESPACE;
  879.     compile_stack.size = INIT_COMPILE_STACK_SIZE;
  880.     compile_stack.avail = 0;
  881.     /* Initialize the pattern buffer.  */
  882.     bufp->syntax = syntax;
  883.     bufp->fastmap_accurate = 0;
  884.     bufp->not_bol = bufp->not_eol = 0;
  885.     /* Set `used' to zero, so that if we return an error, the pattern
  886.      * printer (for debugging) will think there's no pattern.  We reset it
  887.      * at the end.  */
  888.     bufp->used = 0;
  889.     /* Always count groups, whether or not bufp->no_sub is set.  */
  890.     bufp->re_nsub = 0;
  891. #if !defined (emacs) && !defined (SYNTAX_TABLE)
  892.     /* Initialize the syntax table.  */
  893.     init_syntax_once();
  894. #endif
  895.     if (bufp->allocated == 0) {
  896. if (bufp->buffer) { /* If zero allocated, but buffer is non-null, try to realloc
  897.  * enough space.  This loses if buffer's address is bogus, but
  898.  * that is the user's responsibility.  */
  899.     RETALLOC(bufp->buffer, INIT_BUF_SIZE, unsigned char);
  900. } else { /* Caller did not allocate a buffer.  Do it for them.  */
  901.     bufp->buffer = TALLOC(INIT_BUF_SIZE, unsigned char);
  902. }
  903. if (!bufp->buffer)
  904.     return REG_ESPACE;
  905. bufp->allocated = INIT_BUF_SIZE;
  906.     }
  907.     begalt = b = bufp->buffer;
  908.     /* Loop through the uncompiled pattern until we're at the end.  */
  909.     while (p != pend) {
  910. PATFETCH(c);
  911. switch (c) {
  912. case '^':
  913.     {
  914. if ( /* If at start of pattern, it's an operator.  */
  915.     p == pattern + 1
  916. /* If context independent, it's an operator.  */
  917.     || syntax & RE_CONTEXT_INDEP_ANCHORS
  918. /* Otherwise, depends on what's come before.  */
  919.     || at_begline_loc_p(pattern, p, syntax))
  920.     BUF_PUSH(begline);
  921. else
  922.     goto normal_char;
  923.     }
  924.     break;
  925. case '$':
  926.     {
  927. if ( /* If at end of pattern, it's an operator.  */
  928.     p == pend
  929. /* If context independent, it's an operator.  */
  930.     || syntax & RE_CONTEXT_INDEP_ANCHORS
  931. /* Otherwise, depends on what's next.  */
  932.     || at_endline_loc_p(p, pend, syntax))
  933.     BUF_PUSH(endline);
  934. else
  935.     goto normal_char;
  936.     }
  937.     break;
  938. case '+':
  939. case '?':
  940.     if ((syntax & RE_BK_PLUS_QM)
  941. || (syntax & RE_LIMITED_OPS))
  942. goto normal_char;
  943.   handle_plus:
  944. case '*':
  945.     /* If there is no previous pattern... */
  946.     if (!laststart) {
  947. if (syntax & RE_CONTEXT_INVALID_OPS)
  948.     return REG_BADRPT;
  949. else if (!(syntax & RE_CONTEXT_INDEP_OPS))
  950.     goto normal_char;
  951.     } {
  952. /* Are we optimizing this jump?  */
  953. boolean keep_string_p = false;
  954. /* 1 means zero (many) matches is allowed.  */
  955. char zero_times_ok = 0, many_times_ok = 0;
  956. /* If there is a sequence of repetition chars, collapse it
  957.  * down to just one (the right one).  We can't combine
  958.  * interval operators with these because of, e.g., `a{2}*',
  959.  * which should only match an even number of `a's.  */
  960. for (;;) {
  961.     zero_times_ok |= c != '+';
  962.     many_times_ok |= c != '?';
  963.     if (p == pend)
  964. break;
  965.     PATFETCH(c);
  966.     if (c == '*'
  967. || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')));
  968.     else if (syntax & RE_BK_PLUS_QM && c == '\') {
  969. if (p == pend)
  970.     return REG_EESCAPE;
  971. PATFETCH(c1);
  972. if (!(c1 == '+' || c1 == '?')) {
  973.     PATUNFETCH;
  974.     PATUNFETCH;
  975.     break;
  976. }
  977. c = c1;
  978.     } else {
  979. PATUNFETCH;
  980. break;
  981.     }
  982.     /* If we get here, we found another repeat character.  */
  983. }
  984. /* Star, etc. applied to an empty pattern is equivalent
  985.  * to an empty pattern.  */
  986. if (!laststart)
  987.     break;
  988. /* Now we know whether or not zero matches is allowed
  989.  * and also whether or not two or more matches is allowed.  */
  990. if (many_times_ok) { /* More than one repetition is allowed, so put in at the
  991.  * end a backward relative jump from `b' to before the next
  992.  * jump we're going to put in below (which jumps from
  993.  * laststart to after this jump).  
  994.  * 
  995.  * But if we are at the `*' in the exact sequence `.*n',
  996.  * insert an unconditional jump backwards to the .,
  997.  * instead of the beginning of the loop.  This way we only
  998.  * push a failure point once, instead of every time
  999.  * through the loop.  */
  1000.     assert(p - 1 > pattern);
  1001.     /* Allocate the space for the jump.  */
  1002.     GET_BUFFER_SPACE(3);
  1003.     /* We know we are not at the first character of the pattern,
  1004.      * because laststart was nonzero.  And we've already
  1005.      * incremented `p', by the way, to be the character after
  1006.      * the `*'.  Do we have to do something analogous here
  1007.      * for null bytes, because of RE_DOT_NOT_NULL?  */
  1008.     if (TRANSLATE(*(p - 2)) == TRANSLATE('.')
  1009. && zero_times_ok
  1010. && p < pend && TRANSLATE(*p) == TRANSLATE('n')
  1011. && !(syntax & RE_DOT_NEWLINE)) { /* We have .*n.  */
  1012. STORE_JUMP(jump, b, laststart);
  1013. keep_string_p = true;
  1014.     } else
  1015. /* Anything else.  */
  1016. STORE_JUMP(maybe_pop_jump, b, laststart - 3);
  1017.     /* We've added more stuff to the buffer.  */
  1018.     b += 3;
  1019. }
  1020. /* On failure, jump from laststart to b + 3, which will be the
  1021.  * end of the buffer after this jump is inserted.  */
  1022. GET_BUFFER_SPACE(3);
  1023. INSERT_JUMP(keep_string_p ? on_failure_keep_string_jump
  1024.     : on_failure_jump,
  1025.     laststart, b + 3);
  1026. pending_exact = 0;
  1027. b += 3;
  1028. if (!zero_times_ok) {
  1029.     /* At least one repetition is required, so insert a
  1030.      * `dummy_failure_jump' before the initial
  1031.      * `on_failure_jump' instruction of the loop. This
  1032.      * effects a skip over that instruction the first time
  1033.      * we hit that loop.  */
  1034.     GET_BUFFER_SPACE(3);
  1035.     INSERT_JUMP(dummy_failure_jump, laststart, laststart + 6);
  1036.     b += 3;
  1037. }
  1038.     }
  1039.     break;
  1040. case '.':
  1041.     laststart = b;
  1042.     BUF_PUSH(anychar);
  1043.     break;
  1044. case '[':
  1045.     {
  1046. boolean had_char_class = false;
  1047. if (p == pend)
  1048.     return REG_EBRACK;
  1049. /* Ensure that we have enough space to push a charset: the
  1050.  * opcode, the length count, and the bitset; 34 bytes in all.  */
  1051. GET_BUFFER_SPACE(34);
  1052. laststart = b;
  1053. /* We test `*p == '^' twice, instead of using an if
  1054.  * statement, so we only need one BUF_PUSH.  */
  1055. BUF_PUSH(*p == '^' ? charset_not : charset);
  1056. if (*p == '^')
  1057.     p++;
  1058. /* Remember the first position in the bracket expression.  */
  1059. p1 = p;
  1060. /* Push the number of bytes in the bitmap.  */
  1061. BUF_PUSH((1 << BYTEWIDTH) / BYTEWIDTH);
  1062. /* Clear the whole map.  */
  1063. memset(b, 0, (1 << BYTEWIDTH) / BYTEWIDTH);
  1064. /* charset_not matches newline according to a syntax bit.  */
  1065. if ((re_opcode_t) b[-2] == charset_not
  1066.     && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
  1067.     SET_LIST_BIT('n');
  1068. /* Read in characters and ranges, setting map bits.  */
  1069. for (;;) {
  1070.     if (p == pend)
  1071. return REG_EBRACK;
  1072.     PATFETCH(c);
  1073.     /*  might escape characters inside [...] and [^...].  */
  1074.     if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\') {
  1075. if (p == pend)
  1076.     return REG_EESCAPE;
  1077. PATFETCH(c1);
  1078. SET_LIST_BIT(c1);
  1079. continue;
  1080.     }
  1081.     /* Could be the end of the bracket expression.  If it's
  1082.      * not (i.e., when the bracket expression is `[]' so
  1083.      * far), the ']' character bit gets set way below.  */
  1084.     if (c == ']' && p != p1 + 1)
  1085. break;
  1086.     /* Look ahead to see if it's a range when the last thing
  1087.      * was a character class.  */
  1088.     if (had_char_class && c == '-' && *p != ']')
  1089. return REG_ERANGE;
  1090.     /* Look ahead to see if it's a range when the last thing
  1091.      * was a character: if this is a hyphen not at the
  1092.      * beginning or the end of a list, then it's the range
  1093.      * operator.  */
  1094.     if (c == '-'
  1095. && !(p - 2 >= pattern && p[-2] == '[')
  1096. && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
  1097. && *p != ']') {
  1098. reg_errcode_t ret
  1099. = compile_range(&p, pend, translate, syntax, b);
  1100. if (ret != REG_NOERROR)
  1101.     return ret;
  1102.     } else if (p[0] == '-' && p[1] != ']') { /* This handles ranges made up of characters only.  */
  1103. reg_errcode_t ret;
  1104. /* Move past the `-'.  */
  1105. PATFETCH(c1);
  1106. ret = compile_range(&p, pend, translate, syntax, b);
  1107. if (ret != REG_NOERROR)
  1108.     return ret;
  1109.     }
  1110.     /* See if we're at the beginning of a possible character
  1111.      * class.  */
  1112.     else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') { /* Leave room for the null.  */
  1113. char str[CHAR_CLASS_MAX_LENGTH + 1];
  1114. PATFETCH(c);
  1115. c1 = 0;
  1116. /* If pattern is `[[:'.  */
  1117. if (p == pend)
  1118.     return REG_EBRACK;
  1119. for (;;) {
  1120.     PATFETCH(c);
  1121.     if (c == ':' || c == ']' || p == pend
  1122. || c1 == CHAR_CLASS_MAX_LENGTH)
  1123. break;
  1124.     str[c1++] = c;
  1125. }
  1126. str[c1] = '';
  1127. /* If isn't a word bracketed by `[:' and:`]':
  1128.  * undo the ending character, the letters, and leave 
  1129.  * the leading `:' and `[' (but set bits for them).  */
  1130. if (c == ':' && *p == ']') {
  1131.     int ch;
  1132.     boolean is_alnum = STREQ(str, "alnum");
  1133.     boolean is_alpha = STREQ(str, "alpha");
  1134.     boolean is_blank = STREQ(str, "blank");
  1135.     boolean is_cntrl = STREQ(str, "cntrl");
  1136.     boolean is_digit = STREQ(str, "digit");
  1137.     boolean is_graph = STREQ(str, "graph");
  1138.     boolean is_lower = STREQ(str, "lower");
  1139.     boolean is_print = STREQ(str, "print");
  1140.     boolean is_punct = STREQ(str, "punct");
  1141.     boolean is_space = STREQ(str, "space");
  1142.     boolean is_upper = STREQ(str, "upper");
  1143.     boolean is_xdigit = STREQ(str, "xdigit");
  1144.     if (!IS_CHAR_CLASS(str))
  1145. return REG_ECTYPE;
  1146.     /* Throw away the ] at the end of the character
  1147.      * class.  */
  1148.     PATFETCH(c);
  1149.     if (p == pend)
  1150. return REG_EBRACK;
  1151.     for (ch = 0; ch < 1 << BYTEWIDTH; ch++) {
  1152. if ((is_alnum && ISALNUM(ch))
  1153.     || (is_alpha && ISALPHA(ch))
  1154.     || (is_blank && ISBLANK(ch))
  1155.     || (is_cntrl && ISCNTRL(ch))
  1156.     || (is_digit && ISDIGIT(ch))
  1157.     || (is_graph && ISGRAPH(ch))
  1158.     || (is_lower && ISLOWER(ch))
  1159.     || (is_print && ISPRINT(ch))
  1160.     || (is_punct && ISPUNCT(ch))
  1161.     || (is_space && ISSPACE(ch))
  1162.     || (is_upper && ISUPPER(ch))
  1163.     || (is_xdigit && ISXDIGIT(ch)))
  1164.     SET_LIST_BIT(ch);
  1165.     }
  1166.     had_char_class = true;
  1167. } else {
  1168.     c1++;
  1169.     while (c1--)
  1170. PATUNFETCH;
  1171.     SET_LIST_BIT('[');
  1172.     SET_LIST_BIT(':');
  1173.     had_char_class = false;
  1174. }
  1175.     } else {
  1176. had_char_class = false;
  1177. SET_LIST_BIT(c);
  1178.     }
  1179. }
  1180. /* Discard any (non)matching list bytes that are all 0 at the
  1181.  * end of the map.  Decrease the map-length byte too.  */
  1182. while ((int) b[-1] > 0 && b[b[-1] - 1] == 0)
  1183.     b[-1]--;
  1184. b += b[-1];
  1185.     }
  1186.     break;
  1187. case '(':
  1188.     if (syntax & RE_NO_BK_PARENS)
  1189. goto handle_open;
  1190.     else
  1191. goto normal_char;
  1192. case ')':
  1193.     if (syntax & RE_NO_BK_PARENS)
  1194. goto handle_close;
  1195.     else
  1196. goto normal_char;
  1197. case 'n':
  1198.     if (syntax & RE_NEWLINE_ALT)
  1199. goto handle_alt;
  1200.     else
  1201. goto normal_char;
  1202. case '|':
  1203.     if (syntax & RE_NO_BK_VBAR)
  1204. goto handle_alt;
  1205.     else
  1206. goto normal_char;
  1207. case '{':
  1208.     if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
  1209. goto handle_interval;
  1210.     else
  1211. goto normal_char;
  1212. case '\':
  1213.     if (p == pend)
  1214. return REG_EESCAPE;
  1215.     /* Do not translate the character after the , so that we can
  1216.      * distinguish, e.g., B from b, even if we normally would
  1217.      * translate, e.g., B to b.  */
  1218.     PATFETCH_RAW(c);
  1219.     switch (c) {
  1220.     case '(':
  1221. if (syntax & RE_NO_BK_PARENS)
  1222.     goto normal_backslash;
  1223.       handle_open:
  1224. bufp->re_nsub++;
  1225. regnum++;
  1226. if (COMPILE_STACK_FULL) {
  1227.     RETALLOC(compile_stack.stack, compile_stack.size << 1,
  1228. compile_stack_elt_t);
  1229.     if (compile_stack.stack == NULL)
  1230. return REG_ESPACE;
  1231.     compile_stack.size <<= 1;
  1232. }
  1233. /* These are the values to restore when we hit end of this
  1234.  * group.  They are all relative offsets, so that if the
  1235.  * whole pattern moves because of realloc, they will still
  1236.  * be valid.  */
  1237. COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
  1238. COMPILE_STACK_TOP.fixup_alt_jump
  1239.     = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
  1240. COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
  1241. COMPILE_STACK_TOP.regnum = regnum;
  1242. /* We will eventually replace the 0 with the number of
  1243.  * groups inner to this one.  But do not push a
  1244.  * start_memory for groups beyond the last one we can
  1245.  * represent in the compiled pattern.  */
  1246. if (regnum <= MAX_REGNUM) {
  1247.     COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2;
  1248.     BUF_PUSH_3(start_memory, regnum, 0);
  1249. }
  1250. compile_stack.avail++;
  1251. fixup_alt_jump = 0;
  1252. laststart = 0;
  1253. begalt = b;
  1254. /* If we've reached MAX_REGNUM groups, then this open
  1255.  * won't actually generate any code, so we'll have to
  1256.  * clear pending_exact explicitly.  */
  1257. pending_exact = 0;
  1258. break;
  1259.     case ')':
  1260. if (syntax & RE_NO_BK_PARENS)
  1261.     goto normal_backslash;
  1262. if (COMPILE_STACK_EMPTY) {
  1263.     if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
  1264. goto normal_backslash;
  1265.     else
  1266. return REG_ERPAREN;
  1267. }
  1268.       handle_close:
  1269. if (fixup_alt_jump) { /* Push a dummy failure point at the end of the
  1270.  * alternative for a possible future
  1271.  * `pop_failure_jump' to pop.  See comments at
  1272.  * `push_dummy_failure' in `re_match_2'.  */
  1273.     BUF_PUSH(push_dummy_failure);
  1274.     /* We allocated space for this jump when we assigned
  1275.      * to `fixup_alt_jump', in the `handle_alt' case below.  */
  1276.     STORE_JUMP(jump_past_alt, fixup_alt_jump, b - 1);
  1277. }
  1278. /* See similar code for backslashed left paren above.  */
  1279. if (COMPILE_STACK_EMPTY) {
  1280.     if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
  1281. goto normal_char;
  1282.     else
  1283. return REG_ERPAREN;
  1284. }
  1285. /* Since we just checked for an empty stack above, this
  1286.  * ``can't happen''.  */
  1287. assert(compile_stack.avail != 0);
  1288. {
  1289.     /* We don't just want to restore into `regnum', because
  1290.      * later groups should continue to be numbered higher,
  1291.      * as in `(ab)c(de)' -- the second group is #2.  */
  1292.     regnum_t this_group_regnum;
  1293.     compile_stack.avail--;
  1294.     begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
  1295.     fixup_alt_jump
  1296. = COMPILE_STACK_TOP.fixup_alt_jump
  1297. ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1
  1298. : 0;
  1299.     laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
  1300.     this_group_regnum = COMPILE_STACK_TOP.regnum;
  1301.     /* If we've reached MAX_REGNUM groups, then this open
  1302.      * won't actually generate any code, so we'll have to
  1303.      * clear pending_exact explicitly.  */
  1304.     pending_exact = 0;
  1305.     /* We're at the end of the group, so now we know how many
  1306.      * groups were inside this one.  */
  1307.     if (this_group_regnum <= MAX_REGNUM) {
  1308. unsigned char *inner_group_loc
  1309. = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset;
  1310. *inner_group_loc = regnum - this_group_regnum;
  1311. BUF_PUSH_3(stop_memory, this_group_regnum,
  1312.     regnum - this_group_regnum);
  1313.     }
  1314. }
  1315. break;
  1316.     case '|': /* `|'.  */
  1317. if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
  1318.     goto normal_backslash;
  1319.       handle_alt:
  1320. if (syntax & RE_LIMITED_OPS)
  1321.     goto normal_char;
  1322. /* Insert before the previous alternative a jump which
  1323.  * jumps to this alternative if the former fails.  */
  1324. GET_BUFFER_SPACE(3);
  1325. INSERT_JUMP(on_failure_jump, begalt, b + 6);
  1326. pending_exact = 0;
  1327. b += 3;
  1328. /* The alternative before this one has a jump after it
  1329.  * which gets executed if it gets matched.  Adjust that
  1330.  * jump so it will jump to this alternative's analogous
  1331.  * jump (put in below, which in turn will jump to the next
  1332.  * (if any) alternative's such jump, etc.).  The last such
  1333.  * jump jumps to the correct final destination.  A picture:
  1334.  * _____ _____ 
  1335.  * |   | |   |   
  1336.  * |   v |   v 
  1337.  * a | b   | c   
  1338.  * 
  1339.  * If we are at `b', then fixup_alt_jump right now points to a
  1340.  * three-byte space after `a'.  We'll put in the jump, set
  1341.  * fixup_alt_jump to right after `b', and leave behind three
  1342.  * bytes which we'll fill in when we get to after `c'.  */
  1343. if (fixup_alt_jump)
  1344.     STORE_JUMP(jump_past_alt, fixup_alt_jump, b);
  1345. /* Mark and leave space for a jump after this alternative,
  1346.  * to be filled in later either by next alternative or
  1347.  * when know we're at the end of a series of alternatives.  */
  1348. fixup_alt_jump = b;
  1349. GET_BUFFER_SPACE(3);
  1350. b += 3;
  1351. laststart = 0;
  1352. begalt = b;
  1353. break;
  1354.     case '{':
  1355. /* If { is a literal.  */
  1356. if (!(syntax & RE_INTERVALS)
  1357. /* If we're at `{' and it's not the open-interval 
  1358.  * operator.  */
  1359.     || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
  1360.     || (p - 2 == pattern && p == pend))
  1361.     goto normal_backslash;
  1362.       handle_interval:
  1363. {
  1364.     /* If got here, then the syntax allows intervals.  */
  1365.     /* At least (most) this many matches must be made.  */
  1366.     int lower_bound = -1, upper_bound = -1;
  1367.     beg_interval = p - 1;
  1368.     if (p == pend) {
  1369. if (syntax & RE_NO_BK_BRACES)
  1370.     goto unfetch_interval;
  1371. else
  1372.     return REG_EBRACE;
  1373.     }
  1374.     GET_UNSIGNED_NUMBER(lower_bound);
  1375.     if (c == ',') {
  1376. GET_UNSIGNED_NUMBER(upper_bound);
  1377. if (upper_bound < 0)
  1378.     upper_bound = RE_DUP_MAX;
  1379.     } else
  1380. /* Interval such as `{1}' => match exactly once. */
  1381. upper_bound = lower_bound;
  1382.     if (lower_bound < 0 || upper_bound > RE_DUP_MAX
  1383. || lower_bound > upper_bound) {
  1384. if (syntax & RE_NO_BK_BRACES)
  1385.     goto unfetch_interval;
  1386. else
  1387.     return REG_BADBR;
  1388.     }
  1389.     if (!(syntax & RE_NO_BK_BRACES)) {
  1390. if (c != '\')
  1391.     return REG_EBRACE;
  1392. PATFETCH(c);
  1393.     }
  1394.     if (c != '}') {
  1395. if (syntax & RE_NO_BK_BRACES)
  1396.     goto unfetch_interval;
  1397. else
  1398.     return REG_BADBR;
  1399.     }
  1400.     /* We just parsed a valid interval.  */
  1401.     /* If it's invalid to have no preceding re.  */
  1402.     if (!laststart) {
  1403. if (syntax & RE_CONTEXT_INVALID_OPS)
  1404.     return REG_BADRPT;
  1405. else if (syntax & RE_CONTEXT_INDEP_OPS)
  1406.     laststart = b;
  1407. else
  1408.     goto unfetch_interval;
  1409.     }
  1410.     /* If the upper bound is zero, don't want to succeed at
  1411.      * all; jump from `laststart' to `b + 3', which will be
  1412.      * the end of the buffer after we insert the jump.  */
  1413.     if (upper_bound == 0) {
  1414. GET_BUFFER_SPACE(3);
  1415. INSERT_JUMP(jump, laststart, b + 3);
  1416. b += 3;
  1417.     }
  1418.     /* Otherwise, we have a nontrivial interval.  When
  1419.      * we're all done, the pattern will look like:
  1420.      * set_number_at <jump count> <upper bound>
  1421.      * set_number_at <succeed_n count> <lower bound>
  1422.      * succeed_n <after jump addr> <succed_n count>
  1423.      * <body of loop>
  1424.      * jump_n <succeed_n addr> <jump count>
  1425.      * (The upper bound and `jump_n' are omitted if
  1426.      * `upper_bound' is 1, though.)  */
  1427.     else { /* If the upper bound is > 1, we need to insert
  1428.  * more at the end of the loop.  */
  1429. unsigned nbytes = 10 + (upper_bound > 1) * 10;
  1430. GET_BUFFER_SPACE(nbytes);
  1431. /* Initialize lower bound of the `succeed_n', even
  1432.  * though it will be set during matching by its
  1433.  * attendant `set_number_at' (inserted next),
  1434.  * because `re_compile_fastmap' needs to know.
  1435.  * Jump to the `jump_n' we might insert below.  */
  1436. INSERT_JUMP2(succeed_n, laststart,
  1437.     b + 5 + (upper_bound > 1) * 5,
  1438.     lower_bound);
  1439. b += 5;
  1440. /* Code to initialize the lower bound.  Insert 
  1441.  * before the `succeed_n'.  The `5' is the last two
  1442.  * bytes of this `set_number_at', plus 3 bytes of
  1443.  * the following `succeed_n'.  */
  1444. insert_op2(set_number_at, laststart, 5, lower_bound, b);
  1445. b += 5;
  1446. if (upper_bound > 1) { /* More than one repetition is allowed, so
  1447.  * append a backward jump to the `succeed_n'
  1448.  * that starts this interval.
  1449.  * 
  1450.  * When we've reached this during matching,
  1451.  * we'll have matched the interval once, so
  1452.  * jump back only `upper_bound - 1' times.  */
  1453.     STORE_JUMP2(jump_n, b, laststart + 5,
  1454. upper_bound - 1);
  1455.     b += 5;
  1456.     /* The location we want to set is the second
  1457.      * parameter of the `jump_n'; that is `b-2' as
  1458.      * an absolute address.  `laststart' will be
  1459.      * the `set_number_at' we're about to insert;
  1460.      * `laststart+3' the number to set, the source
  1461.      * for the relative address.  But we are
  1462.      * inserting into the middle of the pattern --
  1463.      * so everything is getting moved up by 5.
  1464.      * Conclusion: (b - 2) - (laststart + 3) + 5,
  1465.      * i.e., b - laststart.
  1466.      * 
  1467.      * We insert this at the beginning of the loop
  1468.      * so that if we fail during matching, we'll
  1469.      * reinitialize the bounds.  */
  1470.     insert_op2(set_number_at, laststart, b - laststart,
  1471. upper_bound - 1, b);
  1472.     b += 5;
  1473. }
  1474.     }
  1475.     pending_exact = 0;
  1476.     beg_interval = NULL;
  1477. }
  1478. break;
  1479.       unfetch_interval:
  1480. /* If an invalid interval, match the characters as literals.  */
  1481. assert(beg_interval);
  1482. p = beg_interval;
  1483. beg_interval = NULL;
  1484. /* normal_char and normal_backslash need `c'.  */
  1485. PATFETCH(c);
  1486. if (!(syntax & RE_NO_BK_BRACES)) {
  1487.     if (p > pattern && p[-1] == '\')
  1488. goto normal_backslash;
  1489. }
  1490. goto normal_char;
  1491. #ifdef emacs
  1492. /* There is no way to specify the before_dot and after_dot
  1493.  * operators.  rms says this is ok.  --karl  */
  1494.     case '=':
  1495. BUF_PUSH(at_dot);
  1496. break;
  1497.     case 's':
  1498. laststart = b;
  1499. PATFETCH(c);
  1500. BUF_PUSH_2(syntaxspec, syntax_spec_code[c]);
  1501. break;
  1502.     case 'S':
  1503. laststart = b;
  1504. PATFETCH(c);
  1505. BUF_PUSH_2(notsyntaxspec, syntax_spec_code[c]);
  1506. break;
  1507. #endif /* emacs */
  1508.     case 'w':
  1509. laststart = b;
  1510. BUF_PUSH(wordchar);
  1511. break;
  1512.     case 'W':
  1513. laststart = b;
  1514. BUF_PUSH(notwordchar);
  1515. break;
  1516.     case '<':
  1517. BUF_PUSH(wordbeg);
  1518. break;
  1519.     case '>':
  1520. BUF_PUSH(wordend);
  1521. break;
  1522.     case 'b':
  1523. BUF_PUSH(wordbound);
  1524. break;
  1525.     case 'B':
  1526. BUF_PUSH(notwordbound);
  1527. break;
  1528.     case '`':
  1529. BUF_PUSH(begbuf);
  1530. break;
  1531.     case ''':
  1532. BUF_PUSH(endbuf);
  1533. break;
  1534.     case '1':
  1535.     case '2':
  1536.     case '3':
  1537.     case '4':
  1538.     case '5':
  1539.     case '6':
  1540.     case '7':
  1541.     case '8':
  1542.     case '9':
  1543. if (syntax & RE_NO_BK_REFS)
  1544.     goto normal_char;
  1545. c1 = c - '0';
  1546. if (c1 > regnum)
  1547.     return REG_ESUBREG;
  1548. /* Can't back reference to a subexpression if inside of it.  */
  1549. if (group_in_compile_stack(compile_stack, c1))
  1550.     goto normal_char;
  1551. laststart = b;
  1552. BUF_PUSH_2(duplicate, c1);
  1553. break;
  1554.     case '+':
  1555.     case '?':
  1556. if (syntax & RE_BK_PLUS_QM)
  1557.     goto handle_plus;
  1558. else
  1559.     goto normal_backslash;
  1560.     default:
  1561.       normal_backslash:
  1562. /* You might think it would be useful for  to mean
  1563.  * not to translate; but if we don't translate it
  1564.  * it will never match anything.  */
  1565. c = TRANSLATE(c);
  1566. goto normal_char;
  1567.     }
  1568.     break;
  1569. default:
  1570.     /* Expects the character in `c'.  */
  1571.   normal_char:
  1572.     /* If no exactn currently being built.  */
  1573.     if (!pending_exact
  1574.     /* If last exactn not at current position.  */
  1575. || pending_exact + *pending_exact + 1 != b
  1576.     /* We have only one byte following the exactn for the count.  */
  1577. || *pending_exact == (1 << BYTEWIDTH) - 1
  1578.     /* If followed by a repetition operator.  */
  1579. || *p == '*' || *p == '^'
  1580. || ((syntax & RE_BK_PLUS_QM)
  1581.     ? *p == '\' && (p[1] == '+' || p[1] == '?')
  1582.     : (*p == '+' || *p == '?'))
  1583. || ((syntax & RE_INTERVALS)
  1584.     && ((syntax & RE_NO_BK_BRACES)
  1585. ? *p == '{'
  1586. : (p[0] == '\' && p[1] == '{')))) {
  1587. /* Start building a new exactn.  */
  1588. laststart = b;
  1589. BUF_PUSH_2(exactn, 0);
  1590. pending_exact = b - 1;
  1591.     }
  1592.     BUF_PUSH(c);
  1593.     (*pending_exact)++;
  1594.     break;
  1595. } /* switch (c) */
  1596.     } /* while p != pend */
  1597.     /* Through the pattern now.  */
  1598.     if (fixup_alt_jump)
  1599. STORE_JUMP(jump_past_alt, fixup_alt_jump, b);
  1600.     if (!COMPILE_STACK_EMPTY)
  1601. return REG_EPAREN;
  1602.     free(compile_stack.stack);
  1603.     /* We have succeeded; set the length of the buffer.  */
  1604.     bufp->used = b - bufp->buffer;
  1605. #ifdef DEBUG
  1606.     if (debug) {
  1607. DEBUG_PRINT1("nCompiled pattern: ");
  1608. print_compiled_pattern(bufp);
  1609.     }
  1610. #endif /* DEBUG */
  1611.     return REG_NOERROR;
  1612. } /* regex_compile */
  1613. /* Subroutines for `regex_compile'.  */
  1614. /* Store OP at LOC followed by two-byte integer parameter ARG.  */
  1615. static void
  1616. store_op1(op, loc, arg)
  1617.      re_opcode_t op;
  1618.      unsigned char *loc;
  1619.      int arg;
  1620. {
  1621.     *loc = (unsigned char) op;
  1622.     STORE_NUMBER(loc + 1, arg);
  1623. }
  1624. /* Like `store_op1', but for two two-byte parameters ARG1 and ARG2.  */
  1625. static void
  1626. store_op2(op, loc, arg1, arg2)
  1627.      re_opcode_t op;
  1628.      unsigned char *loc;
  1629.      int arg1, arg2;
  1630. {
  1631.     *loc = (unsigned char) op;
  1632.     STORE_NUMBER(loc + 1, arg1);
  1633.     STORE_NUMBER(loc + 3, arg2);
  1634. }
  1635. /* Copy the bytes from LOC to END to open up three bytes of space at LOC
  1636.  * for OP followed by two-byte integer parameter ARG.  */
  1637. static void
  1638. insert_op1(op, loc, arg, end)
  1639.      re_opcode_t op;
  1640.      unsigned char *loc;
  1641.      int arg;
  1642.      unsigned char *end;
  1643. {
  1644.     register unsigned char *pfrom = end;
  1645.     register unsigned char *pto = end + 3;
  1646.     while (pfrom != loc)
  1647. *--pto = *--pfrom;
  1648.     store_op1(op, loc, arg);
  1649. }
  1650. /* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2.  */
  1651. static void
  1652. insert_op2(op, loc, arg1, arg2, end)
  1653.      re_opcode_t op;
  1654.      unsigned char *loc;
  1655.      int arg1, arg2;
  1656.      unsigned char *end;
  1657. {
  1658.     register unsigned char *pfrom = end;
  1659.     register unsigned char *pto = end + 5;
  1660.     while (pfrom != loc)
  1661. *--pto = *--pfrom;
  1662.     store_op2(op, loc, arg1, arg2);
  1663. }
  1664. /* P points to just after a ^ in PATTERN.  Return true if that ^ comes
  1665.  * after an alternative or a begin-subexpression.  We assume there is at
  1666.  * least one character before the ^.  */
  1667. static boolean
  1668. at_begline_loc_p(pattern, p, syntax)
  1669.      const char *pattern, *p;
  1670.      reg_syntax_t syntax;
  1671. {
  1672.     const char *prev = p - 2;
  1673.     boolean prev_prev_backslash = prev > pattern && prev[-1] == '\';
  1674.     return
  1675.     /* After a subexpression?  */
  1676. (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
  1677.     /* After an alternative?  */
  1678. || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
  1679. }
  1680. /* The dual of at_begline_loc_p.  This one is for $.  We assume there is
  1681.  * at least one character after the $, i.e., `P < PEND'.  */
  1682. static boolean
  1683. at_endline_loc_p(p, pend, syntax)
  1684.      const char *p, *pend;
  1685.      int syntax;
  1686. {
  1687.     const char *next = p;
  1688.     boolean next_backslash = *next == '\';
  1689.     const char *next_next = p + 1 < pend ? p + 1 : NULL;
  1690.     return
  1691.     /* Before a subexpression?  */
  1692. (syntax & RE_NO_BK_PARENS ? *next == ')'
  1693. : next_backslash && next_next && *next_next == ')')
  1694.     /* Before an alternative?  */
  1695. || (syntax & RE_NO_BK_VBAR ? *next == '|'
  1696. : next_backslash && next_next && *next_next == '|');
  1697. }
  1698. /* Returns true if REGNUM is in one of COMPILE_STACK's elements and 
  1699.  * false if it's not.  */
  1700. static boolean
  1701. group_in_compile_stack(compile_stack, regnum)
  1702.      compile_stack_type compile_stack;
  1703.      regnum_t regnum;
  1704. {
  1705.     int this_element;
  1706.     for (this_element = compile_stack.avail - 1;
  1707. this_element >= 0;
  1708. this_element--)
  1709. if (compile_stack.stack[this_element].regnum == regnum)
  1710.     return true;
  1711.     return false;
  1712. }
  1713. /* Read the ending character of a range (in a bracket expression) from the
  1714.  * uncompiled pattern *P_PTR (which ends at PEND).  We assume the
  1715.  * starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
  1716.  * Then we set the translation of all bits between the starting and
  1717.  * ending characters (inclusive) in the compiled pattern B.
  1718.  * 
  1719.  * Return an error code.
  1720.  * 
  1721.  * We use these short variable names so we can use the same macros as
  1722.  * `regex_compile' itself.  */
  1723. static reg_errcode_t
  1724. compile_range(p_ptr, pend, translate, syntax, b)
  1725.      const char **p_ptr, *pend;
  1726.      char *translate;
  1727.      reg_syntax_t syntax;
  1728.      unsigned char *b;
  1729. {
  1730.     unsigned this_char;
  1731.     const char *p = *p_ptr;
  1732.     int range_start, range_end;
  1733.     if (p == pend)
  1734. return REG_ERANGE;
  1735.     /* Even though the pattern is a signed `char *', we need to fetch
  1736.      * with unsigned char *'s; if the high bit of the pattern character
  1737.      * is set, the range endpoints will be negative if we fetch using a
  1738.      * signed char *.
  1739.      * 
  1740.      * We also want to fetch the endpoints without translating them; the 
  1741.      * appropriate translation is done in the bit-setting loop below.  */
  1742.     range_start = ((unsigned char *) p)[-2];
  1743.     range_end = ((unsigned char *) p)[0];
  1744.     /* Have to increment the pointer into the pattern string, so the
  1745.      * caller isn't still at the ending character.  */
  1746.     (*p_ptr)++;
  1747.     /* If the start is after the end, the range is empty.  */
  1748.     if (range_start > range_end)
  1749. return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
  1750.     /* Here we see why `this_char' has to be larger than an `unsigned
  1751.      * char' -- the range is inclusive, so if `range_end' == 0xff
  1752.      * (assuming 8-bit characters), we would otherwise go into an infinite
  1753.      * loop, since all characters <= 0xff.  */
  1754.     for (this_char = range_start; this_char <= range_end; this_char++) {
  1755. SET_LIST_BIT(TRANSLATE(this_char));
  1756.     }
  1757.     return REG_NOERROR;
  1758. }
  1759. /* Failure stack declarations and macros; both re_compile_fastmap and
  1760.  * re_match_2 use a failure stack.  These have to be macros because of
  1761.  * REGEX_ALLOCATE.  */
  1762. /* Number of failure points for which to initially allocate space
  1763.  * when matching.  If this number is exceeded, we allocate more
  1764.  * space, so it is not a hard limit.  */
  1765. #ifndef INIT_FAILURE_ALLOC
  1766. #define INIT_FAILURE_ALLOC 5
  1767. #endif
  1768. /* Roughly the maximum number of failure points on the stack.  Would be
  1769.  * exactly that if always used MAX_FAILURE_SPACE each time we failed.
  1770.  * This is a variable only so users of regex can assign to it; we never
  1771.  * change it ourselves.  */
  1772. int re_max_failures = 2000;
  1773. typedef const unsigned char *fail_stack_elt_t;
  1774. typedef struct {
  1775.     fail_stack_elt_t *stack;
  1776.     unsigned size;
  1777.     unsigned avail; /* Offset of next open position.  */
  1778. } fail_stack_type;
  1779. #define FAIL_STACK_EMPTY()     (fail_stack.avail == 0)
  1780. #define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
  1781. #define FAIL_STACK_FULL()      (fail_stack.avail == fail_stack.size)
  1782. #define FAIL_STACK_TOP()       (fail_stack.stack[fail_stack.avail])
  1783. /* Initialize `fail_stack'.  Do `return -2' if the alloc fails.  */
  1784. #define INIT_FAIL_STACK()
  1785.   do {
  1786.     fail_stack.stack = (fail_stack_elt_t *)
  1787.       REGEX_ALLOCATE (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t));
  1788.     if (fail_stack.stack == NULL)
  1789.       return -2;
  1790.     fail_stack.size = INIT_FAILURE_ALLOC;
  1791.     fail_stack.avail = 0;
  1792.   } while (0)
  1793. /* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
  1794.  * 
  1795.  * Return 1 if succeeds, and 0 if either ran out of memory
  1796.  * allocating space for it or it was already too large.  
  1797.  * 
  1798.  * REGEX_REALLOCATE requires `destination' be declared.   */
  1799. #define DOUBLE_FAIL_STACK(fail_stack)
  1800.   ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS
  1801.    ? 0
  1802.    : ((fail_stack).stack = (fail_stack_elt_t *)
  1803.         REGEX_REALLOCATE ((fail_stack).stack, 
  1804.           (fail_stack).size * sizeof (fail_stack_elt_t),
  1805.           ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)),
  1806.       (fail_stack).stack == NULL
  1807.       ? 0
  1808.       : ((fail_stack).size <<= 1, 
  1809.          1)))
  1810. /* Push PATTERN_OP on FAIL_STACK. 
  1811.  * 
  1812.  * Return 1 if was able to do so and 0 if ran out of memory allocating
  1813.  * space to do so.  */
  1814. #define PUSH_PATTERN_OP(pattern_op, fail_stack)
  1815.   ((FAIL_STACK_FULL ()
  1816.     && !DOUBLE_FAIL_STACK (fail_stack))
  1817.     ? 0
  1818.     : ((fail_stack).stack[(fail_stack).avail++] = pattern_op,
  1819.        1))
  1820. /* This pushes an item onto the failure stack.  Must be a four-byte
  1821.  * value.  Assumes the variable `fail_stack'.  Probably should only
  1822.  * be called from within `PUSH_FAILURE_POINT'.  */
  1823. #define PUSH_FAILURE_ITEM(item)
  1824.   fail_stack.stack[fail_stack.avail++] = (fail_stack_elt_t) item
  1825. /* The complement operation.  Assumes `fail_stack' is nonempty.  */
  1826. #define POP_FAILURE_ITEM() fail_stack.stack[--fail_stack.avail]
  1827. /* Used to omit pushing failure point id's when we're not debugging.  */
  1828. #ifdef DEBUG
  1829. #define DEBUG_PUSH PUSH_FAILURE_ITEM
  1830. #define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_ITEM ()
  1831. #else
  1832. #define DEBUG_PUSH(item)
  1833. #define DEBUG_POP(item_addr)
  1834. #endif
  1835. /* Push the information about the state we will need
  1836.  * if we ever fail back to it.  
  1837.  * 
  1838.  * Requires variables fail_stack, regstart, regend, reg_info, and
  1839.  * num_regs be declared.  DOUBLE_FAIL_STACK requires `destination' be
  1840.  * declared.
  1841.  * 
  1842.  * Does `return FAILURE_CODE' if runs out of memory.  */
  1843. #define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code)
  1844.   do {
  1845.     char *destination;
  1846.     /* Must be int, so when we don't save any registers, the arithmetic
  1847.        of 0 + -1 isn't done as unsigned.  */
  1848.     int this_reg;
  1849.     
  1850.     DEBUG_STATEMENT (failure_id++);
  1851.     DEBUG_STATEMENT (nfailure_points_pushed++);
  1852.     DEBUG_PRINT2 ("nPUSH_FAILURE_POINT #%u:n", failure_id);
  1853.     DEBUG_PRINT2 ("  Before push, next avail: %dn", (fail_stack).avail);
  1854.     DEBUG_PRINT2 ("                     size: %dn", (fail_stack).size);
  1855.     DEBUG_PRINT2 ("  slots needed: %dn", NUM_FAILURE_ITEMS);
  1856.     DEBUG_PRINT2 ("     available: %dn", REMAINING_AVAIL_SLOTS);
  1857.     /* Ensure we have enough space allocated for what we will push.  */
  1858.     while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS)
  1859.       {
  1860.         if (!DOUBLE_FAIL_STACK (fail_stack))
  1861.           return failure_code;
  1862.         DEBUG_PRINT2 ("n  Doubled stack; size now: %dn",
  1863.        (fail_stack).size);
  1864.         DEBUG_PRINT2 ("  slots available: %dn", REMAINING_AVAIL_SLOTS);
  1865.       }
  1866.     /* Push the info, starting with the registers.  */
  1867.     DEBUG_PRINT1 ("n");
  1868.     for (this_reg = lowest_active_reg; this_reg <= highest_active_reg;
  1869.          this_reg++)
  1870.       {
  1871. DEBUG_PRINT2 ("  Pushing reg: %dn", this_reg);
  1872.         DEBUG_STATEMENT (num_regs_pushed++);
  1873. DEBUG_PRINT2 ("    start: 0x%xn", regstart[this_reg]);
  1874.         PUSH_FAILURE_ITEM (regstart[this_reg]);
  1875.                                                                         
  1876. DEBUG_PRINT2 ("    end: 0x%xn", regend[this_reg]);
  1877.         PUSH_FAILURE_ITEM (regend[this_reg]);
  1878. DEBUG_PRINT2 ("    info: 0x%xn      ", reg_info[this_reg]);
  1879.         DEBUG_PRINT2 (" match_null=%d",
  1880.                       REG_MATCH_NULL_STRING_P (reg_info[this_reg]));
  1881.         DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg]));
  1882.         DEBUG_PRINT2 (" matched_something=%d",
  1883.                       MATCHED_SOMETHING (reg_info[this_reg]));
  1884.         DEBUG_PRINT2 (" ever_matched=%d",
  1885.                       EVER_MATCHED_SOMETHING (reg_info[this_reg]));
  1886. DEBUG_PRINT1 ("n");
  1887.         PUSH_FAILURE_ITEM (reg_info[this_reg].word);
  1888.       }
  1889.     DEBUG_PRINT2 ("  Pushing  low active reg: %dn", lowest_active_reg);
  1890.     PUSH_FAILURE_ITEM (lowest_active_reg);
  1891.     DEBUG_PRINT2 ("  Pushing high active reg: %dn", highest_active_reg);
  1892.     PUSH_FAILURE_ITEM (highest_active_reg);
  1893.     DEBUG_PRINT2 ("  Pushing pattern 0x%x: ", pattern_place);
  1894.     DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend);
  1895.     PUSH_FAILURE_ITEM (pattern_place);
  1896.     DEBUG_PRINT2 ("  Pushing string 0x%x: `", string_place);
  1897.     DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2,   
  1898.  size2);
  1899.     DEBUG_PRINT1 ("'n");
  1900.     PUSH_FAILURE_ITEM (string_place);
  1901.     DEBUG_PRINT2 ("  Pushing failure id: %un", failure_id);
  1902.     DEBUG_PUSH (failure_id);
  1903.   } while (0)
  1904. /* This is the number of items that are pushed and popped on the stack
  1905.  * for each register.  */
  1906. #define NUM_REG_ITEMS  3
  1907. /* Individual items aside from the registers.  */
  1908. #ifdef DEBUG
  1909. #define NUM_NONREG_ITEMS 5 /* Includes failure point id.  */
  1910. #else
  1911. #define NUM_NONREG_ITEMS 4
  1912. #endif
  1913. /* We push at most this many items on the stack.  */
  1914. #define MAX_FAILURE_ITEMS ((num_regs - 1) * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
  1915. /* We actually push this many items.  */
  1916. #define NUM_FAILURE_ITEMS
  1917.   ((highest_active_reg - lowest_active_reg + 1) * NUM_REG_ITEMS 
  1918.     + NUM_NONREG_ITEMS)
  1919. /* How many items can still be added to the stack without overflowing it.  */
  1920. #define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)