regexp.c
上传用户:gddssl
上传日期:2007-01-06
资源大小:1003k
文件大小:73k
源码类别:

编辑器/阅读器

开发平台:

DOS

  1. /* vi:set ts=8 sts=4 sw=4:
  2.  *
  3.  * Handling of regular expressions: vim_regcomp(), vim_regexec(), vim_regsub()
  4.  *
  5.  * NOTICE:
  6.  *
  7.  * This is NOT the original regular expression code as written by Henry
  8.  * Spencer.  This code has been modified specifically for use with the VIM
  9.  * editor, and should not be used apart from compiling VIM.  If you want a
  10.  * good regular expression library, get the original code.  The copyright
  11.  * notice that follows is from the original.
  12.  *
  13.  * END NOTICE
  14.  *
  15.  * Copyright (c) 1986 by University of Toronto.
  16.  * Written by Henry Spencer.  Not derived from licensed software.
  17.  *
  18.  * Permission is granted to anyone to use this software for any
  19.  * purpose on any computer system, and to redistribute it freely,
  20.  * subject to the following restrictions:
  21.  *
  22.  * 1. The author is not responsible for the consequences of use of
  23.  * this software, no matter how awful, even if they arise
  24.  * from defects in it.
  25.  *
  26.  * 2. The origin of this software must not be misrepresented, either
  27.  * by explicit claim or by omission.
  28.  *
  29.  * 3. Altered versions must be plainly marked as such, and must not
  30.  * be misrepresented as being the original software.
  31.  *
  32.  * Beware that some of this code is subtly aware of the way operator
  33.  * precedence is structured in regular expressions.  Serious changes in
  34.  * regular-expression syntax might require a total rethink.
  35.  *
  36.  * Changes have been made by Tony Andrews, Olaf 'Rhialto' Seibert, Robert Webb
  37.  * and Bram Moolenaar.
  38.  * Named character class support added by Walter Briscoe (1998 Jul 01)
  39.  */
  40. #include "vim.h"
  41. #undef DEBUG
  42. #include <stdio.h>
  43. #include "option.h"
  44. /*
  45.  * Get around a problem with #defined char class functions.
  46.  */
  47. #ifdef isalnum
  48. static int myisalnum __ARGS((int c));
  49. static int myisalnum(c) int c; { return isalnum(c); }
  50. # undef isalnum
  51. # define isalnum myisalnum
  52. #endif
  53. #ifdef isalpha
  54. static int myisalpha __ARGS((int c));
  55. static int myisalpha(c) int c; { return isalpha(c); }
  56. # undef isalpha
  57. # define isalpha myisalpha
  58. #endif
  59. #ifdef iscntrl
  60. static int myiscntrl __ARGS((int c));
  61. static int myiscntrl(c) int c; { return iscntrl(c); }
  62. # undef iscntrl
  63. # define iscntrl myiscntrl
  64. #endif
  65. #ifdef isdigit
  66. static int myisdigit __ARGS((int c));
  67. static int myisdigit(c) int c; { return isdigit(c); }
  68. # undef isdigit
  69. # define isdigit myisdigit
  70. #endif
  71. # ifdef isgraph
  72. static int myisgraph __ARGS((int c));
  73. static int myisgraph(c) int c; { return isgraph(c); }
  74. # undef isgraph
  75. # define isgraph myisgraph
  76. #endif
  77. #ifdef islower
  78. static int myislower __ARGS((int c));
  79. static int myislower(c) int c; { return islower(c); }
  80. # undef islower
  81. # define islower myislower
  82. #endif
  83. #ifdef ispunct
  84. static int myispunct __ARGS((int c));
  85. static int myispunct(c) int c; { return ispunct(c); }
  86. # undef ispunct
  87. # define ispunct myispunct
  88. #endif
  89. #ifdef isupper
  90. static int myisupper __ARGS((int c));
  91. static int myisupper(c) int c; { return isupper(c); }
  92. # undef isupper
  93. # define isupper myisupper
  94. #endif
  95. #ifdef isxdigit
  96. static int myisxdigit __ARGS((int c));
  97. static int myisxdigit(c) int c; { return isxdigit(c); }
  98. # undef isxdigit
  99. # define isxdigit myisxdigit
  100. #endif
  101. /*
  102.  * The "internal use only" fields in regexp.h are present to pass info from
  103.  * compile to execute that permits the execute phase to run lots faster on
  104.  * simple cases.  They are:
  105.  *
  106.  * regstart char that must begin a match; '' if none obvious
  107.  * reganch is the match anchored (at beginning-of-line only)?
  108.  * regmust string (pointer into program) that match must include, or NULL
  109.  * regmlen length of regmust string
  110.  *
  111.  * Regstart and reganch permit very fast decisions on suitable starting points
  112.  * for a match, cutting down the work a lot.  Regmust permits fast rejection
  113.  * of lines that cannot possibly match.  The regmust tests are costly enough
  114.  * that vim_regcomp() supplies a regmust only if the r.e. contains something
  115.  * potentially expensive (at present, the only such thing detected is * or +
  116.  * at the start of the r.e., which can involve a lot of backup).  Regmlen is
  117.  * supplied because the test in vim_regexec() needs it and vim_regcomp() is
  118.  * computing it anyway.
  119.  */
  120. /*
  121.  * Structure for regexp "program".  This is essentially a linear encoding
  122.  * of a nondeterministic finite-state machine (aka syntax charts or
  123.  * "railroad normal form" in parsing technology).  Each node is an opcode
  124.  * plus a "next" pointer, possibly plus an operand.  "Next" pointers of
  125.  * all nodes except BRANCH and BRACES_COMPLEX implement concatenation; a "next"
  126.  * pointer with a BRANCH on both ends of it is connecting two alternatives.
  127.  * (Here we have one of the subtle syntax dependencies: an individual BRANCH
  128.  * (as opposed to a collection of them) is never concatenated with anything
  129.  * because of operator precedence).  The "next" pointer of a BRACES_COMPLEX
  130.  * node points to the node after the stuff to be repeated.  The operand of some
  131.  * types of node is a literal string; for others, it is a node leading into a
  132.  * sub-FSM.  In particular, the operand of a BRANCH node is the first node of
  133.  * the branch. (NB this is *not* a tree structure: the tail of the branch
  134.  * connects to the thing following the set of BRANCHes.)  The opcodes are:
  135.  */
  136. /* definition number    opnd?    meaning */
  137. #define END 0 /* no End of program. */
  138. #define BOL 1 /* no Match "" at beginning of line. */
  139. #define EOL 2 /* no Match "" at end of line. */
  140. #define ANY 3 /* no Match any one character. */
  141. #define ANYOF 4 /* str Match any character in this string. */
  142. #define ANYBUT 5 /* str Match any character not in this
  143.  * string. */
  144. #define BRANCH 6 /* node Match this alternative, or the
  145.  * next... */
  146. #define BACK 7 /* no Match "", "next" ptr points backward. */
  147. #define EXACTLY 8 /* str Match this string. */
  148. #define NOTHING 9 /* no Match empty string. */
  149. #define STAR 10 /* node Match this (simple) thing 0 or more
  150.  * times. */
  151. #define PLUS 11 /* node Match this (simple) thing 1 or more
  152.  * times. */
  153. #define BRACE_SIMPLE 12 /* node Match this (simple) thing between m and
  154.  * n times ({m,n}). */
  155. #define BOW 13 /* no Match "" after [^a-zA-Z0-9_] */
  156. #define EOW 14 /* no Match "" at    [^a-zA-Z0-9_] */
  157. #define IDENT 15 /* no Match identifier char */
  158. #define KWORD 16 /* no Match keyword char */
  159. #define FNAME 17 /* no Match file name char */
  160. #define PRINT 18 /* no Match printable char */
  161. #define SIDENT 19 /* no Match identifier char but no digit */
  162. #define SWORD 20 /* no Match word char but no digit */
  163. #define SFNAME 21 /* no Match file name char but no digit */
  164. #define SPRINT 22 /* no Match printable char but no digit */
  165. #define BRACE_LIMITS 23 /* 2int define the min & max for BRACE_SIMPLE
  166.  * and BRACE_COMPLEX. */
  167. #define WHITE 24 /* no Match whitespace char */
  168. #define NWHITE 25 /* no Match non-whitespace char */
  169. #define DIGIT 26 /* no Match digit char */
  170. #define NDIGIT 27 /* no Match non-digit char */
  171. #define HEX 28 /* no   Match hex char */
  172. #define NHEX 29 /* no   Match non-hex char */
  173. #define OCTAL 30 /* no Match octal char */
  174. #define NOCTAL 31 /* no Match non-octal char */
  175. #define WORD 32 /* no Match word char */
  176. #define NWORD 33 /* no Match non-word char */
  177. #define HEAD 34 /* no Match head char */
  178. #define NHEAD 35 /* no Match non-head char */
  179. #define ALPHA 36 /* no Match alpha char */
  180. #define NALPHA 37 /* no Match non-alpha char */
  181. #define LOWER 38 /* no Match lowercase char */
  182. #define NLOWER 39 /* no Match non-lowercase char */
  183. #define UPPER 40 /* no Match uppercase char */
  184. #define NUPPER 41 /* no Match non-uppercase char */
  185. #define MOPEN 60 /* -69  no Mark this point in input as start of
  186.  * ( subexpr. */
  187. #define MCLOSE 70 /* -79  no Analogous to MOPEN. */
  188. #define BACKREF 80 /* -89  node Match same string again 1-9 */
  189. #define BRACE_COMPLEX 90 /* -99  node Match nodes between m & n times */
  190. #define Magic(x)    ((x) | ('\' << 8))
  191. /*
  192.  * Opcode notes:
  193.  *
  194.  * BRANCH The set of branches constituting a single choice are hooked
  195.  * together with their "next" pointers, since precedence prevents
  196.  * anything being concatenated to any individual branch.  The
  197.  * "next" pointer of the last BRANCH in a choice points to the
  198.  * thing following the whole choice.  This is also where the
  199.  * final "next" pointer of each individual branch points; each
  200.  * branch starts with the operand node of a BRANCH node.
  201.  *
  202.  * BACK Normal "next" pointers all implicitly point forward; BACK
  203.  * exists to make loop structures possible.
  204.  *
  205.  * STAR,PLUS '=', and complex '*' and '+', are implemented as circular
  206.  * BRANCH structures using BACK.  Simple cases (one character
  207.  * per match) are implemented with STAR and PLUS for speed
  208.  * and to minimize recursive plunges.
  209.  * Note: We would like to use "?" instead of "=", but a "?"
  210.  * can be part of a pattern to escape the special meaning of '?'
  211.  * at the end of the pattern in "?pattern?e".
  212.  *
  213.  * BRACE_LIMITS This is always followed by a BRACE_SIMPLE or BRACE_COMPLEX
  214.  * node, and defines the min and max limits to be used for that
  215.  * node.
  216.  *
  217.  * MOPEN,MCLOSE ...are numbered at compile time.
  218.  */
  219. /*
  220.  * A node is one char of opcode followed by two chars of "next" pointer.
  221.  * "Next" pointers are stored as two 8-bit pieces, high order first.  The
  222.  * value is a positive offset from the opcode of the node containing it.
  223.  * An operand, if any, simply follows the node.  (Note that much of the
  224.  * code generation knows about this implicit relationship.)
  225.  *
  226.  * Using two bytes for the "next" pointer is vast overkill for most things,
  227.  * but allows patterns to get big without disasters.
  228.  */
  229. #define OP(p) ((int)*(p))
  230. #define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
  231. #define OPERAND(p) ((p) + 3)
  232. #define OPERAND_MIN(p) (((*((p)+3)&0377)<<8) + (*((p)+4)&0377))
  233. #define OPERAND_MAX(p) (((*((p)+5)&0377)<<8) + (*((p)+6)&0377))
  234. /*
  235.  * Utility definitions.
  236.  */
  237. #ifndef CHARBITS
  238. # define UCHARAT(p) ((int)*(unsigned char *)(p))
  239. #else
  240. # define UCHARAT(p) ((int)*(p)&CHARBITS)
  241. #endif
  242. #define EMSG_RETURN(m) { emsg(m); rc_did_emsg = TRUE; return NULL; }
  243. #define MAX_LIMIT 32767
  244. static int re_ismult __ARGS((int));
  245. static int cstrncmp __ARGS((char_u *s1, char_u *s2, int n));
  246. static char_u *cstrchr __ARGS((char_u *, int));
  247. #ifdef DEBUG
  248. static void regdump __ARGS((char_u *, vim_regexp *));
  249. static char_u *regprop __ARGS((char_u *));
  250. #endif
  251.     static int
  252. re_ismult(c)
  253.     int c;
  254. {
  255.     return (c == Magic('*') || c == Magic('+') || c == Magic('=') ||
  256.     c == Magic('{'));
  257. }
  258. /*
  259.  * Flags to be passed up and down.
  260.  */
  261. #define HASWIDTH 01 /* Known never to match null string. */
  262. #define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */
  263. #define SPSTART 04 /* Starts with * or +. */
  264. #define WORST 0 /* Worst case. */
  265. /*
  266.  * When regcode is set to this value, code is not emitted and size is computed
  267.  * instead.
  268.  */
  269. #define JUST_CALC_SIZE ((char_u *) -1)
  270. static char_u *reg_prev_sub;
  271. /*
  272.  * REGEXP_INRANGE contains all characters which are always special in a []
  273.  * range after ''.
  274.  * REGEXP_ABBR contains all characters which act as abbreviations after ''.
  275.  * These are:
  276.  *  r - New line (CR).
  277.  *  t - Tab (TAB).
  278.  *  e - Escape (ESC).
  279.  *  b - Backspace (Ctrl('H')).
  280.  */
  281. static char_u REGEXP_INRANGE[] = "]^-\";
  282. static char_u REGEXP_ABBR[] = "rteb";
  283. static int backslash_trans __ARGS((int c));
  284. static int my_isblank __ARGS((int c));
  285. static int (* skip_class_name __ARGS((char_u **pp)))__ARGS((int));
  286. static char_u * skip_range __ARGS((char_u *p));
  287. static void init_class_tab __ARGS((void));
  288.     static int
  289. backslash_trans(c)
  290.     int     c;
  291. {
  292.     switch (c)
  293.     {
  294. case 'r':   return CR;
  295. case 't':   return TAB;
  296. case 'e':   return ESC;
  297. case 'b':   return Ctrl('H');
  298.     }
  299.     return c;
  300. }
  301. /*
  302.  * Function version of the macro vim_iswhite().
  303.  */
  304.     static int
  305. my_isblank(c)
  306.     int c;
  307. {
  308.     return vim_iswhite(c);
  309. }
  310. /*
  311.  * Check for a character class name.  "pp" is at the '['.
  312.  * If not: NULL is returned; If so, a function of the sort is* is returned and
  313.  * the name is skipped.
  314.  */
  315.     static int (*
  316. skip_class_name(pp))__ARGS((int))
  317.     char_u **pp;
  318. {
  319.     typedef struct
  320.     {
  321. size_t     len;
  322. int     (*func)__ARGS((int));
  323. char_u     name[sizeof("xdigit:]")];
  324.     } namedata_t;
  325. #define t(n, func) { sizeof(n) - 1, func, n }
  326.     static const namedata_t class_names[] =
  327.     {
  328. t("alnum:]", isalnum), t("alpha:]", isalpha),
  329. t("blank:]", my_isblank), t("cntrl:]", iscntrl),
  330. t("digit:]", isdigit), t("graph:]", isgraph),
  331. t("lower:]", islower), t("print:]", vim_isprintc),
  332. t("punct:]", ispunct), t("space:]", vim_isspace),
  333. t("upper:]", isupper), t("xdigit:]", isxdigit)
  334.     };
  335. #undef t
  336.     const namedata_t *np;
  337.     if ((*pp)[1] != ':')
  338. return NULL;
  339.     for (   np = class_names;
  340.     np < class_names + sizeof(class_names) / sizeof(*class_names);
  341.     np++)
  342. if (STRNCMP(*pp+2, np->name, np->len) == 0)
  343. {
  344.     *pp += np->len + 2;
  345.     return np->func;
  346. }
  347.     return NULL;
  348. }
  349. /*
  350.  * Skip over a "[]" range.
  351.  * "p" must point to the character after the '['.
  352.  * The returned pointer is on the matching ']', or the terminating NUL.
  353.  */
  354.     static char_u *
  355. skip_range(p)
  356.     char_u *p;
  357. {
  358.     int     cpo_lit;     /* 'cpoptions' contains 'l' flag */
  359.     cpo_lit = (!reg_syn && vim_strchr(p_cpo, CPO_LITERAL) != NULL);
  360.     if (*p == '^') /* Complement of range. */
  361. ++p;
  362.     if (*p == ']' || *p == '-')
  363. ++p;
  364.     while (*p != NUL && *p != ']')
  365.     {
  366. if (*p == '-')
  367. {
  368.     ++p;
  369.     if (*p != ']' && *p != NUL)
  370. ++p;
  371. }
  372. else if (*p == '\'
  373. && (vim_strchr(REGEXP_INRANGE, p[1]) != NULL
  374.     || (!cpo_lit && vim_strchr(REGEXP_ABBR, p[1]) != NULL)))
  375.     p += 2;
  376. else if (*p == '[')
  377. {
  378.     if (skip_class_name(&p) == NULL)
  379. ++p; /* It was not a class name */
  380. }
  381. else
  382.     ++p;
  383.     }
  384.     return p;
  385. }
  386. /*
  387.  * Specific version of character class functions.
  388.  * Using a table to keep this fast.
  389.  */
  390. static char_u class_tab[256];
  391. #define     RI_DIGIT 0x01
  392. #define     RI_HEX 0x02
  393. #define     RI_OCTAL 0x04
  394. #define     RI_WORD 0x08
  395. #define     RI_HEAD 0x10
  396. #define     RI_ALPHA 0x20
  397. #define     RI_LOWER 0x40
  398. #define     RI_UPPER 0x80
  399.     static void
  400. init_class_tab()
  401. {
  402.     int i;
  403.     static int done = FALSE;
  404.     if (done)
  405. return;
  406.     for (i = 0; i < 256; ++i)
  407.     {
  408. if (i >= '0' && i <= '7')
  409.     class_tab[i] = RI_DIGIT + RI_HEX + RI_OCTAL + RI_WORD;
  410. else if (i >= '8' && i <= '9')
  411.     class_tab[i] = RI_DIGIT + RI_HEX + RI_WORD;
  412. else if (i >= 'a' && i <= 'f')
  413.     class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER;
  414. else if (i >= 'g' && i <= 'z')
  415.     class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER;
  416. else if (i >= 'A' && i <= 'F')
  417.     class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER;
  418. else if (i >= 'G' && i <= 'Z')
  419.     class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER;
  420. else if (i == '_')
  421.     class_tab[i] = RI_WORD + RI_HEAD;
  422.     }
  423.     done = TRUE;
  424. }
  425. #define ri_digit(c) (class_tab[c] & RI_DIGIT)
  426. #define ri_hex(c) (class_tab[c] & RI_HEX)
  427. #define ri_octal(c) (class_tab[c] & RI_OCTAL)
  428. #define ri_word(c) (class_tab[c] & RI_WORD)
  429. #define ri_head(c) (class_tab[c] & RI_HEAD)
  430. #define ri_alpha(c) (class_tab[c] & RI_ALPHA)
  431. #define ri_lower(c) (class_tab[c] & RI_LOWER)
  432. #define ri_upper(c) (class_tab[c] & RI_UPPER)
  433. /*
  434.  * Global work variables for vim_regcomp().
  435.  */
  436. static char_u *regparse;  /* Input-scan pointer. */
  437. static int num_complex_braces; /* Complex {...} count */
  438. static int regnpar; /* () count. */
  439. static char_u *regcode; /* Code-emit pointer, or JUST_CALC_SIZE */
  440. static long regsize; /* Code size. */
  441. static char_u **regendp; /* Pointer to endp array */
  442. static int brace_min[10]; /* Minimums for complex brace repeats */
  443. static int brace_max[10]; /* Maximums for complex brace repeats */
  444. static int brace_count[10]; /* Current counts for complex brace repeats */
  445. static int had_eol; /* TRUE when EOL found by vim_regcomp() */
  446. static int reg_magic; /* p_magic passed to vim_regexec() */
  447. /*
  448.  * META contains all characters that may be magic, except '^' and '$'.
  449.  */
  450. static char_u META[] = ".[()|=+*<>iIkKfFpPsSdDxXoOwWhHaAlLuU~123456789{";
  451. /*
  452.  * Forward declarations for vim_regcomp()'s friends.
  453.  */
  454. static void initchr __ARGS((char_u *));
  455. static int getchr __ARGS((void));
  456. static int peekchr __ARGS((void));
  457. #define PeekChr() curchr    /* shortcut only when last action was peekchr() */
  458. static int curchr;
  459. static void skipchr __ARGS((void));
  460. static void ungetchr __ARGS((void));
  461. static char_u *reg __ARGS((int, int *));
  462. static char_u *regbranch __ARGS((int *));
  463. static char_u *regpiece __ARGS((int *));
  464. static char_u *regatom __ARGS((int *));
  465. static char_u *regnode __ARGS((int));
  466. static char_u *regnext __ARGS((char_u *));
  467. static void regc __ARGS((int));
  468. static void unregc __ARGS((void));
  469. static void reginsert __ARGS((int, char_u *));
  470. static void reginsert_limits __ARGS((int, int, int, char_u *));
  471. static int read_limits __ARGS((int, int, int *, int *));
  472. static void regtail __ARGS((char_u *, char_u *));
  473. static void regoptail __ARGS((char_u *, char_u *));
  474. /*
  475.  * Skip past regular expression.
  476.  * Stop at end of 'p' of where 'dirc' is found ('/', '?', etc).
  477.  * Take care of characters with a backslash in front of it.
  478.  * Skip strings inside [ and ].
  479.  */
  480.     char_u *
  481. skip_regexp(p, dirc, magic)
  482.     char_u  *p;
  483.     int     dirc;
  484.     int     magic;
  485. {
  486.     for (; p[0] != NUL; ++p)
  487.     {
  488. if (p[0] == dirc) /* found end of regexp */
  489.     break;
  490. if ((p[0] == '[' && magic) || (p[0] == '\' && p[1] == '[' && !magic))
  491. {
  492.     p = skip_range(p + 1);
  493.     if (p[0] == NUL)
  494. break;
  495. }
  496. else if (p[0] == '\' && p[1] != NUL)
  497.     ++p;    /* skip next character */
  498.     }
  499.     return p;
  500. }
  501. /*
  502.  * vim_regcomp - compile a regular expression into internal code
  503.  *
  504.  * We can't allocate space until we know how big the compiled form will be,
  505.  * but we can't compile it (and thus know how big it is) until we've got a
  506.  * place to put the code.  So we cheat:  we compile it twice, once with code
  507.  * generation turned off and size counting turned on, and once "for real".
  508.  * This also means that we don't allocate space until we are sure that the
  509.  * thing really will compile successfully, and we never have to move the
  510.  * code and thus invalidate pointers into it.  (Note that it has to be in
  511.  * one piece because vim_free() must be able to free it all.)
  512.  *
  513.  * Does not use reg_ic, see vim_regexec() for that.
  514.  *
  515.  * Beware that the optimization-preparation code in here knows about some
  516.  * of the structure of the compiled regexp.
  517.  */
  518.     vim_regexp *
  519. vim_regcomp(exp, magic)
  520.     char_u *exp;
  521.     int magic;
  522. {
  523.     vim_regexp *r;
  524.     char_u *scan;
  525.     char_u *longest;
  526.     int len;
  527.     int flags;
  528.     if (exp == NULL)
  529. EMSG_RETURN(e_null);
  530.     reg_magic = magic;
  531.     init_class_tab();
  532.     /* First pass: determine size, legality. */
  533.     initchr((char_u *)exp);
  534.     num_complex_braces = 0;
  535.     regnpar = 1;
  536.     regsize = 0L;
  537.     regcode = JUST_CALC_SIZE;
  538.     regendp = NULL;
  539.     had_eol = FALSE;
  540.     regc(MAGIC);
  541.     if (reg(0, &flags) == NULL)
  542. return NULL;
  543.     /* Small enough for pointer-storage convention? */
  544. #ifdef SMALL_MALLOC /* 16 bit storage allocation */
  545.     if (regsize >= 65536L - 256L)
  546. EMSG_RETURN(e_toolong);
  547. #endif
  548.     /* Allocate space. */
  549.     r = (vim_regexp *)lalloc(sizeof(vim_regexp) + regsize, TRUE);
  550.     if (r == NULL)
  551. return NULL;
  552.     /* Second pass: emit code. */
  553.     initchr((char_u *)exp);
  554.     num_complex_braces = 0;
  555.     regnpar = 1;
  556.     regcode = r->program;
  557.     regendp = r->endp;
  558.     regc(MAGIC);
  559.     if (reg(0, &flags) == NULL)
  560.     {
  561. vim_free(r);
  562. return NULL;
  563.     }
  564.     /* Dig out information for optimizations. */
  565.     r->regstart = ''; /* Worst-case defaults. */
  566.     r->reganch = 0;
  567.     r->regmust = NULL;
  568.     r->regmlen = 0;
  569.     scan = r->program + 1; /* First BRANCH. */
  570.     if (OP(regnext(scan)) == END)   /* Only one top-level choice. */
  571.     {
  572. scan = OPERAND(scan);
  573. /* Starting-point info. */
  574. if (OP(scan) == BOL)
  575. {
  576.     r->reganch++;
  577.     scan = regnext(scan);
  578. }
  579. if (OP(scan) == EXACTLY)
  580.     r->regstart = *OPERAND(scan);
  581. else if ((OP(scan) == BOW || OP(scan) == EOW)
  582.  && OP(regnext(scan)) == EXACTLY)
  583.     r->regstart = *OPERAND(regnext(scan));
  584. /*
  585.  * If there's something expensive in the r.e., find the longest
  586.  * literal string that must appear and make it the regmust.  Resolve
  587.  * ties in favor of later strings, since the regstart check works
  588.  * with the beginning of the r.e. and avoiding duplication
  589.  * strengthens checking.  Not a strong reason, but sufficient in the
  590.  * absence of others.
  591.  */
  592. /*
  593.  * When the r.e. starts with BOW, it is faster to look for a regmust
  594.  * first. Used a lot for "#" and "*" commands. (Added by mool).
  595.  */
  596. if (flags & SPSTART || OP(scan) == BOW || OP(scan) == EOW)
  597. {
  598.     longest = NULL;
  599.     len = 0;
  600.     for (; scan != NULL; scan = regnext(scan))
  601. if (OP(scan) == EXACTLY && STRLEN(OPERAND(scan)) >= (size_t)len)
  602. {
  603.     longest = OPERAND(scan);
  604.     len = STRLEN(OPERAND(scan));
  605. }
  606.     r->regmust = longest;
  607.     r->regmlen = len;
  608. }
  609.     }
  610. #ifdef DEBUG
  611.     regdump(exp, r);
  612. #endif
  613.     return r;
  614. }
  615. /*
  616.  * Check if during the previous call to vim_regcomp the EOL item "$" has been
  617.  * found.  This is messy, but it works fine.
  618.  */
  619.     int
  620. vim_regcomp_had_eol()
  621. {
  622.     return had_eol;
  623. }
  624. /*
  625.  * reg - regular expression, i.e. main body or parenthesized thing
  626.  *
  627.  * Caller must absorb opening parenthesis.
  628.  *
  629.  * Combining parenthesis handling with the base level of regular expression
  630.  * is a trifle forced, but the need to tie the tails of the branches to what
  631.  * follows makes it hard to avoid.
  632.  */
  633.     static char_u *
  634. reg(paren, flagp)
  635.     int     paren; /* Parenthesized? */
  636.     int     *flagp;
  637. {
  638.     char_u *ret;
  639.     char_u *br;
  640.     char_u *ender;
  641.     int parno = 0;
  642.     int flags;
  643.     *flagp = HASWIDTH; /* Tentatively. */
  644.     /* Make an MOPEN node, if parenthesized. */
  645.     if (paren)
  646.     {
  647. if (regnpar >= NSUBEXP)
  648.     EMSG_RETURN(e_toombra);
  649. parno = regnpar;
  650. regnpar++;
  651. ret = regnode(MOPEN + parno);
  652. if (regendp)
  653.     regendp[parno] = NULL;  /* haven't seen the close paren yet */
  654.     }
  655.     else
  656. ret = NULL;
  657.     /* Pick up the branches, linking them together. */
  658.     br = regbranch(&flags);
  659.     if (br == NULL)
  660. return NULL;
  661.     if (ret != NULL)
  662. regtail(ret, br); /* MOPEN -> first. */
  663.     else
  664. ret = br;
  665.     if (!(flags & HASWIDTH))
  666. *flagp &= ~HASWIDTH;
  667.     *flagp |= flags & SPSTART;
  668.     while (peekchr() == Magic('|'))
  669.     {
  670. skipchr();
  671. br = regbranch(&flags);
  672. if (br == NULL)
  673.     return NULL;
  674. regtail(ret, br); /* BRANCH -> BRANCH. */
  675. if (!(flags & HASWIDTH))
  676.     *flagp &= ~HASWIDTH;
  677. *flagp |= flags & SPSTART;
  678.     }
  679.     /* Make a closing node, and hook it on the end. */
  680.     ender = regnode((paren) ? MCLOSE + parno : END);
  681.     regtail(ret, ender);
  682.     /* Hook the tails of the branches to the closing node. */
  683.     for (br = ret; br != NULL; br = regnext(br))
  684. regoptail(br, ender);
  685.     /* Check for proper termination. */
  686.     if (paren && getchr() != Magic(')'))
  687. EMSG_RETURN(e_toombra)
  688.     else if (!paren && peekchr() != '')
  689.     {
  690. if (PeekChr() == Magic(')'))
  691.     EMSG_RETURN(e_toomket)
  692. else
  693.     EMSG_RETURN(e_trailing) /* "Can't happen". */
  694. /* NOTREACHED */
  695.     }
  696.     /*
  697.      * Here we set the flag allowing back references to this set of
  698.      * parentheses.
  699.      */
  700.     if (paren && regendp)
  701. regendp[parno] = ender; /* have seen the close paren */
  702.     return ret;
  703. }
  704. /*
  705.  * regbranch - one alternative of an | operator
  706.  *
  707.  * Implements the concatenation operator.
  708.  */
  709.     static char_u    *
  710. regbranch(flagp)
  711.     int     *flagp;
  712. {
  713.     char_u     *ret;
  714.     char_u     *chain;
  715.     char_u     *latest;
  716.     int     flags;
  717.     *flagp = WORST; /* Tentatively. */
  718.     ret = regnode(BRANCH);
  719.     chain = NULL;
  720.     while (peekchr() != '' && PeekChr() != Magic('|') &&
  721.       PeekChr() != Magic(')'))
  722.     {
  723. latest = regpiece(&flags);
  724. if (latest == NULL)
  725.     return NULL;
  726. *flagp |= flags & HASWIDTH;
  727. if (chain == NULL) /* First piece. */
  728.     *flagp |= flags & SPSTART;
  729. else
  730.     regtail(chain, latest);
  731. chain = latest;
  732.     }
  733.     if (chain == NULL) /* Loop ran zero times. */
  734. (void) regnode(NOTHING);
  735.     return ret;
  736. }
  737. /*
  738.  * regpiece - something followed by possible [*+=]
  739.  *
  740.  * Note that the branching code sequences used for = and the general cases
  741.  * of * and + are somewhat optimized:  they use the same NOTHING node as
  742.  * both the endmarker for their branch list and the body of the last branch.
  743.  * It might seem that this node could be dispensed with entirely, but the
  744.  * endmarker role is not redundant.
  745.  */
  746.     static char_u *
  747. regpiece(flagp)
  748.     int     *flagp;
  749. {
  750.     char_u     *ret;
  751.     int     op;
  752.     char_u     *next;
  753.     int     flags;
  754.     int     minval;
  755.     int     maxval;
  756.     ret = regatom(&flags);
  757.     if (ret == NULL)
  758. return NULL;
  759.     op = peekchr();
  760.     if (!re_ismult(op))
  761.     {
  762. *flagp = flags;
  763. return ret;
  764.     }
  765.     if (!(flags & HASWIDTH) && op != Magic('='))
  766. EMSG_RETURN((char_u *)"*, \+, or \{ operand could be empty");
  767.     *flagp = (WORST | SPSTART);     /* default flags */
  768.     skipchr();
  769.     if (op == Magic('*') && (flags & SIMPLE))
  770. reginsert(STAR, ret);
  771.     else if (op == Magic('*'))
  772.     {
  773. /* Emit x* as (x&|), where & means "self". */
  774. reginsert(BRANCH, ret); /* Either x */
  775. regoptail(ret, regnode(BACK)); /* and loop */
  776. regoptail(ret, ret); /* back */
  777. regtail(ret, regnode(BRANCH)); /* or */
  778. regtail(ret, regnode(NOTHING)); /* null. */
  779.     }
  780.     else if (op == Magic('+') && (flags & SIMPLE))
  781.     {
  782. reginsert(PLUS, ret);
  783. *flagp = (WORST | HASWIDTH);
  784.     }
  785.     else if (op == Magic('+'))
  786.     {
  787. /* Emit x+ as x(&|), where & means "self". */
  788. next = regnode(BRANCH); /* Either */
  789. regtail(ret, next);
  790. regtail(regnode(BACK), ret); /* loop back */
  791. regtail(next, regnode(BRANCH)); /* or */
  792. regtail(ret, regnode(NOTHING)); /* null. */
  793. *flagp = (WORST | HASWIDTH);
  794.     }
  795.     else if (op == Magic('='))
  796.     {
  797. /* Emit x= as (x|) */
  798. reginsert(BRANCH, ret); /* Either x */
  799. regtail(ret, regnode(BRANCH)); /* or */
  800. next = regnode(NOTHING);/* null. */
  801. regtail(ret, next);
  802. regoptail(ret, next);
  803.     }
  804.     else if (op == Magic('{') && (flags & SIMPLE))
  805.     {
  806. if (!read_limits('{', '}', &minval, &maxval))
  807.     return NULL;
  808. reginsert(BRACE_SIMPLE, ret);
  809. reginsert_limits(BRACE_LIMITS, minval, maxval, ret);
  810. if (minval > 0)
  811.     *flagp = (WORST | HASWIDTH);
  812.     }
  813.     else if (op == Magic('{'))
  814.     {
  815. if (!read_limits('{', '}', &minval, &maxval))
  816.     return NULL;
  817. if (num_complex_braces >= 10)
  818.     EMSG_RETURN((char_u *)"Too many complex \{...}s");
  819. reginsert(BRACE_COMPLEX + num_complex_braces, ret);
  820. regoptail(ret, regnode(BACK));
  821. regoptail(ret, ret);
  822. reginsert_limits(BRACE_LIMITS, minval, maxval, ret);
  823. if (minval > 0)
  824.     *flagp = (WORST | HASWIDTH);
  825. ++num_complex_braces;
  826.     }
  827.     if (re_ismult(peekchr()))
  828. EMSG_RETURN((char_u *)"Nested *, \=, \+, or \{");
  829.     return ret;
  830. }
  831. /*
  832.  * regatom - the lowest level
  833.  *
  834.  * Optimization:  gobbles an entire sequence of ordinary characters so that
  835.  * it can turn them into a single node, which is smaller to store and
  836.  * faster to run.
  837.  */
  838.     static char_u *
  839. regatom(flagp)
  840.     int    *flagp;
  841. {
  842.     char_u     *ret;
  843.     int     flags;
  844.     int     cpo_lit;     /* 'cpoptions' contains 'l' flag */
  845.     *flagp = WORST; /* Tentatively. */
  846.     cpo_lit = (!reg_syn && vim_strchr(p_cpo, CPO_LITERAL) != NULL);
  847.     switch (getchr())
  848.     {
  849.       case Magic('^'):
  850. ret = regnode(BOL);
  851. break;
  852.       case Magic('$'):
  853. ret = regnode(EOL);
  854. had_eol = TRUE;
  855. break;
  856.       case Magic('<'):
  857. ret = regnode(BOW);
  858. break;
  859.       case Magic('>'):
  860. ret = regnode(EOW);
  861. break;
  862.       case Magic('.'):
  863. ret = regnode(ANY);
  864. *flagp |= HASWIDTH | SIMPLE;
  865. break;
  866.       case Magic('i'):
  867. ret = regnode(IDENT);
  868. *flagp |= HASWIDTH | SIMPLE;
  869. break;
  870.       case Magic('k'):
  871. ret = regnode(KWORD);
  872. *flagp |= HASWIDTH | SIMPLE;
  873. break;
  874.       case Magic('I'):
  875. ret = regnode(SIDENT);
  876. *flagp |= HASWIDTH | SIMPLE;
  877. break;
  878.       case Magic('K'):
  879. ret = regnode(SWORD);
  880. *flagp |= HASWIDTH | SIMPLE;
  881. break;
  882.       case Magic('f'):
  883. ret = regnode(FNAME);
  884. *flagp |= HASWIDTH | SIMPLE;
  885. break;
  886.       case Magic('F'):
  887. ret = regnode(SFNAME);
  888. *flagp |= HASWIDTH | SIMPLE;
  889. break;
  890.       case Magic('p'):
  891. ret = regnode(PRINT);
  892. *flagp |= HASWIDTH | SIMPLE;
  893. break;
  894.       case Magic('P'):
  895. ret = regnode(SPRINT);
  896. *flagp |= HASWIDTH | SIMPLE;
  897. break;
  898.       case Magic('s'):
  899. ret = regnode(WHITE);
  900. *flagp |= HASWIDTH | SIMPLE;
  901. break;
  902.       case Magic('S'):
  903. ret = regnode(NWHITE);
  904. *flagp |= HASWIDTH | SIMPLE;
  905. break;
  906.       case Magic('d'):
  907. ret = regnode(DIGIT);
  908. *flagp |= HASWIDTH | SIMPLE;
  909. break;
  910.       case Magic('D'):
  911. ret = regnode(NDIGIT);
  912. *flagp |= HASWIDTH | SIMPLE;
  913. break;
  914.       case Magic('x'):
  915. ret = regnode(HEX);
  916. *flagp |= HASWIDTH | SIMPLE;
  917. break;
  918.       case Magic('X'):
  919. ret = regnode(NHEX);
  920. *flagp |= HASWIDTH | SIMPLE;
  921. break;
  922.       case Magic('o'):
  923. ret = regnode(OCTAL);
  924. *flagp |= HASWIDTH | SIMPLE;
  925. break;
  926.       case Magic('O'):
  927. ret = regnode(NOCTAL);
  928. *flagp |= HASWIDTH | SIMPLE;
  929. break;
  930.       case Magic('w'):
  931. ret = regnode(WORD);
  932. *flagp |= HASWIDTH | SIMPLE;
  933. break;
  934.       case Magic('W'):
  935. ret = regnode(NWORD);
  936. *flagp |= HASWIDTH | SIMPLE;
  937. break;
  938.       case Magic('h'):
  939. ret = regnode(HEAD);
  940. *flagp |= HASWIDTH | SIMPLE;
  941. break;
  942.       case Magic('H'):
  943. ret = regnode(NHEAD);
  944. *flagp |= HASWIDTH | SIMPLE;
  945. break;
  946.       case Magic('a'):
  947. ret = regnode(ALPHA);
  948. *flagp |= HASWIDTH | SIMPLE;
  949. break;
  950.       case Magic('A'):
  951. ret = regnode(NALPHA);
  952. *flagp |= HASWIDTH | SIMPLE;
  953. break;
  954.       case Magic('l'):
  955. ret = regnode(LOWER);
  956. *flagp |= HASWIDTH | SIMPLE;
  957. break;
  958.       case Magic('L'):
  959. ret = regnode(NLOWER);
  960. *flagp |= HASWIDTH | SIMPLE;
  961. break;
  962.       case Magic('u'):
  963. ret = regnode(UPPER);
  964. *flagp |= HASWIDTH | SIMPLE;
  965. break;
  966.       case Magic('U'):
  967. ret = regnode(NUPPER);
  968. *flagp |= HASWIDTH | SIMPLE;
  969. break;
  970.       case Magic('('):
  971. ret = reg(1, &flags);
  972. if (ret == NULL)
  973.     return NULL;
  974. *flagp |= flags & (HASWIDTH | SPSTART);
  975. break;
  976.       case '':
  977.       case Magic('|'):
  978.       case Magic(')'):
  979. EMSG_RETURN(e_internal)     /* Supposed to be caught earlier. */
  980. /* NOTREACHED */
  981.       case Magic('='):
  982. EMSG_RETURN((char_u *)"\= follows nothing")
  983. /* NOTREACHED */
  984.       case Magic('+'):
  985. EMSG_RETURN((char_u *)"\+ follows nothing")
  986. /* NOTREACHED */
  987.       case Magic('{'):
  988. EMSG_RETURN((char_u *)"\{ follows nothing")
  989. /* NOTREACHED */
  990.       case Magic('*'):
  991. if (reg_magic)
  992.     EMSG_RETURN((char_u *)"* follows nothing")
  993. else
  994.     EMSG_RETURN((char_u *)"\* follows nothing")
  995. /* break; Not Reached */
  996.       case Magic('~'): /* previous substitute pattern */
  997.     if (reg_prev_sub)
  998.     {
  999. char_u     *p;
  1000. ret = regnode(EXACTLY);
  1001. p = reg_prev_sub;
  1002. while (*p)
  1003. {
  1004.     regc(*p++);
  1005. }
  1006. regc('');
  1007. if (p - reg_prev_sub)
  1008. {
  1009.     *flagp |= HASWIDTH;
  1010.     if ((p - reg_prev_sub) == 1)
  1011. *flagp |= SIMPLE;
  1012. }
  1013.     }
  1014.     else
  1015. EMSG_RETURN(e_nopresub);
  1016.     break;
  1017.       case Magic('1'):
  1018.       case Magic('2'):
  1019.       case Magic('3'):
  1020.       case Magic('4'):
  1021.       case Magic('5'):
  1022.       case Magic('6'):
  1023.       case Magic('7'):
  1024.       case Magic('8'):
  1025.       case Magic('9'):
  1026.     {
  1027.     int     refnum;
  1028.     ungetchr();
  1029.     refnum = getchr() - Magic('0');
  1030.     /*
  1031.      * Check if the back reference is legal. We use the parentheses
  1032.      * pointers to mark encountered close parentheses, but this
  1033.      * is only available in the second pass. Checking opens is
  1034.      * always possible.
  1035.      * Should also check that we don't refer to something that
  1036.      * is repeated (+*=): what instance of the repetition should
  1037.      * we match? TODO.
  1038.      */
  1039.     if (refnum < regnpar &&
  1040. (regendp == NULL || regendp[refnum] != NULL))
  1041. ret = regnode(BACKREF + refnum);
  1042.     else
  1043. EMSG_RETURN((char_u *)"Illegal back reference");
  1044. }
  1045. break;
  1046.       case Magic('['):
  1047. {
  1048.     char_u *p;
  1049.     /*
  1050.      * If there is no matching ']', we assume the '[' is a normal
  1051.      * character. This makes ":help [" work.
  1052.      */
  1053.     p = skip_range(regparse);
  1054.     if (*p == ']') /* there is a matching ']' */
  1055.     {
  1056. /*
  1057.  * In a character class, different parsing rules apply.
  1058.  * Not even  is special anymore, nothing is.
  1059.  */
  1060. if (*regparse == '^') {     /* Complement of range. */
  1061.     ret = regnode(ANYBUT);
  1062.     regparse++;
  1063. }
  1064. else
  1065.     ret = regnode(ANYOF);
  1066. if (*regparse == ']' || *regparse == '-')
  1067.     regc(*regparse++);
  1068. while (*regparse != '' && *regparse != ']')
  1069. {
  1070.     if (*regparse == '-')
  1071.     {
  1072. regparse++;
  1073. if (*regparse == ']' || *regparse == '')
  1074.     regc('-');
  1075. else
  1076. {
  1077.     int cclass;
  1078.     int cclassend;
  1079.     cclass = UCHARAT(regparse - 2) + 1;
  1080.     cclassend = UCHARAT(regparse);
  1081.     if (cclass > cclassend + 1)
  1082. EMSG_RETURN(e_invrange);
  1083.     for (; cclass <= cclassend; cclass++)
  1084. regc(cclass);
  1085.     regparse++;
  1086. }
  1087.     }
  1088.     /*
  1089.      * Only "]", "^", "]" and "\" are special in Vi.  Vim
  1090.      * accepts "t", "e", etc., but only when the 'l' flag in
  1091.      * 'cpoptions' is not included.
  1092.      */
  1093.     else if (*regparse == '\' &&
  1094.     (vim_strchr(REGEXP_INRANGE, regparse[1]) != NULL ||
  1095.      (!cpo_lit &&
  1096.        vim_strchr(REGEXP_ABBR, regparse[1]) != NULL)))
  1097.     {
  1098. regparse++;
  1099. regc(backslash_trans(*regparse++));
  1100.     }
  1101.     else if (*regparse == '[')
  1102.     {
  1103. int (*func)__ARGS((int));
  1104. int cu;
  1105. if ((func = skip_class_name(&regparse)) == NULL)
  1106.     regc(*regparse++);
  1107. else
  1108.     /* Characters assumed to be 8 bits */
  1109.     for (cu = 0; cu <= 255; cu++)
  1110. if ((*func)(cu))
  1111.     regc(cu);
  1112.     }
  1113.     else
  1114. regc(*regparse++);
  1115. }
  1116. regc('');
  1117. if (*regparse != ']')
  1118.     EMSG_RETURN(e_toomsbra);
  1119. skipchr();     /* let's be friends with the lexer again */
  1120. *flagp |= HASWIDTH | SIMPLE;
  1121. break;
  1122.     }
  1123. }
  1124. /* FALLTHROUGH */
  1125.       default:
  1126. {
  1127.     int     len;
  1128.     int     chr;
  1129.     ungetchr();
  1130.     len = 0;
  1131.     ret = regnode(EXACTLY);
  1132.     /*
  1133.      * Always take at least one character, for '[' without matching
  1134.      * ']'.
  1135.      */
  1136.     while ((chr = peekchr()) != '' && (chr < Magic(0) || len == 0))
  1137.     {
  1138. regc(chr);
  1139. skipchr();
  1140. len++;
  1141.     }
  1142. #ifdef DEBUG
  1143.     if (len == 0)
  1144.  EMSG_RETURN((char_u *)"Unexpected magic character; check META.");
  1145. #endif
  1146.     /*
  1147.      * If there is a following *, + or = we need the character
  1148.      * in front of it as a single character operand
  1149.      */
  1150.     if (len > 1 && re_ismult(chr))
  1151.     {
  1152. unregc();     /* Back off of *+= operand */
  1153. ungetchr();     /* and put it back for next time */
  1154. --len;
  1155.     }
  1156.     regc('');
  1157.     *flagp |= HASWIDTH;
  1158.     if (len == 1)
  1159. *flagp |= SIMPLE;
  1160. }
  1161. break;
  1162.     }
  1163.     return ret;
  1164. }
  1165. /*
  1166.  * regnode - emit a node
  1167.  */
  1168.     static char_u * /* Location. */
  1169. regnode(op)
  1170.     int op;
  1171. {
  1172.     char_u  *ret;
  1173.     char_u  *ptr;
  1174.     ret = regcode;
  1175.     if (ret == JUST_CALC_SIZE)
  1176.     {
  1177. regsize += 3;
  1178. return ret;
  1179.     }
  1180.     ptr = ret;
  1181.     *ptr++ = op;
  1182.     *ptr++ = ''; /* Null "next" pointer. */
  1183.     *ptr++ = '';
  1184.     regcode = ptr;
  1185.     return ret;
  1186. }
  1187. /*
  1188.  * regc - emit (if appropriate) a byte of code
  1189.  */
  1190.     static void
  1191. regc(b)
  1192.     int b;
  1193. {
  1194.     if (regcode != JUST_CALC_SIZE)
  1195. *regcode++ = b;
  1196.     else
  1197. regsize++;
  1198. }
  1199. /*
  1200.  * unregc - take back (if appropriate) a byte of code
  1201.  */
  1202.     static void
  1203. unregc()
  1204. {
  1205.     if (regcode != JUST_CALC_SIZE)
  1206. regcode--;
  1207.     else
  1208. regsize--;
  1209. }
  1210. /*
  1211.  * reginsert - insert an operator in front of already-emitted operand
  1212.  *
  1213.  * Means relocating the operand.
  1214.  */
  1215.     static void
  1216. reginsert(op, opnd)
  1217.     int op;
  1218.     char_u     *opnd;
  1219. {
  1220.     char_u  *src;
  1221.     char_u  *dst;
  1222.     char_u  *place;
  1223.     if (regcode == JUST_CALC_SIZE)
  1224.     {
  1225. regsize += 3;
  1226. return;
  1227.     }
  1228.     src = regcode;
  1229.     regcode += 3;
  1230.     dst = regcode;
  1231.     while (src > opnd)
  1232. *--dst = *--src;
  1233.     place = opnd; /* Op node, where operand used to be. */
  1234.     *place++ = op;
  1235.     *place++ = '';
  1236.     *place = '';
  1237. }
  1238. /*
  1239.  * reginsert_limits - insert an operator in front of already-emitted operand.
  1240.  * The operator has the given limit values as operands.  Also set next pointer.
  1241.  *
  1242.  * Means relocating the operand.
  1243.  */
  1244.     static void
  1245. reginsert_limits(op, minval, maxval, opnd)
  1246.     int op;
  1247.     int minval;
  1248.     int maxval;
  1249.     char_u     *opnd;
  1250. {
  1251.     char_u  *src;
  1252.     char_u  *dst;
  1253.     char_u  *place;
  1254.     if (regcode == JUST_CALC_SIZE)
  1255.     {
  1256. regsize += 7;
  1257. return;
  1258.     }
  1259.     src = regcode;
  1260.     regcode += 7;
  1261.     dst = regcode;
  1262.     while (src > opnd)
  1263. *--dst = *--src;
  1264.     place = opnd; /* Op node, where operand used to be. */
  1265.     *place++ = op;
  1266.     *place++ = '';
  1267.     *place++ = '';
  1268.     *place++ = (char_u) (((unsigned)minval >> 8) & 0377);
  1269.     *place++ = (char_u) (minval & 0377);
  1270.     *place++ = (char_u) (((unsigned)maxval >> 8) & 0377);
  1271.     *place++ = (char_u) (maxval & 0377);
  1272.     regtail(opnd, place);
  1273. }
  1274. /*
  1275.  * regtail - set the next-pointer at the end of a node chain
  1276.  */
  1277.     static void
  1278. regtail(p, val)
  1279.     char_u    *p;
  1280.     char_u    *val;
  1281. {
  1282.     char_u  *scan;
  1283.     char_u  *temp;
  1284.     int     offset;
  1285.     if (p == JUST_CALC_SIZE)
  1286. return;
  1287.     /* Find last node. */
  1288.     scan = p;
  1289.     for (;;)
  1290.     {
  1291. temp = regnext(scan);
  1292. if (temp == NULL)
  1293.     break;
  1294. scan = temp;
  1295.     }
  1296.     if (OP(scan) == BACK)
  1297. offset = (int)(scan - val);
  1298.     else
  1299. offset = (int)(val - scan);
  1300.     *(scan + 1) = (char_u) (((unsigned)offset >> 8) & 0377);
  1301.     *(scan + 2) = (char_u) (offset & 0377);
  1302. }
  1303. /*
  1304.  * regoptail - regtail on operand of first argument; nop if operandless
  1305.  */
  1306.     static void
  1307. regoptail(p, val)
  1308.     char_u    *p;
  1309.     char_u    *val;
  1310. {
  1311.     /* When op is neither BRANCH nor BRACE_COMPLEX0-9, it is "operandless" */
  1312.     if (p == NULL || p == JUST_CALC_SIZE ||
  1313.     (OP(p) != BRANCH &&
  1314.      (OP(p) < BRACE_COMPLEX || OP(p) > BRACE_COMPLEX + 9)))
  1315. return;
  1316.     regtail(OPERAND(p), val);
  1317. }
  1318. /*
  1319.  * getchr() - get the next character from the pattern. We know about
  1320.  * magic and such, so therefore we need a lexical analyzer.
  1321.  */
  1322. /* static int     curchr; */
  1323. static int prevchr;
  1324. static int nextchr;    /* used for ungetchr() */
  1325. /*
  1326.  * Note: prevchr is sometimes -1 when we are not at the start,
  1327.  * eg in /[ ^I]^ the pattern was never found even if it existed, because ^ was
  1328.  * taken to be magic -- webb
  1329.  */
  1330. static int at_start; /* True when on the first character */
  1331. static int prev_at_start;  /* True when on the second character */
  1332.     static void
  1333. initchr(str)
  1334.     char_u *str;
  1335. {
  1336.     regparse = str;
  1337.     curchr = prevchr = nextchr = -1;
  1338.     at_start = TRUE;
  1339.     prev_at_start = FALSE;
  1340. }
  1341.     static int
  1342. peekchr()
  1343. {
  1344.     if (curchr < 0)
  1345.     {
  1346. switch (curchr = regparse[0])
  1347. {
  1348. case '.':
  1349.     /* case '+':*/
  1350.     /* case '=':*/
  1351. case '[':
  1352. case '~':
  1353.     if (reg_magic)
  1354. curchr = Magic(curchr);
  1355.     break;
  1356. case '*':
  1357.     /* * is not magic as the very first character, eg "?*ptr" and when
  1358.      * after '^', eg "/^*ptr" */
  1359.     if (reg_magic && !at_start
  1360.  && !(prev_at_start && prevchr == Magic('^')))
  1361. curchr = Magic('*');
  1362.     break;
  1363. case '^':
  1364.     /* ^ is only magic as the very first character */
  1365.     if (at_start)
  1366. curchr = Magic('^');
  1367.     break;
  1368. case '$':
  1369.     /* $ is only magic as the very last char and in front of '|' */
  1370.     if (regparse[1] == NUL
  1371.        || (regparse[1] == '\' && regparse[2] == '|'))
  1372. curchr = Magic('$');
  1373.     break;
  1374. case '\':
  1375.     regparse++;
  1376.     if (regparse[0] == NUL)
  1377.     {
  1378. curchr = '\'; /* trailing '' */
  1379. --regparse; /* there is no extra character to skip */
  1380.     }
  1381.     else if (vim_strchr(META, regparse[0]))
  1382.     {
  1383. /*
  1384.  * META contains everything that may be magic sometimes, except
  1385.  * ^ and $ ("^" and "$" are never magic).
  1386.  * We now fetch the next character and toggle its magicness.
  1387.  * Therefore,  is so meta-magic that it is not in META.
  1388.  */
  1389. curchr = -1;
  1390. prev_at_start = at_start;
  1391. at_start = FALSE; /* be able to say "/*ptr" */
  1392. peekchr();
  1393. curchr ^= Magic(0);
  1394.     }
  1395.     else if (vim_strchr(REGEXP_ABBR, regparse[0]))
  1396.     {
  1397. /*
  1398.  * Handle abbreviations, like "t" for TAB -- webb
  1399.  */
  1400. curchr = backslash_trans(regparse[0]);
  1401.     }
  1402.     else
  1403.     {
  1404. /*
  1405.  * Next character can never be (made) magic?
  1406.  * Then backslashing it won't do anything.
  1407.  */
  1408. curchr = regparse[0];
  1409.     }
  1410.     break;
  1411. }
  1412.     }
  1413.     return curchr;
  1414. }
  1415.     static void
  1416. skipchr()
  1417. {
  1418.     regparse++;
  1419.     prev_at_start = at_start;
  1420.     at_start = FALSE;
  1421.     prevchr = curchr;
  1422.     curchr = nextchr;     /* use previously unget char, or -1 */
  1423.     nextchr = -1;
  1424. }
  1425.     static int
  1426. getchr()
  1427. {
  1428.     int chr;
  1429.     chr = peekchr();
  1430.     skipchr();
  1431.     return chr;
  1432. }
  1433. /*
  1434.  * put character back. Works only once!
  1435.  */
  1436.     static void
  1437. ungetchr()
  1438. {
  1439.     nextchr = curchr;
  1440.     curchr = prevchr;
  1441.     at_start = prev_at_start;
  1442.     prev_at_start = FALSE;
  1443.     /*
  1444.      * Backup regparse as well; not because we will use what it points at,
  1445.      * but because skipchr() will bump it again.
  1446.      */
  1447.     regparse--;
  1448. }
  1449. /*
  1450.  * read_limits - Read two integers to be taken as a minimum and maximum.
  1451.  * If the first character is '-', then the range is reversed.
  1452.  * Should end with 'end'.  If minval is missing, zero is default, if maxval is
  1453.  * missing, a very big number is the default.
  1454.  */
  1455.     static int
  1456. read_limits(start, end, minval, maxval)
  1457.     int     start;
  1458.     int     end;
  1459.     int     *minval;
  1460.     int     *maxval;
  1461. {
  1462.     int     reverse = FALSE;
  1463.     char_u  *first_char;
  1464.     if (*regparse == '-')
  1465.     {
  1466. /* Starts with '-', so reverse the range later */
  1467. regparse++;
  1468. reverse = TRUE;
  1469.     }
  1470.     first_char = regparse;
  1471.     *minval = getdigits(&regparse);
  1472.     if (*regparse == ',')     /* There is a comma */
  1473.     {
  1474. if (isdigit(*++regparse))
  1475.     *maxval = getdigits(&regparse);
  1476. else
  1477.     *maxval = MAX_LIMIT;
  1478.     }
  1479.     else if (isdigit(*first_char))
  1480. *maxval = *minval;     /* It was {n} or {-n} */
  1481.     else
  1482. *maxval = MAX_LIMIT;     /* It was {} or {-} */
  1483.     if (*regparse == '\')
  1484. regparse++; /* Allow either {...} or {...} */
  1485.     if (       (*regparse != end && *regparse != NUL)
  1486.     || (*maxval == 0 && *minval == 0))
  1487.     {
  1488. sprintf((char *)IObuff, "Syntax error in \%c...%c", start, end);
  1489. emsg(IObuff);
  1490. rc_did_emsg = TRUE;
  1491. return FAIL;
  1492.     }
  1493.     /*
  1494.      * Reverse the range if there was a '-', or make sure it is in the right
  1495.      * order otherwise.
  1496.      */
  1497.     if ((!reverse && *minval > *maxval) || (reverse && *minval < *maxval))
  1498.     {
  1499. int tmp;
  1500. tmp = *minval;
  1501. *minval = *maxval;
  1502. *maxval = tmp;
  1503.     }
  1504.     skipchr(); /* let's be friends with the lexer again */
  1505.     return OK;
  1506. }
  1507. /*
  1508.  * vim_regexec and friends
  1509.  */
  1510. /*
  1511.  * Global work variables for vim_regexec().
  1512.  */
  1513. static char_u  *reginput; /* String-input pointer. */
  1514. static char_u  *regbol; /* Beginning of input, for ^ check. */
  1515. static char_u **regstartp; /* Pointer to startp array. */
  1516. static int   need_clear_subexpr; /* *regstartp end *regendp still need
  1517.    to be cleared */
  1518. static int regtry __ARGS((vim_regexp *, char_u *));
  1519. static void clear_subexpr __ARGS((void));
  1520. static int regmatch __ARGS((char_u *));
  1521. static int regrepeat __ARGS((char_u *));
  1522. #ifdef DEBUG
  1523. int regnarrate = 0;
  1524. #endif
  1525. /*
  1526.  * vim_regexec - match a regexp against a string
  1527.  * Uses current value of reg_ic.
  1528.  * Return non-zero if there is a match.
  1529.  */
  1530.     int
  1531. vim_regexec(prog, string, at_bol)
  1532.     vim_regexp *prog;
  1533.     char_u *string;
  1534.     int at_bol;
  1535. {
  1536.     char_u *s;
  1537.     /* Be paranoid... */
  1538.     if (prog == NULL || string == NULL)
  1539.     {
  1540. emsg(e_null);
  1541. rc_did_emsg = TRUE;
  1542. return 0;
  1543.     }
  1544.     /* Check validity of program. */
  1545.     if (UCHARAT(prog->program) != MAGIC)
  1546.     {
  1547. emsg(e_re_corr);
  1548. rc_did_emsg = TRUE;
  1549. return 0;
  1550.     }
  1551.     /* If there is a "must appear" string, look for it. */
  1552.     if (prog->regmust != NULL)
  1553.     {
  1554. s = string;
  1555. while ((s = cstrchr(s, prog->regmust[0])) != NULL)
  1556. {
  1557.     if (cstrncmp(s, prog->regmust, prog->regmlen) == 0)
  1558. break; /* Found it. */
  1559.     s++;
  1560. }
  1561. if (s == NULL) /* Not present. */
  1562.     return 0;
  1563.     }
  1564.     /* Mark beginning of line for ^ . */
  1565.     if (at_bol)
  1566. regbol = string; /* is possible to match bol */
  1567.     else
  1568. regbol = NULL; /* we aren't there, so don't match it */
  1569.     /* Simplest case:  anchored match need be tried only once. */
  1570.     if (prog->reganch)
  1571.     {
  1572. if (prog->regstart != '' && prog->regstart != string[0] &&
  1573.     (!reg_ic || TO_LOWER(prog->regstart) != TO_LOWER(string[0])))
  1574.     return 0;
  1575. return regtry(prog, string);
  1576.     }
  1577.     /* Messy cases:  unanchored match. */
  1578.     s = string;
  1579.     if (prog->regstart != '')
  1580. /* We know what char it must start with. */
  1581. while ((s = cstrchr(s, prog->regstart)) != NULL)
  1582. {
  1583.     if (regtry(prog, s))
  1584. return 1;
  1585.     s++;
  1586. }
  1587.     else
  1588. /* We don't -- general case. */
  1589. do
  1590. {
  1591.     if (regtry(prog, s))
  1592. return 1;
  1593. } while (*s++ != '');
  1594.     /* Failure. */
  1595.     return 0;
  1596. }
  1597. /*
  1598.  * regtry - try match at specific point
  1599.  */
  1600.     static int /* 0 failure, 1 success */
  1601. regtry(prog, string)
  1602.     vim_regexp    *prog;
  1603.     char_u    *string;
  1604. {
  1605.     reginput = string;
  1606.     regstartp = prog->startp;
  1607.     regendp = prog->endp;
  1608.     need_clear_subexpr = TRUE;
  1609.     if (regmatch(prog->program + 1))
  1610.     {
  1611. clear_subexpr();
  1612. prog->startp[0] = string;
  1613. prog->endp[0] = reginput;
  1614. return 1;
  1615.     }
  1616.     else
  1617. return 0;
  1618. }
  1619. /*
  1620.  * Clear the subexpressions, if this wasn't done yet.
  1621.  * This construction is used to clear the subexpressions only when they are
  1622.  * used (to increase speed).
  1623.  */
  1624.     static void
  1625. clear_subexpr()
  1626. {
  1627.     if (need_clear_subexpr)
  1628.     {
  1629. vim_memset(regstartp, 0, sizeof(char_u *) * NSUBEXP);
  1630. vim_memset(regendp, 0, sizeof(char_u *) * NSUBEXP);
  1631. need_clear_subexpr = FALSE;
  1632.     }
  1633. }
  1634. /*
  1635.  * regmatch - main matching routine
  1636.  *
  1637.  * Conceptually the strategy is simple: Check to see whether the current
  1638.  * node matches, call self recursively to see whether the rest matches,
  1639.  * and then act accordingly.  In practice we make some effort to avoid
  1640.  * recursion, in particular by going through "ordinary" nodes (that don't
  1641.  * need to know whether the rest of the match failed) by a loop instead of
  1642.  * by recursion.
  1643.  */
  1644.     static int /* 0 failure, 1 success */
  1645. regmatch(prog)
  1646.     char_u    *prog;
  1647. {
  1648.     char_u     *scan; /* Current node. */
  1649.     char_u     *next; /* Next node. */
  1650.     int     minval = -1;
  1651.     int     maxval = -1;
  1652.     scan = prog;
  1653. #ifdef DEBUG
  1654.     if (scan != NULL && regnarrate)
  1655.     {
  1656. mch_errmsg(regprop(scan));
  1657. mch_errmsg("(n");
  1658.     }
  1659. #endif
  1660.     while (scan != NULL)
  1661.     {
  1662. #ifdef DEBUG
  1663. if (regnarrate)
  1664. {
  1665.     mch_errmsg(regprop(scan));
  1666.     mch_errmsg("...n");
  1667. }
  1668. #endif
  1669. next = regnext(scan);
  1670. switch (OP(scan))
  1671. {
  1672.   case BOL:
  1673.     if (reginput != regbol)
  1674. return 0;
  1675.     break;
  1676.   case EOL:
  1677.     if (*reginput != '')
  1678. return 0;
  1679.     break;
  1680.   case BOW: /* <word; reginput points to w */
  1681.     if (reginput != regbol && vim_iswordc(reginput[-1]))
  1682. return 0;
  1683.     if (!reginput[0] || !vim_iswordc(reginput[0]))
  1684. return 0;
  1685.     break;
  1686.   case EOW: /* word>; reginput points after d */
  1687.     if (reginput == regbol || !vim_iswordc(reginput[-1]))
  1688. return 0;
  1689.     if (reginput[0] && vim_iswordc(reginput[0]))
  1690. return 0;
  1691.     break;
  1692.   case ANY:
  1693.     if (*reginput == '')
  1694. return 0;
  1695.     reginput++;
  1696.     break;
  1697.   case IDENT:
  1698.     if (!vim_isIDc(*reginput))
  1699. return 0;
  1700.     reginput++;
  1701.     break;
  1702.   case KWORD:
  1703.     if (!vim_iswordc(*reginput))
  1704. return 0;
  1705.     reginput++;
  1706.     break;
  1707.   case FNAME:
  1708.     if (!vim_isfilec(*reginput))
  1709. return 0;
  1710.     reginput++;
  1711.     break;
  1712.   case PRINT:
  1713.     if (charsize(*reginput) != 1)
  1714. return 0;
  1715.     reginput++;
  1716.     break;
  1717.   case SIDENT:
  1718.     if (isdigit(*reginput) || !vim_isIDc(*reginput))
  1719. return 0;
  1720.     reginput++;
  1721.     break;
  1722.   case SWORD:
  1723.     if (isdigit(*reginput) || !vim_iswordc(*reginput))
  1724. return 0;
  1725.     reginput++;
  1726.     break;
  1727.   case SFNAME:
  1728.     if (isdigit(*reginput) || !vim_isfilec(*reginput))
  1729. return 0;
  1730.     reginput++;
  1731.     break;
  1732.   case SPRINT:
  1733.     if (isdigit(*reginput) || charsize(*reginput) != 1)
  1734. return 0;
  1735.     reginput++;
  1736.     break;
  1737.   case WHITE:
  1738.     if (!vim_iswhite(*reginput))
  1739. return 0;
  1740.     reginput++;
  1741.     break;
  1742.   case NWHITE:
  1743.     if (*reginput == NUL || vim_iswhite(*reginput))
  1744. return 0;
  1745.     reginput++;
  1746.     break;
  1747.   case DIGIT:
  1748.     if (!ri_digit(*reginput))
  1749. return 0;
  1750.     reginput++;
  1751.     break;
  1752.   case NDIGIT:
  1753.     if (*reginput == NUL || ri_digit(*reginput))
  1754. return 0;
  1755.     reginput++;
  1756.     break;
  1757.   case HEX:
  1758.     if (!ri_hex(*reginput))
  1759. return 0;
  1760.     reginput++;
  1761.     break;
  1762.   case NHEX:
  1763.     if (*reginput == NUL || ri_hex(*reginput))
  1764. return 0;
  1765.     reginput++;
  1766.     break;
  1767.   case OCTAL:
  1768.     if (!ri_octal(*reginput))
  1769. return 0;
  1770.     reginput++;
  1771.     break;
  1772.   case NOCTAL:
  1773.     if (*reginput == NUL || ri_octal(*reginput))
  1774. return 0;
  1775.     reginput++;
  1776.     break;
  1777.   case WORD:
  1778.     if (!ri_word(*reginput))
  1779. return 0;
  1780.     reginput++;
  1781.     break;
  1782.   case NWORD:
  1783.     if (*reginput == NUL || ri_word(*reginput))
  1784. return 0;
  1785.     reginput++;
  1786.     break;
  1787.   case HEAD:
  1788.     if (!ri_head(*reginput))
  1789. return 0;
  1790.     reginput++;
  1791.     break;
  1792.   case NHEAD:
  1793.     if (*reginput == NUL || ri_head(*reginput))
  1794. return 0;
  1795.     reginput++;
  1796.     break;
  1797.   case ALPHA:
  1798.     if (!ri_alpha(*reginput))
  1799. return 0;
  1800.     reginput++;
  1801.     break;
  1802.   case NALPHA:
  1803.     if (*reginput == NUL || ri_alpha(*reginput))
  1804. return 0;
  1805.     reginput++;
  1806.     break;
  1807.   case LOWER:
  1808.     if (!ri_lower(*reginput))
  1809. return 0;
  1810.     reginput++;
  1811.     break;
  1812.   case NLOWER:
  1813.     if (*reginput == NUL || ri_lower(*reginput))
  1814. return 0;
  1815.     reginput++;
  1816.     break;
  1817.   case UPPER:
  1818.     if (!ri_upper(*reginput))
  1819. return 0;
  1820.     reginput++;
  1821.     break;
  1822.   case NUPPER:
  1823.     if (*reginput == NUL || ri_upper(*reginput))
  1824. return 0;
  1825.     reginput++;
  1826.     break;
  1827.   case EXACTLY:
  1828.     {
  1829. int     len;
  1830. char_u     *opnd;
  1831. opnd = OPERAND(scan);
  1832. /* Inline the first character, for speed. */
  1833. if (*opnd != *reginput
  1834. && (!reg_ic || TO_LOWER(*opnd) != TO_LOWER(*reginput)))
  1835.     return 0;
  1836. len = STRLEN(opnd);
  1837. if (len > 1 && cstrncmp(opnd, reginput, len) != 0)
  1838.     return 0;
  1839. reginput += len;
  1840.     }
  1841.     break;
  1842.   case ANYOF:
  1843.     if (*reginput == '' || cstrchr(OPERAND(scan), *reginput) == NULL)
  1844. return 0;
  1845.     reginput++;
  1846.     break;
  1847.   case ANYBUT:
  1848.     if (*reginput == '' || cstrchr(OPERAND(scan), *reginput) != NULL)
  1849. return 0;
  1850.     reginput++;
  1851.     break;
  1852.   case NOTHING:
  1853.     break;
  1854.   case BACK:
  1855.     break;
  1856.   case MOPEN + 1:
  1857.   case MOPEN + 2:
  1858.   case MOPEN + 3:
  1859.   case MOPEN + 4:
  1860.   case MOPEN + 5:
  1861.   case MOPEN + 6:
  1862.   case MOPEN + 7:
  1863.   case MOPEN + 8:
  1864.   case MOPEN + 9:
  1865.     {
  1866. int     no;
  1867. char_u     *save;
  1868. clear_subexpr();
  1869. no = OP(scan) - MOPEN;
  1870. save = regstartp[no];
  1871. regstartp[no] = reginput; /* Tentatively */
  1872. #ifdef DEBUG
  1873. if (regnarrate)
  1874.     printf("MOPEN  %d pre  @'%s' ('%s' )'%s'n",
  1875. no, save,
  1876. regstartp[no] ? (char *)regstartp[no] : "NULL",
  1877. regendp[no] ? (char *)regendp[no] : "NULL");
  1878. #endif
  1879. if (regmatch(next))
  1880. {
  1881. #ifdef DEBUG
  1882.     if (regnarrate)
  1883. printf("MOPEN  %d post @'%s' ('%s' )'%s'n",
  1884. no, save,
  1885. regstartp[no] ? (char *)regstartp[no] : "NULL",
  1886. regendp[no] ? (char *)regendp[no] : "NULL");
  1887. #endif
  1888.     return 1;
  1889. }
  1890. regstartp[no] = save;     /* We were wrong... */
  1891. return 0;
  1892.     }
  1893.     /* break; Not Reached */
  1894.   case MCLOSE + 1:
  1895.   case MCLOSE + 2:
  1896.   case MCLOSE + 3:
  1897.   case MCLOSE + 4:
  1898.   case MCLOSE + 5:
  1899.   case MCLOSE + 6:
  1900.   case MCLOSE + 7:
  1901.   case MCLOSE + 8:
  1902.   case MCLOSE + 9:
  1903.     {
  1904. int     no;
  1905. char_u     *save;
  1906. clear_subexpr();
  1907. no = OP(scan) - MCLOSE;
  1908. save = regendp[no];
  1909. regendp[no] = reginput; /* Tentatively */
  1910. #ifdef DEBUG
  1911. if (regnarrate)
  1912.     printf("MCLOSE %d pre  @'%s' ('%s' )'%s'n",
  1913. no, save,
  1914. regstartp[no] ? (char *)regstartp[no] : "NULL",
  1915. regendp[no] ? (char *)regendp[no] : "NULL");
  1916. #endif
  1917. if (regmatch(next))
  1918. {
  1919. #ifdef DEBUG
  1920.     if (regnarrate)
  1921. printf("MCLOSE %d post @'%s' ('%s' )'%s'n",
  1922. no, save,
  1923. regstartp[no] ? (char *)regstartp[no] : "NULL",
  1924. regendp[no] ? (char *)regendp[no] : "NULL");
  1925. #endif
  1926.     return 1;
  1927. }
  1928. regendp[no] = save; /* We were wrong... */
  1929. return 0;
  1930.     }
  1931.     /* break; Not Reached */
  1932.   case BACKREF + 1:
  1933.   case BACKREF + 2:
  1934.   case BACKREF + 3:
  1935.   case BACKREF + 4:
  1936.   case BACKREF + 5:
  1937.   case BACKREF + 6:
  1938.   case BACKREF + 7:
  1939.   case BACKREF + 8:
  1940.   case BACKREF + 9:
  1941.     {
  1942. int no;
  1943. int len;
  1944. clear_subexpr();
  1945. no = OP(scan) - BACKREF;
  1946. if (regendp[no] != NULL)
  1947. {
  1948.     len = (int)(regendp[no] - regstartp[no]);
  1949.     if (cstrncmp(regstartp[no], reginput, len) != 0)
  1950. return 0;
  1951.     reginput += len;
  1952. }
  1953. else
  1954. {
  1955.     /*emsg("backref to 0-repeat");*/
  1956.     /*return 0;*/
  1957. }
  1958.     }
  1959.     break;
  1960.   case BRANCH:
  1961.     {
  1962. char_u     *save;
  1963. if (OP(next) != BRANCH) /* No choice. */
  1964.     next = OPERAND(scan); /* Avoid recursion. */
  1965. else
  1966. {
  1967.     do
  1968.     {
  1969. save = reginput;
  1970. if (regmatch(OPERAND(scan)))
  1971.     return 1;
  1972. reginput = save;
  1973. scan = regnext(scan);
  1974.     } while (scan != NULL && OP(scan) == BRANCH);
  1975.     return 0;
  1976.     /* NOTREACHED */
  1977. }
  1978.     }
  1979.     break;
  1980.   case BRACE_LIMITS:
  1981.     {
  1982. int no;
  1983. if (OP(next) == BRACE_SIMPLE)
  1984. {
  1985.     minval = OPERAND_MIN(scan);
  1986.     maxval = OPERAND_MAX(scan);
  1987. }
  1988. else if (OP(next) >= BRACE_COMPLEX &&
  1989.  OP(next) < BRACE_COMPLEX + 10)
  1990. {
  1991.     no = OP(next) - BRACE_COMPLEX;
  1992.     brace_min[no] = OPERAND_MIN(scan);
  1993.     brace_max[no] = OPERAND_MAX(scan);
  1994.     brace_count[no] = 0;
  1995. }
  1996. else
  1997. {
  1998.     emsg(e_internal);     /* Shouldn't happen */
  1999.     return 0;
  2000. }
  2001.     }
  2002.     break;
  2003.   case BRACE_COMPLEX + 0:
  2004.   case BRACE_COMPLEX + 1:
  2005.   case BRACE_COMPLEX + 2:
  2006.   case BRACE_COMPLEX + 3:
  2007.   case BRACE_COMPLEX + 4:
  2008.   case BRACE_COMPLEX + 5:
  2009.   case BRACE_COMPLEX + 6:
  2010.   case BRACE_COMPLEX + 7:
  2011.   case BRACE_COMPLEX + 8:
  2012.   case BRACE_COMPLEX + 9:
  2013.     {
  2014. int     no;
  2015. char_u     *save;
  2016. no = OP(scan) - BRACE_COMPLEX;
  2017. ++brace_count[no];
  2018. /* If not matched enough times yet, try one more */
  2019. if (brace_count[no] <= (brace_min[no] <= brace_max[no]
  2020.     ? brace_min[no] : brace_max[no]))
  2021. {
  2022.     save = reginput;
  2023.     if (regmatch(OPERAND(scan)))
  2024. return 1;
  2025.     reginput = save;
  2026.     --brace_count[no]; /* failed, decrement match count */
  2027.     return 0;
  2028. }
  2029. /* If matched enough times, may try matching some more */
  2030. if (brace_min[no] <= brace_max[no])
  2031. {
  2032.     /* Range is the normal way around, use longest match */
  2033.     if (brace_count[no] <= brace_max[no])
  2034.     {
  2035. save = reginput;
  2036. if (regmatch(OPERAND(scan)))
  2037.     return 1;     /* matched some more times */
  2038. reginput = save;
  2039. --brace_count[no];  /* matched just enough times */
  2040. /* continue with the items after {} */
  2041.     }
  2042. }
  2043. else
  2044. {
  2045.     /* Range is backwards, use shortest match first */
  2046.     if (brace_count[no] <= brace_min[no])
  2047.     {
  2048. save = reginput;
  2049. if (regmatch(next))
  2050.     return 1;
  2051. reginput = save;
  2052. next = OPERAND(scan);
  2053. /* must try to match one more item */
  2054.     }
  2055. }
  2056.     }
  2057.     break;
  2058.   case BRACE_SIMPLE:
  2059.   case STAR:
  2060.   case PLUS:
  2061.     {
  2062. int nextch;
  2063. int nextch_ic;
  2064. int no;
  2065. char_u *save;
  2066. /*
  2067.  * Lookahead to avoid useless match attempts when we know
  2068.  * what character comes next.
  2069.  */
  2070. if (OP(next) == EXACTLY)
  2071. {
  2072.     nextch = *OPERAND(next);
  2073.     if (reg_ic)
  2074.     {
  2075. if (isupper(nextch))
  2076.     nextch_ic = TO_LOWER(nextch);
  2077. else
  2078.     nextch_ic = TO_UPPER(nextch);
  2079.     }
  2080.     else
  2081. nextch_ic = nextch;
  2082. }
  2083. else
  2084. {
  2085.     nextch = '';
  2086.     nextch_ic = '';
  2087. }
  2088. if (OP(scan) != BRACE_SIMPLE)
  2089. {
  2090.     minval = (OP(scan) == STAR) ? 0 : 1;
  2091.     maxval = MAX_LIMIT;
  2092. }
  2093. save = reginput;
  2094. no = regrepeat(OPERAND(scan));
  2095. if (minval <= maxval)
  2096. {
  2097.     /* Range is the normal way around, use longest match */
  2098.     if (no > maxval)
  2099.     {
  2100. no = maxval;
  2101. reginput = save + no;
  2102.     }
  2103.     while (no >= minval)
  2104.     {
  2105. /* If it could work, try it. */
  2106. if (nextch == '' || *reginput == nextch
  2107.     || *reginput == nextch_ic)
  2108.     if (regmatch(next))
  2109. return 1;
  2110. /* Couldn't or didn't -- back up. */
  2111. no--;
  2112. reginput = save + no;
  2113.     }
  2114. }
  2115. else
  2116. {
  2117.     /* Range is backwards, use shortest match first */
  2118.     if (no < maxval)
  2119. return 0;
  2120.     if (minval > no)
  2121. minval = no; /* Actually maximum value */
  2122.     no = maxval;
  2123.     reginput = save + no;
  2124.     while (no <= minval)
  2125.     {
  2126. /* If it could work, try it. */
  2127. if (nextch == '' || *reginput == nextch
  2128.     || *reginput == nextch_ic)
  2129.     if (regmatch(next))
  2130. return 1;
  2131. /* Couldn't or didn't -- try longer match. */
  2132. no++;
  2133. reginput = save + no;
  2134.     }
  2135. }
  2136. return 0;
  2137.     }
  2138.     /* break; Not Reached */
  2139.   case END:
  2140.     return 1;     /* Success! */
  2141.     /* break; Not Reached */
  2142.   default:
  2143.     emsg(e_re_corr);
  2144. #ifdef DEBUG
  2145.     printf("Illegal op code %dn", OP(scan));
  2146. #endif
  2147.     return 0;
  2148.     /* break; Not Reached */
  2149. }
  2150. scan = next;
  2151.     }
  2152.     /*
  2153.      * We get here only if there's trouble -- normally "case END" is the
  2154.      * terminating point.
  2155.      */
  2156.     emsg(e_re_corr);
  2157. #ifdef DEBUG
  2158.     printf("Premature EOLn");
  2159. #endif
  2160.     return 0;
  2161. }
  2162. /*
  2163.  * regrepeat - repeatedly match something simple, report how many
  2164.  */
  2165.     static int
  2166. regrepeat(p)
  2167.     char_u *p;
  2168. {
  2169.     int count = 0;
  2170.     char_u *scan;
  2171.     char_u *opnd;
  2172.     int mask;
  2173.     scan = reginput;
  2174.     opnd = OPERAND(p);
  2175.     switch (OP(p))
  2176.     {
  2177.       case ANY:
  2178. count = STRLEN(scan);
  2179. scan += count;
  2180. break;
  2181.       case IDENT:
  2182. for (count = 0; vim_isIDc(*scan); ++count)
  2183.     ++scan;
  2184. break;
  2185.       case KWORD:
  2186. for (count = 0; vim_iswordc(*scan); ++count)
  2187.     ++scan;
  2188. break;
  2189.       case FNAME:
  2190. for (count = 0; vim_isfilec(*scan); ++count)
  2191.     ++scan;
  2192. break;
  2193.       case PRINT:
  2194. for (count = 0; charsize(*scan) == 1; ++count)
  2195.     ++scan;
  2196. break;
  2197.       case SIDENT:
  2198. for (count = 0; !isdigit(*scan) && vim_isIDc(*scan); ++count)
  2199.     ++scan;
  2200. break;
  2201.       case SWORD:
  2202. for (count = 0; !isdigit(*scan) && vim_iswordc(*scan); ++count)
  2203.     ++scan;
  2204. break;
  2205.       case SFNAME:
  2206. for (count = 0; !isdigit(*scan) && vim_isfilec(*scan); ++count)
  2207.     ++scan;
  2208. break;
  2209.       case SPRINT:
  2210. for (count = 0; !isdigit(*scan) && charsize(*scan) == 1; ++count)
  2211.     ++scan;
  2212. break;
  2213.       case WHITE:
  2214. for (count = 0; vim_iswhite(*scan); ++count)
  2215.     ++scan;
  2216. break;
  2217.       case NWHITE:
  2218. for (count = 0; *scan != NUL && !vim_iswhite(*scan); ++count)
  2219.     ++scan;
  2220. break;
  2221.       case DIGIT:
  2222. mask = RI_DIGIT;
  2223. do_class:
  2224. for (count = 0; class_tab[*scan] & mask; ++count)
  2225.     ++scan;
  2226. break;
  2227.       case NDIGIT:
  2228. mask = RI_DIGIT;
  2229. do_nclass:
  2230. for (count = 0; *scan != NUL && !(class_tab[*scan] & mask); ++count)
  2231.     ++scan;
  2232. break;
  2233.       case HEX:
  2234. mask = RI_HEX;
  2235. goto do_class;
  2236.       case NHEX:
  2237. mask = RI_HEX;
  2238. goto do_nclass;
  2239.       case OCTAL:
  2240. mask = RI_OCTAL;
  2241. goto do_class;
  2242.       case NOCTAL:
  2243. mask = RI_OCTAL;
  2244. goto do_nclass;
  2245.       case WORD:
  2246. mask = RI_WORD;
  2247. goto do_class;
  2248.       case NWORD:
  2249. mask = RI_WORD;
  2250. goto do_nclass;
  2251.       case HEAD:
  2252. mask = RI_HEAD;
  2253. goto do_class;
  2254.       case NHEAD:
  2255. mask = RI_HEAD;
  2256. goto do_nclass;
  2257.       case ALPHA:
  2258. mask = RI_ALPHA;
  2259. goto do_class;
  2260.       case NALPHA:
  2261. mask = RI_ALPHA;
  2262. goto do_nclass;
  2263.       case LOWER:
  2264. mask = RI_LOWER;
  2265. goto do_class;
  2266.       case NLOWER:
  2267. mask = RI_LOWER;
  2268. goto do_nclass;
  2269.       case UPPER:
  2270. mask = RI_UPPER;
  2271. goto do_class;
  2272.       case NUPPER:
  2273. mask = RI_UPPER;
  2274. goto do_nclass;
  2275.       case EXACTLY:
  2276. {
  2277.     int     cu, cl;
  2278.     if (reg_ic)
  2279.     {
  2280. cu = TO_UPPER(*opnd);
  2281. cl = TO_LOWER(*opnd);
  2282. while (*scan == cu || *scan == cl)
  2283. {
  2284.     count++;
  2285.     scan++;
  2286. }
  2287.     }
  2288.     else
  2289.     {
  2290. cu = *opnd;
  2291. while (*scan == cu)
  2292. {
  2293.     count++;
  2294.     scan++;
  2295. }
  2296.     }
  2297.     break;
  2298. }
  2299.       case ANYOF:
  2300. while (*scan != '' && cstrchr(opnd, *scan) != NULL)
  2301. {
  2302.     count++;
  2303.     scan++;
  2304. }
  2305. break;
  2306.       case ANYBUT:
  2307. while (*scan != '' && cstrchr(opnd, *scan) == NULL)
  2308. {
  2309.     count++;
  2310.     scan++;
  2311. }
  2312. break;
  2313.       default: /* Oh dear.  Called inappropriately. */
  2314. emsg(e_re_corr);
  2315. #ifdef DEBUG
  2316. printf("Called regrepeat with op code %dn", OP(p));
  2317. #endif
  2318. count = 0; /* Best compromise. */
  2319. break;
  2320.     }
  2321.     reginput = scan;
  2322.     return count;
  2323. }
  2324. /*
  2325.  * regnext - dig the "next" pointer out of a node
  2326.  */
  2327.     static char_u *
  2328. regnext(p)
  2329.     char_u  *p;
  2330. {
  2331.     int     offset;
  2332.     if (p == JUST_CALC_SIZE)
  2333. return NULL;
  2334.     offset = NEXT(p);
  2335.     if (offset == 0)
  2336. return NULL;
  2337.     if (OP(p) == BACK)
  2338. return p - offset;
  2339.     else
  2340. return p + offset;
  2341. }
  2342. #ifdef DEBUG
  2343. /*
  2344.  * regdump - dump a regexp onto stdout in vaguely comprehensible form
  2345.  */
  2346.     static void
  2347. regdump(pattern, r)
  2348.     char_u *pattern;
  2349.     vim_regexp *r;
  2350. {
  2351.     char_u  *s;
  2352.     int     op = EXACTLY; /* Arbitrary non-END op. */
  2353.     char_u  *next;
  2354.     printf("nregcomp(%s):n", pattern);
  2355.     s = r->program + 1;
  2356.     while (op != END) /* While that wasn't END last time... */
  2357.     {
  2358. op = OP(s);
  2359. printf("%2d%s", (int)(s - r->program), regprop(s)); /* Where, what. */
  2360. next = regnext(s);
  2361. if (next == NULL) /* Next ptr. */
  2362.     printf("(0)");
  2363. else
  2364.     printf("(%d)", (int)((s - r->program) + (next - s)));
  2365. if (op == BRACE_LIMITS)
  2366. {
  2367.     /* Two short ints */
  2368.     printf(" minval %d, maxval %d", OPERAND_MIN(s), OPERAND_MAX(s));
  2369.     s += 4;
  2370. }
  2371. s += 3;
  2372. if (op == ANYOF || op == ANYBUT || op == EXACTLY)
  2373. {
  2374.     /* Literal string, where present. */
  2375.     while (*s != '')
  2376. printf("%c", *s++);
  2377.     s++;
  2378. }
  2379. printf("n");
  2380.     }
  2381.     /* Header fields of interest. */
  2382.     if (r->regstart != '')
  2383. printf("start `%c' ", r->regstart);
  2384.     if (r->reganch)
  2385. printf("anchored ");
  2386.     if (r->regmust != NULL)
  2387. printf("must have "%s"", r->regmust);
  2388.     printf("n");
  2389. }
  2390. /*
  2391.  * regprop - printable representation of opcode
  2392.  */
  2393.     static char_u *
  2394. regprop(op)
  2395.     char_u    *op;
  2396. {
  2397.     char_u     *p;
  2398.     static char_u   buf[50];
  2399.     (void) strcpy(buf, ":");
  2400.     switch (OP(op))
  2401.     {
  2402.       case BOL:
  2403. p = "BOL";
  2404. break;
  2405.       case EOL:
  2406. p = "EOL";
  2407. break;
  2408.       case BOW:
  2409. p = "BOW";
  2410. break;
  2411.       case EOW:
  2412. p = "EOW";
  2413. break;
  2414.       case ANY:
  2415. p = "ANY";
  2416. break;
  2417.       case IDENT:
  2418. p = "IDENT";
  2419. break;
  2420.       case KWORD:
  2421. p = "KWORD";
  2422. break;
  2423.       case FNAME:
  2424. p = "FNAME";
  2425. break;
  2426.       case PRINT:
  2427. p = "PRINT";
  2428. break;
  2429.       case SIDENT:
  2430. p = "SIDENT";
  2431. break;
  2432.       case SWORD:
  2433. p = "SWORD";
  2434. break;
  2435.       case SFNAME:
  2436. p = "SFNAME";
  2437. break;
  2438.       case SPRINT:
  2439. p = "SPRINT";
  2440. break;
  2441.       case WHITE:
  2442. p = "WHITE";
  2443. break;
  2444.       case NWHITE:
  2445. p = "NWHITE";
  2446. break;
  2447.       case DIGIT:
  2448. p = "DIGIT";
  2449. break;
  2450.       case NDIGIT:
  2451. p = "NDIGIT";
  2452. break;
  2453.       case HEX:
  2454. p = "HEX";
  2455. break;
  2456.       case NHEX:
  2457. p = "NHEX";
  2458. break;
  2459.       case OCTAL:
  2460. p = "OCTAL";
  2461. break;
  2462.       case NOCTAL:
  2463. p = "NOCTAL";
  2464. break;
  2465.       case WORD:
  2466. p = "WORD";
  2467. break;
  2468.       case NWORD:
  2469. p = "NWORD";
  2470. break;
  2471.       case HEAD:
  2472. p = "HEAD";
  2473. break;
  2474.       case NHEAD:
  2475. p = "NHEAD";
  2476. break;
  2477.       case ALPHA:
  2478. p = "ALPHA";
  2479. break;
  2480.       case NALPHA:
  2481. p = "NALPHA";
  2482. break;
  2483.       case LOWER:
  2484. p = "LOWER";
  2485. break;
  2486.       case NLOWER:
  2487. p = "NLOWER";
  2488. break;
  2489.       case UPPER:
  2490. p = "UPPER";
  2491. break;
  2492.       case NUPPER:
  2493. p = "NUPPER";
  2494. break;
  2495.       case ANYOF:
  2496. p = "ANYOF";
  2497. break;
  2498.       case ANYBUT:
  2499. p = "ANYBUT";
  2500. break;
  2501.       case BRANCH:
  2502. p = "BRANCH";
  2503. break;
  2504.       case EXACTLY:
  2505. p = "EXACTLY";
  2506. break;
  2507.       case NOTHING:
  2508. p = "NOTHING";
  2509. break;
  2510.       case BACK:
  2511. p = "BACK";
  2512. break;
  2513.       case END:
  2514. p = "END";
  2515. break;
  2516.       case MOPEN + 1:
  2517.       case MOPEN + 2:
  2518.       case MOPEN + 3:
  2519.       case MOPEN + 4:
  2520.       case MOPEN + 5:
  2521.       case MOPEN + 6:
  2522.       case MOPEN + 7:
  2523.       case MOPEN + 8:
  2524.       case MOPEN + 9:
  2525. sprintf(buf + STRLEN(buf), "MOPEN%d", OP(op) - MOPEN);
  2526. p = NULL;
  2527. break;
  2528.       case MCLOSE + 1:
  2529.       case MCLOSE + 2:
  2530.       case MCLOSE + 3:
  2531.       case MCLOSE + 4:
  2532.       case MCLOSE + 5:
  2533.       case MCLOSE + 6:
  2534.       case MCLOSE + 7:
  2535.       case MCLOSE + 8:
  2536.       case MCLOSE + 9:
  2537. sprintf(buf + STRLEN(buf), "MCLOSE%d", OP(op) - MCLOSE);
  2538. p = NULL;
  2539. break;
  2540.       case BACKREF + 1:
  2541.       case BACKREF + 2:
  2542.       case BACKREF + 3:
  2543.       case BACKREF + 4:
  2544.       case BACKREF + 5:
  2545.       case BACKREF + 6:
  2546.       case BACKREF + 7:
  2547.       case BACKREF + 8:
  2548.       case BACKREF + 9:
  2549. sprintf(buf + STRLEN(buf), "BACKREF%d", OP(op) - BACKREF);
  2550. p = NULL;
  2551. break;
  2552.       case STAR:
  2553. p = "STAR";
  2554. break;
  2555.       case PLUS:
  2556. p = "PLUS";
  2557. break;
  2558.       case BRACE_LIMITS:
  2559. p = "BRACE_LIMITS";
  2560. break;
  2561.       case BRACE_SIMPLE:
  2562. p = "BRACE_SIMPLE";
  2563. break;
  2564.       case BRACE_COMPLEX + 0:
  2565.       case BRACE_COMPLEX + 1:
  2566.       case BRACE_COMPLEX + 2:
  2567.       case BRACE_COMPLEX + 3:
  2568.       case BRACE_COMPLEX + 4:
  2569.       case BRACE_COMPLEX + 5:
  2570.       case BRACE_COMPLEX + 6:
  2571.       case BRACE_COMPLEX + 7:
  2572.       case BRACE_COMPLEX + 8:
  2573.       case BRACE_COMPLEX + 9:
  2574. sprintf(buf + STRLEN(buf), "BRACE_COMPLEX%d", OP(op) - BRACE_COMPLEX);
  2575. p = NULL;
  2576. break;
  2577.       default:
  2578. sprintf(buf + STRLEN(buf), "corrupt %d", OP(op));
  2579. p = NULL;
  2580. break;
  2581.     }
  2582.     if (p != NULL)
  2583. (void) strcat(buf, p);
  2584.     return buf;
  2585. }
  2586. #endif
  2587. /*
  2588.  * Compare two strings, ignore case if reg_ic set.
  2589.  * Return 0 if strings match, non-zero otherwise.
  2590.  */
  2591.     static int
  2592. cstrncmp(s1, s2, n)
  2593.     char_u *s1, *s2;
  2594.     int n;
  2595. {
  2596.     if (!reg_ic)
  2597. return STRNCMP(s1, s2, n);
  2598.     return STRNICMP(s1, s2, n);
  2599. }
  2600. /*
  2601.  * cstrchr: This function is used a lot for simple searches, keep it fast!
  2602.  */
  2603.     static char_u *
  2604. cstrchr(s, c)
  2605.     char_u *s;
  2606.     int c;
  2607. {
  2608.     char_u *p;
  2609.     int cc;
  2610.     if (!reg_ic)
  2611. return vim_strchr(s, c);
  2612.     /* tolower() and toupper() can be slow, comparing twice should be a lot
  2613.      * faster (esp. when using MS Visual C++!) */
  2614.     if (isupper(c))
  2615. cc = TO_LOWER(c);
  2616.     else if (islower(c))
  2617. cc = TO_UPPER(c);
  2618.     else
  2619. return vim_strchr(s, c);
  2620.     for (p = s; *p; ++p)
  2621. if (*p == c || *p == cc)
  2622.     return p;
  2623.     return NULL;
  2624. }
  2625. /***************************************************************
  2626.  *       regsub stuff        *
  2627.  ***************************************************************/
  2628. /* This stuff below really confuses cc on an SGI -- webb */
  2629. #ifdef __sgi
  2630. # undef __ARGS
  2631. # define __ARGS(x)  ()
  2632. #endif
  2633. /*
  2634.  * We should define ftpr as a pointer to a function returning a pointer to
  2635.  * a function returning a pointer to a function ...
  2636.  * This is impossible, so we declare a pointer to a function returning a
  2637.  * pointer to a function returning void. This should work for all compilers.
  2638.  */
  2639. typedef void (*(*fptr) __ARGS((char_u *, int)))();
  2640. static fptr do_upper __ARGS((char_u *, int));
  2641. static fptr do_Upper __ARGS((char_u *, int));
  2642. static fptr do_lower __ARGS((char_u *, int));
  2643. static fptr do_Lower __ARGS((char_u *, int));
  2644.     static fptr
  2645. do_upper(d, c)
  2646.     char_u *d;
  2647.     int c;
  2648. {
  2649.     *d = TO_UPPER(c);
  2650.     return (fptr)NULL;
  2651. }
  2652.     static fptr
  2653. do_Upper(d, c)
  2654.     char_u *d;
  2655.     int c;
  2656. {
  2657.     *d = TO_UPPER(c);
  2658.     return (fptr)do_Upper;
  2659. }
  2660.     static fptr
  2661. do_lower(d, c)
  2662.     char_u *d;
  2663.     int c;
  2664. {
  2665.     *d = TO_LOWER(c);
  2666.     return (fptr)NULL;
  2667. }
  2668.     static fptr
  2669. do_Lower(d, c)
  2670.     char_u *d;
  2671.     int c;
  2672. {
  2673.     *d = TO_LOWER(c);
  2674.     return (fptr)do_Lower;
  2675. }
  2676. /*
  2677.  * regtilde(): Replace tildes in the pattern by the old pattern.
  2678.  *
  2679.  * Short explanation of the tilde: It stands for the previous replacement
  2680.  * pattern.  If that previous pattern also contains a ~ we should go back a
  2681.  * step further...  But we insert the previous pattern into the current one
  2682.  * and remember that.
  2683.  * This still does not handle the case where "magic" changes. TODO?
  2684.  *
  2685.  * The tildes are parsed once before the first call to vim_regsub().
  2686.  */
  2687.     char_u *
  2688. regtilde(source, magic)
  2689.     char_u  *source;
  2690.     int     magic;
  2691. {
  2692.     char_u  *newsub = source;
  2693.     char_u  *tmpsub;
  2694.     char_u  *p;
  2695.     int     len;
  2696.     int     prevlen;
  2697.     for (p = newsub; *p; ++p)
  2698.     {
  2699. if ((*p == '~' && magic) || (*p == '\' && *(p + 1) == '~' && !magic))
  2700. {
  2701.     if (reg_prev_sub != NULL)
  2702.     {
  2703. /* length = len(newsub) - 1 + len(prev_sub) + 1 */
  2704. prevlen = STRLEN(reg_prev_sub);
  2705. tmpsub = alloc((unsigned)(STRLEN(newsub) + prevlen));
  2706. if (tmpsub != NULL)
  2707. {
  2708.     /* copy prefix */
  2709.     len = (int)(p - newsub); /* not including ~ */
  2710.     mch_memmove(tmpsub, newsub, (size_t)len);
  2711.     /* interpretate tilde */
  2712.     mch_memmove(tmpsub + len, reg_prev_sub, (size_t)prevlen);
  2713.     /* copy postfix */
  2714.     if (!magic)
  2715. ++p; /* back off  */
  2716.     STRCPY(tmpsub + len + prevlen, p + 1);
  2717.     if (newsub != source) /* already allocated newsub */
  2718. vim_free(newsub);
  2719.     newsub = tmpsub;
  2720.     p = newsub + len + prevlen;
  2721. }
  2722.     }
  2723.     else if (magic)
  2724. STRCPY(p, p + 1); /* remove '~' */
  2725.     else
  2726. STRCPY(p, p + 2); /* remove '~' */
  2727.     --p;
  2728. }
  2729. else if (*p == '\' && p[1]) /* skip escaped characters */
  2730.     ++p;
  2731.     }
  2732.     vim_free(reg_prev_sub);
  2733.     if (newsub != source) /* newsub was allocated, just keep it */
  2734. reg_prev_sub = newsub;
  2735.     else /* no ~ found, need to save newsub  */
  2736. reg_prev_sub = vim_strsave(newsub);
  2737.     return newsub;
  2738. }
  2739. /*
  2740.  * vim_regsub() - perform substitutions after a regexp match
  2741.  *
  2742.  * If copy is TRUE really copy into dest.
  2743.  * If copy is FALSE nothing is copied, this is just to find out the length of
  2744.  * the result.
  2745.  *
  2746.  * Returns the size of the replacement, including terminating NUL.
  2747.  */
  2748.     int
  2749. vim_regsub(prog, source, dest, copy, magic)
  2750.     vim_regexp    *prog;
  2751.     char_u    *source;
  2752.     char_u    *dest;
  2753.     int     copy;
  2754.     int     magic;
  2755. {
  2756.     char_u *src;
  2757.     char_u *dst;
  2758.     char_u *s;
  2759.     int c;
  2760.     int no;
  2761.     fptr func = (fptr)NULL;
  2762.     if (prog == NULL || source == NULL || dest == NULL)
  2763.     {
  2764. emsg(e_null);
  2765. return 0;
  2766.     }
  2767.     if (UCHARAT(prog->program) != MAGIC)
  2768.     {
  2769. emsg(e_re_corr);
  2770. return 0;
  2771.     }
  2772.     src = source;
  2773.     dst = dest;
  2774.     while ((c = *src++) != '')
  2775.     {
  2776. no = -1;
  2777. if (c == '&' && magic)
  2778.     no = 0;
  2779. else if (c == '\' && *src != NUL)
  2780. {
  2781.     if (*src == '&' && !magic)
  2782.     {
  2783. ++src;
  2784. no = 0;
  2785.     }
  2786.     else if ('0' <= *src && *src <= '9')
  2787.     {
  2788. no = *src++ - '0';
  2789.     }
  2790.     else if (vim_strchr((char_u *)"uUlLeE", *src))
  2791.     {
  2792. switch (*src++)
  2793. {
  2794. case 'u':   func = (fptr)do_upper;
  2795.     continue;
  2796. case 'U':   func = (fptr)do_Upper;
  2797.     continue;
  2798. case 'l':   func = (fptr)do_lower;
  2799.     continue;
  2800. case 'L':   func = (fptr)do_Lower;
  2801.     continue;
  2802. case 'e':
  2803. case 'E':   func = (fptr)NULL;
  2804.     continue;
  2805. }
  2806.     }
  2807. }
  2808. if (no < 0)       /* Ordinary character. */
  2809. {
  2810.     if (c == '\' && *src != NUL)
  2811.     {
  2812. /* Check for abbreviations -- webb */
  2813. switch (*src)
  2814. {
  2815.     case 'r': c = CR; break;
  2816.     case 'n': c = NL; break;
  2817.     case 't': c = TAB; break;
  2818.     /* Oh no!  e already has meaning in subst pat :-( */
  2819.     /* case 'e':    c = ESC;     break; */
  2820.     case 'b': c = Ctrl('H'); break;
  2821.     default:
  2822. /* Normal character, not abbreviation */
  2823. c = *src;
  2824. break;
  2825. }
  2826. src++;
  2827.     }
  2828.     if (copy)
  2829.     {
  2830. if (func == (fptr)NULL)     /* just copy */
  2831.     *dst = c;
  2832. else     /* change case */
  2833.     func = (fptr)(func(dst, c));
  2834.     /* Turbo C complains without the typecast */
  2835.     }
  2836.     dst++;
  2837. }
  2838. else if (prog->startp[no] != NULL && prog->endp[no] != NULL)
  2839. {
  2840.     for (s = prog->startp[no]; s < prog->endp[no]; ++s)
  2841.     {
  2842. if (copy && *s == '') /* we hit NUL. */
  2843. {
  2844.     emsg(e_re_damg);
  2845.     goto exit;
  2846. }
  2847. /*
  2848.  * Insert a CTRL-V in front of a CR, otherwise
  2849.  * it will be replaced by a line break.
  2850.  */
  2851. if (*s == CR)
  2852. {
  2853.     if (copy)
  2854.     {
  2855. dst[0] = Ctrl('V');
  2856. dst[1] = CR;
  2857.     }
  2858.     dst += 2;
  2859. }
  2860. else
  2861. {
  2862.     if (copy)
  2863.     {
  2864. if (func == (fptr)NULL)     /* just copy */
  2865.     *dst = *s;
  2866. else     /* change case */
  2867.     func = (fptr)(func(dst, *s));
  2868.     /* Turbo C complains without the typecast */
  2869.     }
  2870.     ++dst;
  2871. }
  2872.     }
  2873. }
  2874.     }
  2875.     if (copy)
  2876. *dst = '';
  2877. exit:
  2878.     return (int)((dst - dest) + 1);
  2879. }
  2880. /*
  2881.  * Return TRUE if "c" is a wildcard character.  Depends on 'magic'.
  2882.  */
  2883.     int
  2884. vim_iswildc(c)
  2885.     int c;
  2886. {
  2887.     return vim_strchr((char_u *)(p_magic ? ".*~[^$\" : "^$\"), c) != NULL;
  2888. }