Jim Tcl
Hex Artifact Content
Not logged in

Artifact 349f19a1e9e391b77f28c28848bff9a78dac23c9:


0000: 2f 2a 0a 20 2a 20 72 65 67 63 6f 6d 70 20 61 6e  /*. * regcomp an
0010: 64 20 72 65 67 65 78 65 63 20 2d 2d 20 72 65 67  d regexec -- reg
0020: 73 75 62 20 61 6e 64 20 72 65 67 65 72 72 6f 72  sub and regerror
0030: 20 61 72 65 20 65 6c 73 65 77 68 65 72 65 0a 20   are elsewhere. 
0040: 2a 0a 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28  *. *.Copyright (
0050: 63 29 20 31 39 38 36 20 62 79 20 55 6e 69 76 65  c) 1986 by Unive
0060: 72 73 69 74 79 20 6f 66 20 54 6f 72 6f 6e 74 6f  rsity of Toronto
0070: 2e 0a 20 2a 09 57 72 69 74 74 65 6e 20 62 79 20  .. *.Written by 
0080: 48 65 6e 72 79 20 53 70 65 6e 63 65 72 2e 20 20  Henry Spencer.  
0090: 4e 6f 74 20 64 65 72 69 76 65 64 20 66 72 6f 6d  Not derived from
00a0: 20 6c 69 63 65 6e 73 65 64 20 73 6f 66 74 77 61   licensed softwa
00b0: 72 65 2e 0a 20 2a 0a 20 2a 09 50 65 72 6d 69 73  re.. *. *.Permis
00c0: 73 69 6f 6e 20 69 73 20 67 72 61 6e 74 65 64 20  sion is granted 
00d0: 74 6f 20 61 6e 79 6f 6e 65 20 74 6f 20 75 73 65  to anyone to use
00e0: 20 74 68 69 73 20 73 6f 66 74 77 61 72 65 20 66   this software f
00f0: 6f 72 20 61 6e 79 0a 20 2a 09 70 75 72 70 6f 73  or any. *.purpos
0100: 65 20 6f 6e 20 61 6e 79 20 63 6f 6d 70 75 74 65  e on any compute
0110: 72 20 73 79 73 74 65 6d 2c 20 61 6e 64 20 74 6f  r system, and to
0120: 20 72 65 64 69 73 74 72 69 62 75 74 65 20 69 74   redistribute it
0130: 20 66 72 65 65 6c 79 2c 0a 20 2a 09 73 75 62 6a   freely,. *.subj
0140: 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ect to the follo
0150: 77 69 6e 67 20 72 65 73 74 72 69 63 74 69 6f 6e  wing restriction
0160: 73 3a 0a 20 2a 0a 20 2a 09 31 2e 20 54 68 65 20  s:. *. *.1. The 
0170: 61 75 74 68 6f 72 20 69 73 20 6e 6f 74 20 72 65  author is not re
0180: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 74 68  sponsible for th
0190: 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f  e consequences o
01a0: 66 20 75 73 65 20 6f 66 0a 20 2a 09 09 74 68 69  f use of. *..thi
01b0: 73 20 73 6f 66 74 77 61 72 65 2c 20 6e 6f 20 6d  s software, no m
01c0: 61 74 74 65 72 20 68 6f 77 20 61 77 66 75 6c 2c  atter how awful,
01d0: 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
01e0: 69 73 65 0a 20 2a 09 09 66 72 6f 6d 20 64 65 66  ise. *..from def
01f0: 65 63 74 73 20 69 6e 20 69 74 2e 0a 20 2a 0a 20  ects in it.. *. 
0200: 2a 09 32 2e 20 54 68 65 20 6f 72 69 67 69 6e 20  *.2. The origin 
0210: 6f 66 20 74 68 69 73 20 73 6f 66 74 77 61 72 65  of this software
0220: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6d 69 73   must not be mis
0230: 72 65 70 72 65 73 65 6e 74 65 64 2c 20 65 69 74  represented, eit
0240: 68 65 72 0a 20 2a 09 09 62 79 20 65 78 70 6c 69  her. *..by expli
0250: 63 69 74 20 63 6c 61 69 6d 20 6f 72 20 62 79 20  cit claim or by 
0260: 6f 6d 69 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 09  omission.. *. *.
0270: 33 2e 20 41 6c 74 65 72 65 64 20 76 65 72 73 69  3. Altered versi
0280: 6f 6e 73 20 6d 75 73 74 20 62 65 20 70 6c 61 69  ons must be plai
0290: 6e 6c 79 20 6d 61 72 6b 65 64 20 61 73 20 73 75  nly marked as su
02a0: 63 68 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74  ch, and must not
02b0: 0a 20 2a 09 09 62 65 20 6d 69 73 72 65 70 72 65  . *..be misrepre
02c0: 73 65 6e 74 65 64 20 61 73 20 62 65 69 6e 67 20  sented as being 
02d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 6f 66  the original sof
02e0: 74 77 61 72 65 2e 0a 20 2a 2a 2a 20 54 48 49 53  tware.. *** THIS
02f0: 20 49 53 20 41 4e 20 41 4c 54 45 52 45 44 20 56   IS AN ALTERED V
0300: 45 52 53 49 4f 4e 2e 20 20 49 74 20 77 61 73 20  ERSION.  It was 
0310: 61 6c 74 65 72 65 64 20 62 79 20 4a 6f 68 6e 20  altered by John 
0320: 47 69 6c 6d 6f 72 65 2c 0a 20 2a 2a 2a 20 68 6f  Gilmore,. *** ho
0330: 70 74 6f 61 64 21 67 6e 75 2c 20 6f 6e 20 32 37  ptoad!gnu, on 27
0340: 20 44 65 63 20 31 39 38 36 2c 20 74 6f 20 61 64   Dec 1986, to ad
0350: 64 20 5c 6e 20 61 73 20 61 6e 20 61 6c 74 65 72  d \n as an alter
0360: 6e 61 74 69 76 65 20 74 6f 20 7c 0a 20 2a 2a 2a  native to |. ***
0370: 20 74 6f 20 61 73 73 69 73 74 20 69 6e 20 69 6d   to assist in im
0380: 70 6c 65 6d 65 6e 74 69 6e 67 20 65 67 72 65 70  plementing egrep
0390: 2e 0a 20 2a 2a 2a 20 54 48 49 53 20 49 53 20 41  .. *** THIS IS A
03a0: 4e 20 41 4c 54 45 52 45 44 20 56 45 52 53 49 4f  N ALTERED VERSIO
03b0: 4e 2e 20 20 49 74 20 77 61 73 20 61 6c 74 65 72  N.  It was alter
03c0: 65 64 20 62 79 20 4a 6f 68 6e 20 47 69 6c 6d 6f  ed by John Gilmo
03d0: 72 65 2c 0a 20 2a 2a 2a 20 68 6f 70 74 6f 61 64  re,. *** hoptoad
03e0: 21 67 6e 75 2c 20 6f 6e 20 32 37 20 44 65 63 20  !gnu, on 27 Dec 
03f0: 31 39 38 36 2c 20 74 6f 20 61 64 64 20 5c 3c 20  1986, to add \< 
0400: 61 6e 64 20 5c 3e 20 66 6f 72 20 77 6f 72 64 2d  and \> for word-
0410: 6d 61 74 63 68 69 6e 67 0a 20 2a 2a 2a 20 61 73  matching. *** as
0420: 20 69 6e 20 42 53 44 20 67 72 65 70 20 61 6e 64   in BSD grep and
0430: 20 65 78 2e 0a 20 2a 2a 2a 20 54 48 49 53 20 49   ex.. *** THIS I
0440: 53 20 41 4e 20 41 4c 54 45 52 45 44 20 56 45 52  S AN ALTERED VER
0450: 53 49 4f 4e 2e 20 20 49 74 20 77 61 73 20 61 6c  SION.  It was al
0460: 74 65 72 65 64 20 62 79 20 4a 6f 68 6e 20 47 69  tered by John Gi
0470: 6c 6d 6f 72 65 2c 0a 20 2a 2a 2a 20 68 6f 70 74  lmore,. *** hopt
0480: 6f 61 64 21 67 6e 75 2c 20 6f 6e 20 32 38 20 44  oad!gnu, on 28 D
0490: 65 63 20 31 39 38 36 2c 20 74 6f 20 6f 70 74 69  ec 1986, to opti
04a0: 6d 69 7a 65 20 63 68 61 72 61 63 74 65 72 73 20  mize characters 
04b0: 71 75 6f 74 65 64 20 77 69 74 68 20 5c 2e 0a 20  quoted with \.. 
04c0: 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e 20 41  *** THIS IS AN A
04d0: 4c 54 45 52 45 44 20 56 45 52 53 49 4f 4e 2e 20  LTERED VERSION. 
04e0: 20 49 74 20 77 61 73 20 61 6c 74 65 72 65 64 20   It was altered 
04f0: 62 79 20 4a 61 6d 65 73 20 41 2e 20 57 6f 6f 64  by James A. Wood
0500: 73 2c 0a 20 2a 2a 2a 20 61 6d 65 73 21 6a 61 77  s,. *** ames!jaw
0510: 2c 20 6f 6e 20 31 39 20 4a 75 6e 65 20 31 39 38  , on 19 June 198
0520: 37 2c 20 74 6f 20 71 75 61 73 68 20 61 20 72 65  7, to quash a re
0530: 67 63 6f 6d 70 28 29 20 72 65 64 75 6e 64 61 6e  gcomp() redundan
0540: 63 79 2e 0a 20 2a 2a 2a 20 54 48 49 53 20 49 53  cy.. *** THIS IS
0550: 20 41 4e 20 41 4c 54 45 52 45 44 20 56 45 52 53   AN ALTERED VERS
0560: 49 4f 4e 2e 20 20 49 74 20 77 61 73 20 61 6c 74  ION.  It was alt
0570: 65 72 65 64 20 62 79 20 43 68 72 69 73 74 6f 70  ered by Christop
0580: 68 65 72 20 53 65 69 77 61 6c 64 0a 20 2a 2a 2a  her Seiwald. ***
0590: 20 73 65 69 77 61 6c 64 40 76 69 78 2e 63 6f 6d   seiwald@vix.com
05a0: 2c 20 6f 6e 20 32 38 20 41 75 67 75 73 74 20 31  , on 28 August 1
05b0: 39 39 33 2c 20 66 6f 72 20 75 73 65 20 69 6e 20  993, for use in 
05c0: 6a 61 6d 2e 20 20 52 65 67 6d 61 67 69 63 2e 68  jam.  Regmagic.h
05d0: 0a 20 2a 2a 2a 20 77 61 73 20 6d 6f 76 65 64 20  . *** was moved 
05e0: 69 6e 74 6f 20 72 65 67 65 78 70 2e 68 2c 20 61  into regexp.h, a
05f0: 6e 64 20 74 68 65 20 69 6e 63 6c 75 64 65 20 6f  nd the include o
0600: 66 20 72 65 67 65 78 70 2e 68 20 6e 6f 77 20 75  f regexp.h now u
0610: 73 65 73 20 22 27 73 0a 20 2a 2a 2a 20 74 6f 20  ses "'s. *** to 
0620: 61 76 6f 69 64 20 63 6f 6e 66 6c 69 63 74 69 6e  avoid conflictin
0630: 67 20 77 69 74 68 20 74 68 65 20 73 79 73 74 65  g with the syste
0640: 6d 20 72 65 67 65 78 70 2e 68 2e 20 20 43 6f 6e  m regexp.h.  Con
0650: 73 74 2c 20 62 6c 65 73 73 20 69 74 73 0a 20 2a  st, bless its. *
0660: 2a 2a 20 73 6f 75 6c 2c 20 77 61 73 20 72 65 6d  ** soul, was rem
0670: 6f 76 65 64 20 73 6f 20 69 74 20 63 61 6e 20 63  oved so it can c
0680: 6f 6d 70 69 6c 65 20 65 76 65 72 79 77 68 65 72  ompile everywher
0690: 65 2e 20 20 54 68 65 20 64 65 63 6c 61 72 61 74  e.  The declarat
06a0: 69 6f 6e 0a 20 2a 2a 2a 20 6f 66 20 73 74 72 63  ion. *** of strc
06b0: 68 72 28 29 20 77 61 73 20 69 6e 20 63 6f 6e 66  hr() was in conf
06c0: 6c 69 63 74 20 6f 6e 20 41 49 58 2c 20 73 6f 20  lict on AIX, so 
06d0: 69 74 20 77 61 73 20 72 65 6d 6f 76 65 64 20 28  it was removed (
06e0: 61 73 20 69 74 20 69 73 0a 20 2a 2a 2a 20 68 61  as it is. *** ha
06f0: 70 70 69 6c 79 20 64 65 66 69 6e 65 64 20 69 6e  ppily defined in
0700: 20 73 74 72 69 6e 67 2e 68 29 2e 0a 20 2a 2a 2a   string.h).. ***
0710: 20 54 48 49 53 20 49 53 20 41 4e 20 41 4c 54 45   THIS IS AN ALTE
0720: 52 45 44 20 56 45 52 53 49 4f 4e 2e 20 20 49 74  RED VERSION.  It
0730: 20 77 61 73 20 61 6c 74 65 72 65 64 20 62 79 20   was altered by 
0740: 43 68 72 69 73 74 6f 70 68 65 72 20 53 65 69 77  Christopher Seiw
0750: 61 6c 64 0a 20 2a 2a 2a 20 73 65 69 77 61 6c 64  ald. *** seiwald
0760: 40 70 65 72 66 6f 72 63 65 2e 63 6f 6d 2c 20 6f  @perforce.com, o
0770: 6e 20 32 30 20 4a 61 6e 75 61 72 79 20 32 30 30  n 20 January 200
0780: 30 2c 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69  0, to use functi
0790: 6f 6e 20 70 72 6f 74 6f 74 79 70 65 73 2e 0a 20  on prototypes.. 
07a0: 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e 20 41  *** THIS IS AN A
07b0: 4c 54 45 52 45 44 20 56 45 52 53 49 4f 4e 2e 20  LTERED VERSION. 
07c0: 20 49 74 20 77 61 73 20 61 6c 74 65 72 65 64 20   It was altered 
07d0: 62 79 20 43 68 72 69 73 74 6f 70 68 65 72 20 53  by Christopher S
07e0: 65 69 77 61 6c 64 0a 20 2a 2a 2a 20 73 65 69 77  eiwald. *** seiw
07f0: 61 6c 64 40 70 65 72 66 6f 72 63 65 2e 63 6f 6d  ald@perforce.com
0800: 2c 20 6f 6e 20 30 35 20 4e 6f 76 65 6d 62 65 72  , on 05 November
0810: 20 32 30 30 32 2c 20 74 6f 20 63 6f 6e 73 74 20   2002, to const 
0820: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e  string literals.
0830: 0a 20 2a 0a 20 2a 20 20 20 54 48 49 53 20 49 53  . *. *   THIS IS
0840: 20 41 4e 20 41 4c 54 45 52 45 44 20 56 45 52 53   AN ALTERED VERS
0850: 49 4f 4e 2e 20 20 49 74 20 77 61 73 20 61 6c 74  ION.  It was alt
0860: 65 72 65 64 20 62 79 20 53 74 65 76 65 20 42 65  ered by Steve Be
0870: 6e 6e 65 74 74 20 3c 73 74 65 76 65 62 40 77 6f  nnett <steveb@wo
0880: 72 6b 77 61 72 65 2e 6e 65 74 2e 61 75 3e 0a 20  rkware.net.au>. 
0890: 2a 20 20 20 6f 6e 20 31 36 20 4f 63 74 6f 62 65  *   on 16 Octobe
08a0: 72 20 32 30 31 30 2c 20 74 6f 20 72 65 6d 6f 76  r 2010, to remov
08b0: 65 20 73 74 61 74 69 63 20 73 74 61 74 65 20 61  e static state a
08c0: 6e 64 20 61 64 64 20 62 65 74 74 65 72 20 54 63  nd add better Tc
08d0: 6c 20 41 52 45 20 63 6f 6d 70 61 74 69 62 69 6c  l ARE compatibil
08e0: 69 74 79 2e 0a 20 2a 20 20 20 54 68 69 73 20 69  ity.. *   This i
08f0: 6e 63 6c 75 64 65 73 20 63 6f 75 6e 74 65 64 20  ncludes counted 
0900: 72 65 70 65 74 69 74 69 6f 6e 73 2c 20 55 54 46  repetitions, UTF
0910: 2d 38 20 73 75 70 70 6f 72 74 2c 20 63 68 61 72  -8 support, char
0920: 61 63 74 65 72 20 63 6c 61 73 73 65 73 2c 0a 20  acter classes,. 
0930: 2a 20 20 20 73 68 6f 72 74 68 61 6e 64 20 63 68  *   shorthand ch
0940: 61 72 61 63 74 65 72 20 63 6c 61 73 73 65 73 2c  aracter classes,
0950: 20 69 6e 63 72 65 61 73 65 64 20 6e 75 6d 62 65   increased numbe
0960: 72 20 6f 66 20 70 61 72 65 6e 74 68 65 73 65 73  r of parentheses
0970: 20 74 6f 20 31 30 30 2c 0a 20 2a 20 20 20 62 61   to 100,. *   ba
0980: 63 6b 73 6c 61 73 68 20 65 73 63 61 70 65 20 73  ckslash escape s
0990: 65 71 75 65 6e 63 65 73 2e 20 49 74 20 61 6c 73  equences. It als
09a0: 6f 20 72 65 6d 6f 76 65 73 20 5c 6e 20 61 73 20  o removes \n as 
09b0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 74  an alternative t
09c0: 6f 20 7c 2e 0a 20 2a 0a 20 2a 20 42 65 77 61 72  o |.. *. * Bewar
09d0: 65 20 74 68 61 74 20 73 6f 6d 65 20 6f 66 20 74  e that some of t
09e0: 68 69 73 20 63 6f 64 65 20 69 73 20 73 75 62 74  his code is subt
09f0: 6c 79 20 61 77 61 72 65 20 6f 66 20 74 68 65 20  ly aware of the 
0a00: 77 61 79 20 6f 70 65 72 61 74 6f 72 0a 20 2a 20  way operator. * 
0a10: 70 72 65 63 65 64 65 6e 63 65 20 69 73 20 73 74  precedence is st
0a20: 72 75 63 74 75 72 65 64 20 69 6e 20 72 65 67 75  ructured in regu
0a30: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  lar expressions.
0a40: 20 20 53 65 72 69 6f 75 73 20 63 68 61 6e 67 65    Serious change
0a50: 73 20 69 6e 0a 20 2a 20 72 65 67 75 6c 61 72 2d  s in. * regular-
0a60: 65 78 70 72 65 73 73 69 6f 6e 20 73 79 6e 74 61  expression synta
0a70: 78 20 6d 69 67 68 74 20 72 65 71 75 69 72 65 20  x might require 
0a80: 61 20 74 6f 74 61 6c 20 72 65 74 68 69 6e 6b 2e  a total rethink.
0a90: 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  . */.#include <s
0aa0: 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  tdio.h>.#include
0ab0: 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c   <ctype.h>.#incl
0ac0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0ad0: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0ae0: 68 3e 0a 0a 23 69 6e 63 6c 75 64 65 20 22 6a 69  h>..#include "ji
0af0: 6d 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6a  m.h".#include "j
0b00: 69 6d 61 75 74 6f 63 6f 6e 66 2e 68 22 0a 23 69  imautoconf.h".#i
0b10: 6e 63 6c 75 64 65 20 22 6a 69 6d 72 65 67 65 78  nclude "jimregex
0b20: 70 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 75  p.h".#include "u
0b30: 74 66 38 2e 68 22 0a 0a 23 69 66 20 21 64 65 66  tf8.h"..#if !def
0b40: 69 6e 65 64 28 48 41 56 45 5f 52 45 47 43 4f 4d  ined(HAVE_REGCOM
0b50: 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4a 49  P) || defined(JI
0b60: 4d 5f 52 45 47 45 58 50 29 0a 0a 2f 2a 0a 20 2a  M_REGEXP)../*. *
0b70: 20 53 74 72 75 63 74 75 72 65 20 66 6f 72 20 72   Structure for r
0b80: 65 67 65 78 70 20 22 70 72 6f 67 72 61 6d 22 2e  egexp "program".
0b90: 20 20 54 68 69 73 20 69 73 20 65 73 73 65 6e 74    This is essent
0ba0: 69 61 6c 6c 79 20 61 20 6c 69 6e 65 61 72 20 65  ially a linear e
0bb0: 6e 63 6f 64 69 6e 67 0a 20 2a 20 6f 66 20 61 20  ncoding. * of a 
0bc0: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
0bd0: 20 66 69 6e 69 74 65 2d 73 74 61 74 65 20 6d 61   finite-state ma
0be0: 63 68 69 6e 65 20 28 61 6b 61 20 73 79 6e 74 61  chine (aka synta
0bf0: 78 20 63 68 61 72 74 73 20 6f 72 0a 20 2a 20 22  x charts or. * "
0c00: 72 61 69 6c 72 6f 61 64 20 6e 6f 72 6d 61 6c 20  railroad normal 
0c10: 66 6f 72 6d 22 20 69 6e 20 70 61 72 73 69 6e 67  form" in parsing
0c20: 20 74 65 63 68 6e 6f 6c 6f 67 79 29 2e 20 20 45   technology).  E
0c30: 61 63 68 20 6e 6f 64 65 20 69 73 20 61 6e 20 6f  ach node is an o
0c40: 70 63 6f 64 65 0a 20 2a 20 70 6c 75 73 20 61 20  pcode. * plus a 
0c50: 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 2c 20  "next" pointer, 
0c60: 70 6f 73 73 69 62 6c 79 20 70 6c 75 73 20 61 6e  possibly plus an
0c70: 20 6f 70 65 72 61 6e 64 2e 20 20 22 4e 65 78 74   operand.  "Next
0c80: 22 20 70 6f 69 6e 74 65 72 73 20 6f 66 0a 20 2a  " pointers of. *
0c90: 20 61 6c 6c 20 6e 6f 64 65 73 20 65 78 63 65 70   all nodes excep
0ca0: 74 20 42 52 41 4e 43 48 20 69 6d 70 6c 65 6d 65  t BRANCH impleme
0cb0: 6e 74 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e  nt concatenation
0cc0: 3b 20 61 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  ; a "next" point
0cd0: 65 72 20 77 69 74 68 0a 20 2a 20 61 20 42 52 41  er with. * a BRA
0ce0: 4e 43 48 20 6f 6e 20 62 6f 74 68 20 65 6e 64 73  NCH on both ends
0cf0: 20 6f 66 20 69 74 20 69 73 20 63 6f 6e 6e 65 63   of it is connec
0d00: 74 69 6e 67 20 74 77 6f 20 61 6c 74 65 72 6e 61  ting two alterna
0d10: 74 69 76 65 73 2e 20 20 28 48 65 72 65 20 77 65  tives.  (Here we
0d20: 0a 20 2a 20 68 61 76 65 20 6f 6e 65 20 6f 66 20  . * have one of 
0d30: 74 68 65 20 73 75 62 74 6c 65 20 73 79 6e 74 61  the subtle synta
0d40: 78 20 64 65 70 65 6e 64 65 6e 63 69 65 73 3a 20  x dependencies: 
0d50: 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 42   an individual B
0d60: 52 41 4e 43 48 20 28 61 73 0a 20 2a 20 6f 70 70  RANCH (as. * opp
0d70: 6f 73 65 64 20 74 6f 20 61 20 63 6f 6c 6c 65 63  osed to a collec
0d80: 74 69 6f 6e 20 6f 66 20 74 68 65 6d 29 20 69 73  tion of them) is
0d90: 20 6e 65 76 65 72 20 63 6f 6e 63 61 74 65 6e 61   never concatena
0da0: 74 65 64 20 77 69 74 68 20 61 6e 79 74 68 69 6e  ted with anythin
0db0: 67 0a 20 2a 20 62 65 63 61 75 73 65 20 6f 66 20  g. * because of 
0dc0: 6f 70 65 72 61 74 6f 72 20 70 72 65 63 65 64 65  operator precede
0dd0: 6e 63 65 2e 29 20 20 54 68 65 20 6f 70 65 72 61  nce.)  The opera
0de0: 6e 64 20 6f 66 20 73 6f 6d 65 20 74 79 70 65 73  nd of some types
0df0: 20 6f 66 20 6e 6f 64 65 20 69 73 0a 20 2a 20 61   of node is. * a
0e00: 20 6c 69 74 65 72 61 6c 20 73 74 72 69 6e 67 3b   literal string;
0e10: 20 66 6f 72 20 6f 74 68 65 72 73 2c 20 69 74 20   for others, it 
0e20: 69 73 20 61 20 6e 6f 64 65 20 6c 65 61 64 69 6e  is a node leadin
0e30: 67 20 69 6e 74 6f 20 61 20 73 75 62 2d 46 53 4d  g into a sub-FSM
0e40: 2e 20 20 49 6e 0a 20 2a 20 70 61 72 74 69 63 75  .  In. * particu
0e50: 6c 61 72 2c 20 74 68 65 20 6f 70 65 72 61 6e 64  lar, the operand
0e60: 20 6f 66 20 61 20 42 52 41 4e 43 48 20 6e 6f 64   of a BRANCH nod
0e70: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6e  e is the first n
0e80: 6f 64 65 20 6f 66 20 74 68 65 20 62 72 61 6e 63  ode of the branc
0e90: 68 2e 0a 20 2a 20 28 4e 42 20 74 68 69 73 20 69  h.. * (NB this i
0ea0: 73 20 2a 6e 6f 74 2a 20 61 20 74 72 65 65 20 73  s *not* a tree s
0eb0: 74 72 75 63 74 75 72 65 3a 20 20 74 68 65 20 74  tructure:  the t
0ec0: 61 69 6c 20 6f 66 20 74 68 65 20 62 72 61 6e 63  ail of the branc
0ed0: 68 20 63 6f 6e 6e 65 63 74 73 0a 20 2a 20 74 6f  h connects. * to
0ee0: 20 74 68 65 20 74 68 69 6e 67 20 66 6f 6c 6c 6f   the thing follo
0ef0: 77 69 6e 67 20 74 68 65 20 73 65 74 20 6f 66 20  wing the set of 
0f00: 42 52 41 4e 43 48 65 73 2e 29 20 20 54 68 65 20  BRANCHes.)  The 
0f10: 6f 70 63 6f 64 65 73 20 61 72 65 3a 0a 20 2a 2f  opcodes are:. */
0f20: 0a 0a 2f 2a 20 54 68 69 73 20 2a 4d 55 53 54 2a  ../* This *MUST*
0f30: 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 28 32   be less than (2
0f40: 35 35 2d 32 30 2d 31 29 2f 32 3d 31 31 37 20 2a  55-20-1)/2=117 *
0f50: 2f 0a 23 64 65 66 69 6e 65 20 52 45 47 5f 4d 41  /.#define REG_MA
0f60: 58 5f 50 41 52 45 4e 20 31 30 30 0a 0a 2f 2a 20  X_PAREN 100../* 
0f70: 64 65 66 69 6e 69 74 69 6f 6e 09 6e 75 6d 62 65  definition.numbe
0f80: 72 09 6f 70 6e 64 3f 09 6d 65 61 6e 69 6e 67 20  r.opnd?.meaning 
0f90: 2a 2f 0a 23 64 65 66 69 6e 65 09 45 4e 44 09 30  */.#define.END.0
0fa0: 09 2f 2a 20 6e 6f 09 45 6e 64 20 6f 66 20 70 72  ./* no.End of pr
0fb0: 6f 67 72 61 6d 2e 20 2a 2f 0a 23 64 65 66 69 6e  ogram. */.#defin
0fc0: 65 09 42 4f 4c 09 31 09 2f 2a 20 6e 6f 09 4d 61  e.BOL.1./* no.Ma
0fd0: 74 63 68 20 22 22 20 61 74 20 62 65 67 69 6e 6e  tch "" at beginn
0fe0: 69 6e 67 20 6f 66 20 6c 69 6e 65 2e 20 2a 2f 0a  ing of line. */.
0ff0: 23 64 65 66 69 6e 65 09 45 4f 4c 09 32 09 2f 2a  #define.EOL.2./*
1000: 20 6e 6f 09 4d 61 74 63 68 20 22 22 20 61 74 20   no.Match "" at 
1010: 65 6e 64 20 6f 66 20 6c 69 6e 65 2e 20 2a 2f 0a  end of line. */.
1020: 23 64 65 66 69 6e 65 09 41 4e 59 09 33 09 2f 2a  #define.ANY.3./*
1030: 20 6e 6f 09 4d 61 74 63 68 20 61 6e 79 20 6f 6e   no.Match any on
1040: 65 20 63 68 61 72 61 63 74 65 72 2e 20 2a 2f 0a  e character. */.
1050: 23 64 65 66 69 6e 65 09 41 4e 59 4f 46 09 34 09  #define.ANYOF.4.
1060: 2f 2a 20 73 74 72 09 4d 61 74 63 68 20 61 6e 79  /* str.Match any
1070: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
1080: 69 73 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 23 64  is string. */.#d
1090: 65 66 69 6e 65 09 41 4e 59 42 55 54 09 35 09 2f  efine.ANYBUT.5./
10a0: 2a 20 73 74 72 09 4d 61 74 63 68 20 61 6e 79 20  * str.Match any 
10b0: 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e  character not in
10c0: 20 74 68 69 73 20 73 74 72 69 6e 67 2e 20 2a 2f   this string. */
10d0: 0a 23 64 65 66 69 6e 65 09 42 52 41 4e 43 48 09  .#define.BRANCH.
10e0: 36 09 2f 2a 20 6e 6f 64 65 09 4d 61 74 63 68 20  6./* node.Match 
10f0: 74 68 69 73 20 61 6c 74 65 72 6e 61 74 69 76 65  this alternative
1100: 2c 20 6f 72 20 74 68 65 20 6e 65 78 74 2e 2e 2e  , or the next...
1110: 20 2a 2f 0a 23 64 65 66 69 6e 65 09 42 41 43 4b   */.#define.BACK
1120: 09 37 09 2f 2a 20 6e 6f 09 4d 61 74 63 68 20 22  .7./* no.Match "
1130: 22 2c 20 22 6e 65 78 74 22 20 70 74 72 20 70 6f  ", "next" ptr po
1140: 69 6e 74 73 20 62 61 63 6b 77 61 72 64 2e 20 2a  ints backward. *
1150: 2f 0a 23 64 65 66 69 6e 65 09 45 58 41 43 54 4c  /.#define.EXACTL
1160: 59 09 38 09 2f 2a 20 73 74 72 09 4d 61 74 63 68  Y.8./* str.Match
1170: 20 74 68 69 73 20 73 74 72 69 6e 67 2e 20 2a 2f   this string. */
1180: 0a 23 64 65 66 69 6e 65 09 4e 4f 54 48 49 4e 47  .#define.NOTHING
1190: 09 39 09 2f 2a 20 6e 6f 09 4d 61 74 63 68 20 65  .9./* no.Match e
11a0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 2a 2f 0a  mpty string. */.
11b0: 23 64 65 66 69 6e 65 09 52 45 50 09 09 31 30 09  #define.REP..10.
11c0: 2f 2a 20 6d 61 78 2c 6d 69 6e 09 4d 61 74 63 68  /* max,min.Match
11d0: 20 74 68 69 73 20 28 73 69 6d 70 6c 65 29 20 74   this (simple) t
11e0: 68 69 6e 67 20 5b 6d 69 6e 2c 6d 61 78 5d 20 74  hing [min,max] t
11f0: 69 6d 65 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  imes. */.#define
1200: 09 52 45 50 4d 49 4e 09 31 31 09 2f 2a 20 6d 61  .REPMIN.11./* ma
1210: 78 2c 6d 69 6e 09 4d 61 74 63 68 20 74 68 69 73  x,min.Match this
1220: 20 28 73 69 6d 70 6c 65 29 20 74 68 69 6e 67 20   (simple) thing 
1230: 5b 6d 69 6e 2c 6d 61 78 5d 20 74 69 6d 65 73 2c  [min,max] times,
1240: 20 6d 69 6e 69 6e 61 6c 20 6d 61 74 63 68 2e 20   mininal match. 
1250: 2a 2f 0a 23 64 65 66 69 6e 65 09 52 45 50 58 09  */.#define.REPX.
1260: 31 32 09 2f 2a 20 6d 61 78 2c 6d 69 6e 09 4d 61  12./* max,min.Ma
1270: 74 63 68 20 74 68 69 73 20 28 63 6f 6d 70 6c 65  tch this (comple
1280: 78 29 20 74 68 69 6e 67 20 5b 6d 69 6e 2c 6d 61  x) thing [min,ma
1290: 78 5d 20 74 69 6d 65 73 2e 20 2a 2f 0a 23 64 65  x] times. */.#de
12a0: 66 69 6e 65 09 52 45 50 58 4d 49 4e 09 31 33 09  fine.REPXMIN.13.
12b0: 2f 2a 20 6d 61 78 2c 6d 69 6e 09 4d 61 74 63 68  /* max,min.Match
12c0: 20 74 68 69 73 20 28 63 6f 6d 70 6c 65 78 29 20   this (complex) 
12d0: 74 68 69 6e 67 20 5b 6d 69 6e 2c 6d 61 78 5d 20  thing [min,max] 
12e0: 74 69 6d 65 73 2c 20 6d 69 6e 69 6d 61 6c 20 6d  times, minimal m
12f0: 61 74 63 68 2e 20 2a 2f 0a 0a 23 64 65 66 69 6e  atch. */..#defin
1300: 65 09 57 4f 52 44 41 09 31 35 09 2f 2a 20 6e 6f  e.WORDA.15./* no
1310: 09 4d 61 74 63 68 20 22 22 20 61 74 20 77 6f 72  .Match "" at wor
1320: 64 63 68 61 72 2c 20 77 68 65 72 65 20 70 72 65  dchar, where pre
1330: 76 20 69 73 20 6e 6f 6e 77 6f 72 64 20 2a 2f 0a  v is nonword */.
1340: 23 64 65 66 69 6e 65 09 57 4f 52 44 5a 09 31 36  #define.WORDZ.16
1350: 09 2f 2a 20 6e 6f 09 4d 61 74 63 68 20 22 22 20  ./* no.Match "" 
1360: 61 74 20 6e 6f 6e 77 6f 72 64 63 68 61 72 2c 20  at nonwordchar, 
1370: 77 68 65 72 65 20 70 72 65 76 20 69 73 20 77 6f  where prev is wo
1380: 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 09 4f 50  rd */.#define.OP
1390: 45 4e 4e 43 09 31 39 09 2f 2a 20 6e 6f 09 4e 6f  ENNC.19./* no.No
13a0: 6e 2d 63 61 70 74 75 72 69 6e 67 20 70 61 72 65  n-capturing pare
13b0: 6e 74 68 65 73 65 73 20 2d 20 6d 75 73 74 20 62  ntheses - must b
13c0: 65 20 4f 50 45 4e 2d 31 20 2a 2f 0a 23 64 65 66  e OPEN-1 */.#def
13d0: 69 6e 65 09 4f 50 45 4e 09 32 30 09 2f 2a 20 6e  ine.OPEN.20./* n
13e0: 6f 09 4d 61 72 6b 20 74 68 69 73 20 70 6f 69 6e  o.Mark this poin
13f0: 74 20 69 6e 20 69 6e 70 75 74 20 61 73 20 73 74  t in input as st
1400: 61 72 74 20 6f 66 20 23 6e 2e 20 2a 2f 0a 09 09  art of #n. */...
1410: 09 2f 2a 09 4f 50 45 4e 2b 31 20 69 73 20 6e 75  ./*.OPEN+1 is nu
1420: 6d 62 65 72 20 31 2c 20 65 74 63 2e 20 2a 2f 0a  mber 1, etc. */.
1430: 23 64 65 66 69 6e 65 09 43 4c 4f 53 45 09 28 4f  #define.CLOSE.(O
1440: 50 45 4e 2b 52 45 47 5f 4d 41 58 5f 50 41 52 45  PEN+REG_MAX_PARE
1450: 4e 2b 31 29 09 2f 2a 20 6e 6f 09 41 6e 61 6c 6f  N+1)./* no.Analo
1460: 67 6f 75 73 20 74 6f 20 4f 50 45 4e 2e 20 2a 2f  gous to OPEN. */
1470: 0a 23 64 65 66 69 6e 65 09 43 4c 4f 53 45 5f 45  .#define.CLOSE_E
1480: 4e 44 09 28 43 4c 4f 53 45 2b 52 45 47 5f 4d 41  ND.(CLOSE+REG_MA
1490: 58 5f 50 41 52 45 4e 29 0a 23 64 65 66 69 6e 65  X_PAREN).#define
14a0: 09 43 4c 4f 53 45 4e 43 09 28 43 4c 4f 53 45 2d  .CLOSENC.(CLOSE-
14b0: 31 29 09 2f 2a 20 6e 6f 09 4e 6f 6e 2d 63 61 70  1)./* no.Non-cap
14c0: 74 75 72 69 6e 67 20 70 61 72 65 6e 74 68 65 73  turing parenthes
14d0: 65 73 20 2d 20 6d 75 73 74 20 62 65 20 43 4c 4f  es - must be CLO
14e0: 53 45 2d 31 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54  SE-1 */../*. * T
14f0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
1500: 20 74 68 65 20 72 65 67 65 78 70 20 69 6e 74 65   the regexp inte
1510: 72 6e 61 6c 20 22 70 72 6f 67 72 61 6d 22 20 69  rnal "program" i
1520: 73 20 61 63 74 75 61 6c 6c 79 20 74 68 69 73 20  s actually this 
1530: 6d 61 67 69 63 0a 20 2a 20 6e 75 6d 62 65 72 3b  magic. * number;
1540: 20 74 68 65 20 73 74 61 72 74 20 6e 6f 64 65 20   the start node 
1550: 62 65 67 69 6e 73 20 69 6e 20 74 68 65 20 73 65  begins in the se
1560: 63 6f 6e 64 20 62 79 74 65 2e 0a 20 2a 2f 0a 23  cond byte.. */.#
1570: 64 65 66 69 6e 65 09 52 45 47 5f 4d 41 47 49 43  define.REG_MAGIC
1580: 09 30 78 46 41 44 45 44 30 30 44 0a 0a 2f 2a 0a  .0xFADED00D../*.
1590: 20 2a 20 4f 70 63 6f 64 65 20 6e 6f 74 65 73 3a   * Opcode notes:
15a0: 0a 20 2a 0a 20 2a 20 42 52 41 4e 43 48 09 54 68  . *. * BRANCH.Th
15b0: 65 20 73 65 74 20 6f 66 20 62 72 61 6e 63 68 65  e set of branche
15c0: 73 20 63 6f 6e 73 74 69 74 75 74 69 6e 67 20 61  s constituting a
15d0: 20 73 69 6e 67 6c 65 20 63 68 6f 69 63 65 20 61   single choice a
15e0: 72 65 20 68 6f 6f 6b 65 64 0a 20 2a 09 09 74 6f  re hooked. *..to
15f0: 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 69  gether with thei
1600: 72 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72  r "next" pointer
1610: 73 2c 20 73 69 6e 63 65 20 70 72 65 63 65 64 65  s, since precede
1620: 6e 63 65 20 70 72 65 76 65 6e 74 73 0a 20 2a 09  nce prevents. *.
1630: 09 61 6e 79 74 68 69 6e 67 20 62 65 69 6e 67 20  .anything being 
1640: 63 6f 6e 63 61 74 65 6e 61 74 65 64 20 74 6f 20  concatenated to 
1650: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 20 62  any individual b
1660: 72 61 6e 63 68 2e 20 20 54 68 65 0a 20 2a 09 09  ranch.  The. *..
1670: 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 20 6f  "next" pointer o
1680: 66 20 74 68 65 20 6c 61 73 74 20 42 52 41 4e 43  f the last BRANC
1690: 48 20 69 6e 20 61 20 63 68 6f 69 63 65 20 70 6f  H in a choice po
16a0: 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 2a 09 09  ints to the. *..
16b0: 74 68 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  thing following 
16c0: 74 68 65 20 77 68 6f 6c 65 20 63 68 6f 69 63 65  the whole choice
16d0: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 73 6f 20  .  This is also 
16e0: 77 68 65 72 65 20 74 68 65 0a 20 2a 09 09 66 69  where the. *..fi
16f0: 6e 61 6c 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  nal "next" point
1700: 65 72 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76  er of each indiv
1710: 69 64 75 61 6c 20 62 72 61 6e 63 68 20 70 6f 69  idual branch poi
1720: 6e 74 73 3b 20 65 61 63 68 0a 20 2a 09 09 62 72  nts; each. *..br
1730: 61 6e 63 68 20 73 74 61 72 74 73 20 77 69 74 68  anch starts with
1740: 20 74 68 65 20 6f 70 65 72 61 6e 64 20 6e 6f 64   the operand nod
1750: 65 20 6f 66 20 61 20 42 52 41 4e 43 48 20 6e 6f  e of a BRANCH no
1760: 64 65 2e 0a 20 2a 0a 20 2a 20 42 41 43 4b 09 09  de.. *. * BACK..
1770: 4e 6f 72 6d 61 6c 20 22 6e 65 78 74 22 20 70 6f  Normal "next" po
1780: 69 6e 74 65 72 73 20 61 6c 6c 20 69 6d 70 6c 69  inters all impli
1790: 63 69 74 6c 79 20 70 6f 69 6e 74 20 66 6f 72 77  citly point forw
17a0: 61 72 64 3b 20 42 41 43 4b 0a 20 2a 09 09 65 78  ard; BACK. *..ex
17b0: 69 73 74 73 20 74 6f 20 6d 61 6b 65 20 6c 6f 6f  ists to make loo
17c0: 70 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 73  p structures pos
17d0: 73 69 62 6c 65 2e 0a 20 2a 0a 20 2a 20 53 54 41  sible.. *. * STA
17e0: 52 2c 50 4c 55 53 09 27 3f 27 2c 20 61 6e 64 20  R,PLUS.'?', and 
17f0: 63 6f 6d 70 6c 65 78 20 27 2a 27 20 61 6e 64 20  complex '*' and 
1800: 27 2b 27 2c 20 61 72 65 20 69 6d 70 6c 65 6d 65  '+', are impleme
1810: 6e 74 65 64 20 61 73 20 63 69 72 63 75 6c 61 72  nted as circular
1820: 0a 20 2a 09 09 42 52 41 4e 43 48 20 73 74 72 75  . *..BRANCH stru
1830: 63 74 75 72 65 73 20 75 73 69 6e 67 20 42 41 43  ctures using BAC
1840: 4b 2e 20 20 53 69 6d 70 6c 65 20 63 61 73 65 73  K.  Simple cases
1850: 20 28 6f 6e 65 20 63 68 61 72 61 63 74 65 72 0a   (one character.
1860: 20 2a 09 09 70 65 72 20 6d 61 74 63 68 29 20 61   *..per match) a
1870: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 77  re implemented w
1880: 69 74 68 20 53 54 41 52 20 61 6e 64 20 50 4c 55  ith STAR and PLU
1890: 53 20 66 6f 72 20 73 70 65 65 64 0a 20 2a 09 09  S for speed. *..
18a0: 61 6e 64 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20  and to minimize 
18b0: 72 65 63 75 72 73 69 76 65 20 70 6c 75 6e 67 65  recursive plunge
18c0: 73 2e 0a 20 2a 0a 20 2a 20 4f 50 45 4e 2c 43 4c  s.. *. * OPEN,CL
18d0: 4f 53 45 09 2e 2e 2e 61 72 65 20 6e 75 6d 62 65  OSE....are numbe
18e0: 72 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  red at compile t
18f0: 69 6d 65 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20  ime.. */../*. * 
1900: 41 20 6e 6f 64 65 20 69 73 20 6f 6e 65 20 63 68  A node is one ch
1910: 61 72 20 6f 66 20 6f 70 63 6f 64 65 20 66 6f 6c  ar of opcode fol
1920: 6c 6f 77 65 64 20 62 79 20 74 77 6f 20 63 68 61  lowed by two cha
1930: 72 73 20 6f 66 20 22 6e 65 78 74 22 20 70 6f 69  rs of "next" poi
1940: 6e 74 65 72 2e 0a 20 2a 20 22 4e 65 78 74 22 20  nter.. * "Next" 
1950: 70 6f 69 6e 74 65 72 73 20 61 72 65 20 73 74 6f  pointers are sto
1960: 72 65 64 20 61 73 20 74 77 6f 20 38 2d 62 69 74  red as two 8-bit
1970: 20 70 69 65 63 65 73 2c 20 68 69 67 68 20 6f 72   pieces, high or
1980: 64 65 72 20 66 69 72 73 74 2e 20 20 54 68 65 0a  der first.  The.
1990: 20 2a 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f   * value is a po
19a0: 73 69 74 69 76 65 20 6f 66 66 73 65 74 20 66 72  sitive offset fr
19b0: 6f 6d 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66  om the opcode of
19c0: 20 74 68 65 20 6e 6f 64 65 20 63 6f 6e 74 61 69   the node contai
19d0: 6e 69 6e 67 20 69 74 2e 0a 20 2a 20 41 6e 20 6f  ning it.. * An o
19e0: 70 65 72 61 6e 64 2c 20 69 66 20 61 6e 79 2c 20  perand, if any, 
19f0: 73 69 6d 70 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  simply follows t
1a00: 68 65 20 6e 6f 64 65 2e 20 20 28 4e 6f 74 65 20  he node.  (Note 
1a10: 74 68 61 74 20 6d 75 63 68 20 6f 66 20 74 68 65  that much of the
1a20: 0a 20 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74  . * code generat
1a30: 69 6f 6e 20 6b 6e 6f 77 73 20 61 62 6f 75 74 20  ion knows about 
1a40: 74 68 69 73 20 69 6d 70 6c 69 63 69 74 20 72 65  this implicit re
1a50: 6c 61 74 69 6f 6e 73 68 69 70 2e 29 0a 20 2a 0a  lationship.). *.
1a60: 20 2a 20 55 73 69 6e 67 20 74 77 6f 20 62 79 74   * Using two byt
1a70: 65 73 20 66 6f 72 20 74 68 65 20 22 6e 65 78 74  es for the "next
1a80: 22 20 70 6f 69 6e 74 65 72 20 69 73 20 76 61 73  " pointer is vas
1a90: 74 20 6f 76 65 72 6b 69 6c 6c 20 66 6f 72 20 6d  t overkill for m
1aa0: 6f 73 74 20 74 68 69 6e 67 73 2c 0a 20 2a 20 62  ost things,. * b
1ab0: 75 74 20 61 6c 6c 6f 77 73 20 70 61 74 74 65 72  ut allows patter
1ac0: 6e 73 20 74 6f 20 67 65 74 20 62 69 67 20 77 69  ns to get big wi
1ad0: 74 68 6f 75 74 20 64 69 73 61 73 74 65 72 73 2e  thout disasters.
1ae0: 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 09 4f 50 28  . */.#define.OP(
1af0: 70 72 65 67 2c 20 70 29 09 28 70 72 65 67 2d 3e  preg, p).(preg->
1b00: 70 72 6f 67 72 61 6d 5b 70 5d 29 0a 23 64 65 66  program[p]).#def
1b10: 69 6e 65 09 4e 45 58 54 28 70 72 65 67 2c 20 70  ine.NEXT(preg, p
1b20: 29 09 28 70 72 65 67 2d 3e 70 72 6f 67 72 61 6d  ).(preg->program
1b30: 5b 70 20 2b 20 31 5d 29 0a 23 64 65 66 69 6e 65  [p + 1]).#define
1b40: 09 4f 50 45 52 41 4e 44 28 70 29 09 28 28 70 29  .OPERAND(p).((p)
1b50: 20 2b 20 32 29 0a 0a 2f 2a 0a 20 2a 20 53 65 65   + 2)../*. * See
1b60: 20 72 65 67 6d 61 67 69 63 2e 68 20 66 6f 72 20   regmagic.h for 
1b70: 6f 6e 65 20 66 75 72 74 68 65 72 20 64 65 74 61  one further deta
1b80: 69 6c 20 6f 66 20 70 72 6f 67 72 61 6d 20 73 74  il of program st
1b90: 72 75 63 74 75 72 65 2e 0a 20 2a 2f 0a 0a 0a 2f  ructure.. */.../
1ba0: 2a 0a 20 2a 20 55 74 69 6c 69 74 79 20 64 65 66  *. * Utility def
1bb0: 69 6e 69 74 69 6f 6e 73 2e 0a 20 2a 2f 0a 0a 23  initions.. */..#
1bc0: 64 65 66 69 6e 65 09 46 41 49 4c 28 52 2c 4d 29  define.FAIL(R,M)
1bd0: 09 7b 20 28 52 29 2d 3e 65 72 72 20 3d 20 28 4d  .{ (R)->err = (M
1be0: 29 3b 20 72 65 74 75 72 6e 20 28 4d 29 3b 20 7d  ); return (M); }
1bf0: 0a 23 64 65 66 69 6e 65 09 49 53 4d 55 4c 54 28  .#define.ISMULT(
1c00: 63 29 09 28 28 63 29 20 3d 3d 20 27 2a 27 20 7c  c).((c) == '*' |
1c10: 7c 20 28 63 29 20 3d 3d 20 27 2b 27 20 7c 7c 20  | (c) == '+' || 
1c20: 28 63 29 20 3d 3d 20 27 3f 27 20 7c 7c 20 28 63  (c) == '?' || (c
1c30: 29 20 3d 3d 20 27 7b 27 29 0a 23 64 65 66 69 6e  ) == '{').#defin
1c40: 65 09 4d 45 54 41 09 22 5e 24 2e 5b 28 29 7c 3f  e.META."^$.[()|?
1c50: 7b 2b 2a 22 0a 0a 2f 2a 0a 20 2a 20 46 6c 61 67  {+*"../*. * Flag
1c60: 73 20 74 6f 20 62 65 20 70 61 73 73 65 64 20 75  s to be passed u
1c70: 70 20 61 6e 64 20 64 6f 77 6e 2e 0a 20 2a 2f 0a  p and down.. */.
1c80: 23 64 65 66 69 6e 65 09 48 41 53 57 49 44 54 48  #define.HASWIDTH
1c90: 09 30 31 09 2f 2a 20 4b 6e 6f 77 6e 20 6e 65 76  .01./* Known nev
1ca0: 65 72 20 74 6f 20 6d 61 74 63 68 20 6e 75 6c 6c  er to match null
1cb0: 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 23 64 65 66   string. */.#def
1cc0: 69 6e 65 09 53 49 4d 50 4c 45 09 09 30 32 09 2f  ine.SIMPLE..02./
1cd0: 2a 20 53 69 6d 70 6c 65 20 65 6e 6f 75 67 68 20  * Simple enough 
1ce0: 74 6f 20 62 65 20 53 54 41 52 2f 50 4c 55 53 20  to be STAR/PLUS 
1cf0: 6f 70 65 72 61 6e 64 2e 20 2a 2f 0a 23 64 65 66  operand. */.#def
1d00: 69 6e 65 09 53 50 53 54 41 52 54 09 09 30 34 09  ine.SPSTART..04.
1d10: 2f 2a 20 53 74 61 72 74 73 20 77 69 74 68 20 2a  /* Starts with *
1d20: 20 6f 72 20 2b 2e 20 2a 2f 0a 23 64 65 66 69 6e   or +. */.#defin
1d30: 65 09 57 4f 52 53 54 09 09 30 09 2f 2a 20 57 6f  e.WORST..0./* Wo
1d40: 72 73 74 20 63 61 73 65 2e 20 2a 2f 0a 0a 23 64  rst case. */..#d
1d50: 65 66 69 6e 65 20 4d 41 58 5f 52 45 50 5f 43 4f  efine MAX_REP_CO
1d60: 55 4e 54 20 31 30 30 30 30 30 30 0a 0a 2f 2a 0a  UNT 1000000../*.
1d70: 20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61   * Forward decla
1d80: 72 61 74 69 6f 6e 73 20 66 6f 72 20 72 65 67 63  rations for regc
1d90: 6f 6d 70 28 29 27 73 20 66 72 69 65 6e 64 73 2e  omp()'s friends.
1da0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1db0: 72 65 67 28 72 65 67 65 78 5f 74 20 2a 70 72 65  reg(regex_t *pre
1dc0: 67 2c 20 69 6e 74 20 70 61 72 65 6e 20 2f 2a 20  g, int paren /* 
1dd0: 50 61 72 65 6e 74 68 65 73 69 7a 65 64 3f 20 2a  Parenthesized? *
1de0: 2f 2c 20 69 6e 74 20 2a 66 6c 61 67 70 20 29 3b  /, int *flagp );
1df0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 67 70  .static int regp
1e00: 69 65 63 65 28 72 65 67 65 78 5f 74 20 2a 70 72  iece(regex_t *pr
1e10: 65 67 2c 20 69 6e 74 20 2a 66 6c 61 67 70 20 29  eg, int *flagp )
1e20: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 67  ;.static int reg
1e30: 62 72 61 6e 63 68 28 72 65 67 65 78 5f 74 20 2a  branch(regex_t *
1e40: 70 72 65 67 2c 20 69 6e 74 20 2a 66 6c 61 67 70  preg, int *flagp
1e50: 20 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 72   );.static int r
1e60: 65 67 61 74 6f 6d 28 72 65 67 65 78 5f 74 20 2a  egatom(regex_t *
1e70: 70 72 65 67 2c 20 69 6e 74 20 2a 66 6c 61 67 70  preg, int *flagp
1e80: 20 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 72   );.static int r
1e90: 65 67 6e 6f 64 65 28 72 65 67 65 78 5f 74 20 2a  egnode(regex_t *
1ea0: 70 72 65 67 2c 20 69 6e 74 20 6f 70 20 29 3b 0a  preg, int op );.
1eb0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 67 6e 65  static int regne
1ec0: 78 74 28 72 65 67 65 78 5f 74 20 2a 70 72 65 67  xt(regex_t *preg
1ed0: 2c 20 69 6e 74 20 70 20 29 3b 0a 73 74 61 74 69  , int p );.stati
1ee0: 63 20 76 6f 69 64 20 72 65 67 63 28 72 65 67 65  c void regc(rege
1ef0: 78 5f 74 20 2a 70 72 65 67 2c 20 69 6e 74 20 62  x_t *preg, int b
1f00: 20 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 72   );.static int r
1f10: 65 67 69 6e 73 65 72 74 28 72 65 67 65 78 5f 74  eginsert(regex_t
1f20: 20 2a 70 72 65 67 2c 20 69 6e 74 20 6f 70 2c 20   *preg, int op, 
1f30: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 6f 70  int size, int op
1f40: 6e 64 20 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  nd );.static voi
1f50: 64 20 72 65 67 74 61 69 6c 5f 28 72 65 67 65 78  d regtail_(regex
1f60: 5f 74 20 2a 70 72 65 67 2c 20 69 6e 74 20 70 2c  _t *preg, int p,
1f70: 20 69 6e 74 20 76 61 6c 2c 20 69 6e 74 20 6c 69   int val, int li
1f80: 6e 65 20 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ne );.static voi
1f90: 64 20 72 65 67 6f 70 74 61 69 6c 28 72 65 67 65  d regoptail(rege
1fa0: 78 5f 74 20 2a 70 72 65 67 2c 20 69 6e 74 20 70  x_t *preg, int p
1fb0: 2c 20 69 6e 74 20 76 61 6c 20 29 3b 0a 23 64 65  , int val );.#de
1fc0: 66 69 6e 65 20 72 65 67 74 61 69 6c 28 50 52 45  fine regtail(PRE
1fd0: 47 2c 20 50 2c 20 56 41 4c 29 20 72 65 67 74 61  G, P, VAL) regta
1fe0: 69 6c 5f 28 50 52 45 47 2c 20 50 2c 20 56 41 4c  il_(PREG, P, VAL
1ff0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 0a 73 74 61  , __LINE__)..sta
2000: 74 69 63 20 69 6e 74 20 72 65 67 5f 72 61 6e 67  tic int reg_rang
2010: 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20 69 6e 74  e_find(const int
2020: 20 2a 73 74 72 69 6e 67 2c 20 69 6e 74 20 63 29   *string, int c)
2030: 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ;.static const c
2040: 68 61 72 20 2a 73 74 72 5f 66 69 6e 64 28 63 6f  har *str_find(co
2050: 6e 73 74 20 63 68 61 72 20 2a 73 74 72 69 6e 67  nst char *string
2060: 2c 20 69 6e 74 20 63 2c 20 69 6e 74 20 6e 6f 63  , int c, int noc
2070: 61 73 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ase);.static int
2080: 20 70 72 65 66 69 78 5f 63 6d 70 28 63 6f 6e 73   prefix_cmp(cons
2090: 74 20 69 6e 74 20 2a 70 72 6f 67 2c 20 69 6e 74  t int *prog, int
20a0: 20 70 72 6f 67 6c 65 6e 2c 20 63 6f 6e 73 74 20   proglen, const 
20b0: 63 68 61 72 20 2a 73 74 72 69 6e 67 2c 20 69 6e  char *string, in
20c0: 74 20 6e 6f 63 61 73 65 29 3b 0a 0a 2f 2a 23 64  t nocase);../*#d
20d0: 65 66 69 6e 65 20 44 45 42 55 47 2a 2f 0a 23 69  efine DEBUG*/.#i
20e0: 66 64 65 66 20 44 45 42 55 47 0a 73 74 61 74 69  fdef DEBUG.stati
20f0: 63 20 69 6e 74 20 72 65 67 6e 61 72 72 61 74 65  c int regnarrate
2100: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f 69   = 0;.static voi
2110: 64 20 72 65 67 64 75 6d 70 28 72 65 67 65 78 5f  d regdump(regex_
2120: 74 20 2a 70 72 65 67 29 3b 0a 73 74 61 74 69 63  t *preg);.static
2130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 67   const char *reg
2140: 70 72 6f 70 28 20 69 6e 74 20 6f 70 20 29 3b 0a  prop( int op );.
2150: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 2a 0a 20 2a 20  #endif.../**. * 
2160: 52 65 74 75 72 6e 73 20 74 68 65 20 6c 65 6e 67  Returns the leng
2170: 74 68 20 6f 66 20 74 68 65 20 6e 75 6c 6c 2d 74  th of the null-t
2180: 65 72 6d 69 6e 61 74 65 64 20 69 6e 74 65 67 65  erminated intege
2190: 72 20 73 65 71 75 65 6e 63 65 2e 0a 20 2a 2f 0a  r sequence.. */.
21a0: 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 5f 69  static int str_i
21b0: 6e 74 5f 6c 65 6e 28 63 6f 6e 73 74 20 69 6e 74  nt_len(const int
21c0: 20 2a 73 65 71 29 0a 7b 0a 09 69 6e 74 20 6e 20   *seq).{..int n 
21d0: 3d 20 30 3b 0a 09 77 68 69 6c 65 20 28 2a 73 65  = 0;..while (*se
21e0: 71 2b 2b 29 20 7b 0a 09 09 6e 2b 2b 3b 0a 09 7d  q++) {...n++;..}
21f0: 0a 09 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f  ..return n;.}../
2200: 2a 0a 20 2d 20 72 65 67 63 6f 6d 70 20 2d 20 63  *. - regcomp - c
2210: 6f 6d 70 69 6c 65 20 61 20 72 65 67 75 6c 61 72  ompile a regular
2220: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f   expression into
2230: 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 0a 20   internal code. 
2240: 2a 0a 20 2a 20 57 65 20 63 61 6e 27 74 20 61 6c  *. * We can't al
2250: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 75 6e 74  locate space unt
2260: 69 6c 20 77 65 20 6b 6e 6f 77 20 68 6f 77 20 62  il we know how b
2270: 69 67 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20  ig the compiled 
2280: 66 6f 72 6d 20 77 69 6c 6c 20 62 65 2c 0a 20 2a  form will be,. *
2290: 20 62 75 74 20 77 65 20 63 61 6e 27 74 20 63 6f   but we can't co
22a0: 6d 70 69 6c 65 20 69 74 20 28 61 6e 64 20 74 68  mpile it (and th
22b0: 75 73 20 6b 6e 6f 77 20 68 6f 77 20 62 69 67 20  us know how big 
22c0: 69 74 20 69 73 29 20 75 6e 74 69 6c 20 77 65 27  it is) until we'
22d0: 76 65 20 67 6f 74 20 61 0a 20 2a 20 70 6c 61 63  ve got a. * plac
22e0: 65 20 74 6f 20 70 75 74 20 74 68 65 20 63 6f 64  e to put the cod
22f0: 65 2e 20 20 53 6f 20 77 65 20 63 68 65 61 74 3a  e.  So we cheat:
2300: 20 20 77 65 20 63 6f 6d 70 69 6c 65 20 69 74 20    we compile it 
2310: 74 77 69 63 65 2c 20 6f 6e 63 65 20 77 69 74 68  twice, once with
2320: 20 63 6f 64 65 0a 20 2a 20 67 65 6e 65 72 61 74   code. * generat
2330: 69 6f 6e 20 74 75 72 6e 65 64 20 6f 66 66 20 61  ion turned off a
2340: 6e 64 20 73 69 7a 65 20 63 6f 75 6e 74 69 6e 67  nd size counting
2350: 20 74 75 72 6e 65 64 20 6f 6e 2c 20 61 6e 64 20   turned on, and 
2360: 6f 6e 63 65 20 22 66 6f 72 20 72 65 61 6c 22 2e  once "for real".
2370: 0a 20 2a 20 54 68 69 73 20 61 6c 73 6f 20 6d 65  . * This also me
2380: 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 6e 27  ans that we don'
2390: 74 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  t allocate space
23a0: 20 75 6e 74 69 6c 20 77 65 20 61 72 65 20 73 75   until we are su
23b0: 72 65 20 74 68 61 74 20 74 68 65 0a 20 2a 20 74  re that the. * t
23c0: 68 69 6e 67 20 72 65 61 6c 6c 79 20 77 69 6c 6c  hing really will
23d0: 20 63 6f 6d 70 69 6c 65 20 73 75 63 63 65 73 73   compile success
23e0: 66 75 6c 6c 79 2c 20 61 6e 64 20 77 65 20 6e 65  fully, and we ne
23f0: 76 65 72 20 68 61 76 65 20 74 6f 20 6d 6f 76 65  ver have to move
2400: 20 74 68 65 0a 20 2a 20 63 6f 64 65 20 61 6e 64   the. * code and
2410: 20 74 68 75 73 20 69 6e 76 61 6c 69 64 61 74 65   thus invalidate
2420: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 69   pointers into i
2430: 74 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 69  t.  (Note that i
2440: 74 20 68 61 73 20 74 6f 20 62 65 20 69 6e 0a 20  t has to be in. 
2450: 2a 20 6f 6e 65 20 70 69 65 63 65 20 62 65 63 61  * one piece beca
2460: 75 73 65 20 66 72 65 65 28 29 20 6d 75 73 74 20  use free() must 
2470: 62 65 20 61 62 6c 65 20 74 6f 20 66 72 65 65 20  be able to free 
2480: 69 74 20 61 6c 6c 2e 29 0a 20 2a 0a 20 2a 20 42  it all.). *. * B
2490: 65 77 61 72 65 20 74 68 61 74 20 74 68 65 20 6f  eware that the o
24a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2d 70 72 65 70  ptimization-prep
24b0: 61 72 61 74 69 6f 6e 20 63 6f 64 65 20 69 6e 20  aration code in 
24c0: 68 65 72 65 20 6b 6e 6f 77 73 20 61 62 6f 75 74  here knows about
24d0: 20 73 6f 6d 65 0a 20 2a 20 6f 66 20 74 68 65 20   some. * of the 
24e0: 73 74 72 75 63 74 75 72 65 20 6f 66 20 74 68 65  structure of the
24f0: 20 63 6f 6d 70 69 6c 65 64 20 72 65 67 65 78 70   compiled regexp
2500: 2e 0a 20 2a 2f 0a 69 6e 74 20 72 65 67 63 6f 6d  .. */.int regcom
2510: 70 28 72 65 67 65 78 5f 74 20 2a 70 72 65 67 2c  p(regex_t *preg,
2520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 78 70   const char *exp
2530: 2c 20 69 6e 74 20 63 66 6c 61 67 73 29 0a 7b 0a  , int cflags).{.
2540: 09 69 6e 74 20 73 63 61 6e 3b 0a 09 69 6e 74 20  .int scan;..int 
2550: 6c 6f 6e 67 65 73 74 3b 0a 09 75 6e 73 69 67 6e  longest;..unsign
2560: 65 64 20 6c 65 6e 3b 0a 09 69 6e 74 20 66 6c 61  ed len;..int fla
2570: 67 73 3b 0a 0a 23 69 66 64 65 66 20 44 45 42 55  gs;..#ifdef DEBU
2580: 47 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  G..fprintf(stder
2590: 72 2c 20 22 43 6f 6d 70 69 6c 69 6e 67 3a 20 27  r, "Compiling: '
25a0: 25 73 27 5c 6e 22 2c 20 65 78 70 29 3b 0a 23 65  %s'\n", exp);.#e
25b0: 6e 64 69 66 0a 09 6d 65 6d 73 65 74 28 70 72 65  ndif..memset(pre
25c0: 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 72  g, 0, sizeof(*pr
25d0: 65 67 29 29 3b 0a 0a 09 69 66 20 28 65 78 70 20  eg));...if (exp 
25e0: 3d 3d 20 4e 55 4c 4c 29 0a 09 09 46 41 49 4c 28  == NULL)...FAIL(
25f0: 70 72 65 67 2c 20 52 45 47 5f 45 52 52 5f 4e 55  preg, REG_ERR_NU
2600: 4c 4c 5f 41 52 47 55 4d 45 4e 54 29 3b 0a 0a 09  LL_ARGUMENT);...
2610: 2f 2a 20 46 69 72 73 74 20 70 61 73 73 3a 20 64  /* First pass: d
2620: 65 74 65 72 6d 69 6e 65 20 73 69 7a 65 2c 20 6c  etermine size, l
2630: 65 67 61 6c 69 74 79 2e 20 2a 2f 0a 09 70 72 65  egality. */..pre
2640: 67 2d 3e 63 66 6c 61 67 73 20 3d 20 63 66 6c 61  g->cflags = cfla
2650: 67 73 3b 0a 09 70 72 65 67 2d 3e 72 65 67 70 61  gs;..preg->regpa
2660: 72 73 65 20 3d 20 65 78 70 3b 0a 09 2f 2a 20 58  rse = exp;../* X
2670: 58 58 3a 20 46 6f 72 20 6e 6f 77 2c 20 73 74 61  XX: For now, sta
2680: 72 74 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 2a  rt unallocated *
2690: 2f 0a 09 70 72 65 67 2d 3e 70 72 6f 67 72 61 6d  /..preg->program
26a0: 20 3d 20 4e 55 4c 4c 3b 0a 09 70 72 65 67 2d 3e   = NULL;..preg->
26b0: 70 72 6f 67 6c 65 6e 20 3d 20 30 3b 0a 0a 09 2f  proglen = 0;.../
26c0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
26d0: 2e 20 2a 2f 0a 09 70 72 65 67 2d 3e 70 72 6f 67  . */..preg->prog
26e0: 6c 65 6e 20 3d 20 28 73 74 72 6c 65 6e 28 65 78  len = (strlen(ex
26f0: 70 29 20 2b 20 31 29 20 2a 20 35 3b 0a 09 70 72  p) + 1) * 5;..pr
2700: 65 67 2d 3e 70 72 6f 67 72 61 6d 20 3d 20 6d 61  eg->program = ma
2710: 6c 6c 6f 63 28 70 72 65 67 2d 3e 70 72 6f 67 6c  lloc(preg->progl
2720: 65 6e 20 2a 20 73 69 7a 65 6f 66 28 69 6e 74 29  en * sizeof(int)
2730: 29 3b 0a 09 69 66 20 28 70 72 65 67 2d 3e 70 72  );..if (preg->pr
2740: 6f 67 72 61 6d 20 3d 3d 20 4e 55 4c 4c 29 0a 09  ogram == NULL)..
2750: 09 46 41 49 4c 28 70 72 65 67 2c 20 52 45 47 5f  .FAIL(preg, REG_
2760: 45 52 52 5f 4e 4f 4d 45 4d 29 3b 0a 0a 09 2f 2a  ERR_NOMEM);.../*
2770: 20 4e 6f 74 65 20 74 68 61 74 20 73 69 6e 63 65   Note that since
2780: 20 77 65 20 73 74 6f 72 65 20 61 20 6d 61 67 69   we store a magi
2790: 63 20 76 61 6c 75 65 20 61 73 20 74 68 65 20 66  c value as the f
27a0: 69 72 73 74 20 69 74 65 6d 20 69 6e 20 74 68 65  irst item in the
27b0: 20 70 72 6f 67 72 61 6d 2c 0a 09 20 2a 20 70 72   program,.. * pr
27c0: 6f 67 72 61 6d 20 6f 66 66 73 65 74 73 20 77 69  ogram offsets wi
27d0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 30 0a 09 20  ll never be 0.. 
27e0: 2a 2f 0a 09 72 65 67 63 28 70 72 65 67 2c 20 52  */..regc(preg, R
27f0: 45 47 5f 4d 41 47 49 43 29 3b 0a 09 69 66 20 28  EG_MAGIC);..if (
2800: 72 65 67 28 70 72 65 67 2c 20 30 2c 20 26 66 6c  reg(preg, 0, &fl
2810: 61 67 73 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72  ags) == 0) {...r
2820: 65 74 75 72 6e 20 70 72 65 67 2d 3e 65 72 72 3b  eturn preg->err;
2830: 0a 09 7d 0a 0a 09 2f 2a 20 53 6d 61 6c 6c 20 65  ..}.../* Small e
2840: 6e 6f 75 67 68 20 66 6f 72 20 70 6f 69 6e 74 65  nough for pointe
2850: 72 2d 73 74 6f 72 61 67 65 20 63 6f 6e 76 65 6e  r-storage conven
2860: 74 69 6f 6e 3f 20 2a 2f 0a 09 69 66 20 28 70 72  tion? */..if (pr
2870: 65 67 2d 3e 72 65 5f 6e 73 75 62 20 3e 3d 20 52  eg->re_nsub >= R
2880: 45 47 5f 4d 41 58 5f 50 41 52 45 4e 29 09 09 2f  EG_MAX_PAREN)../
2890: 2a 20 50 72 6f 62 61 62 6c 79 20 63 6f 75 6c 64  * Probably could
28a0: 20 62 65 20 36 35 35 33 35 4c 2e 20 2a 2f 0a 09   be 65535L. */..
28b0: 09 46 41 49 4c 28 70 72 65 67 2c 52 45 47 5f 45  .FAIL(preg,REG_E
28c0: 52 52 5f 54 4f 4f 5f 42 49 47 29 3b 0a 0a 09 2f  RR_TOO_BIG);.../
28d0: 2a 20 44 69 67 20 6f 75 74 20 69 6e 66 6f 72 6d  * Dig out inform
28e0: 61 74 69 6f 6e 20 66 6f 72 20 6f 70 74 69 6d 69  ation for optimi
28f0: 7a 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 70 72 65  zations. */..pre
2900: 67 2d 3e 72 65 67 73 74 61 72 74 20 3d 20 30 3b  g->regstart = 0;
2910: 09 2f 2a 20 57 6f 72 73 74 2d 63 61 73 65 20 64  ./* Worst-case d
2920: 65 66 61 75 6c 74 73 2e 20 2a 2f 0a 09 70 72 65  efaults. */..pre
2930: 67 2d 3e 72 65 67 61 6e 63 68 20 3d 20 30 3b 0a  g->reganch = 0;.
2940: 09 70 72 65 67 2d 3e 72 65 67 6d 75 73 74 20 3d  .preg->regmust =
2950: 20 30 3b 0a 09 70 72 65 67 2d 3e 72 65 67 6d 6c   0;..preg->regml
2960: 65 6e 20 3d 20 30 3b 0a 09 73 63 61 6e 20 3d 20  en = 0;..scan = 
2970: 31 3b 09 09 09 2f 2a 20 46 69 72 73 74 20 42 52  1;.../* First BR
2980: 41 4e 43 48 2e 20 2a 2f 0a 09 69 66 20 28 4f 50  ANCH. */..if (OP
2990: 28 70 72 65 67 2c 20 72 65 67 6e 65 78 74 28 70  (preg, regnext(p
29a0: 72 65 67 2c 20 73 63 61 6e 29 29 20 3d 3d 20 45  reg, scan)) == E
29b0: 4e 44 29 20 7b 09 09 2f 2a 20 4f 6e 6c 79 20 6f  ND) {../* Only o
29c0: 6e 65 20 74 6f 70 2d 6c 65 76 65 6c 20 63 68 6f  ne top-level cho
29d0: 69 63 65 2e 20 2a 2f 0a 09 09 73 63 61 6e 20 3d  ice. */...scan =
29e0: 20 4f 50 45 52 41 4e 44 28 73 63 61 6e 29 3b 0a   OPERAND(scan);.
29f0: 0a 09 09 2f 2a 20 53 74 61 72 74 69 6e 67 2d 70  .../* Starting-p
2a00: 6f 69 6e 74 20 69 6e 66 6f 2e 20 2a 2f 0a 09 09  oint info. */...
2a10: 69 66 20 28 4f 50 28 70 72 65 67 2c 20 73 63 61  if (OP(preg, sca
2a20: 6e 29 20 3d 3d 20 45 58 41 43 54 4c 59 29 20 7b  n) == EXACTLY) {
2a30: 0a 09 09 09 70 72 65 67 2d 3e 72 65 67 73 74 61  ....preg->regsta
2a40: 72 74 20 3d 20 70 72 65 67 2d 3e 70 72 6f 67 72  rt = preg->progr
2a50: 61 6d 5b 4f 50 45 52 41 4e 44 28 73 63 61 6e 29  am[OPERAND(scan)
2a60: 5d 3b 0a 09 09 7d 0a 09 09 65 6c 73 65 20 69 66  ];...}...else if
2a70: 20 28 4f 50 28 70 72 65 67 2c 20 73 63 61 6e 29   (OP(preg, scan)
2a80: 20 3d 3d 20 42 4f 4c 29 0a 09 09 09 70 72 65 67   == BOL)....preg
2a90: 2d 3e 72 65 67 61 6e 63 68 2b 2b 3b 0a 0a 09 09  ->reganch++;....
2aa0: 2f 2a 0a 09 09 20 2a 20 49 66 20 74 68 65 72 65  /*... * If there
2ab0: 27 73 20 73 6f 6d 65 74 68 69 6e 67 20 65 78 70  's something exp
2ac0: 65 6e 73 69 76 65 20 69 6e 20 74 68 65 20 72 2e  ensive in the r.
2ad0: 65 2e 2c 20 66 69 6e 64 20 74 68 65 0a 09 09 20  e., find the... 
2ae0: 2a 20 6c 6f 6e 67 65 73 74 20 6c 69 74 65 72 61  * longest litera
2af0: 6c 20 73 74 72 69 6e 67 20 74 68 61 74 20 6d 75  l string that mu
2b00: 73 74 20 61 70 70 65 61 72 20 61 6e 64 20 6d 61  st appear and ma
2b10: 6b 65 20 69 74 20 74 68 65 0a 09 09 20 2a 20 72  ke it the... * r
2b20: 65 67 6d 75 73 74 2e 20 20 52 65 73 6f 6c 76 65  egmust.  Resolve
2b30: 20 74 69 65 73 20 69 6e 20 66 61 76 6f 72 20 6f   ties in favor o
2b40: 66 20 6c 61 74 65 72 20 73 74 72 69 6e 67 73 2c  f later strings,
2b50: 20 73 69 6e 63 65 0a 09 09 20 2a 20 74 68 65 20   since... * the 
2b60: 72 65 67 73 74 61 72 74 20 63 68 65 63 6b 20 77  regstart check w
2b70: 6f 72 6b 73 20 77 69 74 68 20 74 68 65 20 62 65  orks with the be
2b80: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 72  ginning of the r
2b90: 2e 65 2e 0a 09 09 20 2a 20 61 6e 64 20 61 76 6f  .e.... * and avo
2ba0: 69 64 69 6e 67 20 64 75 70 6c 69 63 61 74 69 6f  iding duplicatio
2bb0: 6e 20 73 74 72 65 6e 67 74 68 65 6e 73 20 63 68  n strengthens ch
2bc0: 65 63 6b 69 6e 67 2e 20 20 4e 6f 74 20 61 0a 09  ecking.  Not a..
2bd0: 09 20 2a 20 73 74 72 6f 6e 67 20 72 65 61 73 6f  . * strong reaso
2be0: 6e 2c 20 62 75 74 20 73 75 66 66 69 63 69 65 6e  n, but sufficien
2bf0: 74 20 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65  t in the absence
2c00: 20 6f 66 20 6f 74 68 65 72 73 2e 0a 09 09 20 2a   of others.... *
2c10: 2f 0a 09 09 69 66 20 28 66 6c 61 67 73 26 53 50  /...if (flags&SP
2c20: 53 54 41 52 54 29 20 7b 0a 09 09 09 6c 6f 6e 67  START) {....long
2c30: 65 73 74 20 3d 20 30 3b 0a 09 09 09 6c 65 6e 20  est = 0;....len 
2c40: 3d 20 30 3b 0a 09 09 09 66 6f 72 20 28 3b 20 73  = 0;....for (; s
2c50: 63 61 6e 20 21 3d 20 30 3b 20 73 63 61 6e 20 3d  can != 0; scan =
2c60: 20 72 65 67 6e 65 78 74 28 70 72 65 67 2c 20 73   regnext(preg, s
2c70: 63 61 6e 29 29 20 7b 0a 09 09 09 09 69 66 20 28  can)) {.....if (
2c80: 4f 50 28 70 72 65 67 2c 20 73 63 61 6e 29 20 3d  OP(preg, scan) =
2c90: 3d 20 45 58 41 43 54 4c 59 29 20 7b 0a 09 09 09  = EXACTLY) {....
2ca0: 09 09 69 6e 74 20 70 6c 65 6e 20 3d 20 73 74 72  ..int plen = str
2cb0: 5f 69 6e 74 5f 6c 65 6e 28 70 72 65 67 2d 3e 70  _int_len(preg->p
2cc0: 72 6f 67 72 61 6d 20 2b 20 4f 50 45 52 41 4e 44  rogram + OPERAND
2cd0: 28 73 63 61 6e 29 29 3b 0a 09 09 09 09 09 69 66  (scan));......if
2ce0: 20 28 70 6c 65 6e 20 3e 3d 20 6c 65 6e 29 20 7b   (plen >= len) {
2cf0: 0a 09 09 09 09 09 09 6c 6f 6e 67 65 73 74 20 3d  .......longest =
2d00: 20 4f 50 45 52 41 4e 44 28 73 63 61 6e 29 3b 0a   OPERAND(scan);.
2d10: 09 09 09 09 09 09 6c 65 6e 20 3d 20 70 6c 65 6e  ......len = plen
2d20: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
2d30: 09 09 7d 0a 09 09 09 70 72 65 67 2d 3e 72 65 67  ..}....preg->reg
2d40: 6d 75 73 74 20 3d 20 6c 6f 6e 67 65 73 74 3b 0a  must = longest;.
2d50: 09 09 09 70 72 65 67 2d 3e 72 65 67 6d 6c 65 6e  ...preg->regmlen
2d60: 20 3d 20 6c 65 6e 3b 0a 09 09 7d 0a 09 7d 0a 0a   = len;...}..}..
2d70: 23 69 66 64 65 66 20 44 45 42 55 47 0a 09 72 65  #ifdef DEBUG..re
2d80: 67 64 75 6d 70 28 70 72 65 67 29 3b 0a 23 65 6e  gdump(preg);.#en
2d90: 64 69 66 0a 0a 09 72 65 74 75 72 6e 20 30 3b 0a  dif...return 0;.
2da0: 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 20 2d 20 72  }../*. - reg - r
2db0: 65 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  egular expressio
2dc0: 6e 2c 20 69 2e 65 2e 20 6d 61 69 6e 20 62 6f 64  n, i.e. main bod
2dd0: 79 20 6f 72 20 70 61 72 65 6e 74 68 65 73 69 7a  y or parenthesiz
2de0: 65 64 20 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 43  ed thing. *. * C
2df0: 61 6c 6c 65 72 20 6d 75 73 74 20 61 62 73 6f 72  aller must absor
2e00: 62 20 6f 70 65 6e 69 6e 67 20 70 61 72 65 6e 74  b opening parent
2e10: 68 65 73 69 73 2e 0a 20 2a 0a 20 2a 20 43 6f 6d  hesis.. *. * Com
2e20: 62 69 6e 69 6e 67 20 70 61 72 65 6e 74 68 65 73  bining parenthes
2e30: 69 73 20 68 61 6e 64 6c 69 6e 67 20 77 69 74 68  is handling with
2e40: 20 74 68 65 20 62 61 73 65 20 6c 65 76 65 6c 20   the base level 
2e50: 6f 66 20 72 65 67 75 6c 61 72 20 65 78 70 72 65  of regular expre
2e60: 73 73 69 6f 6e 0a 20 2a 20 69 73 20 61 20 74 72  ssion. * is a tr
2e70: 69 66 6c 65 20 66 6f 72 63 65 64 2c 20 62 75 74  ifle forced, but
2e80: 20 74 68 65 20 6e 65 65 64 20 74 6f 20 74 69 65   the need to tie
2e90: 20 74 68 65 20 74 61 69 6c 73 20 6f 66 20 74 68   the tails of th
2ea0: 65 20 62 72 61 6e 63 68 65 73 20 74 6f 20 77 68  e branches to wh
2eb0: 61 74 0a 20 2a 20 66 6f 6c 6c 6f 77 73 20 6d 61  at. * follows ma
2ec0: 6b 65 73 20 69 74 20 68 61 72 64 20 74 6f 20 61  kes it hard to a
2ed0: 76 6f 69 64 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  void.. */.static
2ee0: 20 69 6e 74 20 72 65 67 28 72 65 67 65 78 5f 74   int reg(regex_t
2ef0: 20 2a 70 72 65 67 2c 20 69 6e 74 20 70 61 72 65   *preg, int pare
2f00: 6e 20 2f 2a 20 50 61 72 65 6e 74 68 65 73 69 7a  n /* Parenthesiz
2f10: 65 64 3f 20 2a 2f 2c 20 69 6e 74 20 2a 66 6c 61  ed? */, int *fla
2f20: 67 70 20 29 0a 7b 0a 09 69 6e 74 20 72 65 74 3b  gp ).{..int ret;
2f30: 0a 09 69 6e 74 20 62 72 3b 0a 09 69 6e 74 20 65  ..int br;..int e
2f40: 6e 64 65 72 3b 0a 09 69 6e 74 20 70 61 72 6e 6f  nder;..int parno
2f50: 20 3d 20 30 3b 0a 09 69 6e 74 20 66 6c 61 67 73   = 0;..int flags
2f60: 3b 0a 0a 09 2a 66 6c 61 67 70 20 3d 20 48 41 53  ;...*flagp = HAS
2f70: 57 49 44 54 48 3b 09 2f 2a 20 54 65 6e 74 61 74  WIDTH;./* Tentat
2f80: 69 76 65 6c 79 2e 20 2a 2f 0a 0a 09 2f 2a 20 4d  ively. */.../* M
2f90: 61 6b 65 20 61 6e 20 4f 50 45 4e 20 6e 6f 64 65  ake an OPEN node
2fa0: 2c 20 69 66 20 70 61 72 65 6e 74 68 65 73 69 7a  , if parenthesiz
2fb0: 65 64 2e 20 2a 2f 0a 09 69 66 20 28 70 61 72 65  ed. */..if (pare
2fc0: 6e 29 20 7b 0a 09 09 69 66 20 28 70 72 65 67 2d  n) {...if (preg-
2fd0: 3e 72 65 67 70 61 72 73 65 5b 30 5d 20 3d 3d 20  >regparse[0] == 
2fe0: 27 3f 27 20 26 26 20 70 72 65 67 2d 3e 72 65 67  '?' && preg->reg
2ff0: 70 61 72 73 65 5b 31 5d 20 3d 3d 20 27 3a 27 29  parse[1] == ':')
3000: 20 7b 0a 09 09 09 2f 2a 20 6e 6f 6e 2d 63 61 70   {..../* non-cap
3010: 74 75 72 69 6e 67 20 70 61 72 65 6e 20 2a 2f 0a  turing paren */.
3020: 09 09 09 70 72 65 67 2d 3e 72 65 67 70 61 72 73  ...preg->regpars
3030: 65 20 2b 3d 20 32 3b 0a 09 09 09 70 61 72 6e 6f  e += 2;....parno
3040: 20 3d 20 2d 31 3b 0a 09 09 7d 0a 09 09 65 6c 73   = -1;...}...els
3050: 65 20 7b 0a 09 09 09 70 61 72 6e 6f 20 3d 20 2b  e {....parno = +
3060: 2b 70 72 65 67 2d 3e 72 65 5f 6e 73 75 62 3b 0a  +preg->re_nsub;.
3070: 09 09 7d 0a 09 09 72 65 74 20 3d 20 72 65 67 6e  ..}...ret = regn
3080: 6f 64 65 28 70 72 65 67 2c 20 4f 50 45 4e 2b 70  ode(preg, OPEN+p
3090: 61 72 6e 6f 29 3b 0a 09 7d 20 65 6c 73 65 0a 09  arno);..} else..
30a0: 09 72 65 74 20 3d 20 30 3b 0a 0a 09 2f 2a 20 50  .ret = 0;.../* P
30b0: 69 63 6b 20 75 70 20 74 68 65 20 62 72 61 6e 63  ick up the branc
30c0: 68 65 73 2c 20 6c 69 6e 6b 69 6e 67 20 74 68 65  hes, linking the
30d0: 6d 20 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 09  m together. */..
30e0: 62 72 20 3d 20 72 65 67 62 72 61 6e 63 68 28 70  br = regbranch(p
30f0: 72 65 67 2c 20 26 66 6c 61 67 73 29 3b 0a 09 69  reg, &flags);..i
3100: 66 20 28 62 72 20 3d 3d 20 30 29 0a 09 09 72 65  f (br == 0)...re
3110: 74 75 72 6e 20 30 3b 0a 09 69 66 20 28 72 65 74  turn 0;..if (ret
3120: 20 21 3d 20 30 29 0a 09 09 72 65 67 74 61 69 6c   != 0)...regtail
3130: 28 70 72 65 67 2c 20 72 65 74 2c 20 62 72 29 3b  (preg, ret, br);
3140: 09 2f 2a 20 4f 50 45 4e 20 2d 3e 20 66 69 72 73  ./* OPEN -> firs
3150: 74 2e 20 2a 2f 0a 09 65 6c 73 65 0a 09 09 72 65  t. */..else...re
3160: 74 20 3d 20 62 72 3b 0a 09 69 66 20 28 21 28 66  t = br;..if (!(f
3170: 6c 61 67 73 26 48 41 53 57 49 44 54 48 29 29 0a  lags&HASWIDTH)).
3180: 09 09 2a 66 6c 61 67 70 20 26 3d 20 7e 48 41 53  ..*flagp &= ~HAS
3190: 57 49 44 54 48 3b 0a 09 2a 66 6c 61 67 70 20 7c  WIDTH;..*flagp |
31a0: 3d 20 66 6c 61 67 73 26 53 50 53 54 41 52 54 3b  = flags&SPSTART;
31b0: 0a 09 77 68 69 6c 65 20 28 2a 70 72 65 67 2d 3e  ..while (*preg->
31c0: 72 65 67 70 61 72 73 65 20 3d 3d 20 27 7c 27 29  regparse == '|')
31d0: 20 7b 0a 09 09 70 72 65 67 2d 3e 72 65 67 70 61   {...preg->regpa
31e0: 72 73 65 2b 2b 3b 0a 09 09 62 72 20 3d 20 72 65  rse++;...br = re
31f0: 67 62 72 61 6e 63 68 28 70 72 65 67 2c 20 26 66  gbranch(preg, &f
3200: 6c 61 67 73 29 3b 0a 09 09 69 66 20 28 62 72 20  lags);...if (br 
3210: 3d 3d 20 30 29 0a 09 09 09 72 65 74 75 72 6e 20  == 0)....return 
3220: 30 3b 0a 09 09 72 65 67 74 61 69 6c 28 70 72 65  0;...regtail(pre
3230: 67 2c 20 72 65 74 2c 20 62 72 29 3b 09 2f 2a 20  g, ret, br);./* 
3240: 42 52 41 4e 43 48 20 2d 3e 20 42 52 41 4e 43 48  BRANCH -> BRANCH
3250: 2e 20 2a 2f 0a 09 09 69 66 20 28 21 28 66 6c 61  . */...if (!(fla
3260: 67 73 26 48 41 53 57 49 44 54 48 29 29 0a 09 09  gs&HASWIDTH))...
3270: 09 2a 66 6c 61 67 70 20 26 3d 20 7e 48 41 53 57  .*flagp &= ~HASW
3280: 49 44 54 48 3b 0a 09 09 2a 66 6c 61 67 70 20 7c  IDTH;...*flagp |
3290: 3d 20 66 6c 61 67 73 26 53 50 53 54 41 52 54 3b  = flags&SPSTART;
32a0: 0a 09 7d 0a 0a 09 2f 2a 20 4d 61 6b 65 20 61 20  ..}.../* Make a 
32b0: 63 6c 6f 73 69 6e 67 20 6e 6f 64 65 2c 20 61 6e  closing node, an
32c0: 64 20 68 6f 6f 6b 20 69 74 20 6f 6e 20 74 68 65  d hook it on the
32d0: 20 65 6e 64 2e 20 2a 2f 0a 09 65 6e 64 65 72 20   end. */..ender 
32e0: 3d 20 72 65 67 6e 6f 64 65 28 70 72 65 67 2c 20  = regnode(preg, 
32f0: 28 70 61 72 65 6e 29 20 3f 20 43 4c 4f 53 45 2b  (paren) ? CLOSE+
3300: 70 61 72 6e 6f 20 3a 20 45 4e 44 29 3b 0a 09 72  parno : END);..r
3310: 65 67 74 61 69 6c 28 70 72 65 67 2c 20 72 65 74  egtail(preg, ret
3320: 2c 20 65 6e 64 65 72 29 3b 0a 0a 09 2f 2a 20 48  , ender);.../* H
3330: 6f 6f 6b 20 74 68 65 20 74 61 69 6c 73 20 6f 66  ook the tails of
3340: 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 74 6f   the branches to
3350: 20 74 68 65 20 63 6c 6f 73 69 6e 67 20 6e 6f 64   the closing nod
3360: 65 2e 20 2a 2f 0a 09 66 6f 72 20 28 62 72 20 3d  e. */..for (br =
3370: 20 72 65 74 3b 20 62 72 20 21 3d 20 30 3b 20 62   ret; br != 0; b
3380: 72 20 3d 20 72 65 67 6e 65 78 74 28 70 72 65 67  r = regnext(preg
3390: 2c 20 62 72 29 29 0a 09 09 72 65 67 6f 70 74 61  , br))...regopta
33a0: 69 6c 28 70 72 65 67 2c 20 62 72 2c 20 65 6e 64  il(preg, br, end
33b0: 65 72 29 3b 0a 0a 09 2f 2a 20 43 68 65 63 6b 20  er);.../* Check 
33c0: 66 6f 72 20 70 72 6f 70 65 72 20 74 65 72 6d 69  for proper termi
33d0: 6e 61 74 69 6f 6e 2e 20 2a 2f 0a 09 69 66 20 28  nation. */..if (
33e0: 70 61 72 65 6e 20 26 26 20 2a 70 72 65 67 2d 3e  paren && *preg->
33f0: 72 65 67 70 61 72 73 65 2b 2b 20 21 3d 20 27 29  regparse++ != ')
3400: 27 29 20 7b 0a 09 09 70 72 65 67 2d 3e 65 72 72  ') {...preg->err
3410: 20 3d 20 52 45 47 5f 45 52 52 5f 55 4e 4d 41 54   = REG_ERR_UNMAT
3420: 43 48 45 44 5f 50 41 52 45 4e 3b 0a 09 09 72 65  CHED_PAREN;...re
3430: 74 75 72 6e 20 30 3b 0a 09 7d 20 65 6c 73 65 20  turn 0;..} else 
3440: 69 66 20 28 21 70 61 72 65 6e 20 26 26 20 2a 70  if (!paren && *p
3450: 72 65 67 2d 3e 72 65 67 70 61 72 73 65 20 21 3d  reg->regparse !=
3460: 20 27 5c 30 27 29 20 7b 0a 09 09 69 66 20 28 2a   '\0') {...if (*
3470: 70 72 65 67 2d 3e 72 65 67 70 61 72 73 65 20 3d  preg->regparse =
3480: 3d 20 27 29 27 29 20 7b 0a 09 09 09 70 72 65 67  = ')') {....preg
3490: 2d 3e 65 72 72 20 3d 20 52 45 47 5f 45 52 52 5f  ->err = REG_ERR_
34a0: 55 4e 4d 41 54 43 48 45 44 5f 50 41 52 45 4e 3b  UNMATCHED_PAREN;
34b0: 0a 09 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 09  ....return 0;...
34c0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 70 72 65 67  } else {....preg
34d0: 2d 3e 65 72 72 20 3d 20 52 45 47 5f 45 52 52 5f  ->err = REG_ERR_
34e0: 4a 55 4e 4b 5f 4f 4e 5f 45 4e 44 3b 0a 09 09 09  JUNK_ON_END;....
34f0: 72 65 74 75 72 6e 20 30 3b 0a 09 09 7d 0a 09 7d  return 0;...}..}
3500: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 29 3b 0a  ...return(ret);.
3510: 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 62 72 61 6e  }../*. - regbran
3520: 63 68 20 2d 20 6f 6e 65 20 61 6c 74 65 72 6e 61  ch - one alterna
3530: 74 69 76 65 20 6f 66 20 61 6e 20 7c 20 6f 70 65  tive of an | ope
3540: 72 61 74 6f 72 0a 20 2a 0a 20 2a 20 49 6d 70 6c  rator. *. * Impl
3550: 65 6d 65 6e 74 73 20 74 68 65 20 63 6f 6e 63 61  ements the conca
3560: 74 65 6e 61 74 69 6f 6e 20 6f 70 65 72 61 74 6f  tenation operato
3570: 72 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  r.. */.static in
3580: 74 20 72 65 67 62 72 61 6e 63 68 28 72 65 67 65  t regbranch(rege
3590: 78 5f 74 20 2a 70 72 65 67 2c 20 69 6e 74 20 2a  x_t *preg, int *
35a0: 66 6c 61 67 70 20 29 0a 7b 0a 09 69 6e 74 20 72  flagp ).{..int r
35b0: 65 74 3b 0a 09 69 6e 74 20 63 68 61 69 6e 3b 0a  et;..int chain;.
35c0: 09 69 6e 74 20 6c 61 74 65 73 74 3b 0a 09 69 6e  .int latest;..in
35d0: 74 20 66 6c 61 67 73 3b 0a 0a 09 2a 66 6c 61 67  t flags;...*flag
35e0: 70 20 3d 20 57 4f 52 53 54 3b 09 09 2f 2a 20 54  p = WORST;../* T
35f0: 65 6e 74 61 74 69 76 65 6c 79 2e 20 2a 2f 0a 0a  entatively. */..
3600: 09 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28 70  .ret = regnode(p
3610: 72 65 67 2c 20 42 52 41 4e 43 48 29 3b 0a 09 63  reg, BRANCH);..c
3620: 68 61 69 6e 20 3d 20 30 3b 0a 09 77 68 69 6c 65  hain = 0;..while
3630: 20 28 2a 70 72 65 67 2d 3e 72 65 67 70 61 72 73   (*preg->regpars
3640: 65 20 21 3d 20 27 5c 30 27 20 26 26 20 2a 70 72  e != '\0' && *pr
3650: 65 67 2d 3e 72 65 67 70 61 72 73 65 20 21 3d 20  eg->regparse != 
3660: 27 29 27 20 26 26 0a 09 20 20 20 20 20 20 20 2a  ')' &&..       *
3670: 70 72 65 67 2d 3e 72 65 67 70 61 72 73 65 20 21  preg->regparse !
3680: 3d 20 27 7c 27 29 20 7b 0a 09 09 6c 61 74 65 73  = '|') {...lates
3690: 74 20 3d 20 72 65 67 70 69 65 63 65 28 70 72 65  t = regpiece(pre
36a0: 67 2c 20 26 66 6c 61 67 73 29 3b 0a 09 09 69 66  g, &flags);...if
36b0: 20 28 6c 61 74 65 73 74 20 3d 3d 20 30 29 0a 09   (latest == 0)..
36c0: 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 09 2a 66  ..return 0;...*f
36d0: 6c 61 67 70 20 7c 3d 20 66 6c 61 67 73 26 48 41  lagp |= flags&HA
36e0: 53 57 49 44 54 48 3b 0a 09 09 69 66 20 28 63 68  SWIDTH;...if (ch
36f0: 61 69 6e 20 3d 3d 20 30 29 20 7b 2f 2a 20 46 69  ain == 0) {/* Fi
3700: 72 73 74 20 70 69 65 63 65 2e 20 2a 2f 0a 09 09  rst piece. */...
3710: 09 2a 66 6c 61 67 70 20 7c 3d 20 66 6c 61 67 73  .*flagp |= flags
3720: 26 53 50 53 54 41 52 54 3b 0a 09 09 7d 0a 09 09  &SPSTART;...}...
3730: 65 6c 73 65 20 7b 0a 09 09 09 72 65 67 74 61 69  else {....regtai
3740: 6c 28 70 72 65 67 2c 20 63 68 61 69 6e 2c 20 6c  l(preg, chain, l
3750: 61 74 65 73 74 29 3b 0a 09 09 7d 0a 09 09 63 68  atest);...}...ch
3760: 61 69 6e 20 3d 20 6c 61 74 65 73 74 3b 0a 09 7d  ain = latest;..}
3770: 0a 09 69 66 20 28 63 68 61 69 6e 20 3d 3d 20 30  ..if (chain == 0
3780: 29 09 2f 2a 20 4c 6f 6f 70 20 72 61 6e 20 7a 65  )./* Loop ran ze
3790: 72 6f 20 74 69 6d 65 73 2e 20 2a 2f 0a 09 09 28  ro times. */...(
37a0: 76 6f 69 64 29 20 72 65 67 6e 6f 64 65 28 70 72  void) regnode(pr
37b0: 65 67 2c 20 4e 4f 54 48 49 4e 47 29 3b 0a 0a 09  eg, NOTHING);...
37c0: 72 65 74 75 72 6e 28 72 65 74 29 3b 0a 7d 0a 0a  return(ret);.}..
37d0: 2f 2a 0a 20 2d 20 72 65 67 70 69 65 63 65 20 2d  /*. - regpiece -
37e0: 20 73 6f 6d 65 74 68 69 6e 67 20 66 6f 6c 6c 6f   something follo
37f0: 77 65 64 20 62 79 20 70 6f 73 73 69 62 6c 65 20  wed by possible 
3800: 5b 2a 2b 3f 5d 0a 20 2a 0a 20 2a 20 4e 6f 74 65  [*+?]. *. * Note
3810: 20 74 68 61 74 20 74 68 65 20 62 72 61 6e 63 68   that the branch
3820: 69 6e 67 20 63 6f 64 65 20 73 65 71 75 65 6e 63  ing code sequenc
3830: 65 73 20 75 73 65 64 20 66 6f 72 20 3f 20 61 6e  es used for ? an
3840: 64 20 74 68 65 20 67 65 6e 65 72 61 6c 20 63 61  d the general ca
3850: 73 65 73 0a 20 2a 20 6f 66 20 2a 20 61 6e 64 20  ses. * of * and 
3860: 2b 20 61 72 65 20 73 6f 6d 65 77 68 61 74 20 6f  + are somewhat o
3870: 70 74 69 6d 69 7a 65 64 3a 20 20 74 68 65 79 20  ptimized:  they 
3880: 75 73 65 20 74 68 65 20 73 61 6d 65 20 4e 4f 54  use the same NOT
3890: 48 49 4e 47 20 6e 6f 64 65 20 61 73 0a 20 2a 20  HING node as. * 
38a0: 62 6f 74 68 20 74 68 65 20 65 6e 64 6d 61 72 6b  both the endmark
38b0: 65 72 20 66 6f 72 20 74 68 65 69 72 20 62 72 61  er for their bra
38c0: 6e 63 68 20 6c 69 73 74 20 61 6e 64 20 74 68 65  nch list and the
38d0: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 6c 61 73   body of the las
38e0: 74 20 62 72 61 6e 63 68 2e 0a 20 2a 20 49 74 20  t branch.. * It 
38f0: 6d 69 67 68 74 20 73 65 65 6d 20 74 68 61 74 20  might seem that 
3900: 74 68 69 73 20 6e 6f 64 65 20 63 6f 75 6c 64 20  this node could 
3910: 62 65 20 64 69 73 70 65 6e 73 65 64 20 77 69 74  be dispensed wit
3920: 68 20 65 6e 74 69 72 65 6c 79 2c 20 62 75 74 20  h entirely, but 
3930: 74 68 65 0a 20 2a 20 65 6e 64 6d 61 72 6b 65 72  the. * endmarker
3940: 20 72 6f 6c 65 20 69 73 20 6e 6f 74 20 72 65 64   role is not red
3950: 75 6e 64 61 6e 74 2e 0a 20 2a 2f 0a 73 74 61 74  undant.. */.stat
3960: 69 63 20 69 6e 74 20 72 65 67 70 69 65 63 65 28  ic int regpiece(
3970: 72 65 67 65 78 5f 74 20 2a 70 72 65 67 2c 20 69  regex_t *preg, i
3980: 6e 74 20 2a 66 6c 61 67 70 29 0a 7b 0a 09 69 6e  nt *flagp).{..in
3990: 74 20 72 65 74 3b 0a 09 63 68 61 72 20 6f 70 3b  t ret;..char op;
39a0: 0a 09 69 6e 74 20 6e 65 78 74 3b 0a 09 69 6e 74  ..int next;..int
39b0: 20 66 6c 61 67 73 3b 0a 09 69 6e 74 20 63 68 61   flags;..int cha
39c0: 69 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 6d 69 6e  in = 0;..int min
39d0: 3b 0a 09 69 6e 74 20 6d 61 78 3b 0a 0a 09 72 65  ;..int max;...re
39e0: 74 20 3d 20 72 65 67 61 74 6f 6d 28 70 72 65 67  t = regatom(preg
39f0: 2c 20 26 66 6c 61 67 73 29 3b 0a 09 69 66 20 28  , &flags);..if (
3a00: 72 65 74 20 3d 3d 20 30 29 0a 09 09 72 65 74 75  ret == 0)...retu
3a10: 72 6e 20 30 3b 0a 0a 09 6f 70 20 3d 20 2a 70 72  rn 0;...op = *pr
3a20: 65 67 2d 3e 72 65 67 70 61 72 73 65 3b 0a 09 69  eg->regparse;..i
3a30: 66 20 28 21 49 53 4d 55 4c 54 28 6f 70 29 29 20  f (!ISMULT(op)) 
3a40: 7b 0a 09 09 2a 66 6c 61 67 70 20 3d 20 66 6c 61  {...*flagp = fla
3a50: 67 73 3b 0a 09 09 72 65 74 75 72 6e 28 72 65 74  gs;...return(ret
3a60: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 28 66 6c  );..}...if (!(fl
3a70: 61 67 73 26 48 41 53 57 49 44 54 48 29 20 26 26  ags&HASWIDTH) &&
3a80: 20 6f 70 20 21 3d 20 27 3f 27 29 20 7b 0a 09 09   op != '?') {...
3a90: 70 72 65 67 2d 3e 65 72 72 20 3d 20 52 45 47 5f  preg->err = REG_
3aa0: 45 52 52 5f 4f 50 45 52 41 4e 44 5f 43 4f 55 4c  ERR_OPERAND_COUL
3ab0: 44 5f 42 45 5f 45 4d 50 54 59 3b 0a 09 09 72 65  D_BE_EMPTY;...re
3ac0: 74 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20  turn 0;..}.../* 
3ad0: 48 61 6e 64 6c 65 20 62 72 61 63 65 73 20 28 63  Handle braces (c
3ae0: 6f 75 6e 74 65 64 20 72 65 70 65 74 69 74 69 6f  ounted repetitio
3af0: 6e 29 20 62 79 20 65 78 70 61 6e 73 69 6f 6e 20  n) by expansion 
3b00: 2a 2f 0a 09 69 66 20 28 6f 70 20 3d 3d 20 27 7b  */..if (op == '{
3b10: 27 29 20 7b 0a 09 09 63 68 61 72 20 2a 65 6e 64  ') {...char *end
3b20: 3b 0a 0a 09 09 6d 69 6e 20 3d 20 73 74 72 74 6f  ;....min = strto
3b30: 75 6c 28 70 72 65 67 2d 3e 72 65 67 70 61 72 73  ul(preg->regpars
3b40: 65 20 2b 20 31 2c 20 26 65 6e 64 2c 20 31 30 29  e + 1, &end, 10)
3b50: 3b 0a 09 09 69 66 20 28 65 6e 64 20 3d 3d 20 70  ;...if (end == p
3b60: 72 65 67 2d 3e 72 65 67 70 61 72 73 65 20 2b 20  reg->regparse + 
3b70: 31 29 20 7b 0a 09 09 09 70 72 65 67 2d 3e 65 72  1) {....preg->er
3b80: 72 20 3d 20 52 45 47 5f 45 52 52 5f 42 41 44 5f  r = REG_ERR_BAD_
3b90: 43 4f 55 4e 54 3b 0a 09 09 09 72 65 74 75 72 6e  COUNT;....return
3ba0: 20 30 3b 0a 09 09 7d 0a 09 09 69 66 20 28 2a 65   0;...}...if (*e
3bb0: 6e 64 20 3d 3d 20 27 7d 27 29 20 7b 0a 09 09 09  nd == '}') {....
3bc0: 6d 61 78 20 3d 20 6d 69 6e 3b 0a 09 09 7d 0a 09  max = min;...}..
3bd0: 09 65 6c 73 65 20 7b 0a 09 09 09 70 72 65 67 2d  .else {....preg-
3be0: 3e 72 65 67 70 61 72 73 65 20 3d 20 65 6e 64 3b  >regparse = end;
3bf0: 0a 09 09 09 6d 61 78 20 3d 20 73 74 72 74 6f 75  ....max = strtou
3c00: 6c 28 70 72 65 67 2d 3e 72 65 67 70 61 72 73 65  l(preg->regparse
3c10: 20 2b 20 31 2c 20 26 65 6e 64 2c 20 31 30 29 3b   + 1, &end, 10);
3c20: 0a 09 09 09 69 66 20 28 2a 65 6e 64 20 21 3d 20  ....if (*end != 
3c30: 27 7d 27 29 20 7b 0a 09 09 09 09 70 72 65 67 2d  '}') {.....preg-
3c40: 3e 65 72 72 20 3d 20 52 45 47 5f 45 52 52 5f 55  >err = REG_ERR_U
3c50: 4e 4d 41 54 43 48 45 44 5f 42 52 41 43 45 53 3b  NMATCHED_BRACES;
3c60: 0a 09 09 09 09 72 65 74 75 72 6e 20 30 3b 0a 09  .....return 0;..
3c70: 09 09 7d 0a 09 09 7d 0a 09 09 69 66 20 28 65 6e  ..}...}...if (en
3c80: 64 20 3d 3d 20 70 72 65 67 2d 3e 72 65 67 70 61  d == preg->regpa
3c90: 72 73 65 20 2b 20 31 29 20 7b 0a 09 09 09 6d 61  rse + 1) {....ma
3ca0: 78 20 3d 20 4d 41 58 5f 52 45 50 5f 43 4f 55 4e  x = MAX_REP_COUN
3cb0: 54 3b 0a 09 09 7d 0a 09 09 65 6c 73 65 20 69 66  T;...}...else if
3cc0: 20 28 6d 61 78 20 3c 20 6d 69 6e 20 7c 7c 20 6d   (max < min || m
3cd0: 61 78 20 3e 3d 20 31 30 30 29 20 7b 0a 09 09 09  ax >= 100) {....
3ce0: 70 72 65 67 2d 3e 65 72 72 20 3d 20 52 45 47 5f  preg->err = REG_
3cf0: 45 52 52 5f 42 41 44 5f 43 4f 55 4e 54 3b 0a 09  ERR_BAD_COUNT;..
3d00: 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 09 7d 0a  ..return 0;...}.
3d10: 09 09 69 66 20 28 6d 69 6e 20 3e 3d 20 31 30 30  ..if (min >= 100
3d20: 29 20 7b 0a 09 09 09 70 72 65 67 2d 3e 65 72 72  ) {....preg->err
3d30: 20 3d 20 52 45 47 5f 45 52 52 5f 42 41 44 5f 43   = REG_ERR_BAD_C
3d40: 4f 55 4e 54 3b 0a 09 09 09 72 65 74 75 72 6e 20  OUNT;....return 
3d50: 30 3b 0a 09 09 7d 0a 0a 09 09 70 72 65 67 2d 3e  0;...}....preg->
3d60: 72 65 67 70 61 72 73 65 20 3d 20 73 74 72 63 68  regparse = strch
3d70: 72 28 70 72 65 67 2d 3e 72 65 67 70 61 72 73 65  r(preg->regparse
3d80: 2c 20 27 7d 27 29 3b 0a 09 7d 0a 09 65 6c 73 65  , '}');..}..else
3d90: 20 7b 0a 09 09 6d 69 6e 20 3d 20 28 6f 70 20 3d   {...min = (op =
3da0: 3d 20 27 2b 27 29 3b 0a 09 09 6d 61 78 20 3d 20  = '+');...max = 
3db0: 28 6f 70 20 3d 3d 20 27 3f 27 20 3f 20 31 20 3a  (op == '?' ? 1 :
3dc0: 20 4d 41 58 5f 52 45 50 5f 43 4f 55 4e 54 29 3b   MAX_REP_COUNT);
3dd0: 0a 09 7d 0a 0a 09 69 66 20 28 70 72 65 67 2d 3e  ..}...if (preg->
3de0: 72 65 67 70 61 72 73 65 5b 31 5d 20 3d 3d 20 27  regparse[1] == '
3df0: 3f 27 29 20 7b 0a 09 09 70 72 65 67 2d 3e 72 65  ?') {...preg->re
3e00: 67 70 61 72 73 65 2b 2b 3b 0a 09 09 6e 65 78 74  gparse++;...next
3e10: 20 3d 20 72 65 67 69 6e 73 65 72 74 28 70 72 65   = reginsert(pre
3e20: 67 2c 20 66 6c 61 67 73 20 26 20 53 49 4d 50 4c  g, flags & SIMPL
3e30: 45 20 3f 20 52 45 50 4d 49 4e 20 3a 20 52 45 50  E ? REPMIN : REP
3e40: 58 4d 49 4e 2c 20 35 2c 20 72 65 74 29 3b 0a 09  XMIN, 5, ret);..
3e50: 7d 0a 09 65 6c 73 65 20 7b 0a 09 09 6e 65 78 74  }..else {...next
3e60: 20 3d 20 72 65 67 69 6e 73 65 72 74 28 70 72 65   = reginsert(pre
3e70: 67 2c 20 66 6c 61 67 73 20 26 20 53 49 4d 50 4c  g, flags & SIMPL
3e80: 45 20 3f 20 52 45 50 3a 20 52 45 50 58 2c 20 35  E ? REP: REPX, 5
3e90: 2c 20 72 65 74 29 3b 0a 09 7d 0a 09 70 72 65 67  , ret);..}..preg
3ea0: 2d 3e 70 72 6f 67 72 61 6d 5b 72 65 74 20 2b 20  ->program[ret + 
3eb0: 32 5d 20 3d 20 6d 61 78 3b 0a 09 70 72 65 67 2d  2] = max;..preg-
3ec0: 3e 70 72 6f 67 72 61 6d 5b 72 65 74 20 2b 20 33  >program[ret + 3
3ed0: 5d 20 3d 20 6d 69 6e 3b 0a 09 70 72 65 67 2d 3e  ] = min;..preg->
3ee0: 70 72 6f 67 72 61 6d 5b 72 65 74 20 2b 20 34 5d  program[ret + 4]
3ef0: 20 3d 20 30 3b 0a 0a 09 2a 66 6c 61 67 70 20 3d   = 0;...*flagp =
3f00: 20 28 6d 69 6e 29 20 3f 20 28 57 4f 52 53 54 7c   (min) ? (WORST|
3f10: 48 41 53 57 49 44 54 48 29 20 3a 20 28 57 4f 52  HASWIDTH) : (WOR
3f20: 53 54 7c 53 50 53 54 41 52 54 29 3b 0a 0a 09 69  ST|SPSTART);...i
3f30: 66 20 28 21 28 66 6c 61 67 73 20 26 20 53 49 4d  f (!(flags & SIM
3f40: 50 4c 45 29 29 20 7b 0a 09 09 69 6e 74 20 62 61  PLE)) {...int ba
3f50: 63 6b 20 3d 20 72 65 67 6e 6f 64 65 28 70 72 65  ck = regnode(pre
3f60: 67 2c 20 42 41 43 4b 29 3b 0a 09 09 72 65 67 74  g, BACK);...regt
3f70: 61 69 6c 28 70 72 65 67 2c 20 62 61 63 6b 2c 20  ail(preg, back, 
3f80: 72 65 74 29 3b 0a 09 09 72 65 67 74 61 69 6c 28  ret);...regtail(
3f90: 70 72 65 67 2c 20 6e 65 78 74 2c 20 62 61 63 6b  preg, next, back
3fa0: 29 3b 0a 09 7d 0a 0a 09 70 72 65 67 2d 3e 72 65  );..}...preg->re
3fb0: 67 70 61 72 73 65 2b 2b 3b 0a 09 69 66 20 28 49  gparse++;..if (I
3fc0: 53 4d 55 4c 54 28 2a 70 72 65 67 2d 3e 72 65 67  SMULT(*preg->reg
3fd0: 70 61 72 73 65 29 29 20 7b 0a 09 09 70 72 65 67  parse)) {...preg
3fe0: 2d 3e 65 72 72 20 3d 20 52 45 47 5f 45 52 52 5f  ->err = REG_ERR_
3ff0: 4e 45 53 54 45 44 5f 43 4f 55 4e 54 3b 0a 09 09  NESTED_COUNT;...
4000: 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09 72  return 0;..}...r
4010: 65 74 75 72 6e 20 63 68 61 69 6e 20 3f 20 63 68  eturn chain ? ch
4020: 61 69 6e 20 3a 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  ain : ret;.}../*
4030: 2a 0a 20 2a 20 41 64 64 20 61 6c 6c 20 63 68 61  *. * Add all cha
4040: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 69  racters in the i
4050: 6e 63 6c 75 73 69 76 65 20 72 61 6e 67 65 20 62  nclusive range b
4060: 65 74 77 65 65 6e 20 6c 6f 77 65 72 20 61 6e 64  etween lower and
4070: 20 75 70 70 65 72 2e 0a 20 2a 0a 20 2a 20 48 61   upper.. *. * Ha
4080: 6e 64 6c 65 73 20 61 20 73 77 61 70 70 65 64 20  ndles a swapped 
4090: 72 61 6e 67 65 20 28 75 70 70 65 72 20 3c 20 6c  range (upper < l
40a0: 6f 77 65 72 29 2e 0a 20 2a 2f 0a 73 74 61 74 69  ower).. */.stati
40b0: 63 20 76 6f 69 64 20 72 65 67 5f 61 64 64 72 61  c void reg_addra
40c0: 6e 67 65 28 72 65 67 65 78 5f 74 20 2a 70 72 65  nge(regex_t *pre
40d0: 67 2c 20 69 6e 74 20 6c 6f 77 65 72 2c 20 69 6e  g, int lower, in
40e0: 74 20 75 70 70 65 72 29 0a 7b 0a 09 69 66 20 28  t upper).{..if (
40f0: 6c 6f 77 65 72 20 3e 20 75 70 70 65 72 29 20 7b  lower > upper) {
4100: 0a 09 09 72 65 67 5f 61 64 64 72 61 6e 67 65 28  ...reg_addrange(
4110: 70 72 65 67 2c 20 75 70 70 65 72 2c 20 6c 6f 77  preg, upper, low
4120: 65 72 29 3b 0a 09 7d 0a 09 2f 2a 20 41 64 64 20  er);..}../* Add 
4130: 61 20 72 61 6e 67 65 20 61 73 20 6c 65 6e 67 74  a range as lengt
4140: 68 2c 20 73 74 61 72 74 20 2a 2f 0a 09 72 65 67  h, start */..reg
4150: 63 28 70 72 65 67 2c 20 75 70 70 65 72 20 2d 20  c(preg, upper - 
4160: 6c 6f 77 65 72 20 2b 20 31 29 3b 0a 09 72 65 67  lower + 1);..reg
4170: 63 28 70 72 65 67 2c 20 6c 6f 77 65 72 29 3b 0a  c(preg, lower);.
4180: 7d 0a 0a 2f 2a 2a 0a 20 2a 20 41 64 64 20 61 20  }../**. * Add a 
4190: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
41a0: 6c 69 74 65 72 61 6c 20 73 74 72 69 6e 67 20 61  literal string a
41b0: 73 20 61 20 73 65 74 20 6f 66 20 72 61 6e 67 65  s a set of range
41c0: 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s.. */.static vo
41d0: 69 64 20 72 65 67 5f 61 64 64 72 61 6e 67 65 5f  id reg_addrange_
41e0: 73 74 72 28 72 65 67 65 78 5f 74 20 2a 70 72 65  str(regex_t *pre
41f0: 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  g, const char *s
4200: 74 72 29 0a 7b 0a 09 77 68 69 6c 65 20 28 2a 73  tr).{..while (*s
4210: 74 72 29 20 7b 0a 09 09 72 65 67 5f 61 64 64 72  tr) {...reg_addr
4220: 61 6e 67 65 28 70 72 65 67 2c 20 2a 73 74 72 2c  ange(preg, *str,
4230: 20 2a 73 74 72 29 3b 0a 09 09 73 74 72 2b 2b 3b   *str);...str++;
4240: 0a 09 7d 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 45 78  ..}.}../**. * Ex
4250: 74 72 61 63 74 73 20 74 68 65 20 6e 65 78 74 20  tracts the next 
4260: 75 6e 69 63 6f 64 65 20 63 68 61 72 20 66 72 6f  unicode char fro
4270: 6d 20 75 74 66 38 2e 0a 20 2a 0a 20 2a 20 49 66  m utf8.. *. * If
4280: 20 27 75 70 70 65 72 27 20 69 73 20 73 65 74 2c   'upper' is set,
4290: 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 63 68   converts the ch
42a0: 61 72 20 74 6f 20 75 70 70 65 72 63 61 73 65 2e  ar to uppercase.
42b0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
42c0: 72 65 67 5f 75 74 66 38 5f 74 6f 75 6e 69 63 6f  reg_utf8_tounico
42d0: 64 65 5f 63 61 73 65 28 63 6f 6e 73 74 20 63 68  de_case(const ch
42e0: 61 72 20 2a 73 2c 20 69 6e 74 20 2a 75 63 2c 20  ar *s, int *uc, 
42f0: 69 6e 74 20 75 70 70 65 72 29 0a 7b 0a 09 69 6e  int upper).{..in
4300: 74 20 6c 20 3d 20 75 74 66 38 5f 74 6f 75 6e 69  t l = utf8_touni
4310: 63 6f 64 65 28 73 2c 20 75 63 29 3b 0a 09 69 66  code(s, uc);..if
4320: 20 28 75 70 70 65 72 29 20 7b 0a 09 09 2a 75 63   (upper) {...*uc
4330: 20 3d 20 75 74 66 38 5f 75 70 70 65 72 28 2a 75   = utf8_upper(*u
4340: 63 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 6c  c);..}..return l
4350: 3b 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 43 6f 6e 76  ;.}../**. * Conv
4360: 65 72 74 73 20 61 20 68 65 78 20 64 69 67 69 74  erts a hex digit
4370: 20 74 6f 20 64 65 63 69 6d 61 6c 2e 0a 20 2a 0a   to decimal.. *.
4380: 20 2a 20 52 65 74 75 72 6e 73 20 2d 31 20 66 6f   * Returns -1 fo
4390: 72 20 61 6e 20 69 6e 76 61 6c 69 64 20 68 65 78  r an invalid hex
43a0: 20 64 69 67 69 74 2e 0a 20 2a 2f 0a 73 74 61 74   digit.. */.stat
43b0: 69 63 20 69 6e 74 20 68 65 78 64 69 67 69 74 76  ic int hexdigitv
43c0: 61 6c 28 69 6e 74 20 63 29 0a 7b 0a 09 69 66 20  al(int c).{..if 
43d0: 28 63 20 3e 3d 20 27 30 27 20 26 26 20 63 20 3c  (c >= '0' && c <
43e0: 3d 20 27 39 27 29 0a 09 09 72 65 74 75 72 6e 20  = '9')...return 
43f0: 63 20 2d 20 27 30 27 3b 0a 09 69 66 20 28 63 20  c - '0';..if (c 
4400: 3e 3d 20 27 61 27 20 26 26 20 63 20 3c 3d 20 27  >= 'a' && c <= '
4410: 66 27 29 0a 09 09 72 65 74 75 72 6e 20 63 20 2d  f')...return c -
4420: 20 27 61 27 20 2b 20 31 30 3b 0a 09 69 66 20 28   'a' + 10;..if (
4430: 63 20 3e 3d 20 27 41 27 20 26 26 20 63 20 3c 3d  c >= 'A' && c <=
4440: 20 27 46 27 29 0a 09 09 72 65 74 75 72 6e 20 63   'F')...return c
4450: 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a 09 72 65   - 'A' + 10;..re
4460: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 2a 0a  turn -1;.}../**.
4470: 20 2a 20 50 61 72 73 65 73 20 75 70 20 74 6f 20   * Parses up to 
4480: 27 6e 27 20 68 65 78 20 64 69 67 69 74 73 20 61  'n' hex digits a
4490: 74 20 27 73 27 20 61 6e 64 20 73 74 6f 72 65 73  t 's' and stores
44a0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 2a   the result in *
44b0: 75 63 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  uc.. *. * Return
44c0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
44d0: 68 65 78 20 64 69 67 69 74 73 20 70 61 72 73 65  hex digits parse
44e0: 64 2e 0a 20 2a 20 49 66 20 74 68 65 72 65 20 61  d.. * If there a
44f0: 72 65 20 6e 6f 20 68 65 78 20 64 69 67 69 74 73  re no hex digits
4500: 2c 20 72 65 74 75 72 6e 73 20 30 20 61 6e 64 20  , returns 0 and 
4510: 73 74 6f 72 65 73 20 6e 6f 74 68 69 6e 67 2e 0a  stores nothing..
4520: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
4530: 61 72 73 65 5f 68 65 78 28 63 6f 6e 73 74 20 63  arse_hex(const c
4540: 68 61 72 20 2a 73 2c 20 69 6e 74 20 6e 2c 20 69  har *s, int n, i
4550: 6e 74 20 2a 75 63 29 0a 7b 0a 09 69 6e 74 20 76  nt *uc).{..int v
4560: 61 6c 20 3d 20 30 3b 0a 09 69 6e 74 20 6b 3b 0a  al = 0;..int k;.
4570: 0a 09 66 6f 72 20 28 6b 20 3d 20 30 3b 20 6b 20  ..for (k = 0; k 
4580: 3c 20 6e 3b 20 6b 2b 2b 29 20 7b 0a 09 09 69 6e  < n; k++) {...in
4590: 74 20 63 20 3d 20 68 65 78 64 69 67 69 74 76 61  t c = hexdigitva
45a0: 6c 28 2a 73 2b 2b 29 3b 0a 09 09 69 66 20 28 63  l(*s++);...if (c
45b0: 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 09 62 72 65   == -1) {....bre
45c0: 61 6b 3b 0a 09 09 7d 0a 09 09 76 61 6c 20 3d 20  ak;...}...val = 
45d0: 28 76 61 6c 20 3c 3c 20 34 29 20 7c 20 63 3b 0a  (val << 4) | c;.
45e0: 09 7d 0a 09 69 66 20 28 6b 29 20 7b 0a 09 09 2a  .}..if (k) {...*
45f0: 75 63 20 3d 20 76 61 6c 3b 0a 09 7d 0a 09 72 65  uc = val;..}..re
4600: 74 75 72 6e 20 6b 3b 0a 7d 0a 0a 2f 2a 2a 0a 20  turn k;.}../**. 
4610: 2a 20 43 61 6c 6c 20 66 6f 72 20 63 68 61 72 73  * Call for chars
4620: 20 61 66 74 65 72 20 61 20 62 61 63 6b 6c 61 73   after a backlas
4630: 68 20 74 6f 20 64 65 63 6f 64 65 20 74 68 65 20  h to decode the 
4640: 65 73 63 61 70 65 20 73 65 71 75 65 6e 63 65 2e  escape sequence.
4650: 0a 20 2a 0a 20 2a 20 53 74 6f 72 65 73 20 74 68  . *. * Stores th
4660: 65 20 72 65 73 75 6c 74 20 69 6e 20 2a 63 68 2e  e result in *ch.
4670: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 20 74  . *. * Returns t
4680: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
4690: 65 73 20 63 6f 6e 73 75 6d 65 64 2e 0a 20 2a 2f  es consumed.. */
46a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 67 5f  .static int reg_
46b0: 64 65 63 6f 64 65 5f 65 73 63 61 70 65 28 63 6f  decode_escape(co
46c0: 6e 73 74 20 63 68 61 72 20 2a 73 2c 20 69 6e 74  nst char *s, int
46d0: 20 2a 63 68 29 0a 7b 0a 09 69 6e 74 20 6e 3b 0a   *ch).{..int n;.
46e0: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 30 20  .const char *s0 
46f0: 3d 20 73 3b 0a 0a 09 2a 63 68 20 3d 20 2a 73 2b  = s;...*ch = *s+
4700: 2b 3b 0a 0a 09 73 77 69 74 63 68 20 28 2a 63 68  +;...switch (*ch
4710: 29 20 7b 0a 09 09 63 61 73 65 20 27 62 27 3a 20  ) {...case 'b': 
4720: 2a 63 68 20 3d 20 27 5c 62 27 3b 20 62 72 65 61  *ch = '\b'; brea
4730: 6b 3b 0a 09 09 63 61 73 65 20 27 65 27 3a 20 2a  k;...case 'e': *
4740: 63 68 20 3d 20 32 37 3b 20 62 72 65 61 6b 3b 0a  ch = 27; break;.
4750: 09 09 63 61 73 65 20 27 66 27 3a 20 2a 63 68 20  ..case 'f': *ch 
4760: 3d 20 27 5c 66 27 3b 20 62 72 65 61 6b 3b 0a 09  = '\f'; break;..
4770: 09 63 61 73 65 20 27 6e 27 3a 20 2a 63 68 20 3d  .case 'n': *ch =
4780: 20 27 5c 6e 27 3b 20 62 72 65 61 6b 3b 0a 09 09   '\n'; break;...
4790: 63 61 73 65 20 27 72 27 3a 20 2a 63 68 20 3d 20  case 'r': *ch = 
47a0: 27 5c 72 27 3b 20 62 72 65 61 6b 3b 0a 09 09 63  '\r'; break;...c
47b0: 61 73 65 20 27 74 27 3a 20 2a 63 68 20 3d 20 27  ase 't': *ch = '
47c0: 5c 74 27 3b 20 62 72 65 61 6b 3b 0a 09 09 63 61  \t'; break;...ca
47d0: 73 65 20 27 76 27 3a 20 2a 63 68 20 3d 20 27 5c  se 'v': *ch = '\
47e0: 76 27 3b 20 62 72 65 61 6b 3b 0a 09 09 63 61 73  v'; break;...cas
47f0: 65 20 27 75 27 3a 0a 09 09 09 69 66 20 28 2a 73  e 'u':....if (*s
4800: 20 3d 3d 20 27 7b 27 29 20 7b 0a 09 09 09 09 2f   == '{') {...../
4810: 2a 20 45 78 70 65 63 74 20 5c 75 7b 4e 4e 4e 4e  * Expect \u{NNNN
4820: 7d 20 2a 2f 0a 09 09 09 09 6e 20 3d 20 70 61 72  } */.....n = par
4830: 73 65 5f 68 65 78 28 73 20 2b 20 31 2c 20 36 2c  se_hex(s + 1, 6,
4840: 20 63 68 29 3b 0a 09 09 09 09 69 66 20 28 6e 20   ch);.....if (n 
4850: 3e 20 30 20 26 26 20 73 5b 6e 20 2b 20 31 5d 20  > 0 && s[n + 1] 
4860: 3d 3d 20 27 7d 27 20 26 26 20 2a 63 68 20 3e 3d  == '}' && *ch >=
4870: 20 30 20 26 26 20 2a 63 68 20 3c 3d 20 30 78 31   0 && *ch <= 0x1
4880: 66 66 66 66 66 29 20 7b 0a 09 09 09 09 09 73 20  fffff) {......s 
4890: 2b 3d 20 6e 20 2b 20 32 3b 0a 09 09 09 09 7d 0a  += n + 2;.....}.
48a0: 09 09 09 09 65 6c 73 65 20 7b 0a 09 09 09 09 09  ....else {......
48b0: 2f 2a 20 49 6e 76 61 6c 69 64 2c 20 73 6f 20 6a  /* Invalid, so j
48c0: 75 73 74 20 74 72 65 61 74 20 61 73 20 61 6e 20  ust treat as an 
48d0: 65 73 63 61 70 65 64 20 27 75 27 20 2a 2f 0a 09  escaped 'u' */..
48e0: 09 09 09 09 2a 63 68 20 3d 20 27 75 27 3b 0a 09  ....*ch = 'u';..
48f0: 09 09 09 7d 0a 09 09 09 7d 0a 09 09 09 65 6c 73  ...}....}....els
4900: 65 20 69 66 20 28 28 6e 20 3d 20 70 61 72 73 65  e if ((n = parse
4910: 5f 68 65 78 28 73 2c 20 34 2c 20 63 68 29 29 20  _hex(s, 4, ch)) 
4920: 3e 20 30 29 20 7b 0a 09 09 09 09 73 20 2b 3d 20  > 0) {.....s += 
4930: 6e 3b 0a 09 09 09 7d 0a 09 09 09 62 72 65 61 6b  n;....}....break
4940: 3b 0a 09 09 63 61 73 65 20 27 55 27 3a 0a 09 09  ;...case 'U':...
4950: 09 69 66 20 28 28 6e 20 3d 20 70 61 72 73 65 5f  .if ((n = parse_
4960: 68 65 78 28 73 2c 20 38 2c 20 63 68 29 29 20 3e  hex(s, 8, ch)) >
4970: 20 30 29 20 7b 0a 09 09 09 09 73 20 2b 3d 20 6e   0) {.....s += n
4980: 3b 0a 09 09 09 7d 0a 09 09 63 61 73 65 20 27 78  ;....}...case 'x
4990: 27 3a 0a 09 09 09 69 66 20 28 28 6e 20 3d 20 70  ':....if ((n = p
49a0: 61 72 73 65 5f 68 65 78 28 73 2c 20 32 2c 20 63  arse_hex(s, 2, c
49b0: 68 29 29 20 3e 20 30 29 20 7b 0a 09 09 09 09 73  h)) > 0) {.....s
49c0: 20 2b 3d 20 6e 3b 0a 09 09 09 7d 0a 09 09 09 62   += n;....}....b
49d0: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 27 5c 30  reak;...case '\0
49e0: 27 3a 0a 09 09 09 73 2d 2d 3b 0a 09 09 09 2a 63  ':....s--;....*c
49f0: 68 20 3d 20 27 5c 5c 27 3b 0a 09 09 09 62 72 65  h = '\\';....bre
4a00: 61 6b 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 73  ak;..}..return s
4a10: 20 2d 20 73 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20   - s0;.}../*. - 
4a20: 72 65 67 61 74 6f 6d 20 2d 20 74 68 65 20 6c 6f  regatom - the lo
4a30: 77 65 73 74 20 6c 65 76 65 6c 0a 20 2a 0a 20 2a  west level. *. *
4a40: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20   Optimization:  
4a50: 67 6f 62 62 6c 65 73 20 61 6e 20 65 6e 74 69 72  gobbles an entir
4a60: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 72  e sequence of or
4a70: 64 69 6e 61 72 79 20 63 68 61 72 61 63 74 65 72  dinary character
4a80: 73 20 73 6f 20 74 68 61 74 0a 20 2a 20 69 74 20  s so that. * it 
4a90: 63 61 6e 20 74 75 72 6e 20 74 68 65 6d 20 69 6e  can turn them in
4aa0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 6e 6f 64 65  to a single node
4ab0: 2c 20 77 68 69 63 68 20 69 73 20 73 6d 61 6c 6c  , which is small
4ac0: 65 72 20 74 6f 20 73 74 6f 72 65 20 61 6e 64 0a  er to store and.
4ad0: 20 2a 20 66 61 73 74 65 72 20 74 6f 20 72 75 6e   * faster to run
4ae0: 2e 20 20 42 61 63 6b 73 6c 61 73 68 65 64 20 63  .  Backslashed c
4af0: 68 61 72 61 63 74 65 72 73 20 61 72 65 20 65 78  haracters are ex
4b00: 63 65 70 74 69 6f 6e 73 2c 20 65 61 63 68 20 62  ceptions, each b
4b10: 65 63 6f 6d 69 6e 67 20 61 0a 20 2a 20 73 65 70  ecoming a. * sep
4b20: 61 72 61 74 65 20 6e 6f 64 65 3b 20 74 68 65 20  arate node; the 
4b30: 63 6f 64 65 20 69 73 20 73 69 6d 70 6c 65 72 20  code is simpler 
4b40: 74 68 61 74 20 77 61 79 20 61 6e 64 20 69 74 27  that way and it'
4b50: 73 20 6e 6f 74 20 77 6f 72 74 68 20 66 69 78 69  s not worth fixi
4b60: 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ng.. */.static i
4b70: 6e 74 20 72 65 67 61 74 6f 6d 28 72 65 67 65 78  nt regatom(regex
4b80: 5f 74 20 2a 70 72 65 67 2c 20 69 6e 74 20 2a 66  _t *preg, int *f
4b90: 6c 61 67 70 29 0a 7b 0a 09 69 6e 74 20 72 65 74  lagp).{..int ret
4ba0: 3b 0a 09 69 6e 74 20 66 6c 61 67 73 3b 0a 09 69  ;..int flags;..i
4bb0: 6e 74 20 6e 6f 63 61 73 65 20 3d 20 28 70 72 65  nt nocase = (pre
4bc0: 67 2d 3e 63 66 6c 61 67 73 20 26 20 52 45 47 5f  g->cflags & REG_
4bd0: 49 43 41 53 45 29 3b 0a 0a 09 69 6e 74 20 63 68  ICASE);...int ch
4be0: 3b 0a 09 69 6e 74 20 6e 20 3d 20 72 65 67 5f 75  ;..int n = reg_u
4bf0: 74 66 38 5f 74 6f 75 6e 69 63 6f 64 65 5f 63 61  tf8_tounicode_ca
4c00: 73 65 28 70 72 65 67 2d 3e 72 65 67 70 61 72 73  se(preg->regpars
4c10: 65 2c 20 26 63 68 2c 20 6e 6f 63 61 73 65 29 3b  e, &ch, nocase);
4c20: 0a 0a 09 2a 66 6c 61 67 70 20 3d 20 57 4f 52 53  ...*flagp = WORS
4c30: 54 3b 09 09 2f 2a 20 54 65 6e 74 61 74 69 76 65  T;../* Tentative
4c40: 6c 79 2e 20 2a 2f 0a 0a 09 70 72 65 67 2d 3e 72  ly. */...preg->r
4c50: 65 67 70 61 72 73 65 20 2b 3d 20 6e 3b 0a 09 73  egparse += n;..s
4c60: 77 69 74 63 68 20 28 63 68 29 20 7b 0a 09 2f 2a  witch (ch) {../*
4c70: 20 46 49 58 4d 45 3a 20 74 68 65 73 65 20 63 68   FIXME: these ch
4c80: 61 72 73 20 6f 6e 6c 79 20 68 61 76 65 20 6d 65  ars only have me
4c90: 61 6e 69 6e 67 20 61 74 20 62 65 67 2f 65 6e 64  aning at beg/end
4ca0: 20 6f 66 20 70 61 74 3f 20 2a 2f 0a 09 63 61 73   of pat? */..cas
4cb0: 65 20 27 5e 27 3a 0a 09 09 72 65 74 20 3d 20 72  e '^':...ret = r
4cc0: 65 67 6e 6f 64 65 28 70 72 65 67 2c 20 42 4f 4c  egnode(preg, BOL
4cd0: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73  );...break;..cas
4ce0: 65 20 27 24 27 3a 0a 09 09 72 65 74 20 3d 20 72  e '$':...ret = r
4cf0: 65 67 6e 6f 64 65 28 70 72 65 67 2c 20 45 4f 4c  egnode(preg, EOL
4d00: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73  );...break;..cas
4d10: 65 20 27 2e 27 3a 0a 09 09 72 65 74 20 3d 20 72  e '.':...ret = r
4d20: 65 67 6e 6f 64 65 28 70 72 65 67 2c 20 41 4e 59  egnode(preg, ANY
4d30: 29 3b 0a 09 09 2a 66 6c 61 67 70 20 7c 3d 20 48  );...*flagp |= H
4d40: 41 53 57 49 44 54 48 7c 53 49 4d 50 4c 45 3b 0a  ASWIDTH|SIMPLE;.
4d50: 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 27  ..break;..case '
4d60: 5b 27 3a 20 7b 0a 09 09 09 63 6f 6e 73 74 20 63  [': {....const c
4d70: 68 61 72 20 2a 70 61 74 74 65 72 6e 20 3d 20 70  har *pattern = p
4d80: 72 65 67 2d 3e 72 65 67 70 61 72 73 65 3b 0a 0a  reg->regparse;..
4d90: 09 09 09 69 66 20 28 2a 70 61 74 74 65 72 6e 20  ...if (*pattern 
4da0: 3d 3d 20 27 5e 27 29 20 7b 09 2f 2a 20 43 6f 6d  == '^') {./* Com
4db0: 70 6c 65 6d 65 6e 74 20 6f 66 20 72 61 6e 67 65  plement of range
4dc0: 2e 20 2a 2f 0a 09 09 09 09 72 65 74 20 3d 20 72  . */.....ret = r
4dd0: 65 67 6e 6f 64 65 28 70 72 65 67 2c 20 41 4e 59  egnode(preg, ANY
4de0: 42 55 54 29 3b 0a 09 09 09 09 70 61 74 74 65 72  BUT);.....patter
4df0: 6e 2b 2b 3b 0a 09 09 09 7d 20 65 6c 73 65 0a 09  n++;....} else..
4e00: 09 09 09 72 65 74 20 3d 20 72 65 67 6e 6f 64 65  ...ret = regnode
4e10: 28 70 72 65 67 2c 20 41 4e 59 4f 46 29 3b 0a 0a  (preg, ANYOF);..
4e20: 09 09 09 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .../* Special ca
4e30: 73 65 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  se. If the first
4e40: 20 63 68 61 72 20 69 73 20 27 5d 27 20 6f 72 20   char is ']' or 
4e50: 27 2d 27 2c 20 69 74 20 69 73 20 70 61 72 74 20  '-', it is part 
4e60: 6f 66 20 74 68 65 20 73 65 74 20 2a 2f 0a 09 09  of the set */...
4e70: 09 69 66 20 28 2a 70 61 74 74 65 72 6e 20 3d 3d  .if (*pattern ==
4e80: 20 27 5d 27 20 7c 7c 20 2a 70 61 74 74 65 72 6e   ']' || *pattern
4e90: 20 3d 3d 20 27 2d 27 29 20 7b 0a 09 09 09 09 72   == '-') {.....r
4ea0: 65 67 5f 61 64 64 72 61 6e 67 65 28 70 72 65 67  eg_addrange(preg
4eb0: 2c 20 2a 70 61 74 74 65 72 6e 2c 20 2a 70 61 74  , *pattern, *pat
4ec0: 74 65 72 6e 29 3b 0a 09 09 09 09 70 61 74 74 65  tern);.....patte
4ed0: 72 6e 2b 2b 3b 0a 09 09 09 7d 0a 0a 09 09 09 77  rn++;....}.....w
4ee0: 68 69 6c 65 20 28 2a 70 61 74 74 65 72 6e 20 26  hile (*pattern &
4ef0: 26 20 2a 70 61 74 74 65 72 6e 20 21 3d 20 27 5d  & *pattern != ']
4f00: 27 29 20 7b 0a 09 09 09 09 2f 2a 20 49 73 20 74  ') {...../* Is t
4f10: 68 69 73 20 61 20 72 61 6e 67 65 3f 20 61 2d 7a  his a range? a-z
4f20: 20 2a 2f 0a 09 09 09 09 69 6e 74 20 73 74 61 72   */.....int star
4f30: 74 3b 0a 09 09 09 09 69 6e 74 20 65 6e 64 3b 0a  t;.....int end;.
4f40: 0a 09 09 09 09 70 61 74 74 65 72 6e 20 2b 3d 20  .....pattern += 
4f50: 72 65 67 5f 75 74 66 38 5f 74 6f 75 6e 69 63 6f  reg_utf8_tounico
4f60: 64 65 5f 63 61 73 65 28 70 61 74 74 65 72 6e 2c  de_case(pattern,
4f70: 20 26 73 74 61 72 74 2c 20 6e 6f 63 61 73 65 29   &start, nocase)
4f80: 3b 0a 09 09 09 09 69 66 20 28 73 74 61 72 74 20  ;.....if (start 
4f90: 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 09 09 09 09  == '\\') {......
4fa0: 70 61 74 74 65 72 6e 20 2b 3d 20 72 65 67 5f 64  pattern += reg_d
4fb0: 65 63 6f 64 65 5f 65 73 63 61 70 65 28 70 61 74  ecode_escape(pat
4fc0: 74 65 72 6e 2c 20 26 73 74 61 72 74 29 3b 0a 09  tern, &start);..
4fd0: 09 09 09 09 69 66 20 28 73 74 61 72 74 20 3d 3d  ....if (start ==
4fe0: 20 30 29 20 7b 0a 09 09 09 09 09 09 70 72 65 67   0) {.......preg
4ff0: 2d 3e 65 72 72 20 3d 20 52 45 47 5f 45 52 52 5f  ->err = REG_ERR_
5000: 4e 55 4c 4c 5f 43 48 41 52 3b 0a 09 09 09 09 09  NULL_CHAR;......
5010: 09 72 65 74 75 72 6e 20 30 3b 0a 09 09 09 09 09  .return 0;......
5020: 7d 0a 09 09 09 09 7d 0a 09 09 09 09 69 66 20 28  }.....}.....if (
5030: 70 61 74 74 65 72 6e 5b 30 5d 20 3d 3d 20 27 2d  pattern[0] == '-
5040: 27 20 26 26 20 70 61 74 74 65 72 6e 5b 31 5d 20  ' && pattern[1] 
5050: 26 26 20 70 61 74 74 65 72 6e 5b 31 5d 20 21 3d  && pattern[1] !=
5060: 20 27 5d 27 29 20 7b 0a 09 09 09 09 09 2f 2a 20   ']') {....../* 
5070: 73 6b 69 70 20 27 2d 27 20 2a 2f 0a 09 09 09 09  skip '-' */.....
5080: 09 70 61 74 74 65 72 6e 20 2b 3d 20 75 74 66 38  .pattern += utf8
5090: 5f 74 6f 75 6e 69 63 6f 64 65 28 70 61 74 74 65  _tounicode(patte
50a0: 72 6e 2c 20 26 65 6e 64 29 3b 0a 09 09 09 09 09  rn, &end);......
50b0: 70 61 74 74 65 72 6e 20 2b 3d 20 72 65 67 5f 75  pattern += reg_u
50c0: 74 66 38 5f 74 6f 75 6e 69 63 6f 64 65 5f 63 61  tf8_tounicode_ca
50d0: 73 65 28 70 61 74 74 65 72 6e 2c 20 26 65 6e 64  se(pattern, &end
50e0: 2c 20 6e 6f 63 61 73 65 29 3b 0a 09 09 09 09 09  , nocase);......
50f0: 69 66 20 28 65 6e 64 20 3d 3d 20 27 5c 5c 27 29  if (end == '\\')
5100: 20 7b 0a 09 09 09 09 09 09 70 61 74 74 65 72 6e   {.......pattern
5110: 20 2b 3d 20 72 65 67 5f 64 65 63 6f 64 65 5f 65   += reg_decode_e
5120: 73 63 61 70 65 28 70 61 74 74 65 72 6e 2c 20 26  scape(pattern, &
5130: 65 6e 64 29 3b 0a 09 09 09 09 09 09 69 66 20 28  end);.......if (
5140: 65 6e 64 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  end == 0) {.....
5150: 09 09 09 70 72 65 67 2d 3e 65 72 72 20 3d 20 52  ...preg->err = R
5160: 45 47 5f 45 52 52 5f 4e 55 4c 4c 5f 43 48 41 52  EG_ERR_NULL_CHAR
5170: 3b 0a 09 09 09 09 09 09 09 72 65 74 75 72 6e 20  ;........return 
5180: 30 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  0;.......}......
5190: 7d 0a 0a 09 09 09 09 09 72 65 67 5f 61 64 64 72  }.......reg_addr
51a0: 61 6e 67 65 28 70 72 65 67 2c 20 73 74 61 72 74  ange(preg, start
51b0: 2c 20 65 6e 64 29 3b 0a 09 09 09 09 09 63 6f 6e  , end);......con
51c0: 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 09 09 09  tinue;.....}....
51d0: 09 69 66 20 28 73 74 61 72 74 20 3d 3d 20 27 5b  .if (start == '[
51e0: 27 29 20 7b 0a 09 09 09 09 09 69 66 20 28 73 74  ') {......if (st
51f0: 72 6e 63 6d 70 28 70 61 74 74 65 72 6e 2c 20 22  rncmp(pattern, "
5200: 3a 61 6c 70 68 61 3a 5d 22 2c 20 38 29 20 3d 3d  :alpha:]", 8) ==
5210: 20 30 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28   0) {.......if (
5220: 28 70 72 65 67 2d 3e 63 66 6c 61 67 73 20 26 20  (preg->cflags & 
5230: 52 45 47 5f 49 43 41 53 45 29 20 3d 3d 20 30 29  REG_ICASE) == 0)
5240: 20 7b 0a 09 09 09 09 09 09 09 72 65 67 5f 61 64   {........reg_ad
5250: 64 72 61 6e 67 65 28 70 72 65 67 2c 20 27 61 27  drange(preg, 'a'
5260: 2c 20 27 7a 27 29 3b 0a 09 09 09 09 09 09 7d 0a  , 'z');.......}.
5270: 09 09 09 09 09 09 72 65 67 5f 61 64 64 72 61 6e  ......reg_addran
5280: 67 65 28 70 72 65 67 2c 20 27 41 27 2c 20 27 5a  ge(preg, 'A', 'Z
5290: 27 29 3b 0a 09 09 09 09 09 09 70 61 74 74 65 72  ');.......patter
52a0: 6e 20 2b 3d 20 38 3b 0a 09 09 09 09 09 09 63 6f  n += 8;.......co
52b0: 6e 74 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 09  ntinue;......}..
52c0: 09 09 09 09 69 66 20 28 73 74 72 6e 63 6d 70 28  ....if (strncmp(
52d0: 70 61 74 74 65 72 6e 2c 20 22 3a 61 6c 6e 75 6d  pattern, ":alnum
52e0: 3a 5d 22 2c 20 38 29 20 3d 3d 20 30 29 20 7b 0a  :]", 8) == 0) {.
52f0: 09 09 09 09 09 09 69 66 20 28 28 70 72 65 67 2d  ......if ((preg-
5300: 3e 63 66 6c 61 67 73 20 26 20 52 45 47 5f 49 43  >cflags & REG_IC
5310: 41 53 45 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09  ASE) == 0) {....
5320: 09 09 09 09 72 65 67 5f 61 64 64 72 61 6e 67 65  ....reg_addrange
5330: 28 70 72 65 67 2c 20 27 61 27 2c 20 27 7a 27 29  (preg, 'a', 'z')
5340: 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09  ;.......}.......
5350: 72 65 67 5f 61 64 64 72 61 6e 67 65 28 70 72 65  reg_addrange(pre
5360: 67 2c 20 27 41 27 2c 20 27 5a 27 29 3b 0a 09 09  g, 'A', 'Z');...
5370: 09 09 09 09 72 65 67 5f 61 64 64 72 61 6e 67 65  ....reg_addrange
5380: 28 70 72 65 67 2c 20 27 30 27 2c 20 27 39 27 29  (preg, '0', '9')
5390: 3b 0a 09 09 09 09 09 09 70 61 74 74 65 72 6e 20  ;.......pattern 
53a0: 2b 3d 20 38 3b 0a 09 09 09 09 09 09 63 6f 6e 74  += 8;.......cont
53b0: 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 09 09 09  inue;......}....
53c0: 09 09 69 66 20 28 73 74 72 6e 63 6d 70 28 70 61  ..if (strncmp(pa
53d0: 74 74 65 72 6e 2c 20 22 3a 73 70 61 63 65 3a 5d  ttern, ":space:]
53e0: 22 2c 20 38 29 20 3d 3d 20 30 29 20 7b 0a 09 09  ", 8) == 0) {...
53f0: 09 09 09 09 72 65 67 5f 61 64 64 72 61 6e 67 65  ....reg_addrange
5400: 5f 73 74 72 28 70 72 65 67 2c 20 22 20 5c 74 5c  _str(preg, " \t\
5410: 72 5c 6e 5c 66 5c 76 22 29 3b 0a 09 09 09 09 09  r\n\f\v");......
5420: 09 70 61 74 74 65 72 6e 20 2b 3d 20 38 3b 0a 09  .pattern += 8;..
5430: 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
5440: 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09  ....}.....}.....
5450: 2f 2a 20 4e 6f 74 20 61 20 72 61 6e 67 65 2c 20  /* Not a range, 
5460: 73 6f 20 6a 75 73 74 20 61 64 64 20 74 68 65 20  so just add the 
5470: 63 68 61 72 20 2a 2f 0a 09 09 09 09 72 65 67 5f  char */.....reg_
5480: 61 64 64 72 61 6e 67 65 28 70 72 65 67 2c 20 73  addrange(preg, s
5490: 74 61 72 74 2c 20 73 74 61 72 74 29 3b 0a 09 09  tart, start);...
54a0: 09 7d 0a 09 09 09 72 65 67 63 28 70 72 65 67 2c  .}....regc(preg,
54b0: 20 27 5c 30 27 29 3b 0a 0a 09 09 09 69 66 20 28   '\0');.....if (
54c0: 2a 70 61 74 74 65 72 6e 29 20 7b 0a 09 09 09 09  *pattern) {.....
54d0: 70 61 74 74 65 72 6e 2b 2b 3b 0a 09 09 09 7d 0a  pattern++;....}.
54e0: 09 09 09 70 72 65 67 2d 3e 72 65 67 70 61 72 73  ...preg->regpars
54f0: 65 20 3d 20 70 61 74 74 65 72 6e 3b 0a 0a 09 09  e = pattern;....
5500: 09 2a 66 6c 61 67 70 20 7c 3d 20 48 41 53 57 49  .*flagp |= HASWI
5510: 44 54 48 7c 53 49 4d 50 4c 45 3b 0a 09 09 7d 0a  DTH|SIMPLE;...}.
5520: 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 27  ..break;..case '
5530: 28 27 3a 0a 09 09 72 65 74 20 3d 20 72 65 67 28  (':...ret = reg(
5540: 70 72 65 67 2c 20 31 2c 20 26 66 6c 61 67 73 29  preg, 1, &flags)
5550: 3b 0a 09 09 69 66 20 28 72 65 74 20 3d 3d 20 30  ;...if (ret == 0
5560: 29 0a 09 09 09 72 65 74 75 72 6e 20 30 3b 0a 09  )....return 0;..
5570: 09 2a 66 6c 61 67 70 20 7c 3d 20 66 6c 61 67 73  .*flagp |= flags
5580: 26 28 48 41 53 57 49 44 54 48 7c 53 50 53 54 41  &(HASWIDTH|SPSTA
5590: 52 54 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63  RT);...break;..c
55a0: 61 73 65 20 27 5c 30 27 3a 0a 09 63 61 73 65 20  ase '\0':..case 
55b0: 27 7c 27 3a 0a 09 63 61 73 65 20 27 29 27 3a 0a  '|':..case ')':.
55c0: 09 09 70 72 65 67 2d 3e 65 72 72 20 3d 20 52 45  ..preg->err = RE
55d0: 47 5f 45 52 52 5f 49 4e 54 45 52 4e 41 4c 3b 0a  G_ERR_INTERNAL;.
55e0: 09 09 72 65 74 75 72 6e 20 30 3b 09 2f 2a 20 53  ..return 0;./* S
55f0: 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 63 61  upposed to be ca
5600: 75 67 68 74 20 65 61 72 6c 69 65 72 2e 20 2a 2f  ught earlier. */
5610: 0a 09 63 61 73 65 20 27 3f 27 3a 0a 09 63 61 73  ..case '?':..cas
5620: 65 20 27 2b 27 3a 0a 09 63 61 73 65 20 27 2a 27  e '+':..case '*'
5630: 3a 0a 09 63 61 73 65 20 27 7b 27 3a 0a 09 09 70  :..case '{':...p
5640: 72 65 67 2d 3e 65 72 72 20 3d 20 52 45 47 5f 45  reg->err = REG_E
5650: 52 52 5f 43 4f 55 4e 54 5f 46 4f 4c 4c 4f 57 53  RR_COUNT_FOLLOWS
5660: 5f 4e 4f 54 48 49 4e 47 3b 0a 09 09 72 65 74 75  _NOTHING;...retu
5670: 72 6e 20 30 3b 0a 09 63 61 73 65 20 27 5c 5c 27  rn 0;..case '\\'
5680: 3a 0a 09 09 73 77 69 74 63 68 20 28 2a 70 72 65  :...switch (*pre
5690: 67 2d 3e 72 65 67 70 61 72 73 65 2b 2b 29 20 7b  g->regparse++) {
56a0: 0a 09 09 63 61 73 65 20 27 5c 30 27 3a 0a 09 09  ...case '\0':...
56b0: 09 70 72 65 67 2d 3e 65 72 72 20 3d 20 52 45 47  .preg->err = REG
56c0: 5f 45 52 52 5f 54 52 41 49 4c 49 4e 47 5f 42 41  _ERR_TRAILING_BA
56d0: 43 4b 53 4c 41 53 48 3b 0a 09 09 09 72 65 74 75  CKSLASH;....retu
56e0: 72 6e 20 30 3b 0a 09 09 63 61 73 65 20 27 3c 27  rn 0;...case '<'
56f0: 3a 0a 09 09 63 61 73 65 20 27 6d 27 3a 0a 09 09  :...case 'm':...
5700: 09 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28 70  .ret = regnode(p
5710: 72 65 67 2c 20 57 4f 52 44 41 29 3b 0a 09 09 09  reg, WORDA);....
5720: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 27 3e  break;...case '>
5730: 27 3a 0a 09 09 63 61 73 65 20 27 4d 27 3a 0a 09  ':...case 'M':..
5740: 09 09 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28  ..ret = regnode(
5750: 70 72 65 67 2c 20 57 4f 52 44 5a 29 3b 0a 09 09  preg, WORDZ);...
5760: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 27  .break;...case '
5770: 64 27 3a 0a 09 09 09 72 65 74 20 3d 20 72 65 67  d':....ret = reg
5780: 6e 6f 64 65 28 70 72 65 67 2c 20 41 4e 59 4f 46  node(preg, ANYOF
5790: 29 3b 0a 09 09 09 72 65 67 5f 61 64 64 72 61 6e  );....reg_addran
57a0: 67 65 28 70 72 65 67 2c 20 27 30 27 2c 20 27 39  ge(preg, '0', '9
57b0: 27 29 3b 0a 09 09 09 72 65 67 63 28 70 72 65 67  ');....regc(preg
57c0: 2c 20 27 5c 30 27 29 3b 0a 09 09 09 2a 66 6c 61  , '\0');....*fla
57d0: 67 70 20 7c 3d 20 48 41 53 57 49 44 54 48 7c 53  gp |= HASWIDTH|S
57e0: 49 4d 50 4c 45 3b 0a 09 09 09 62 72 65 61 6b 3b  IMPLE;....break;
57f0: 0a 09 09 63 61 73 65 20 27 77 27 3a 0a 09 09 09  ...case 'w':....
5800: 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28 70 72  ret = regnode(pr
5810: 65 67 2c 20 41 4e 59 4f 46 29 3b 0a 09 09 09 69  eg, ANYOF);....i
5820: 66 20 28 28 70 72 65 67 2d 3e 63 66 6c 61 67 73  f ((preg->cflags
5830: 20 26 20 52 45 47 5f 49 43 41 53 45 29 20 3d 3d   & REG_ICASE) ==
5840: 20 30 29 20 7b 0a 09 09 09 09 72 65 67 5f 61 64   0) {.....reg_ad
5850: 64 72 61 6e 67 65 28 70 72 65 67 2c 20 27 61 27  drange(preg, 'a'
5860: 2c 20 27 7a 27 29 3b 0a 09 09 09 7d 0a 09 09 09  , 'z');....}....
5870: 72 65 67 5f 61 64 64 72 61 6e 67 65 28 70 72 65  reg_addrange(pre
5880: 67 2c 20 27 41 27 2c 20 27 5a 27 29 3b 0a 09 09  g, 'A', 'Z');...
5890: 09 72 65 67 5f 61 64 64 72 61 6e 67 65 28 70 72  .reg_addrange(pr
58a0: 65 67 2c 20 27 30 27 2c 20 27 39 27 29 3b 0a 09  eg, '0', '9');..
58b0: 09 09 72 65 67 5f 61 64 64 72 61 6e 67 65 28 70  ..reg_addrange(p
58c0: 72 65 67 2c 20 27 5f 27 2c 20 27 5f 27 29 3b 0a  reg, '_', '_');.
58d0: 09 09 09 72 65 67 63 28 70 72 65 67 2c 20 27 5c  ...regc(preg, '\
58e0: 30 27 29 3b 0a 09 09 09 2a 66 6c 61 67 70 20 7c  0');....*flagp |
58f0: 3d 20 48 41 53 57 49 44 54 48 7c 53 49 4d 50 4c  = HASWIDTH|SIMPL
5900: 45 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  E;....break;...c
5910: 61 73 65 20 27 73 27 3a 0a 09 09 09 72 65 74 20  ase 's':....ret 
5920: 3d 20 72 65 67 6e 6f 64 65 28 70 72 65 67 2c 20  = regnode(preg, 
5930: 41 4e 59 4f 46 29 3b 0a 09 09 09 72 65 67 5f 61  ANYOF);....reg_a
5940: 64 64 72 61 6e 67 65 5f 73 74 72 28 70 72 65 67  ddrange_str(preg
5950: 2c 22 20 5c 74 5c 72 5c 6e 5c 66 5c 76 22 29 3b  ," \t\r\n\f\v");
5960: 0a 09 09 09 72 65 67 63 28 70 72 65 67 2c 20 27  ....regc(preg, '
5970: 5c 30 27 29 3b 0a 09 09 09 2a 66 6c 61 67 70 20  \0');....*flagp 
5980: 7c 3d 20 48 41 53 57 49 44 54 48 7c 53 49 4d 50  |= HASWIDTH|SIMP
5990: 4c 45 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  LE;....break;...
59a0: 2f 2a 20 46 49 58 4d 45 3a 20 53 6f 6d 65 64 61  /* FIXME: Someda
59b0: 79 20 68 61 6e 64 6c 65 20 5c 31 2c 20 5c 32 2c  y handle \1, \2,
59c0: 20 2e 2e 2e 20 2a 2f 0a 09 09 64 65 66 61 75 6c   ... */...defaul
59d0: 74 3a 0a 09 09 09 2f 2a 20 48 61 6e 64 6c 65 20  t:..../* Handle 
59e0: 67 65 6e 65 72 61 6c 20 71 75 6f 74 65 64 20 63  general quoted c
59f0: 68 61 72 73 20 69 6e 20 65 78 61 63 74 2d 6d 61  hars in exact-ma
5a00: 74 63 68 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 09  tch routine */..
5a10: 09 09 2f 2a 20 42 61 63 6b 20 75 70 20 74 6f 20  ../* Back up to 
5a20: 69 6e 63 6c 75 64 65 20 74 68 65 20 62 61 63 6b  include the back
5a30: 73 6c 61 73 68 20 2a 2f 0a 09 09 09 70 72 65 67  slash */....preg
5a40: 2d 3e 72 65 67 70 61 72 73 65 2d 2d 3b 0a 09 09  ->regparse--;...
5a50: 09 67 6f 74 6f 20 64 65 5f 66 61 75 6c 74 3b 0a  .goto de_fault;.
5a60: 09 09 7d 0a 09 09 62 72 65 61 6b 3b 0a 09 64 65  ..}...break;..de
5a70: 5f 66 61 75 6c 74 3a 0a 09 64 65 66 61 75 6c 74  _fault:..default
5a80: 3a 20 7b 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20  : {..../*.... * 
5a90: 45 6e 63 6f 64 65 20 61 20 73 74 72 69 6e 67 20  Encode a string 
5aa0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 74 6f  of characters to
5ab0: 20 62 65 20 6d 61 74 63 68 65 64 20 65 78 61 63   be matched exac
5ac0: 74 6c 79 2e 0a 09 09 09 20 2a 2f 0a 09 09 09 69  tly..... */....i
5ad0: 6e 74 20 61 64 64 65 64 20 3d 20 30 3b 0a 0a 09  nt added = 0;...
5ae0: 09 09 2f 2a 20 42 61 63 6b 20 75 70 20 74 6f 20  ../* Back up to 
5af0: 70 69 63 6b 20 75 70 20 74 68 65 20 66 69 72 73  pick up the firs
5b00: 74 20 63 68 61 72 20 6f 66 20 69 6e 74 65 72 65  t char of intere
5b10: 73 74 20 2a 2f 0a 09 09 09 70 72 65 67 2d 3e 72  st */....preg->r
5b20: 65 67 70 61 72 73 65 20 2d 3d 20 6e 3b 0a 0a 09  egparse -= n;...
5b30: 09 09 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28  ..ret = regnode(
5b40: 70 72 65 67 2c 20 45 58 41 43 54 4c 59 29 3b 0a  preg, EXACTLY);.
5b50: 0a 09 09 09 2f 2a 20 4e 6f 74 65 20 74 68 61 74  ..../* Note that
5b60: 20 61 20 4d 45 54 41 20 6f 70 65 72 61 74 6f 72   a META operator
5b70: 20 73 75 63 68 20 61 73 20 3f 20 6f 72 20 2a 20   such as ? or * 
5b80: 63 6f 6e 73 75 6d 65 73 20 74 68 65 0a 09 09 09  consumes the....
5b90: 20 2a 20 70 72 65 63 65 64 69 6e 67 20 63 68 61   * preceding cha
5ba0: 72 2e 0a 09 09 09 20 2a 20 54 68 75 73 20 77 65  r..... * Thus we
5bb0: 20 6d 75 73 74 20 62 65 20 63 61 72 65 66 75 6c   must be careful
5bc0: 20 74 6f 20 6c 6f 6f 6b 20 61 68 65 61 64 20 62   to look ahead b
5bd0: 79 20 32 20 61 6e 64 20 61 64 64 20 74 68 65 0a  y 2 and add the.
5be0: 09 09 09 20 2a 20 6c 61 73 74 20 63 68 61 72 20  ... * last char 
5bf0: 61 73 20 69 74 27 73 20 6f 77 6e 20 45 58 41 43  as it's own EXAC
5c00: 54 4c 59 20 69 66 20 6e 65 63 65 73 73 61 72 79  TLY if necessary
5c10: 0a 09 09 09 20 2a 2f 0a 0a 09 09 09 2f 2a 20 55  .... */...../* U
5c20: 6e 74 69 6c 20 65 6e 64 20 6f 66 20 73 74 72 69  ntil end of stri
5c30: 6e 67 20 6f 72 20 61 20 4d 45 54 41 20 63 68 61  ng or a META cha
5c40: 72 20 69 73 20 72 65 61 63 68 65 64 20 2a 2f 0a  r is reached */.
5c50: 09 09 09 77 68 69 6c 65 20 28 2a 70 72 65 67 2d  ...while (*preg-
5c60: 3e 72 65 67 70 61 72 73 65 20 26 26 20 73 74 72  >regparse && str
5c70: 63 68 72 28 4d 45 54 41 2c 20 2a 70 72 65 67 2d  chr(META, *preg-
5c80: 3e 72 65 67 70 61 72 73 65 29 20 3d 3d 20 4e 55  >regparse) == NU
5c90: 4c 4c 29 20 7b 0a 09 09 09 09 6e 20 3d 20 72 65  LL) {.....n = re
5ca0: 67 5f 75 74 66 38 5f 74 6f 75 6e 69 63 6f 64 65  g_utf8_tounicode
5cb0: 5f 63 61 73 65 28 70 72 65 67 2d 3e 72 65 67 70  _case(preg->regp
5cc0: 61 72 73 65 2c 20 26 63 68 2c 20 28 70 72 65 67  arse, &ch, (preg
5cd0: 2d 3e 63 66 6c 61 67 73 20 26 20 52 45 47 5f 49  ->cflags & REG_I
5ce0: 43 41 53 45 29 29 3b 0a 09 09 09 09 69 66 20 28  CASE));.....if (
5cf0: 63 68 20 3d 3d 20 27 5c 5c 27 20 26 26 20 70 72  ch == '\\' && pr
5d00: 65 67 2d 3e 72 65 67 70 61 72 73 65 5b 6e 5d 29  eg->regparse[n])
5d10: 20 7b 0a 09 09 09 09 09 2f 2a 20 4e 6f 6e 2d 74   {....../* Non-t
5d20: 72 61 69 6c 69 6e 67 20 62 61 63 6b 73 6c 61 73  railing backslas
5d30: 68 2e 0a 09 09 09 09 09 20 2a 20 49 73 20 74 68  h....... * Is th
5d40: 69 73 20 61 20 73 70 65 63 69 61 6c 20 65 73 63  is a special esc
5d50: 61 70 65 2c 20 6f 72 20 61 20 72 65 67 75 6c 61  ape, or a regula
5d60: 72 20 65 73 63 61 70 65 3f 0a 09 09 09 09 09 20  r escape?...... 
5d70: 2a 2f 0a 09 09 09 09 09 69 66 20 28 73 74 72 63  */......if (strc
5d80: 68 72 28 22 3c 3e 6d 4d 77 64 73 22 2c 20 70 72  hr("<>mMwds", pr
5d90: 65 67 2d 3e 72 65 67 70 61 72 73 65 5b 6e 5d 29  eg->regparse[n])
5da0: 29 20 7b 0a 09 09 09 09 09 09 2f 2a 20 41 20 73  ) {......./* A s
5db0: 70 65 63 69 61 6c 20 65 73 63 61 70 65 2e 20 41  pecial escape. A
5dc0: 6c 6c 20 64 6f 6e 65 20 77 69 74 68 20 45 58 41  ll done with EXA
5dd0: 43 54 4c 59 20 2a 2f 0a 09 09 09 09 09 09 62 72  CTLY */.......br
5de0: 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  eak;......}.....
5df0: 09 2f 2a 20 44 65 63 6f 64 65 20 69 74 2e 20 4e  ./* Decode it. N
5e00: 6f 74 65 20 74 68 61 74 20 77 65 20 61 64 64 20  ote that we add 
5e10: 74 68 65 20 6c 65 6e 67 74 68 20 66 6f 72 20 74  the length for t
5e20: 68 65 20 65 73 63 61 70 65 0a 09 09 09 09 09 20  he escape...... 
5e30: 2a 20 73 65 71 75 65 6e 63 65 20 74 6f 20 74 68  * sequence to th
5e40: 65 20 6c 65 6e 67 74 68 20 66 6f 72 20 74 68 65  e length for the
5e50: 20 62 61 63 6b 6c 61 73 68 20 73 6f 20 77 65 20   backlash so we 
5e60: 63 61 6e 20 73 6b 69 70 0a 09 09 09 09 09 20 2a  can skip...... *
5e70: 20 74 68 65 20 65 6e 74 69 72 65 20 73 65 71 75   the entire sequ
5e80: 65 6e 63 65 2c 20 6f 72 20 6e 6f 74 20 61 73 20  ence, or not as 
5e90: 72 65 71 75 69 72 65 64 2e 0a 09 09 09 09 09 20  required....... 
5ea0: 2a 2f 0a 09 09 09 09 09 6e 20 2b 3d 20 72 65 67  */......n += reg
5eb0: 5f 64 65 63 6f 64 65 5f 65 73 63 61 70 65 28 70  _decode_escape(p
5ec0: 72 65 67 2d 3e 72 65 67 70 61 72 73 65 20 2b 20  reg->regparse + 
5ed0: 6e 2c 20 26 63 68 29 3b 0a 09 09 09 09 09 69 66  n, &ch);......if
5ee0: 20 28 63 68 20 3d 3d 20 30 29 20 7b 0a 09 09 09   (ch == 0) {....
5ef0: 09 09 09 70 72 65 67 2d 3e 65 72 72 20 3d 20 52  ...preg->err = R
5f00: 45 47 5f 45 52 52 5f 4e 55 4c 4c 5f 43 48 41 52  EG_ERR_NULL_CHAR
5f10: 3b 0a 09 09 09 09 09 09 72 65 74 75 72 6e 20 30  ;.......return 0
5f20: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
5f30: 09 09 09 09 2f 2a 20 4e 6f 77 20 77 65 20 68 61  ..../* Now we ha
5f40: 76 65 20 6f 6e 65 20 63 68 61 72 20 27 63 68 27  ve one char 'ch'
5f50: 20 6f 66 20 6c 65 6e 67 74 68 20 27 6e 27 2e 0a   of length 'n'..
5f60: 09 09 09 09 20 2a 20 43 68 65 63 6b 20 74 6f 20  .... * Check to 
5f70: 73 65 65 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  see if the follo
5f80: 77 69 6e 67 20 63 68 61 72 20 69 73 20 61 20 4d  wing char is a M
5f90: 55 4c 54 0a 09 09 09 09 20 2a 2f 0a 0a 09 09 09  ULT..... */.....
5fa0: 09 69 66 20 28 49 53 4d 55 4c 54 28 70 72 65 67  .if (ISMULT(preg
5fb0: 2d 3e 72 65 67 70 61 72 73 65 5b 6e 5d 29 29 20  ->regparse[n])) 
5fc0: 7b 0a 09 09 09 09 09 2f 2a 20 59 65 73 2e 20 42  {....../* Yes. B
5fd0: 75 74 20 64 6f 20 77 65 20 61 6c 72 65 61 64 79  ut do we already
5fe0: 20 68 61 76 65 20 73 6f 6d 65 20 45 58 41 43 54   have some EXACT
5ff0: 4c 59 20 63 68 61 72 73 3f 20 2a 2f 0a 09 09 09  LY chars? */....
6000: 09 09 69 66 20 28 61 64 64 65 64 29 20 7b 0a 09  ..if (added) {..
6010: 09 09 09 09 09 2f 2a 20 59 65 73 2c 20 73 6f 20  ...../* Yes, so 
6020: 72 65 74 75 72 6e 20 77 68 61 74 20 77 65 20 68  return what we h
6030: 61 76 65 20 61 6e 64 20 70 69 63 6b 20 75 70 20  ave and pick up 
6040: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72  the current char
6050: 20 6e 65 78 74 20 74 69 6d 65 20 61 72 6f 75 6e   next time aroun
6060: 64 20 2a 2f 0a 09 09 09 09 09 09 62 72 65 61 6b  d */.......break
6070: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 2f 2a  ;......}....../*
6080: 20 4e 6f 2c 20 73 6f 20 61 64 64 20 74 68 69 73   No, so add this
6090: 20 73 69 6e 67 6c 65 20 63 68 61 72 20 61 6e 64   single char and
60a0: 20 66 69 6e 69 73 68 20 2a 2f 0a 09 09 09 09 09   finish */......
60b0: 72 65 67 63 28 70 72 65 67 2c 20 63 68 29 3b 0a  regc(preg, ch);.
60c0: 09 09 09 09 09 61 64 64 65 64 2b 2b 3b 0a 09 09  .....added++;...
60d0: 09 09 09 70 72 65 67 2d 3e 72 65 67 70 61 72 73  ...preg->regpars
60e0: 65 20 2b 3d 20 6e 3b 0a 09 09 09 09 09 62 72 65  e += n;......bre
60f0: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
6100: 2a 20 4e 6f 2c 20 73 6f 20 6a 75 73 74 20 61 64  * No, so just ad
6110: 64 20 74 68 69 73 20 63 68 61 72 20 6e 6f 72 6d  d this char norm
6120: 61 6c 6c 79 20 2a 2f 0a 09 09 09 09 72 65 67 63  ally */.....regc
6130: 28 70 72 65 67 2c 20 63 68 29 3b 0a 09 09 09 09  (preg, ch);.....
6140: 61 64 64 65 64 2b 2b 3b 0a 09 09 09 09 70 72 65  added++;.....pre
6150: 67 2d 3e 72 65 67 70 61 72 73 65 20 2b 3d 20 6e  g->regparse += n
6160: 3b 0a 09 09 09 7d 0a 09 09 09 72 65 67 63 28 70  ;....}....regc(p
6170: 72 65 67 2c 20 27 5c 30 27 29 3b 0a 0a 09 09 09  reg, '\0');.....
6180: 2a 66 6c 61 67 70 20 7c 3d 20 48 41 53 57 49 44  *flagp |= HASWID
6190: 54 48 3b 0a 09 09 09 69 66 20 28 61 64 64 65 64  TH;....if (added
61a0: 20 3d 3d 20 31 29 0a 09 09 09 09 2a 66 6c 61 67   == 1).....*flag
61b0: 70 20 7c 3d 20 53 49 4d 50 4c 45 3b 0a 09 09 09  p |= SIMPLE;....
61c0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09 62 72 65  break;...}...bre
61d0: 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ak;..}...return(
61e0: 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ret);.}..static 
61f0: 76 6f 69 64 20 72 65 67 5f 67 72 6f 77 28 72 65  void reg_grow(re
6200: 67 65 78 5f 74 20 2a 70 72 65 67 2c 20 69 6e 74  gex_t *preg, int
6210: 20 6e 29 0a 7b 0a 09 69 66 20 28 70 72 65 67 2d   n).{..if (preg-
6220: 3e 70 20 2b 20 6e 20 3e 3d 20 70 72 65 67 2d 3e  >p + n >= preg->
6230: 70 72 6f 67 6c 65 6e 29 20 7b 0a 09 09 70 72 65  proglen) {...pre
6240: 67 2d 3e 70 72 6f 67 6c 65 6e 20 3d 20 28 70 72  g->proglen = (pr
6250: 65 67 2d 3e 70 20 2b 20 6e 29 20 2a 20 32 3b 0a  eg->p + n) * 2;.
6260: 09 09 70 72 65 67 2d 3e 70 72 6f 67 72 61 6d 20  ..preg->program 
6270: 3d 20 72 65 61 6c 6c 6f 63 28 70 72 65 67 2d 3e  = realloc(preg->
6280: 70 72 6f 67 72 61 6d 2c 20 70 72 65 67 2d 3e 70  program, preg->p
6290: 72 6f 67 6c 65 6e 20 2a 20 73 69 7a 65 6f 66 28  roglen * sizeof(
62a0: 69 6e 74 29 29 3b 0a 09 7d 0a 7d 0a 0a 2f 2a 0a  int));..}.}../*.
62b0: 20 2d 20 72 65 67 6e 6f 64 65 20 2d 20 65 6d 69   - regnode - emi
62c0: 74 20 61 20 6e 6f 64 65 0a 20 2a 2f 0a 2f 2a 20  t a node. */./* 
62d0: 4c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 73 74 61  Location. */.sta
62e0: 74 69 63 20 69 6e 74 20 72 65 67 6e 6f 64 65 28  tic int regnode(
62f0: 72 65 67 65 78 5f 74 20 2a 70 72 65 67 2c 20 69  regex_t *preg, i
6300: 6e 74 20 6f 70 29 0a 7b 0a 09 72 65 67 5f 67 72  nt op).{..reg_gr
6310: 6f 77 28 70 72 65 67 2c 20 32 29 3b 0a 0a 09 70  ow(preg, 2);...p
6320: 72 65 67 2d 3e 70 72 6f 67 72 61 6d 5b 70 72 65  reg->program[pre
6330: 67 2d 3e 70 2b 2b 5d 20 3d 20 6f 70 3b 0a 09 70  g->p++] = op;..p
6340: 72 65 67 2d 3e 70 72 6f 67 72 61 6d 5b 70 72 65  reg->program[pre
6350: 67 2d 3e 70 2b 2b 5d 20 3d 20 30 3b 0a 0a 09 2f  g->p++] = 0;.../
6360: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 61  * Return the sta
6370: 72 74 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 2a  rt of the node *
6380: 2f 0a 09 72 65 74 75 72 6e 20 70 72 65 67 2d 3e  /..return preg->
6390: 70 20 2d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20  p - 2;.}../*. - 
63a0: 72 65 67 63 20 2d 20 65 6d 69 74 20 28 69 66 20  regc - emit (if 
63b0: 61 70 70 72 6f 70 72 69 61 74 65 29 20 61 20 62  appropriate) a b
63c0: 79 74 65 20 6f 66 20 63 6f 64 65 0a 20 2a 2f 0a  yte of code. */.
63d0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 67 63  static void regc
63e0: 28 72 65 67 65 78 5f 74 20 2a 70 72 65 67 2c 20  (regex_t *preg, 
63f0: 69 6e 74 20 62 20 29 0a 7b 0a 09 72 65 67 5f 67  int b ).{..reg_g
6400: 72 6f 77 28 70 72 65 67 2c 20 31 29 3b 0a 09 70  row(preg, 1);..p
6410: 72 65 67 2d 3e 70 72 6f 67 72 61 6d 5b 70 72 65  reg->program[pre
6420: 67 2d 3e 70 2b 2b 5d 20 3d 20 62 3b 0a 7d 0a 0a  g->p++] = b;.}..
6430: 2f 2a 0a 20 2d 20 72 65 67 69 6e 73 65 72 74 20  /*. - reginsert 
6440: 2d 20 69 6e 73 65 72 74 20 61 6e 20 6f 70 65 72  - insert an oper
6450: 61 74 6f 72 20 69 6e 20 66 72 6f 6e 74 20 6f 66  ator in front of
6460: 20 61 6c 72 65 61 64 79 2d 65 6d 69 74 74 65 64   already-emitted
6470: 20 6f 70 65 72 61 6e 64 0a 20 2a 0a 20 2a 20 4d   operand. *. * M
6480: 65 61 6e 73 20 72 65 6c 6f 63 61 74 69 6e 67 20  eans relocating 
6490: 74 68 65 20 6f 70 65 72 61 6e 64 2e 0a 20 2a 20  the operand.. * 
64a0: 52 65 74 75 72 6e 73 20 74 68 65 20 6e 65 77 20  Returns the new 
64b0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
64c0: 6f 72 69 67 69 6e 61 6c 20 6f 70 65 72 61 6e 64  original operand
64d0: 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
64e0: 20 72 65 67 69 6e 73 65 72 74 28 72 65 67 65 78   reginsert(regex
64f0: 5f 74 20 2a 70 72 65 67 2c 20 69 6e 74 20 6f 70  _t *preg, int op
6500: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20  , int size, int 
6510: 6f 70 6e 64 20 29 0a 7b 0a 09 72 65 67 5f 67 72  opnd ).{..reg_gr
6520: 6f 77 28 70 72 65 67 2c 20 73 69 7a 65 29 3b 0a  ow(preg, size);.
6530: 0a 09 2f 2a 20 4d 6f 76 65 20 65 76 65 72 79 74  ../* Move everyt
6540: 68 69 6e 67 20 66 72 6f 6d 20 6f 70 6e 64 20 75  hing from opnd u
6550: 70 20 2a 2f 0a 09 6d 65 6d 6d 6f 76 65 28 70 72  p */..memmove(pr
6560: 65 67 2d 3e 70 72 6f 67 72 61 6d 20 2b 20 6f 70  eg->program + op
6570: 6e 64 20 2b 20 73 69 7a 65 2c 20 70 72 65 67 2d  nd + size, preg-
6580: 3e 70 72 6f 67 72 61 6d 20 2b 20 6f 70 6e 64 2c  >program + opnd,
6590: 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 28   sizeof(int) * (
65a0: 70 72 65 67 2d 3e 70 20 2d 20 6f 70 6e 64 29 29  preg->p - opnd))
65b0: 3b 0a 09 2f 2a 20 5a 65 72 6f 20 6f 75 74 20 74  ;../* Zero out t
65c0: 68 65 20 6e 65 77 20 73 70 61 63 65 20 2a 2f 0a  he new space */.
65d0: 09 6d 65 6d 73 65 74 28 70 72 65 67 2d 3e 70 72  .memset(preg->pr
65e0: 6f 67 72 61 6d 20 2b 20 6f 70 6e 64 2c 20 30 2c  ogram + opnd, 0,
65f0: 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 73   sizeof(int) * s
6600: 69 7a 65 29 3b 0a 0a 09 70 72 65 67 2d 3e 70 72  ize);...preg->pr
6610: 6f 67 72 61 6d 5b 6f 70 6e 64 5d 20 3d 20 6f 70  ogram[opnd] = op
6620: 3b 0a 0a 09 70 72 65 67 2d 3e 70 20 2b 3d 20 73  ;...preg->p += s
6630: 69 7a 65 3b 0a 0a 09 72 65 74 75 72 6e 20 6f 70  ize;...return op
6640: 6e 64 20 2b 20 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a  nd + size;.}../*
6650: 0a 20 2d 20 72 65 67 74 61 69 6c 20 2d 20 73 65  . - regtail - se
6660: 74 20 74 68 65 20 6e 65 78 74 2d 70 6f 69 6e 74  t the next-point
6670: 65 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  er at the end of
6680: 20 61 20 6e 6f 64 65 20 63 68 61 69 6e 0a 20 2a   a node chain. *
6690: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
66a0: 67 74 61 69 6c 5f 28 72 65 67 65 78 5f 74 20 2a  gtail_(regex_t *
66b0: 70 72 65 67 2c 20 69 6e 74 20 70 2c 20 69 6e 74  preg, int p, int
66c0: 20 76 61 6c 2c 20 69 6e 74 20 6c 69 6e 65 20 29   val, int line )
66d0: 0a 7b 0a 09 69 6e 74 20 73 63 61 6e 3b 0a 09 69  .{..int scan;..i
66e0: 6e 74 20 74 65 6d 70 3b 0a 09 69 6e 74 20 6f 66  nt temp;..int of
66f0: 66 73 65 74 3b 0a 0a 09 2f 2a 20 46 69 6e 64 20  fset;.../* Find 
6700: 6c 61 73 74 20 6e 6f 64 65 2e 20 2a 2f 0a 09 73  last node. */..s
6710: 63 61 6e 20 3d 20 70 3b 0a 09 66 6f 72 20 28 3b  can = p;..for (;
6720: 3b 29 20 7b 0a 09 09 74 65 6d 70 20 3d 20 72 65  ;) {...temp = re
6730: 67 6e 65 78 74 28 70 72 65 67 2c 20 73 63 61 6e  gnext(preg, scan
6740: 29 3b 0a 09 09 69 66 20 28 74 65 6d 70 20 3d 3d  );...if (temp ==
6750: 20 30 29 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09   0)....break;...
6760: 73 63 61 6e 20 3d 20 74 65 6d 70 3b 0a 09 7d 0a  scan = temp;..}.
6770: 0a 09 69 66 20 28 4f 50 28 70 72 65 67 2c 20 73  ..if (OP(preg, s
6780: 63 61 6e 29 20 3d 3d 20 42 41 43 4b 29 0a 09 09  can) == BACK)...
6790: 6f 66 66 73 65 74 20 3d 20 73 63 61 6e 20 2d 20  offset = scan - 
67a0: 76 61 6c 3b 0a 09 65 6c 73 65 0a 09 09 6f 66 66  val;..else...off
67b0: 73 65 74 20 3d 20 76 61 6c 20 2d 20 73 63 61 6e  set = val - scan
67c0: 3b 0a 0a 09 70 72 65 67 2d 3e 70 72 6f 67 72 61  ;...preg->progra
67d0: 6d 5b 73 63 61 6e 20 2b 20 31 5d 20 3d 20 6f 66  m[scan + 1] = of
67e0: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72  fset;.}../*. - r
67f0: 65 67 6f 70 74 61 69 6c 20 2d 20 72 65 67 74 61  egoptail - regta
6800: 69 6c 20 6f 6e 20 6f 70 65 72 61 6e 64 20 6f 66  il on operand of
6810: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 3b   first argument;
6820: 20 6e 6f 70 20 69 66 20 6f 70 65 72 61 6e 64 6c   nop if operandl
6830: 65 73 73 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ess. */..static 
6840: 76 6f 69 64 20 72 65 67 6f 70 74 61 69 6c 28 72  void regoptail(r
6850: 65 67 65 78 5f 74 20 2a 70 72 65 67 2c 20 69 6e  egex_t *preg, in
6860: 74 20 70 2c 20 69 6e 74 20 76 61 6c 20 29 0a 7b  t p, int val ).{
6870: 0a 09 2f 2a 20 22 4f 70 65 72 61 6e 64 6c 65 73  ../* "Operandles
6880: 73 22 20 61 6e 64 20 22 6f 70 20 21 3d 20 42 52  s" and "op != BR
6890: 41 4e 43 48 22 20 61 72 65 20 73 79 6e 6f 6e 79  ANCH" are synony
68a0: 6d 6f 75 73 20 69 6e 20 70 72 61 63 74 69 63 65  mous in practice
68b0: 2e 20 2a 2f 0a 09 69 66 20 28 70 20 21 3d 20 30  . */..if (p != 0
68c0: 20 26 26 20 4f 50 28 70 72 65 67 2c 20 70 29 20   && OP(preg, p) 
68d0: 3d 3d 20 42 52 41 4e 43 48 29 20 7b 0a 09 09 72  == BRANCH) {...r
68e0: 65 67 74 61 69 6c 28 70 72 65 67 2c 20 4f 50 45  egtail(preg, OPE
68f0: 52 41 4e 44 28 70 29 2c 20 76 61 6c 29 3b 0a 09  RAND(p), val);..
6900: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 20 72 65 67 65 78  }.}../*. * regex
6910: 65 63 20 61 6e 64 20 66 72 69 65 6e 64 73 0a 20  ec and friends. 
6920: 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72  */../*. * Forwar
6930: 64 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ds.. */.static i
6940: 6e 74 20 72 65 67 74 72 79 28 72 65 67 65 78 5f  nt regtry(regex_
6950: 74 20 2a 70 72 65 67 2c 20 63 6f 6e 73 74 20 63  t *preg, const c
6960: 68 61 72 20 2a 73 74 72 69 6e 67 20 29 3b 0a 73  har *string );.s
6970: 74 61 74 69 63 20 69 6e 74 20 72 65 67 6d 61 74  tatic int regmat
6980: 63 68 28 72 65 67 65 78 5f 74 20 2a 70 72 65 67  ch(regex_t *preg
6990: 2c 20 69 6e 74 20 70 72 6f 67 29 3b 0a 73 74 61  , int prog);.sta
69a0: 74 69 63 20 69 6e 74 20 72 65 67 72 65 70 65 61  tic int regrepea
69b0: 74 28 72 65 67 65 78 5f 74 20 2a 70 72 65 67 2c  t(regex_t *preg,
69c0: 20 69 6e 74 20 70 2c 20 69 6e 74 20 6d 61 78 29   int p, int max)
69d0: 3b 0a 0a 2f 2a 0a 20 2d 20 72 65 67 65 78 65 63  ;../*. - regexec
69e0: 20 2d 20 6d 61 74 63 68 20 61 20 72 65 67 65 78   - match a regex
69f0: 70 20 61 67 61 69 6e 73 74 20 61 20 73 74 72 69  p against a stri
6a00: 6e 67 0a 20 2a 2f 0a 69 6e 74 20 72 65 67 65 78  ng. */.int regex
6a10: 65 63 28 72 65 67 65 78 5f 74 20 20 2a 70 72 65  ec(regex_t  *pre
6a20: 67 2c 20 20 63 6f 6e 73 74 20 20 63 68 61 72 20  g,  const  char 
6a30: 2a 73 74 72 69 6e 67 2c 20 73 69 7a 65 5f 74 20  *string, size_t 
6a40: 6e 6d 61 74 63 68 2c 20 72 65 67 6d 61 74 63 68  nmatch, regmatch
6a50: 5f 74 20 70 6d 61 74 63 68 5b 5d 2c 20 69 6e 74  _t pmatch[], int
6a60: 20 65 66 6c 61 67 73 29 0a 7b 0a 09 63 6f 6e 73   eflags).{..cons
6a70: 74 20 63 68 61 72 20 2a 73 3b 0a 09 69 6e 74 20  t char *s;..int 
6a80: 73 63 61 6e 3b 0a 0a 09 2f 2a 20 42 65 20 70 61  scan;.../* Be pa
6a90: 72 61 6e 6f 69 64 2e 2e 2e 20 2a 2f 0a 09 69 66  ranoid... */..if
6aa0: 20 28 70 72 65 67 20 3d 3d 20 4e 55 4c 4c 20 7c   (preg == NULL |
6ab0: 7c 20 70 72 65 67 2d 3e 70 72 6f 67 72 61 6d 20  | preg->program 
6ac0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 74 72 69 6e  == NULL || strin
6ad0: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  g == NULL) {...r
6ae0: 65 74 75 72 6e 20 52 45 47 5f 45 52 52 5f 4e 55  eturn REG_ERR_NU
6af0: 4c 4c 5f 41 52 47 55 4d 45 4e 54 3b 0a 09 7d 0a  LL_ARGUMENT;..}.
6b00: 0a 09 2f 2a 20 43 68 65 63 6b 20 76 61 6c 69 64  ../* Check valid
6b10: 69 74 79 20 6f 66 20 70 72 6f 67 72 61 6d 2e 20  ity of program. 
6b20: 2a 2f 0a 09 69 66 20 28 2a 70 72 65 67 2d 3e 70  */..if (*preg->p
6b30: 72 6f 67 72 61 6d 20 21 3d 20 52 45 47 5f 4d 41  rogram != REG_MA
6b40: 47 49 43 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  GIC) {...return 
6b50: 52 45 47 5f 45 52 52 5f 43 4f 52 52 55 50 54 45  REG_ERR_CORRUPTE
6b60: 44 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 44 45  D;..}..#ifdef DE
6b70: 42 55 47 0a 09 66 70 72 69 6e 74 66 28 73 74 64  BUG..fprintf(std
6b80: 65 72 72 2c 20 22 72 65 67 65 78 65 63 3a 20 25  err, "regexec: %
6b90: 73 5c 6e 22 2c 20 73 74 72 69 6e 67 29 3b 0a 09  s\n", string);..
6ba0: 72 65 67 64 75 6d 70 28 70 72 65 67 29 3b 0a 23  regdump(preg);.#
6bb0: 65 6e 64 69 66 0a 0a 09 70 72 65 67 2d 3e 65 66  endif...preg->ef
6bc0: 6c 61 67 73 20 3d 20 65 66 6c 61 67 73 3b 0a 09  lags = eflags;..
6bd0: 70 72 65 67 2d 3e 70 6d 61 74 63 68 20 3d 20 70  preg->pmatch = p
6be0: 6d 61 74 63 68 3b 0a 09 70 72 65 67 2d 3e 6e 6d  match;..preg->nm
6bf0: 61 74 63 68 20 3d 20 6e 6d 61 74 63 68 3b 0a 09  atch = nmatch;..
6c00: 70 72 65 67 2d 3e 73 74 61 72 74 20 3d 20 73 74  preg->start = st
6c10: 72 69 6e 67 3b 09 2f 2a 20 41 6c 6c 20 6f 66 66  ring;./* All off
6c20: 73 65 74 73 20 61 72 65 20 63 6f 6d 70 75 74 65  sets are compute
6c30: 64 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 0a  d from here */..
6c40: 09 2f 2a 20 4d 75 73 74 20 63 6c 65 61 72 20 6f  ./* Must clear o
6c50: 75 74 20 74 68 65 20 65 6d 62 65 64 64 65 64 20  ut the embedded 
6c60: 72 65 70 65 61 74 20 63 6f 75 6e 74 73 20 2a 2f  repeat counts */
6c70: 0a 09 66 6f 72 20 28 73 63 61 6e 20 3d 20 4f 50  ..for (scan = OP
6c80: 45 52 41 4e 44 28 31 29 3b 20 73 63 61 6e 20 21  ERAND(1); scan !
6c90: 3d 20 30 3b 20 29 20 7b 0a 09 09 73 77 69 74 63  = 0; ) {...switc
6ca0: 68 20 28 4f 50 28 70 72 65 67 2c 20 73 63 61 6e  h (OP(preg, scan
6cb0: 29 29 20 7b 0a 09 09 63 61 73 65 20 52 45 50 3a  )) {...case REP:
6cc0: 0a 09 09 63 61 73 65 20 52 45 50 4d 49 4e 3a 0a  ...case REPMIN:.
6cd0: 09 09 63 61 73 65 20 52 45 50 58 3a 0a 09 09 63  ..case REPX:...c
6ce0: 61 73 65 20 52 45 50 58 4d 49 4e 3a 0a 09 09 09  ase REPXMIN:....
6cf0: 70 72 65 67 2d 3e 70 72 6f 67 72 61 6d 5b 73 63  preg->program[sc
6d00: 61 6e 20 2b 20 34 5d 20 3d 20 30 3b 0a 09 09 09  an + 4] = 0;....
6d10: 73 63 61 6e 20 2b 3d 20 35 3b 0a 09 09 09 62 72  scan += 5;....br
6d20: 65 61 6b 3b 0a 0a 09 09 63 61 73 65 20 41 4e 59  eak;....case ANY
6d30: 4f 46 3a 0a 09 09 63 61 73 65 20 41 4e 59 42 55  OF:...case ANYBU
6d40: 54 3a 0a 09 09 63 61 73 65 20 45 58 41 43 54 4c  T:...case EXACTL
6d50: 59 3a 0a 09 09 09 73 63 61 6e 20 2b 3d 20 32 3b  Y:....scan += 2;
6d60: 0a 09 09 09 77 68 69 6c 65 20 28 70 72 65 67 2d  ....while (preg-
6d70: 3e 70 72 6f 67 72 61 6d 5b 73 63 61 6e 2b 2b 5d  >program[scan++]
6d80: 29 20 7b 0a 09 09 09 7d 0a 09 09 09 62 72 65 61  ) {....}....brea
6d90: 6b 3b 0a 0a 09 09 63 61 73 65 20 45 4e 44 3a 0a  k;....case END:.
6da0: 09 09 09 73 63 61 6e 20 3d 20 30 3b 0a 09 09 09  ...scan = 0;....
6db0: 62 72 65 61 6b 3b 0a 0a 09 09 64 65 66 61 75 6c  break;....defaul
6dc0: 74 3a 0a 09 09 09 73 63 61 6e 20 2b 3d 20 32 3b  t:....scan += 2;
6dd0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
6de0: 7d 0a 0a 09 2f 2a 20 49 66 20 74 68 65 72 65 20  }.../* If there 
6df0: 69 73 20 61 20 22 6d 75 73 74 20 61 70 70 65 61  is a "must appea
6e00: 72 22 20 73 74 72 69 6e 67 2c 20 6c 6f 6f 6b 20  r" string, look 
6e10: 66 6f 72 20 69 74 2e 20 2a 2f 0a 09 69 66 20 28  for it. */..if (
6e20: 70 72 65 67 2d 3e 72 65 67 6d 75 73 74 20 21 3d  preg->regmust !=
6e30: 20 30 29 20 7b 0a 09 09 73 20 3d 20 73 74 72 69   0) {...s = stri
6e40: 6e 67 3b 0a 09 09 77 68 69 6c 65 20 28 28 73 20  ng;...while ((s 
6e50: 3d 20 73 74 72 5f 66 69 6e 64 28 73 2c 20 70 72  = str_find(s, pr
6e60: 65 67 2d 3e 70 72 6f 67 72 61 6d 5b 70 72 65 67  eg->program[preg
6e70: 2d 3e 72 65 67 6d 75 73 74 5d 2c 20 70 72 65 67  ->regmust], preg
6e80: 2d 3e 63 66 6c 61 67 73 20 26 20 52 45 47 5f 49  ->cflags & REG_I
6e90: 43 41 53 45 29 29 20 21 3d 20 4e 55 4c 4c 29 20  CASE)) != NULL) 
6ea0: 7b 0a 09 09 09 69 66 20 28 70 72 65 66 69 78 5f  {....if (prefix_
6eb0: 63 6d 70 28 70 72 65 67 2d 3e 70 72 6f 67 72 61  cmp(preg->progra
6ec0: 6d 20 2b 20 70 72 65 67 2d 3e 72 65 67 6d 75 73  m + preg->regmus
6ed0: 74 2c 20 70 72 65 67 2d 3e 72 65 67 6d 6c 65 6e  t, preg->regmlen
6ee0: 2c 20 73 2c 20 70 72 65 67 2d 3e 63 66 6c 61 67  , s, preg->cflag
6ef0: 73 20 26 20 52 45 47 5f 49 43 41 53 45 29 20 3e  s & REG_ICASE) >
6f00: 3d 20 30 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  = 0) {.....break
6f10: 3b 0a 09 09 09 7d 0a 09 09 09 73 2b 2b 3b 0a 09  ;....}....s++;..
6f20: 09 7d 0a 09 09 69 66 20 28 73 20 3d 3d 20 4e 55  .}...if (s == NU
6f30: 4c 4c 29 09 2f 2a 20 4e 6f 74 20 70 72 65 73 65  LL)./* Not prese
6f40: 6e 74 2e 20 2a 2f 0a 09 09 09 72 65 74 75 72 6e  nt. */....return
6f50: 20 52 45 47 5f 4e 4f 4d 41 54 43 48 3b 0a 09 7d   REG_NOMATCH;..}
6f60: 0a 0a 09 2f 2a 20 4d 61 72 6b 20 62 65 67 69 6e  .../* Mark begin
6f70: 6e 69 6e 67 20 6f 66 20 6c 69 6e 65 20 66 6f 72  ning of line for
6f80: 20 5e 20 2e 20 2a 2f 0a 09 70 72 65 67 2d 3e 72   ^ . */..preg->r
6f90: 65 67 62 6f 6c 20 3d 20 73 74 72 69 6e 67 3b 0a  egbol = string;.
6fa0: 0a 09 2f 2a 20 53 69 6d 70 6c 65 73 74 20 63 61  ../* Simplest ca
6fb0: 73 65 3a 20 20 61 6e 63 68 6f 72 65 64 20 6d 61  se:  anchored ma
6fc0: 74 63 68 20 6e 65 65 64 20 62 65 20 74 72 69 65  tch need be trie
6fd0: 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 28 6d 61 79  d only once (may
6fe0: 62 65 20 70 65 72 20 6c 69 6e 65 29 2e 20 2a 2f  be per line). */
6ff0: 0a 09 69 66 20 28 70 72 65 67 2d 3e 72 65 67 61  ..if (preg->rega
7000: 6e 63 68 29 20 7b 0a 09 09 69 66 20 28 65 66 6c  nch) {...if (efl
7010: 61 67 73 20 26 20 52 45 47 5f 4e 4f 54 42 4f 4c  ags & REG_NOTBOL
7020: 29 20 7b 0a 09 09 09 2f 2a 20 54 68 69 73 20 69  ) {..../* This i
7030: 73 20 61 6e 20 61 6e 63 68 6f 72 65 64 20 73 65  s an anchored se
7040: 61 72 63 68 2c 20 62 75 74 20 6e 6f 74 20 61 6e  arch, but not an
7050: 20 42 4f 4c 2c 20 73 6f 20 70 6f 73 73 69 62 6c   BOL, so possibl
7060: 79 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65  y skip to the ne
7070: 78 74 20 6c 69 6e 65 20 2a 2f 0a 09 09 09 67 6f  xt line */....go
7080: 74 6f 20 6e 65 78 74 6c 69 6e 65 3b 0a 09 09 7d  to nextline;...}
7090: 0a 09 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09  ...while (1) {..
70a0: 09 09 69 66 20 28 72 65 67 74 72 79 28 70 72 65  ..if (regtry(pre
70b0: 67 2c 20 73 74 72 69 6e 67 29 29 20 7b 0a 09 09  g, string)) {...
70c0: 09 09 72 65 74 75 72 6e 20 52 45 47 5f 4e 4f 45  ..return REG_NOE
70d0: 52 52 4f 52 3b 0a 09 09 09 7d 0a 09 09 09 69 66  RROR;....}....if
70e0: 20 28 2a 73 74 72 69 6e 67 29 20 7b 0a 6e 65 78   (*string) {.nex
70f0: 74 6c 69 6e 65 3a 0a 09 09 09 09 69 66 20 28 70  tline:.....if (p
7100: 72 65 67 2d 3e 63 66 6c 61 67 73 20 26 20 52 45  reg->cflags & RE
7110: 47 5f 4e 45 57 4c 49 4e 45 29 20 7b 0a 09 09 09  G_NEWLINE) {....
7120: 09 09 2f 2a 20 54 72 79 20 74 68 65 20 6e 65 78  ../* Try the nex
7130: 74 20 61 6e 63 68 6f 72 3f 20 2a 2f 0a 09 09 09  t anchor? */....
7140: 09 09 73 74 72 69 6e 67 20 3d 20 73 74 72 63 68  ..string = strch
7150: 72 28 73 74 72 69 6e 67 2c 20 27 5c 6e 27 29 3b  r(string, '\n');
7160: 0a 09 09 09 09 09 69 66 20 28 73 74 72 69 6e 67  ......if (string
7170: 29 20 7b 0a 09 09 09 09 09 09 70 72 65 67 2d 3e  ) {.......preg->
7180: 72 65 67 62 6f 6c 20 3d 20 2b 2b 73 74 72 69 6e  regbol = ++strin
7190: 67 3b 0a 09 09 09 09 09 09 63 6f 6e 74 69 6e 75  g;.......continu
71a0: 65 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  e;......}.....}.
71b0: 09 09 09 7d 0a 09 09 09 72 65 74 75 72 6e 20 52  ...}....return R
71c0: 45 47 5f 4e 4f 4d 41 54 43 48 3b 0a 09 09 7d 0a  EG_NOMATCH;...}.
71d0: 09 7d 0a 0a 09 2f 2a 20 4d 65 73 73 79 20 63 61  .}.../* Messy ca
71e0: 73 65 73 3a 20 20 75 6e 61 6e 63 68 6f 72 65 64  ses:  unanchored
71f0: 20 6d 61 74 63 68 2e 20 2a 2f 0a 09 73 20 3d 20   match. */..s = 
7200: 73 74 72 69 6e 67 3b 0a 09 69 66 20 28 70 72 65  string;..if (pre
7210: 67 2d 3e 72 65 67 73 74 61 72 74 20 21 3d 20 27  g->regstart != '
7220: 5c 30 27 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6b  \0') {.../* We k
7230: 6e 6f 77 20 77 68 61 74 20 63 68 61 72 20 69 74  now what char it
7240: 20 6d 75 73 74 20 73 74 61 72 74 20 77 69 74 68   must start with
7250: 2e 20 2a 2f 0a 09 09 77 68 69 6c 65 20 28 28 73  . */...while ((s
7260: 20 3d 20 73 74 72 5f 66 69 6e 64 28 73 2c 20 70   = str_find(s, p
7270: 72 65 67 2d 3e 72 65 67 73 74 61 72 74 2c 20 70  reg->regstart, p
7280: 72 65 67 2d 3e 63 66 6c 61 67 73 20 26 20 52 45  reg->cflags & RE
7290: 47 5f 49 43 41 53 45 29 29 20 21 3d 20 4e 55 4c  G_ICASE)) != NUL
72a0: 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 65 67 74  L) {....if (regt
72b0: 72 79 28 70 72 65 67 2c 20 73 29 29 0a 09 09 09  ry(preg, s))....
72c0: 09 72 65 74 75 72 6e 20 52 45 47 5f 4e 4f 45 52  .return REG_NOER
72d0: 52 4f 52 3b 0a 09 09 09 73 2b 2b 3b 0a 09 09 7d  ROR;....s++;...}
72e0: 0a 09 7d 0a 09 65 6c 73 65 0a 09 09 2f 2a 20 57  ..}..else.../* W
72f0: 65 20 64 6f 6e 27 74 20 2d 2d 20 67 65 6e 65 72  e don't -- gener
7300: 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 09 09 77 68  al case. */...wh
7310: 69 6c 65 20 28 31 29 20 7b 0a 09 09 09 69 66 20  ile (1) {....if 
7320: 28 72 65 67 74 72 79 28 70 72 65 67 2c 20 73 29  (regtry(preg, s)
7330: 29 0a 09 09 09 09 72 65 74 75 72 6e 20 52 45 47  ).....return REG
7340: 5f 4e 4f 45 52 52 4f 52 3b 0a 09 09 09 69 66 20  _NOERROR;....if 
7350: 28 2a 73 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09  (*s == '\0') {..
7360: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09  ...break;....}..
7370: 09 09 65 6c 73 65 20 7b 0a 09 09 09 09 69 6e 74  ..else {.....int
7380: 20 63 3b 0a 09 09 09 09 73 20 2b 3d 20 75 74 66   c;.....s += utf
7390: 38 5f 74 6f 75 6e 69 63 6f 64 65 28 73 2c 20 26  8_tounicode(s, &
73a0: 63 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 2f  c);....}...}.../
73b0: 2a 20 46 61 69 6c 75 72 65 2e 20 2a 2f 0a 09 72  * Failure. */..r
73c0: 65 74 75 72 6e 20 52 45 47 5f 4e 4f 4d 41 54 43  eturn REG_NOMATC
73d0: 48 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 74  H;.}../*. - regt
73e0: 72 79 20 2d 20 74 72 79 20 6d 61 74 63 68 20 61  ry - try match a
73f0: 74 20 73 70 65 63 69 66 69 63 20 70 6f 69 6e 74  t specific point
7400: 0a 20 2a 2f 0a 09 09 09 2f 2a 20 30 20 66 61 69  . */..../* 0 fai
7410: 6c 75 72 65 2c 20 31 20 73 75 63 63 65 73 73 20  lure, 1 success 
7420: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
7430: 67 74 72 79 28 20 72 65 67 65 78 5f 74 20 2a 70  gtry( regex_t *p
7440: 72 65 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  reg, const char 
7450: 2a 73 74 72 69 6e 67 20 29 0a 7b 0a 09 69 6e 74  *string ).{..int
7460: 20 69 3b 0a 0a 09 70 72 65 67 2d 3e 72 65 67 69   i;...preg->regi
7470: 6e 70 75 74 20 3d 20 73 74 72 69 6e 67 3b 0a 0a  nput = string;..
7480: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
7490: 20 70 72 65 67 2d 3e 6e 6d 61 74 63 68 3b 20 69   preg->nmatch; i
74a0: 2b 2b 29 20 7b 0a 09 09 70 72 65 67 2d 3e 70 6d  ++) {...preg->pm
74b0: 61 74 63 68 5b 69 5d 2e 72 6d 5f 73 6f 20 3d 20  atch[i].rm_so = 
74c0: 2d 31 3b 0a 09 09 70 72 65 67 2d 3e 70 6d 61 74  -1;...preg->pmat
74d0: 63 68 5b 69 5d 2e 72 6d 5f 65 6f 20 3d 20 2d 31  ch[i].rm_eo = -1
74e0: 3b 0a 09 7d 0a 09 69 66 20 28 72 65 67 6d 61 74  ;..}..if (regmat
74f0: 63 68 28 70 72 65 67 2c 20 31 29 29 20 7b 0a 09  ch(preg, 1)) {..
7500: 09 70 72 65 67 2d 3e 70 6d 61 74 63 68 5b 30 5d  .preg->pmatch[0]
7510: 2e 72 6d 5f 73 6f 20 3d 20 73 74 72 69 6e 67 20  .rm_so = string 
7520: 2d 20 70 72 65 67 2d 3e 73 74 61 72 74 3b 0a 09  - preg->start;..
7530: 09 70 72 65 67 2d 3e 70 6d 61 74 63 68 5b 30 5d  .preg->pmatch[0]
7540: 2e 72 6d 5f 65 6f 20 3d 20 70 72 65 67 2d 3e 72  .rm_eo = preg->r
7550: 65 67 69 6e 70 75 74 20 2d 20 70 72 65 67 2d 3e  eginput - preg->
7560: 73 74 61 72 74 3b 0a 09 09 72 65 74 75 72 6e 28  start;...return(
7570: 31 29 3b 0a 09 7d 20 65 6c 73 65 0a 09 09 72 65  1);..} else...re
7580: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 2a 0a  turn(0);.}../**.
7590: 20 2a 20 52 65 74 75 72 6e 73 20 62 79 74 65 73   * Returns bytes
75a0: 20 6d 61 74 63 68 65 64 20 69 66 20 27 70 61 74   matched if 'pat
75b0: 74 65 72 6e 27 20 69 73 20 61 20 70 72 65 66 69  tern' is a prefi
75c0: 78 20 6f 66 20 27 73 74 72 69 6e 67 27 2e 0a 20  x of 'string'.. 
75d0: 2a 0a 20 2a 20 49 66 20 27 6e 6f 63 61 73 65 27  *. * If 'nocase'
75e0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 64 6f   is non-zero, do
75f0: 65 73 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73  es a case-insens
7600: 69 74 69 76 65 20 6d 61 74 63 68 2e 0a 20 2a 0a  itive match.. *.
7610: 20 2a 20 52 65 74 75 72 6e 73 20 2d 31 20 6f 6e   * Returns -1 on
7620: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 2a 2f 0a   not found.. */.
7630: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 66 69  static int prefi
7640: 78 5f 63 6d 70 28 63 6f 6e 73 74 20 69 6e 74 20  x_cmp(const int 
7650: 2a 70 72 6f 67 2c 20 69 6e 74 20 70 72 6f 67 6c  *prog, int progl
7660: 65 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  en, const char *
7670: 73 74 72 69 6e 67 2c 20 69 6e 74 20 6e 6f 63 61  string, int noca
7680: 73 65 29 0a 7b 0a 09 63 6f 6e 73 74 20 63 68 61  se).{..const cha
7690: 72 20 2a 73 20 3d 20 73 74 72 69 6e 67 3b 0a 09  r *s = string;..
76a0: 77 68 69 6c 65 20 28 70 72 6f 67 6c 65 6e 20 26  while (proglen &
76b0: 26 20 2a 73 29 20 7b 0a 09 09 69 6e 74 20 63 68  & *s) {...int ch
76c0: 3b 0a 09 09 69 6e 74 20 6e 20 3d 20 72 65 67 5f  ;...int n = reg_
76d0: 75 74 66 38 5f 74 6f 75 6e 69 63 6f 64 65 5f 63  utf8_tounicode_c
76e0: 61 73 65 28 73 2c 20 26 63 68 2c 20 6e 6f 63 61  ase(s, &ch, noca
76f0: 73 65 29 3b 0a 09 09 69 66 20 28 63 68 20 21 3d  se);...if (ch !=
7700: 20 2a 70 72 6f 67 29 20 7b 0a 09 09 09 72 65 74   *prog) {....ret
7710: 75 72 6e 20 2d 31 3b 0a 09 09 7d 0a 09 09 70 72  urn -1;...}...pr
7720: 6f 67 2b 2b 3b 0a 09 09 73 20 2b 3d 20 6e 3b 0a  og++;...s += n;.
7730: 09 09 70 72 6f 67 6c 65 6e 2d 2d 3b 0a 09 7d 0a  ..proglen--;..}.
7740: 09 69 66 20 28 70 72 6f 67 6c 65 6e 20 3d 3d 20  .if (proglen == 
7750: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 73 20  0) {...return s 
7760: 2d 20 73 74 72 69 6e 67 3b 0a 09 7d 0a 09 72 65  - string;..}..re
7770: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 2a 0a  turn -1;.}../**.
7780: 20 2a 20 53 65 61 72 63 68 73 20 66 6f 72 20 27   * Searchs for '
7790: 63 27 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  c' in the range 
77a0: 27 72 61 6e 67 65 27 2e 0a 20 2a 0a 20 2a 20 52  'range'.. *. * R
77b0: 65 74 75 72 6e 73 20 31 20 69 66 20 66 6f 75 6e  eturns 1 if foun
77c0: 64 2c 20 6f 72 20 30 20 69 66 20 6e 6f 74 2e 0a  d, or 0 if not..
77d0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72   */.static int r
77e0: 65 67 5f 72 61 6e 67 65 5f 66 69 6e 64 28 63 6f  eg_range_find(co
77f0: 6e 73 74 20 69 6e 74 20 2a 72 61 6e 67 65 2c 20  nst int *range, 
7800: 69 6e 74 20 63 29 0a 7b 0a 09 77 68 69 6c 65 20  int c).{..while 
7810: 28 2a 72 61 6e 67 65 29 20 7b 0a 09 09 2f 2a 70  (*range) {.../*p
7820: 72 69 6e 74 66 28 22 43 68 65 63 6b 69 6e 67 20  rintf("Checking 
7830: 25 64 20 69 6e 20 72 61 6e 67 65 20 5b 25 64 2c  %d in range [%d,
7840: 25 64 5d 5c 6e 22 2c 20 63 2c 20 72 61 6e 67 65  %d]\n", c, range
7850: 5b 31 5d 2c 20 28 72 61 6e 67 65 5b 30 5d 20 2b  [1], (range[0] +
7860: 20 72 61 6e 67 65 5b 31 5d 20 2d 20 31 29 29 3b   range[1] - 1));
7870: 2a 2f 0a 09 09 69 66 20 28 63 20 3e 3d 20 72 61  */...if (c >= ra
7880: 6e 67 65 5b 31 5d 20 26 26 20 63 20 3c 3d 20 28  nge[1] && c <= (
7890: 72 61 6e 67 65 5b 30 5d 20 2b 20 72 61 6e 67 65  range[0] + range
78a0: 5b 31 5d 20 2d 20 31 29 29 20 7b 0a 09 09 09 72  [1] - 1)) {....r
78b0: 65 74 75 72 6e 20 31 3b 0a 09 09 7d 0a 09 09 72  eturn 1;...}...r
78c0: 61 6e 67 65 20 2b 3d 20 32 3b 0a 09 7d 0a 09 72  ange += 2;..}..r
78d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 2a 0a  eturn 0;.}../**.
78e0: 20 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68   * Search for th
78f0: 65 20 63 68 61 72 61 63 74 65 72 20 27 63 27 20  e character 'c' 
7900: 69 6e 20 74 68 65 20 75 74 66 2d 38 20 73 74 72  in the utf-8 str
7910: 69 6e 67 20 27 73 74 72 69 6e 67 27 2e 0a 20 2a  ing 'string'.. *
7920: 0a 20 2a 20 49 66 20 27 6e 6f 63 61 73 65 27 20  . * If 'nocase' 
7930: 69 73 20 73 65 74 2c 20 74 68 65 20 27 73 74 72  is set, the 'str
7940: 69 6e 67 27 20 69 73 20 61 73 73 75 6d 65 64 20  ing' is assumed 
7950: 74 6f 20 62 65 20 75 70 70 65 72 63 61 73 65 0a  to be uppercase.
7960: 20 2a 20 61 6e 64 20 27 63 27 20 69 73 20 63 6f   * and 'c' is co
7970: 6e 76 65 72 74 65 64 20 74 6f 20 75 70 70 65 72  nverted to upper
7980: 63 61 73 65 20 62 65 66 6f 72 65 20 6d 61 74 63  case before matc
7990: 68 69 6e 67 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  hing.. *. * Retu
79a0: 72 6e 73 20 74 68 65 20 62 79 74 65 20 70 6f 73  rns the byte pos
79b0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 72  ition in the str
79c0: 69 6e 67 20 77 68 65 72 65 20 74 68 65 20 27 63  ing where the 'c
79d0: 27 20 77 61 73 20 66 6f 75 6e 64 2c 20 6f 72 0a  ' was found, or.
79e0: 20 2a 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66   * NULL if not f
79f0: 6f 75 6e 64 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  ound.. */.static
7a00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72   const char *str
7a10: 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72  _find(const char
7a20: 20 2a 73 74 72 69 6e 67 2c 20 69 6e 74 20 63 2c   *string, int c,
7a30: 20 69 6e 74 20 6e 6f 63 61 73 65 29 0a 7b 0a 09   int nocase).{..
7a40: 69 66 20 28 6e 6f 63 61 73 65 29 20 7b 0a 09 09  if (nocase) {...
7a50: 2f 2a 20 54 68 65 20 22 73 74 72 69 6e 67 22 20  /* The "string" 
7a60: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
7a70: 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 75  e converted to u
7a80: 70 70 65 72 63 61 73 65 20 2a 2f 0a 09 09 63 20  ppercase */...c 
7a90: 3d 20 75 74 66 38 5f 75 70 70 65 72 28 63 29 3b  = utf8_upper(c);
7aa0: 0a 09 7d 0a 09 77 68 69 6c 65 20 28 2a 73 74 72  ..}..while (*str
7ab0: 69 6e 67 29 20 7b 0a 09 09 69 6e 74 20 63 68 3b  ing) {...int ch;
7ac0: 0a 09 09 69 6e 74 20 6e 20 3d 20 72 65 67 5f 75  ...int n = reg_u
7ad0: 74 66 38 5f 74 6f 75 6e 69 63 6f 64 65 5f 63 61  tf8_tounicode_ca
7ae0: 73 65 28 73 74 72 69 6e 67 2c 20 26 63 68 2c 20  se(string, &ch, 
7af0: 6e 6f 63 61 73 65 29 3b 0a 09 09 69 66 20 28 63  nocase);...if (c
7b00: 20 3d 3d 20 63 68 29 20 7b 0a 09 09 09 72 65 74   == ch) {....ret
7b10: 75 72 6e 20 73 74 72 69 6e 67 3b 0a 09 09 7d 0a  urn string;...}.
7b20: 09 09 73 74 72 69 6e 67 20 2b 3d 20 6e 3b 0a 09  ..string += n;..
7b30: 7d 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  }..return NULL;.
7b40: 7d 0a 0a 2f 2a 2a 0a 20 2a 20 52 65 74 75 72 6e  }../**. * Return
7b50: 73 20 74 72 75 65 20 69 66 20 27 63 68 27 20 69  s true if 'ch' i
7b60: 73 20 61 6e 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65  s an end-of-line
7b70: 20 63 68 61 72 2e 0a 20 2a 0a 20 2a 20 49 6e 20   char.. *. * In 
7b80: 52 45 47 5f 4e 45 57 4c 49 4e 45 20 6d 6f 64 65  REG_NEWLINE mode
7b90: 2c 20 5c 6e 20 69 73 20 63 6f 6e 73 69 64 65 72  , \n is consider
7ba0: 65 64 20 45 4f 4c 20 69 6e 0a 20 2a 20 61 64 64  ed EOL in. * add
7bb0: 69 74 69 6f 6e 20 74 6f 20 5c 30 0a 20 2a 2f 0a  ition to \0. */.
7bc0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 67 5f 69  static int reg_i
7bd0: 73 65 6f 6c 28 72 65 67 65 78 5f 74 20 2a 70 72  seol(regex_t *pr
7be0: 65 67 2c 20 69 6e 74 20 63 68 29 0a 7b 0a 09 69  eg, int ch).{..i
7bf0: 66 20 28 70 72 65 67 2d 3e 63 66 6c 61 67 73 20  f (preg->cflags 
7c00: 26 20 52 45 47 5f 4e 45 57 4c 49 4e 45 29 20 7b  & REG_NEWLINE) {
7c10: 0a 09 09 72 65 74 75 72 6e 20 63 68 20 3d 3d 20  ...return ch == 
7c20: 27 5c 30 27 20 7c 7c 20 63 68 20 3d 3d 20 27 5c  '\0' || ch == '\
7c30: 6e 27 3b 0a 09 7d 0a 09 65 6c 73 65 20 7b 0a 09  n';..}..else {..
7c40: 09 72 65 74 75 72 6e 20 63 68 20 3d 3d 20 27 5c  .return ch == '\
7c50: 30 27 3b 0a 09 7d 0a 7d 0a 0a 73 74 61 74 69 63  0';..}.}..static
7c60: 20 69 6e 74 20 72 65 67 6d 61 74 63 68 73 69 6d   int regmatchsim
7c70: 70 6c 65 72 65 70 65 61 74 28 72 65 67 65 78 5f  plerepeat(regex_
7c80: 74 20 2a 70 72 65 67 2c 20 69 6e 74 20 73 63 61  t *preg, int sca
7c90: 6e 2c 20 69 6e 74 20 6d 61 74 63 68 6d 69 6e 29  n, int matchmin)
7ca0: 0a 7b 0a 09 69 6e 74 20 6e 65 78 74 63 68 20 3d  .{..int nextch =
7cb0: 20 27 5c 30 27 3b 0a 09 63 6f 6e 73 74 20 63 68   '\0';..const ch
7cc0: 61 72 20 2a 73 61 76 65 3b 0a 09 69 6e 74 20 6e  ar *save;..int n
7cd0: 6f 3b 0a 09 69 6e 74 20 63 3b 0a 0a 09 69 6e 74  o;..int c;...int
7ce0: 20 6d 61 78 20 3d 20 70 72 65 67 2d 3e 70 72 6f   max = preg->pro
7cf0: 67 72 61 6d 5b 73 63 61 6e 20 2b 20 32 5d 3b 0a  gram[scan + 2];.
7d00: 09 69 6e 74 20 6d 69 6e 20 3d 20 70 72 65 67 2d  .int min = preg-
7d10: 3e 70 72 6f 67 72 61 6d 5b 73 63 61 6e 20 2b 20  >program[scan + 
7d20: 33 5d 3b 0a 09 69 6e 74 20 6e 65 78 74 20 3d 20  3];..int next = 
7d30: 72 65 67 6e 65 78 74 28 70 72 65 67 2c 20 73 63  regnext(preg, sc
7d40: 61 6e 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4c 6f  an);.../*.. * Lo
7d50: 6f 6b 61 68 65 61 64 20 74 6f 20 61 76 6f 69 64  okahead to avoid
7d60: 20 75 73 65 6c 65 73 73 20 6d 61 74 63 68 20 61   useless match a
7d70: 74 74 65 6d 70 74 73 0a 09 20 2a 20 77 68 65 6e  ttempts.. * when
7d80: 20 77 65 20 6b 6e 6f 77 20 77 68 61 74 20 63 68   we know what ch
7d90: 61 72 61 63 74 65 72 20 63 6f 6d 65 73 20 6e 65  aracter comes ne
7da0: 78 74 2e 0a 09 20 2a 2f 0a 09 69 66 20 28 4f 50  xt... */..if (OP
7db0: 28 70 72 65 67 2c 20 6e 65 78 74 29 20 3d 3d 20  (preg, next) == 
7dc0: 45 58 41 43 54 4c 59 29 20 7b 0a 09 09 6e 65 78  EXACTLY) {...nex
7dd0: 74 63 68 20 3d 20 70 72 65 67 2d 3e 70 72 6f 67  tch = preg->prog
7de0: 72 61 6d 5b 4f 50 45 52 41 4e 44 28 6e 65 78 74  ram[OPERAND(next
7df0: 29 5d 3b 0a 09 7d 0a 09 73 61 76 65 20 3d 20 70  )];..}..save = p
7e00: 72 65 67 2d 3e 72 65 67 69 6e 70 75 74 3b 0a 09  reg->reginput;..
7e10: 6e 6f 20 3d 20 72 65 67 72 65 70 65 61 74 28 70  no = regrepeat(p
7e20: 72 65 67 2c 20 73 63 61 6e 20 2b 20 35 2c 20 6d  reg, scan + 5, m
7e30: 61 78 29 3b 0a 09 69 66 20 28 6e 6f 20 3c 20 6d  ax);..if (no < m
7e40: 69 6e 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 30  in) {...return 0
7e50: 3b 0a 09 7d 0a 09 69 66 20 28 6d 61 74 63 68 6d  ;..}..if (matchm
7e60: 69 6e 29 20 7b 0a 09 09 2f 2a 20 66 72 6f 6d 20  in) {.../* from 
7e70: 6d 69 6e 20 75 70 20 74 6f 20 6e 6f 20 2a 2f 0a  min up to no */.
7e80: 09 09 6d 61 78 20 3d 20 6e 6f 3b 0a 09 09 6e 6f  ..max = no;...no
7e90: 20 3d 20 6d 69 6e 3b 0a 09 7d 0a 09 2f 2a 20 65   = min;..}../* e
7ea0: 6c 73 65 20 66 72 6f 6d 20 6e 6f 20 64 6f 77 6e  lse from no down
7eb0: 20 74 6f 20 6d 69 6e 20 2a 2f 0a 09 77 68 69 6c   to min */..whil
7ec0: 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6d 61  e (1) {...if (ma
7ed0: 74 63 68 6d 69 6e 29 20 7b 0a 09 09 09 69 66 20  tchmin) {....if 
7ee0: 28 6e 6f 20 3e 20 6d 61 78 29 20 7b 0a 09 09 09  (no > max) {....
7ef0: 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
7f00: 0a 09 09 65 6c 73 65 20 7b 0a 09 09 09 69 66 20  ...else {....if 
7f10: 28 6e 6f 20 3c 20 6d 69 6e 29 20 7b 0a 09 09 09  (no < min) {....
7f20: 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
7f30: 0a 09 09 70 72 65 67 2d 3e 72 65 67 69 6e 70 75  ...preg->reginpu
7f40: 74 20 3d 20 73 61 76 65 20 2b 20 75 74 66 38 5f  t = save + utf8_
7f50: 69 6e 64 65 78 28 73 61 76 65 2c 20 6e 6f 29 3b  index(save, no);
7f60: 0a 09 09 72 65 67 5f 75 74 66 38 5f 74 6f 75 6e  ...reg_utf8_toun
7f70: 69 63 6f 64 65 5f 63 61 73 65 28 70 72 65 67 2d  icode_case(preg-
7f80: 3e 72 65 67 69 6e 70 75 74 2c 20 26 63 2c 20 28  >reginput, &c, (
7f90: 70 72 65 67 2d 3e 63 66 6c 61 67 73 20 26 20 52  preg->cflags & R
7fa0: 45 47 5f 49 43 41 53 45 29 29 3b 0a 09 09 2f 2a  EG_ICASE));.../*
7fb0: 20 49 66 20 69 74 20 63 6f 75 6c 64 20 77 6f 72   If it could wor
7fc0: 6b 2c 20 74 72 79 20 69 74 2e 20 2a 2f 0a 09 09  k, try it. */...
7fd0: 69 66 20 28 72 65 67 5f 69 73 65 6f 6c 28 70 72  if (reg_iseol(pr
7fe0: 65 67 2c 20 6e 65 78 74 63 68 29 20 7c 7c 20 63  eg, nextch) || c
7ff0: 20 3d 3d 20 6e 65 78 74 63 68 29 20 7b 0a 09 09   == nextch) {...
8000: 09 69 66 20 28 72 65 67 6d 61 74 63 68 28 70 72  .if (regmatch(pr
8010: 65 67 2c 20 6e 65 78 74 29 29 20 7b 0a 09 09 09  eg, next)) {....
8020: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d  .return(1);....}
8030: 0a 09 09 7d 0a 09 09 69 66 20 28 6d 61 74 63 68  ...}...if (match
8040: 6d 69 6e 29 20 7b 0a 09 09 09 2f 2a 20 43 6f 75  min) {..../* Cou
8050: 6c 64 6e 27 74 20 6f 72 20 64 69 64 6e 27 74 2c  ldn't or didn't,
8060: 20 61 64 64 20 6f 6e 65 20 6d 6f 72 65 20 2a 2f   add one more */
8070: 0a 09 09 09 6e 6f 2b 2b 3b 0a 09 09 7d 0a 09 09  ....no++;...}...
8080: 65 6c 73 65 20 7b 0a 09 09 09 2f 2a 20 43 6f 75  else {..../* Cou
8090: 6c 64 6e 27 74 20 6f 72 20 64 69 64 6e 27 74 20  ldn't or didn't 
80a0: 2d 2d 20 62 61 63 6b 20 75 70 2e 20 2a 2f 0a 09  -- back up. */..
80b0: 09 09 6e 6f 2d 2d 3b 0a 09 09 7d 0a 09 7d 0a 09  ..no--;...}..}..
80c0: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74  return(0);.}..st
80d0: 61 74 69 63 20 69 6e 74 20 72 65 67 6d 61 74 63  atic int regmatc
80e0: 68 72 65 70 65 61 74 28 72 65 67 65 78 5f 74 20  hrepeat(regex_t 
80f0: 2a 70 72 65 67 2c 20 69 6e 74 20 73 63 61 6e 2c  *preg, int scan,
8100: 20 69 6e 74 20 6d 61 74 63 68 6d 69 6e 29 0a 7b   int matchmin).{
8110: 0a 09 69 6e 74 20 2a 73 63 61 6e 70 74 20 3d 20  ..int *scanpt = 
8120: 70 72 65 67 2d 3e 70 72 6f 67 72 61 6d 20 2b 20  preg->program + 
8130: 73 63 61 6e 3b 0a 0a 09 69 6e 74 20 6d 61 78 20  scan;...int max 
8140: 3d 20 73 63 61 6e 70 74 5b 32 5d 3b 0a 09 69 6e  = scanpt[2];..in
8150: 74 20 6d 69 6e 20 3d 20 73 63 61 6e 70 74 5b 33  t min = scanpt[3
8160: 5d 3b 0a 0a 09 2f 2a 20 48 61 76 65 20 77 65 20  ];.../* Have we 
8170: 72 65 61 63 68 65 64 20 6d 69 6e 3f 20 2a 2f 0a  reached min? */.
8180: 09 69 66 20 28 73 63 61 6e 70 74 5b 34 5d 20 3c  .if (scanpt[4] <
8190: 20 6d 69 6e 29 20 7b 0a 09 09 2f 2a 20 4e 6f 2c   min) {.../* No,
81a0: 20 73 6f 20 67 65 74 20 61 6e 6f 74 68 65 72 20   so get another 
81b0: 6f 6e 65 20 2a 2f 0a 09 09 73 63 61 6e 70 74 5b  one */...scanpt[
81c0: 34 5d 2b 2b 3b 0a 09 09 69 66 20 28 72 65 67 6d  4]++;...if (regm
81d0: 61 74 63 68 28 70 72 65 67 2c 20 73 63 61 6e 20  atch(preg, scan 
81e0: 2b 20 35 29 29 20 7b 0a 09 09 09 72 65 74 75 72  + 5)) {....retur
81f0: 6e 20 31 3b 0a 09 09 7d 0a 09 09 73 63 61 6e 70  n 1;...}...scanp
8200: 74 5b 34 5d 2d 2d 3b 0a 09 09 72 65 74 75 72 6e  t[4]--;...return
8210: 20 30 3b 0a 09 7d 0a 09 69 66 20 28 73 63 61 6e   0;..}..if (scan
8220: 70 74 5b 34 5d 20 3e 20 6d 61 78 29 20 7b 0a 09  pt[4] > max) {..
8230: 09 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09  .return 0;..}...
8240: 69 66 20 28 6d 61 74 63 68 6d 69 6e 29 20 7b 0a  if (matchmin) {.
8250: 09 09 2f 2a 20 6d 69 6e 69 6d 61 6c 2c 20 73 6f  ../* minimal, so
8260: 20 74 72 79 20 6f 74 68 65 72 20 62 72 61 6e 63   try other branc
8270: 68 20 66 69 72 73 74 20 2a 2f 0a 09 09 69 66 20  h first */...if 
8280: 28 72 65 67 6d 61 74 63 68 28 70 72 65 67 2c 20  (regmatch(preg, 
8290: 72 65 67 6e 65 78 74 28 70 72 65 67 2c 20 73 63  regnext(preg, sc
82a0: 61 6e 29 29 29 20 7b 0a 09 09 09 72 65 74 75 72  an))) {....retur
82b0: 6e 20 31 3b 0a 09 09 7d 0a 09 09 2f 2a 20 4e 6f  n 1;...}.../* No
82c0: 2c 20 73 6f 20 74 72 79 20 6f 6e 65 20 6d 6f 72  , so try one mor
82d0: 65 20 2a 2f 0a 09 09 73 63 61 6e 70 74 5b 34 5d  e */...scanpt[4]
82e0: 2b 2b 3b 0a 09 09 69 66 20 28 72 65 67 6d 61 74  ++;...if (regmat
82f0: 63 68 28 70 72 65 67 2c 20 73 63 61 6e 20 2b 20  ch(preg, scan + 
8300: 35 29 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 20  5)) {....return 
8310: 31 3b 0a 09 09 7d 0a 09 09 73 63 61 6e 70 74 5b  1;...}...scanpt[
8320: 34 5d 2d 2d 3b 0a 09 09 72 65 74 75 72 6e 20 30  4]--;...return 0
8330: 3b 0a 09 7d 0a 09 2f 2a 20 6d 61 78 69 6d 61 6c  ;..}../* maximal
8340: 2c 20 73 6f 20 74 72 79 20 74 68 69 73 20 62 72  , so try this br
8350: 61 6e 63 68 20 61 67 61 69 6e 20 2a 2f 0a 09 69  anch again */..i
8360: 66 20 28 73 63 61 6e 70 74 5b 34 5d 20 3c 20 6d  f (scanpt[4] < m
8370: 61 78 29 20 7b 0a 09 09 73 63 61 6e 70 74 5b 34  ax) {...scanpt[4
8380: 5d 2b 2b 3b 0a 09 09 69 66 20 28 72 65 67 6d 61  ]++;...if (regma
8390: 74 63 68 28 70 72 65 67 2c 20 73 63 61 6e 20 2b  tch(preg, scan +
83a0: 20 35 29 29 20 7b 0a 09 09 09 72 65 74 75 72 6e   5)) {....return
83b0: 20 31 3b 0a 09 09 7d 0a 09 09 73 63 61 6e 70 74   1;...}...scanpt
83c0: 5b 34 5d 2d 2d 3b 0a 09 7d 0a 09 2f 2a 20 41 74  [4]--;..}../* At
83d0: 20 74 68 69 73 20 70 6f 69 6e 74 20 77 65 20 61   this point we a
83e0: 72 65 20 61 74 20 6d 61 78 20 77 69 74 68 20 6e  re at max with n
83f0: 6f 20 6d 61 74 63 68 2e 20 54 72 79 20 74 68 65  o match. Try the
8400: 20 6f 74 68 65 72 20 62 72 61 6e 63 68 20 2a 2f   other branch */
8410: 0a 09 72 65 74 75 72 6e 20 72 65 67 6d 61 74 63  ..return regmatc
8420: 68 28 70 72 65 67 2c 20 72 65 67 6e 65 78 74 28  h(preg, regnext(
8430: 70 72 65 67 2c 20 73 63 61 6e 29 29 3b 0a 7d 0a  preg, scan));.}.
8440: 0a 2f 2a 0a 20 2d 20 72 65 67 6d 61 74 63 68 20  ./*. - regmatch 
8450: 2d 20 6d 61 69 6e 20 6d 61 74 63 68 69 6e 67 20  - main matching 
8460: 72 6f 75 74 69 6e 65 0a 20 2a 0a 20 2a 20 43 6f  routine. *. * Co
8470: 6e 63 65 70 74 75 61 6c 6c 79 20 74 68 65 20 73  nceptually the s
8480: 74 72 61 74 65 67 79 20 69 73 20 73 69 6d 70 6c  trategy is simpl
8490: 65 3a 20 20 63 68 65 63 6b 20 74 6f 20 73 65 65  e:  check to see
84a0: 20 77 68 65 74 68 65 72 20 74 68 65 20 63 75 72   whether the cur
84b0: 72 65 6e 74 0a 20 2a 20 6e 6f 64 65 20 6d 61 74  rent. * node mat
84c0: 63 68 65 73 2c 20 63 61 6c 6c 20 73 65 6c 66 20  ches, call self 
84d0: 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 73  recursively to s
84e0: 65 65 20 77 68 65 74 68 65 72 20 74 68 65 20 72  ee whether the r
84f0: 65 73 74 20 6d 61 74 63 68 65 73 2c 0a 20 2a 20  est matches,. * 
8500: 61 6e 64 20 74 68 65 6e 20 61 63 74 20 61 63 63  and then act acc
8510: 6f 72 64 69 6e 67 6c 79 2e 20 20 49 6e 20 70 72  ordingly.  In pr
8520: 61 63 74 69 63 65 20 77 65 20 6d 61 6b 65 20 73  actice we make s
8530: 6f 6d 65 20 65 66 66 6f 72 74 20 74 6f 20 61 76  ome effort to av
8540: 6f 69 64 0a 20 2a 20 72 65 63 75 72 73 69 6f 6e  oid. * recursion
8550: 2c 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  , in particular 
8560: 62 79 20 67 6f 69 6e 67 20 74 68 72 6f 75 67 68  by going through
8570: 20 22 6f 72 64 69 6e 61 72 79 22 20 6e 6f 64 65   "ordinary" node
8580: 73 20 28 74 68 61 74 20 64 6f 6e 27 74 0a 20 2a  s (that don't. *
8590: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68   need to know wh
85a0: 65 74 68 65 72 20 74 68 65 20 72 65 73 74 20 6f  ether the rest o
85b0: 66 20 74 68 65 20 6d 61 74 63 68 20 66 61 69 6c  f the match fail
85c0: 65 64 29 20 62 79 20 61 20 6c 6f 6f 70 20 69 6e  ed) by a loop in
85d0: 73 74 65 61 64 20 6f 66 0a 20 2a 20 62 79 20 72  stead of. * by r
85e0: 65 63 75 72 73 69 6f 6e 2e 0a 20 2a 2f 0a 2f 2a  ecursion.. */./*
85f0: 20 30 20 66 61 69 6c 75 72 65 2c 20 31 20 73 75   0 failure, 1 su
8600: 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
8610: 69 6e 74 20 72 65 67 6d 61 74 63 68 28 72 65 67  int regmatch(reg
8620: 65 78 5f 74 20 2a 70 72 65 67 2c 20 69 6e 74 20  ex_t *preg, int 
8630: 70 72 6f 67 29 0a 7b 0a 09 69 6e 74 20 73 63 61  prog).{..int sca
8640: 6e 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 6e 6f  n;./* Current no
8650: 64 65 2e 20 2a 2f 0a 09 69 6e 74 20 6e 65 78 74  de. */..int next
8660: 3b 09 09 2f 2a 20 4e 65 78 74 20 6e 6f 64 65 2e  ;../* Next node.
8670: 20 2a 2f 0a 0a 09 73 63 61 6e 20 3d 20 70 72 6f   */...scan = pro
8680: 67 3b 0a 0a 23 69 66 64 65 66 20 44 45 42 55 47  g;..#ifdef DEBUG
8690: 0a 09 69 66 20 28 73 63 61 6e 20 21 3d 20 30 20  ..if (scan != 0 
86a0: 26 26 20 72 65 67 6e 61 72 72 61 74 65 29 0a 09  && regnarrate)..
86b0: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
86c0: 20 22 25 73 28 5c 6e 22 2c 20 72 65 67 70 72 6f   "%s(\n", regpro
86d0: 70 28 73 63 61 6e 29 29 3b 0a 23 65 6e 64 69 66  p(scan));.#endif
86e0: 0a 09 77 68 69 6c 65 20 28 73 63 61 6e 20 21 3d  ..while (scan !=
86f0: 20 30 29 20 7b 0a 09 09 69 6e 74 20 6e 3b 0a 09   0) {...int n;..
8700: 09 69 6e 74 20 63 3b 0a 23 69 66 64 65 66 20 44  .int c;.#ifdef D
8710: 45 42 55 47 0a 09 09 69 66 20 28 72 65 67 6e 61  EBUG...if (regna
8720: 72 72 61 74 65 29 20 7b 0a 09 09 09 66 70 72 69  rrate) {....fpri
8730: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 33 64  ntf(stderr, "%3d
8740: 3a 20 25 73 2e 2e 2e 5c 6e 22 2c 20 73 63 61 6e  : %s...\n", scan
8750: 2c 20 72 65 67 70 72 6f 70 28 4f 50 28 70 72 65  , regprop(OP(pre
8760: 67 2c 20 73 63 61 6e 29 29 29 3b 09 2f 2a 20 57  g, scan)));./* W
8770: 68 65 72 65 2c 20 77 68 61 74 2e 20 2a 2f 0a 09  here, what. */..
8780: 09 7d 0a 23 65 6e 64 69 66 0a 09 09 6e 65 78 74  .}.#endif...next
8790: 20 3d 20 72 65 67 6e 65 78 74 28 70 72 65 67 2c   = regnext(preg,
87a0: 20 73 63 61 6e 29 3b 0a 09 09 6e 20 3d 20 72 65   scan);...n = re
87b0: 67 5f 75 74 66 38 5f 74 6f 75 6e 69 63 6f 64 65  g_utf8_tounicode
87c0: 5f 63 61 73 65 28 70 72 65 67 2d 3e 72 65 67 69  _case(preg->regi
87d0: 6e 70 75 74 2c 20 26 63 2c 20 28 70 72 65 67 2d  nput, &c, (preg-
87e0: 3e 63 66 6c 61 67 73 20 26 20 52 45 47 5f 49 43  >cflags & REG_IC
87f0: 41 53 45 29 29 3b 0a 0a 09 09 73 77 69 74 63 68  ASE));....switch
8800: 20 28 4f 50 28 70 72 65 67 2c 20 73 63 61 6e 29   (OP(preg, scan)
8810: 29 20 7b 0a 09 09 63 61 73 65 20 42 4f 4c 3a 0a  ) {...case BOL:.
8820: 09 09 09 69 66 20 28 70 72 65 67 2d 3e 72 65 67  ...if (preg->reg
8830: 69 6e 70 75 74 20 21 3d 20 70 72 65 67 2d 3e 72  input != preg->r
8840: 65 67 62 6f 6c 29 0a 09 09 09 09 72 65 74 75 72  egbol).....retur
8850: 6e 28 30 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  n(0);....break;.
8860: 09 09 63 61 73 65 20 45 4f 4c 3a 0a 09 09 09 69  ..case EOL:....i
8870: 66 20 28 21 72 65 67 5f 69 73 65 6f 6c 28 70 72  f (!reg_iseol(pr
8880: 65 67 2c 20 63 29 29 20 7b 0a 09 09 09 09 72 65  eg, c)) {.....re
8890: 74 75 72 6e 28 30 29 3b 0a 09 09 09 7d 0a 09 09  turn(0);....}...
88a0: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 57  .break;...case W
88b0: 4f 52 44 41 3a 0a 09 09 09 2f 2a 20 4d 75 73 74  ORDA:..../* Must
88c0: 20 62 65 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 61   be looking at a
88d0: 20 6c 65 74 74 65 72 2c 20 64 69 67 69 74 2c 20   letter, digit, 
88e0: 6f 72 20 5f 20 2a 2f 0a 09 09 09 69 66 20 28 28  or _ */....if ((
88f0: 21 69 73 61 6c 6e 75 6d 28 55 43 48 41 52 28 63  !isalnum(UCHAR(c
8900: 29 29 29 20 26 26 20 63 20 21 3d 20 27 5f 27 29  ))) && c != '_')
8910: 0a 09 09 09 09 72 65 74 75 72 6e 28 30 29 3b 0a  .....return(0);.
8920: 09 09 09 2f 2a 20 50 72 65 76 20 6d 75 73 74 20  .../* Prev must 
8930: 62 65 20 42 4f 4c 20 6f 72 20 6e 6f 6e 77 6f 72  be BOL or nonwor
8940: 64 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 67  d */....if (preg
8950: 2d 3e 72 65 67 69 6e 70 75 74 20 3e 20 70 72 65  ->reginput > pre
8960: 67 2d 3e 72 65 67 62 6f 6c 20 26 26 0a 09 09 09  g->regbol &&....
8970: 09 28 69 73 61 6c 6e 75 6d 28 55 43 48 41 52 28  .(isalnum(UCHAR(
8980: 70 72 65 67 2d 3e 72 65 67 69 6e 70 75 74 5b 2d  preg->reginput[-
8990: 31 5d 29 29 20 7c 7c 20 70 72 65 67 2d 3e 72 65  1])) || preg->re
89a0: 67 69 6e 70 75 74 5b 2d 31 5d 20 3d 3d 20 27 5f  ginput[-1] == '_
89b0: 27 29 29 0a 09 09 09 09 72 65 74 75 72 6e 28 30  ')).....return(0
89c0: 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  );....break;...c
89d0: 61 73 65 20 57 4f 52 44 5a 3a 0a 09 09 09 2f 2a  ase WORDZ:..../*
89e0: 20 43 61 6e 27 74 20 6d 61 74 63 68 20 61 74 20   Can't match at 
89f0: 42 4f 4c 20 2a 2f 0a 09 09 09 69 66 20 28 70 72  BOL */....if (pr
8a00: 65 67 2d 3e 72 65 67 69 6e 70 75 74 20 3e 20 70  eg->reginput > p
8a10: 72 65 67 2d 3e 72 65 67 62 6f 6c 29 20 7b 0a 09  reg->regbol) {..
8a20: 09 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 6d 75  .../* Current mu
8a30: 73 74 20 62 65 20 45 4f 4c 20 6f 72 20 6e 6f 6e  st be EOL or non
8a40: 77 6f 72 64 20 2a 2f 0a 09 09 09 09 69 66 20 28  word */.....if (
8a50: 72 65 67 5f 69 73 65 6f 6c 28 70 72 65 67 2c 20  reg_iseol(preg, 
8a60: 63 29 20 7c 7c 20 21 69 73 61 6c 6e 75 6d 28 55  c) || !isalnum(U
8a70: 43 48 41 52 28 63 29 29 20 7c 7c 20 63 20 21 3d  CHAR(c)) || c !=
8a80: 20 27 5f 27 29 20 7b 0a 09 09 09 09 09 63 20 3d   '_') {......c =
8a90: 20 70 72 65 67 2d 3e 72 65 67 69 6e 70 75 74 5b   preg->reginput[
8aa0: 2d 31 5d 3b 0a 09 09 09 09 09 2f 2a 20 50 72 65  -1];....../* Pre
8ab0: 76 69 6f 75 73 20 6d 75 73 74 20 62 65 20 77 6f  vious must be wo
8ac0: 72 64 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 69  rd */......if (i
8ad0: 73 61 6c 6e 75 6d 28 55 43 48 41 52 28 63 29 29  salnum(UCHAR(c))
8ae0: 20 7c 7c 20 63 20 3d 3d 20 27 5f 27 29 20 7b 0a   || c == '_') {.
8af0: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
8b00: 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09  ..}.....}....}..
8b10: 09 09 2f 2a 20 4e 6f 20 2a 2f 0a 09 09 09 72 65  ../* No */....re
8b20: 74 75 72 6e 28 30 29 3b 0a 0a 09 09 63 61 73 65  turn(0);....case
8b30: 20 41 4e 59 3a 0a 09 09 09 69 66 20 28 72 65 67   ANY:....if (reg
8b40: 5f 69 73 65 6f 6c 28 70 72 65 67 2c 20 63 29 29  _iseol(preg, c))
8b50: 0a 09 09 09 09 72 65 74 75 72 6e 20 30 3b 0a 09  .....return 0;..
8b60: 09 09 70 72 65 67 2d 3e 72 65 67 69 6e 70 75 74  ..preg->reginput
8b70: 20 2b 3d 20 6e 3b 0a 09 09 09 62 72 65 61 6b 3b   += n;....break;
8b80: 0a 09 09 63 61 73 65 20 45 58 41 43 54 4c 59 3a  ...case EXACTLY:
8b90: 20 7b 0a 09 09 09 09 69 6e 74 20 6f 70 6e 64 3b   {.....int opnd;
8ba0: 0a 09 09 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09  .....int len;...
8bb0: 09 09 69 6e 74 20 73 6c 65 6e 3b 0a 0a 09 09 09  ..int slen;.....
8bc0: 09 6f 70 6e 64 20 3d 20 4f 50 45 52 41 4e 44 28  .opnd = OPERAND(
8bd0: 73 63 61 6e 29 3b 0a 09 09 09 09 6c 65 6e 20 3d  scan);.....len =
8be0: 20 73 74 72 5f 69 6e 74 5f 6c 65 6e 28 70 72 65   str_int_len(pre
8bf0: 67 2d 3e 70 72 6f 67 72 61 6d 20 2b 20 6f 70 6e  g->program + opn
8c00: 64 29 3b 0a 0a 09 09 09 09 73 6c 65 6e 20 3d 20  d);......slen = 
8c10: 70 72 65 66 69 78 5f 63 6d 70 28 70 72 65 67 2d  prefix_cmp(preg-
8c20: 3e 70 72 6f 67 72 61 6d 20 2b 20 6f 70 6e 64 2c  >program + opnd,
8c30: 20 6c 65 6e 2c 20 70 72 65 67 2d 3e 72 65 67 69   len, preg->regi
8c40: 6e 70 75 74 2c 20 70 72 65 67 2d 3e 63 66 6c 61  nput, preg->cfla
8c50: 67 73 20 26 20 52 45 47 5f 49 43 41 53 45 29 3b  gs & REG_ICASE);
8c60: 0a 09 09 09 09 69 66 20 28 73 6c 65 6e 20 3c 20  .....if (slen < 
8c70: 30 29 20 7b 0a 09 09 09 09 09 72 65 74 75 72 6e  0) {......return
8c80: 28 30 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 70  (0);.....}.....p
8c90: 72 65 67 2d 3e 72 65 67 69 6e 70 75 74 20 2b 3d  reg->reginput +=
8ca0: 20 73 6c 65 6e 3b 0a 09 09 09 7d 0a 09 09 09 62   slen;....}....b
8cb0: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 41 4e 59  reak;...case ANY
8cc0: 4f 46 3a 0a 09 09 09 69 66 20 28 72 65 67 5f 69  OF:....if (reg_i
8cd0: 73 65 6f 6c 28 70 72 65 67 2c 20 63 29 20 7c 7c  seol(preg, c) ||
8ce0: 20 72 65 67 5f 72 61 6e 67 65 5f 66 69 6e 64 28   reg_range_find(
8cf0: 70 72 65 67 2d 3e 70 72 6f 67 72 61 6d 20 2b 20  preg->program + 
8d00: 4f 50 45 52 41 4e 44 28 73 63 61 6e 29 2c 20 63  OPERAND(scan), c
8d10: 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 72 65  ) == 0) {.....re
8d20: 74 75 72 6e 28 30 29 3b 0a 09 09 09 7d 0a 09 09  turn(0);....}...
8d30: 09 70 72 65 67 2d 3e 72 65 67 69 6e 70 75 74 20  .preg->reginput 
8d40: 2b 3d 20 6e 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  += n;....break;.
8d50: 09 09 63 61 73 65 20 41 4e 59 42 55 54 3a 0a 09  ..case ANYBUT:..
8d60: 09 09 69 66 20 28 72 65 67 5f 69 73 65 6f 6c 28  ..if (reg_iseol(
8d70: 70 72 65 67 2c 20 63 29 20 7c 7c 20 72 65 67 5f  preg, c) || reg_
8d80: 72 61 6e 67 65 5f 66 69 6e 64 28 70 72 65 67 2d  range_find(preg-
8d90: 3e 70 72 6f 67 72 61 6d 20 2b 20 4f 50 45 52 41  >program + OPERA
8da0: 4e 44 28 73 63 61 6e 29 2c 20 63 29 20 21 3d 20  ND(scan), c) != 
8db0: 30 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28  0) {.....return(
8dc0: 30 29 3b 0a 09 09 09 7d 0a 09 09 09 70 72 65 67  0);....}....preg
8dd0: 2d 3e 72 65 67 69 6e 70 75 74 20 2b 3d 20 6e 3b  ->reginput += n;
8de0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
8df0: 65 20 4e 4f 54 48 49 4e 47 3a 0a 09 09 09 62 72  e NOTHING:....br
8e00: 65 61 6b 3b 0a 09 09 63 61 73 65 20 42 41 43 4b  eak;...case BACK
8e10: 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  :....break;...ca
8e20: 73 65 20 42 52 41 4e 43 48 3a 20 7b 0a 09 09 09  se BRANCH: {....
8e30: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 61 76  .const char *sav
8e40: 65 3b 0a 0a 09 09 09 09 69 66 20 28 4f 50 28 70  e;......if (OP(p
8e50: 72 65 67 2c 20 6e 65 78 74 29 20 21 3d 20 42 52  reg, next) != BR
8e60: 41 4e 43 48 29 09 09 2f 2a 20 4e 6f 20 63 68 6f  ANCH)../* No cho
8e70: 69 63 65 2e 20 2a 2f 0a 09 09 09 09 09 6e 65 78  ice. */......nex
8e80: 74 20 3d 20 4f 50 45 52 41 4e 44 28 73 63 61 6e  t = OPERAND(scan
8e90: 29 3b 09 2f 2a 20 41 76 6f 69 64 20 72 65 63 75  );./* Avoid recu
8ea0: 72 73 69 6f 6e 2e 20 2a 2f 0a 09 09 09 09 65 6c  rsion. */.....el
8eb0: 73 65 20 7b 0a 09 09 09 09 09 64 6f 20 7b 0a 09  se {......do {..
8ec0: 09 09 09 09 09 73 61 76 65 20 3d 20 70 72 65 67  .....save = preg
8ed0: 2d 3e 72 65 67 69 6e 70 75 74 3b 0a 09 09 09 09  ->reginput;.....
8ee0: 09 09 69 66 20 28 72 65 67 6d 61 74 63 68 28 70  ..if (regmatch(p
8ef0: 72 65 67 2c 20 4f 50 45 52 41 4e 44 28 73 63 61  reg, OPERAND(sca
8f00: 6e 29 29 29 20 7b 0a 09 09 09 09 09 09 09 72 65  n))) {........re
8f10: 74 75 72 6e 28 31 29 3b 0a 09 09 09 09 09 09 7d  turn(1);.......}
8f20: 0a 09 09 09 09 09 09 70 72 65 67 2d 3e 72 65 67  .......preg->reg
8f30: 69 6e 70 75 74 20 3d 20 73 61 76 65 3b 0a 09 09  input = save;...
8f40: 09 09 09 09 73 63 61 6e 20 3d 20 72 65 67 6e 65  ....scan = regne
8f50: 78 74 28 70 72 65 67 2c 20 73 63 61 6e 29 3b 0a  xt(preg, scan);.
8f60: 09 09 09 09 09 7d 20 77 68 69 6c 65 20 28 73 63  .....} while (sc
8f70: 61 6e 20 21 3d 20 30 20 26 26 20 4f 50 28 70 72  an != 0 && OP(pr
8f80: 65 67 2c 20 73 63 61 6e 29 20 3d 3d 20 42 52 41  eg, scan) == BRA
8f90: 4e 43 48 29 3b 0a 09 09 09 09 09 72 65 74 75 72  NCH);......retur
8fa0: 6e 28 30 29 3b 0a 09 09 09 09 09 2f 2a 20 4e 4f  n(0);....../* NO
8fb0: 54 52 45 41 43 48 45 44 20 2a 2f 0a 09 09 09 09  TREACHED */.....
8fc0: 7d 0a 09 09 09 7d 0a 09 09 09 62 72 65 61 6b 3b  }....}....break;
8fd0: 0a 09 09 63 61 73 65 20 52 45 50 3a 0a 09 09 63  ...case REP:...c
8fe0: 61 73 65 20 52 45 50 4d 49 4e 3a 0a 09 09 09 72  ase REPMIN:....r
8ff0: 65 74 75 72 6e 20 72 65 67 6d 61 74 63 68 73 69  eturn regmatchsi
9000: 6d 70 6c 65 72 65 70 65 61 74 28 70 72 65 67 2c  mplerepeat(preg,
9010: 20 73 63 61 6e 2c 20 4f 50 28 70 72 65 67 2c 20   scan, OP(preg, 
9020: 73 63 61 6e 29 20 3d 3d 20 52 45 50 4d 49 4e 29  scan) == REPMIN)
9030: 3b 0a 0a 09 09 63 61 73 65 20 52 45 50 58 3a 0a  ;....case REPX:.
9040: 09 09 63 61 73 65 20 52 45 50 58 4d 49 4e 3a 0a  ..case REPXMIN:.
9050: 09 09 09 72 65 74 75 72 6e 20 72 65 67 6d 61 74  ...return regmat
9060: 63 68 72 65 70 65 61 74 28 70 72 65 67 2c 20 73  chrepeat(preg, s
9070: 63 61 6e 2c 20 4f 50 28 70 72 65 67 2c 20 73 63  can, OP(preg, sc
9080: 61 6e 29 20 3d 3d 20 52 45 50 58 4d 49 4e 29 3b  an) == REPXMIN);
9090: 0a 0a 09 09 63 61 73 65 20 45 4e 44 3a 0a 09 09  ....case END:...
90a0: 09 72 65 74 75 72 6e 28 31 29 3b 09 2f 2a 20 53  .return(1);./* S
90b0: 75 63 63 65 73 73 21 20 2a 2f 0a 09 09 09 62 72  uccess! */....br
90c0: 65 61 6b 3b 0a 0a 09 09 63 61 73 65 20 4f 50 45  eak;....case OPE
90d0: 4e 4e 43 3a 0a 09 09 63 61 73 65 20 43 4c 4f 53  NNC:...case CLOS
90e0: 45 4e 43 3a 0a 09 09 09 69 66 20 28 72 65 67 6d  ENC:....if (regm
90f0: 61 74 63 68 28 70 72 65 67 2c 20 6e 65 78 74 29  atch(preg, next)
9100: 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 20 31  ) {.....return 1
9110: 3b 0a 09 09 09 7d 0a 09 09 09 72 65 74 75 72 6e  ;....}....return
9120: 20 30 3b 0a 0a 09 09 64 65 66 61 75 6c 74 3a 0a   0;....default:.
9130: 09 09 09 69 66 20 28 4f 50 28 70 72 65 67 2c 20  ...if (OP(preg, 
9140: 73 63 61 6e 29 20 3e 3d 20 4f 50 45 4e 2b 31 20  scan) >= OPEN+1 
9150: 26 26 20 4f 50 28 70 72 65 67 2c 20 73 63 61 6e  && OP(preg, scan
9160: 29 20 3c 20 43 4c 4f 53 45 5f 45 4e 44 29 20 7b  ) < CLOSE_END) {
9170: 0a 09 09 09 09 63 6f 6e 73 74 20 63 68 61 72 20  .....const char 
9180: 2a 73 61 76 65 3b 0a 0a 09 09 09 09 73 61 76 65  *save;......save
9190: 20 3d 20 70 72 65 67 2d 3e 72 65 67 69 6e 70 75   = preg->reginpu
91a0: 74 3b 0a 0a 09 09 09 09 69 66 20 28 72 65 67 6d  t;......if (regm
91b0: 61 74 63 68 28 70 72 65 67 2c 20 6e 65 78 74 29  atch(preg, next)
91c0: 29 20 7b 0a 09 09 09 09 09 69 6e 74 20 6e 6f 3b  ) {......int no;
91d0: 0a 09 09 09 09 09 2f 2a 0a 09 09 09 09 09 20 2a  ....../*...... *
91e0: 20 44 6f 6e 27 74 20 73 65 74 20 73 74 61 72 74   Don't set start
91f0: 70 20 69 66 20 73 6f 6d 65 20 6c 61 74 65 72 0a  p if some later.
9200: 09 09 09 09 09 20 2a 20 69 6e 76 6f 63 61 74 69  ..... * invocati
9210: 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  on of the same p
9220: 61 72 65 6e 74 68 65 73 65 73 0a 09 09 09 09 09  arentheses......
9230: 20 2a 20 61 6c 72 65 61 64 79 20 68 61 73 2e 0a   * already has..
9240: 09 09 09 09 09 20 2a 2f 0a 09 09 09 09 09 69 66  ..... */......if
9250: 20 28 4f 50 28 70 72 65 67 2c 20 73 63 61 6e 29   (OP(preg, scan)
9260: 20 3c 20 43 4c 4f 53 45 29 20 7b 0a 09 09 09 09   < CLOSE) {.....
9270: 09 09 6e 6f 20 3d 20 4f 50 28 70 72 65 67 2c 20  ..no = OP(preg, 
9280: 73 63 61 6e 29 20 2d 20 4f 50 45 4e 3b 0a 09 09  scan) - OPEN;...
9290: 09 09 09 09 69 66 20 28 6e 6f 20 3c 20 70 72 65  ....if (no < pre
92a0: 67 2d 3e 6e 6d 61 74 63 68 20 26 26 20 70 72 65  g->nmatch && pre
92b0: 67 2d 3e 70 6d 61 74 63 68 5b 6e 6f 5d 2e 72 6d  g->pmatch[no].rm
92c0: 5f 73 6f 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 09  _so == -1) {....
92d0: 09 09 09 09 70 72 65 67 2d 3e 70 6d 61 74 63 68  ....preg->pmatch
92e0: 5b 6e 6f 5d 2e 72 6d 5f 73 6f 20 3d 20 73 61 76  [no].rm_so = sav
92f0: 65 20 2d 20 70 72 65 67 2d 3e 73 74 61 72 74 3b  e - preg->start;
9300: 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a  .......}......}.
9310: 09 09 09 09 09 65 6c 73 65 20 7b 0a 09 09 09 09  .....else {.....
9320: 09 09 6e 6f 20 3d 20 4f 50 28 70 72 65 67 2c 20  ..no = OP(preg, 
9330: 73 63 61 6e 29 20 2d 20 43 4c 4f 53 45 3b 0a 09  scan) - CLOSE;..
9340: 09 09 09 09 09 69 66 20 28 6e 6f 20 3c 20 70 72  .....if (no < pr
9350: 65 67 2d 3e 6e 6d 61 74 63 68 20 26 26 20 70 72  eg->nmatch && pr
9360: 65 67 2d 3e 70 6d 61 74 63 68 5b 6e 6f 5d 2e 72  eg->pmatch[no].r
9370: 6d 5f 65 6f 20 3d 3d 20 2d 31 29 20 7b 0a 09 09  m_eo == -1) {...
9380: 09 09 09 09 09 70 72 65 67 2d 3e 70 6d 61 74 63  .....preg->pmatc
9390: 68 5b 6e 6f 5d 2e 72 6d 5f 65 6f 20 3d 20 73 61  h[no].rm_eo = sa
93a0: 76 65 20 2d 20 70 72 65 67 2d 3e 73 74 61 72 74  ve - preg->start
93b0: 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
93c0: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b  ......return(1);
93d0: 0a 09 09 09 09 7d 20 65 6c 73 65 0a 09 09 09 09  .....} else.....
93e0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 09 09 7d  .return(0);....}
93f0: 0a 09 09 09 72 65 74 75 72 6e 20 52 45 47 5f 45  ....return REG_E
9400: 52 52 5f 49 4e 54 45 52 4e 41 4c 3b 0a 09 09 7d  RR_INTERNAL;...}
9410: 0a 0a 09 09 73 63 61 6e 20 3d 20 6e 65 78 74 3b  ....scan = next;
9420: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20  ..}.../*.. * We 
9430: 67 65 74 20 68 65 72 65 20 6f 6e 6c 79 20 69 66  get here only if
9440: 20 74 68 65 72 65 27 73 20 74 72 6f 75 62 6c 65   there's trouble
9450: 20 2d 2d 20 6e 6f 72 6d 61 6c 6c 79 20 22 63 61   -- normally "ca
9460: 73 65 20 45 4e 44 22 20 69 73 0a 09 20 2a 20 74  se END" is.. * t
9470: 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 70  he terminating p
9480: 6f 69 6e 74 2e 0a 09 20 2a 2f 0a 09 72 65 74 75  oint... */..retu
9490: 72 6e 20 52 45 47 5f 45 52 52 5f 49 4e 54 45 52  rn REG_ERR_INTER
94a0: 4e 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65  NAL;.}../*. - re
94b0: 67 72 65 70 65 61 74 20 2d 20 72 65 70 65 61 74  grepeat - repeat
94c0: 65 64 6c 79 20 6d 61 74 63 68 20 73 6f 6d 65 74  edly match somet
94d0: 68 69 6e 67 20 73 69 6d 70 6c 65 2c 20 72 65 70  hing simple, rep
94e0: 6f 72 74 20 68 6f 77 20 6d 61 6e 79 0a 20 2a 2f  ort how many. */
94f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 67 72  .static int regr
9500: 65 70 65 61 74 28 72 65 67 65 78 5f 74 20 2a 70  epeat(regex_t *p
9510: 72 65 67 2c 20 69 6e 74 20 70 2c 20 69 6e 74 20  reg, int p, int 
9520: 6d 61 78 29 0a 7b 0a 09 69 6e 74 20 63 6f 75 6e  max).{..int coun
9530: 74 20 3d 20 30 3b 0a 09 63 6f 6e 73 74 20 63 68  t = 0;..const ch
9540: 61 72 20 2a 73 63 61 6e 3b 0a 09 69 6e 74 20 6f  ar *scan;..int o
9550: 70 6e 64 3b 0a 09 69 6e 74 20 63 68 3b 0a 09 69  pnd;..int ch;..i
9560: 6e 74 20 6e 3b 0a 0a 09 73 63 61 6e 20 3d 20 70  nt n;...scan = p
9570: 72 65 67 2d 3e 72 65 67 69 6e 70 75 74 3b 0a 09  reg->reginput;..
9580: 6f 70 6e 64 20 3d 20 4f 50 45 52 41 4e 44 28 70  opnd = OPERAND(p
9590: 29 3b 0a 09 73 77 69 74 63 68 20 28 4f 50 28 70  );..switch (OP(p
95a0: 72 65 67 2c 20 70 29 29 20 7b 0a 09 63 61 73 65  reg, p)) {..case
95b0: 20 41 4e 59 3a 0a 09 09 2f 2a 20 4e 6f 20 6e 65   ANY:.../* No ne
95c0: 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 75 74 66  ed to handle utf
95d0: 38 20 73 70 65 63 69 61 6c 6c 79 20 68 65 72 65  8 specially here
95e0: 20 2a 2f 0a 09 09 77 68 69 6c 65 20 28 21 72 65   */...while (!re
95f0: 67 5f 69 73 65 6f 6c 28 70 72 65 67 2c 20 2a 73  g_iseol(preg, *s
9600: 63 61 6e 29 20 26 26 20 63 6f 75 6e 74 20 3c 20  can) && count < 
9610: 6d 61 78 29 20 7b 0a 09 09 09 63 6f 75 6e 74 2b  max) {....count+
9620: 2b 3b 0a 09 09 09 73 63 61 6e 2b 2b 3b 0a 09 09  +;....scan++;...
9630: 7d 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65  }...break;..case
9640: 20 45 58 41 43 54 4c 59 3a 0a 09 09 77 68 69 6c   EXACTLY:...whil
9650: 65 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 29 20  e (count < max) 
9660: 7b 0a 09 09 09 6e 20 3d 20 72 65 67 5f 75 74 66  {....n = reg_utf
9670: 38 5f 74 6f 75 6e 69 63 6f 64 65 5f 63 61 73 65  8_tounicode_case
9680: 28 73 63 61 6e 2c 20 26 63 68 2c 20 70 72 65 67  (scan, &ch, preg
9690: 2d 3e 63 66 6c 61 67 73 20 26 20 52 45 47 5f 49  ->cflags & REG_I
96a0: 43 41 53 45 29 3b 0a 09 09 09 69 66 20 28 70 72  CASE);....if (pr
96b0: 65 67 2d 3e 70 72 6f 67 72 61 6d 5b 6f 70 6e 64  eg->program[opnd
96c0: 5d 20 21 3d 20 63 68 29 20 7b 0a 09 09 09 09 62  ] != ch) {.....b
96d0: 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 09 63 6f  reak;....}....co
96e0: 75 6e 74 2b 2b 3b 0a 09 09 09 73 63 61 6e 20 2b  unt++;....scan +
96f0: 3d 20 6e 3b 0a 09 09 7d 0a 09 09 62 72 65 61 6b  = n;...}...break
9700: 3b 0a 09 63 61 73 65 20 41 4e 59 4f 46 3a 0a 09  ;..case ANYOF:..
9710: 09 77 68 69 6c 65 20 28 63 6f 75 6e 74 20 3c 20  .while (count < 
9720: 6d 61 78 29 20 7b 0a 09 09 09 6e 20 3d 20 72 65  max) {....n = re
9730: 67 5f 75 74 66 38 5f 74 6f 75 6e 69 63 6f 64 65  g_utf8_tounicode
9740: 5f 63 61 73 65 28 73 63 61 6e 2c 20 26 63 68 2c  _case(scan, &ch,
9750: 20 70 72 65 67 2d 3e 63 66 6c 61 67 73 20 26 20   preg->cflags & 
9760: 52 45 47 5f 49 43 41 53 45 29 3b 0a 09 09 09 69  REG_ICASE);....i
9770: 66 20 28 72 65 67 5f 69 73 65 6f 6c 28 70 72 65  f (reg_iseol(pre
9780: 67 2c 20 63 68 29 20 7c 7c 20 72 65 67 5f 72 61  g, ch) || reg_ra
9790: 6e 67 65 5f 66 69 6e 64 28 70 72 65 67 2d 3e 70  nge_find(preg->p
97a0: 72 6f 67 72 61 6d 20 2b 20 6f 70 6e 64 2c 20 63  rogram + opnd, c
97b0: 68 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 62  h) == 0) {.....b
97c0: 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 09 63 6f  reak;....}....co
97d0: 75 6e 74 2b 2b 3b 0a 09 09 09 73 63 61 6e 20 2b  unt++;....scan +
97e0: 3d 20 6e 3b 0a 09 09 7d 0a 09 09 62 72 65 61 6b  = n;...}...break
97f0: 3b 0a 09 63 61 73 65 20 41 4e 59 42 55 54 3a 0a  ;..case ANYBUT:.
9800: 09 09 77 68 69 6c 65 20 28 63 6f 75 6e 74 20 3c  ..while (count <
9810: 20 6d 61 78 29 20 7b 0a 09 09 09 6e 20 3d 20 72   max) {....n = r
9820: 65 67 5f 75 74 66 38 5f 74 6f 75 6e 69 63 6f 64  eg_utf8_tounicod
9830: 65 5f 63 61 73 65 28 73 63 61 6e 2c 20 26 63 68  e_case(scan, &ch
9840: 2c 20 70 72 65 67 2d 3e 63 66 6c 61 67 73 20 26  , preg->cflags &
9850: 20 52 45 47 5f 49 43 41 53 45 29 3b 0a 09 09 09   REG_ICASE);....
9860: 69 66 20 28 72 65 67 5f 69 73 65 6f 6c 28 70 72  if (reg_iseol(pr
9870: 65 67 2c 20 63 68 29 20 7c 7c 20 72 65 67 5f 72  eg, ch) || reg_r
9880: 61 6e 67 65 5f 66 69 6e 64 28 70 72 65 67 2d 3e  ange_find(preg->
9890: 70 72 6f 67 72 61 6d 20 2b 20 6f 70 6e 64 2c 20  program + opnd, 
98a0: 63 68 29 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  ch) != 0) {.....
98b0: 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 09 63  break;....}....c
98c0: 6f 75 6e 74 2b 2b 3b 0a 09 09 09 73 63 61 6e 20  ount++;....scan 
98d0: 2b 3d 20 6e 3b 0a 09 09 7d 0a 09 09 62 72 65 61  += n;...}...brea
98e0: 6b 3b 0a 09 64 65 66 61 75 6c 74 3a 09 09 2f 2a  k;..default:../*
98f0: 20 4f 68 20 64 65 61 72 2e 20 20 43 61 6c 6c 65   Oh dear.  Calle
9900: 64 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 6c  d inappropriatel
9910: 79 2e 20 2a 2f 0a 09 09 70 72 65 67 2d 3e 65 72  y. */...preg->er
9920: 72 20 3d 20 52 45 47 5f 45 52 52 5f 49 4e 54 45  r = REG_ERR_INTE
9930: 52 4e 41 4c 3b 0a 09 09 63 6f 75 6e 74 20 3d 20  RNAL;...count = 
9940: 30 3b 09 2f 2a 20 42 65 73 74 20 63 6f 6d 70 72  0;./* Best compr
9950: 6f 6d 69 73 65 2e 20 2a 2f 0a 09 09 62 72 65 61  omise. */...brea
9960: 6b 3b 0a 09 7d 0a 09 70 72 65 67 2d 3e 72 65 67  k;..}..preg->reg
9970: 69 6e 70 75 74 20 3d 20 73 63 61 6e 3b 0a 0a 09  input = scan;...
9980: 72 65 74 75 72 6e 28 63 6f 75 6e 74 29 3b 0a 7d  return(count);.}
9990: 0a 0a 2f 2a 0a 20 2d 20 72 65 67 6e 65 78 74 20  ../*. - regnext 
99a0: 2d 20 64 69 67 20 74 68 65 20 22 6e 65 78 74 22  - dig the "next"
99b0: 20 70 6f 69 6e 74 65 72 20 6f 75 74 20 6f 66 20   pointer out of 
99c0: 61 20 6e 6f 64 65 0a 20 2a 2f 0a 73 74 61 74 69  a node. */.stati
99d0: 63 20 69 6e 74 20 72 65 67 6e 65 78 74 28 72 65  c int regnext(re
99e0: 67 65 78 5f 74 20 2a 70 72 65 67 2c 20 69 6e 74  gex_t *preg, int
99f0: 20 70 20 29 0a 7b 0a 09 69 6e 74 20 6f 66 66 73   p ).{..int offs
9a00: 65 74 3b 0a 0a 09 6f 66 66 73 65 74 20 3d 20 4e  et;...offset = N
9a10: 45 58 54 28 70 72 65 67 2c 20 70 29 3b 0a 0a 09  EXT(preg, p);...
9a20: 69 66 20 28 6f 66 66 73 65 74 20 3d 3d 20 30 29  if (offset == 0)
9a30: 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 0a 09 69  ...return 0;...i
9a40: 66 20 28 4f 50 28 70 72 65 67 2c 20 70 29 20 3d  f (OP(preg, p) =
9a50: 3d 20 42 41 43 4b 29 0a 09 09 72 65 74 75 72 6e  = BACK)...return
9a60: 28 70 2d 6f 66 66 73 65 74 29 3b 0a 09 65 6c 73  (p-offset);..els
9a70: 65 0a 09 09 72 65 74 75 72 6e 28 70 2b 6f 66 66  e...return(p+off
9a80: 73 65 74 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  set);.}..#if def
9a90: 69 6e 65 64 28 44 45 42 55 47 29 20 26 26 20 21  ined(DEBUG) && !
9aa0: 64 65 66 69 6e 65 64 28 4a 49 4d 5f 42 4f 4f 54  defined(JIM_BOOT
9ab0: 53 54 52 41 50 29 0a 0a 2f 2a 0a 20 2d 20 72 65  STRAP)../*. - re
9ac0: 67 64 75 6d 70 20 2d 20 64 75 6d 70 20 61 20 72  gdump - dump a r
9ad0: 65 67 65 78 70 20 6f 6e 74 6f 20 73 74 64 6f 75  egexp onto stdou
9ae0: 74 20 69 6e 20 76 61 67 75 65 6c 79 20 63 6f 6d  t in vaguely com
9af0: 70 72 65 68 65 6e 73 69 62 6c 65 20 66 6f 72 6d  prehensible form
9b00: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
9b10: 20 72 65 67 64 75 6d 70 28 72 65 67 65 78 5f 74   regdump(regex_t
9b20: 20 2a 70 72 65 67 29 0a 7b 0a 09 69 6e 74 20 73   *preg).{..int s
9b30: 3b 0a 09 69 6e 74 20 6f 70 20 3d 20 45 58 41 43  ;..int op = EXAC
9b40: 54 4c 59 3b 09 2f 2a 20 41 72 62 69 74 72 61 72  TLY;./* Arbitrar
9b50: 79 20 6e 6f 6e 2d 45 4e 44 20 6f 70 2e 20 2a 2f  y non-END op. */
9b60: 0a 09 69 6e 74 20 6e 65 78 74 3b 0a 09 63 68 61  ..int next;..cha
9b70: 72 20 62 75 66 5b 4d 41 58 5f 55 54 46 38 5f 4c  r buf[MAX_UTF8_L
9b80: 45 4e 20 2b 20 31 5d 3b 0a 0a 09 69 6e 74 20 69  EN + 1];...int i
9b90: 3b 0a 09 66 6f 72 20 28 69 20 3d 20 31 3b 20 69  ;..for (i = 1; i
9ba0: 20 3c 20 70 72 65 67 2d 3e 70 3b 20 69 2b 2b 29   < preg->p; i++)
9bb0: 20 7b 0a 09 09 70 72 69 6e 74 66 28 22 25 30 32   {...printf("%02
9bc0: 78 20 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  x ", (unsigned c
9bd0: 68 61 72 29 70 72 65 67 2d 3e 70 72 6f 67 72 61  har)preg->progra
9be0: 6d 5b 69 5d 29 3b 0a 09 09 69 66 20 28 69 20 25  m[i]);...if (i %
9bf0: 20 31 36 20 3d 3d 20 30 29 20 7b 0a 09 09 09 70   16 == 0) {....p
9c00: 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 09 09 7d  rintf("\n");...}
9c10: 0a 09 7d 0a 09 70 72 69 6e 74 66 28 22 5c 6e 22  ..}..printf("\n"
9c20: 29 3b 0a 0a 09 73 20 3d 20 31 3b 0a 09 77 68 69  );...s = 1;..whi
9c30: 6c 65 20 28 6f 70 20 21 3d 20 45 4e 44 20 26 26  le (op != END &&
9c40: 20 73 20 3c 20 70 72 65 67 2d 3e 70 29 20 7b 09   s < preg->p) {.
9c50: 2f 2a 20 57 68 69 6c 65 20 74 68 61 74 20 77 61  /* While that wa
9c60: 73 6e 27 74 20 45 4e 44 20 6c 61 73 74 20 74 69  sn't END last ti
9c70: 6d 65 2e 2e 2e 20 2a 2f 0a 09 09 6f 70 20 3d 20  me... */...op = 
9c80: 4f 50 28 70 72 65 67 2c 20 73 29 3b 0a 09 09 70  OP(preg, s);...p
9c90: 72 69 6e 74 66 28 22 25 33 64 3a 20 25 73 22 2c  rintf("%3d: %s",
9ca0: 20 73 2c 20 72 65 67 70 72 6f 70 28 6f 70 29 29   s, regprop(op))
9cb0: 3b 09 2f 2a 20 57 68 65 72 65 2c 20 77 68 61 74  ;./* Where, what
9cc0: 2e 20 2a 2f 0a 09 09 6e 65 78 74 20 3d 20 72 65  . */...next = re
9cd0: 67 6e 65 78 74 28 70 72 65 67 2c 20 73 29 3b 0a  gnext(preg, s);.
9ce0: 09 09 69 66 20 28 6e 65 78 74 20 3d 3d 20 30 29  ..if (next == 0)
9cf0: 09 09 2f 2a 20 4e 65 78 74 20 70 74 72 2e 20 2a  ../* Next ptr. *
9d00: 2f 0a 09 09 09 70 72 69 6e 74 66 28 22 28 30 29  /....printf("(0)
9d10: 22 29 3b 0a 09 09 65 6c 73 65 0a 09 09 09 70 72  ");...else....pr
9d20: 69 6e 74 66 28 22 28 25 64 29 22 2c 20 6e 65 78  intf("(%d)", nex
9d30: 74 29 3b 0a 09 09 73 20 2b 3d 20 32 3b 0a 09 09  t);...s += 2;...
9d40: 69 66 20 28 6f 70 20 3d 3d 20 52 45 50 20 7c 7c  if (op == REP ||
9d50: 20 6f 70 20 3d 3d 20 52 45 50 4d 49 4e 20 7c 7c   op == REPMIN ||
9d60: 20 6f 70 20 3d 3d 20 52 45 50 58 20 7c 7c 20 6f   op == REPX || o
9d70: 70 20 3d 3d 20 52 45 50 58 4d 49 4e 29 20 7b 0a  p == REPXMIN) {.
9d80: 09 09 09 69 6e 74 20 6d 61 78 20 3d 20 70 72 65  ...int max = pre
9d90: 67 2d 3e 70 72 6f 67 72 61 6d 5b 73 5d 3b 0a 09  g->program[s];..
9da0: 09 09 69 6e 74 20 6d 69 6e 20 3d 20 70 72 65 67  ..int min = preg
9db0: 2d 3e 70 72 6f 67 72 61 6d 5b 73 20 2b 20 31 5d  ->program[s + 1]
9dc0: 3b 0a 09 09 09 69 66 20 28 6d 61 78 20 3d 3d 20  ;....if (max == 
9dd0: 36 35 35 33 35 29 20 7b 0a 09 09 09 09 70 72 69  65535) {.....pri
9de0: 6e 74 66 28 22 7b 25 64 2c 2a 7d 22 2c 20 6d 69  ntf("{%d,*}", mi
9df0: 6e 29 3b 0a 09 09 09 7d 0a 09 09 09 65 6c 73 65  n);....}....else
9e00: 20 7b 0a 09 09 09 09 70 72 69 6e 74 66 28 22 7b   {.....printf("{
9e10: 25 64 2c 25 64 7d 22 2c 20 6d 69 6e 2c 20 6d 61  %d,%d}", min, ma
9e20: 78 29 3b 0a 09 09 09 7d 0a 09 09 09 70 72 69 6e  x);....}....prin
9e30: 74 66 28 22 20 25 64 22 2c 20 70 72 65 67 2d 3e  tf(" %d", preg->
9e40: 70 72 6f 67 72 61 6d 5b 73 20 2b 20 32 5d 29 3b  program[s + 2]);
9e50: 0a 09 09 09 73 20 2b 3d 20 33 3b 0a 09 09 7d 0a  ....s += 3;...}.
9e60: 09 09 65 6c 73 65 20 69 66 20 28 6f 70 20 3d 3d  ..else if (op ==
9e70: 20 41 4e 59 4f 46 20 7c 7c 20 6f 70 20 3d 3d 20   ANYOF || op == 
9e80: 41 4e 59 42 55 54 29 20 7b 0a 09 09 09 2f 2a 20  ANYBUT) {..../* 
9e90: 73 65 74 20 6f 66 20 72 61 6e 67 65 73 20 2a 2f  set of ranges */
9ea0: 0a 0a 09 09 09 77 68 69 6c 65 20 28 70 72 65 67  .....while (preg
9eb0: 2d 3e 70 72 6f 67 72 61 6d 5b 73 5d 29 20 7b 0a  ->program[s]) {.
9ec0: 09 09 09 09 69 6e 74 20 6c 65 6e 20 3d 20 70 72  ....int len = pr
9ed0: 65 67 2d 3e 70 72 6f 67 72 61 6d 5b 73 2b 2b 5d  eg->program[s++]
9ee0: 3b 0a 09 09 09 09 69 6e 74 20 66 69 72 73 74 20  ;.....int first 
9ef0: 3d 20 70 72 65 67 2d 3e 70 72 6f 67 72 61 6d 5b  = preg->program[
9f00: 73 2b 2b 5d 3b 0a 09 09 09 09 62 75 66 5b 75 74  s++];.....buf[ut
9f10: 66 38 5f 66 72 6f 6d 75 6e 69 63 6f 64 65 28 62  f8_fromunicode(b
9f20: 75 66 2c 20 66 69 72 73 74 29 5d 20 3d 20 30 3b  uf, first)] = 0;
9f30: 0a 09 09 09 09 70 72 69 6e 74 66 28 22 25 73 22  .....printf("%s"
9f40: 2c 20 62 75 66 29 3b 0a 09 09 09 09 69 66 20 28  , buf);.....if (
9f50: 6c 65 6e 20 3e 20 31 29 20 7b 0a 09 09 09 09 09  len > 1) {......
9f60: 62 75 66 5b 75 74 66 38 5f 66 72 6f 6d 75 6e 69  buf[utf8_fromuni
9f70: 63 6f 64 65 28 62 75 66 2c 20 66 69 72 73 74 20  code(buf, first 
9f80: 2b 20 6c 65 6e 20 2d 20 31 29 5d 20 3d 20 30 3b  + len - 1)] = 0;
9f90: 0a 09 09 09 09 09 70 72 69 6e 74 66 28 22 2d 25  ......printf("-%
9fa0: 73 22 2c 20 62 75 66 29 3b 0a 09 09 09 09 7d 0a  s", buf);.....}.
9fb0: 09 09 09 7d 0a 09 09 09 73 2b 2b 3b 0a 09 09 7d  ...}....s++;...}
9fc0: 0a 09 09 65 6c 73 65 20 69 66 20 28 6f 70 20 3d  ...else if (op =
9fd0: 3d 20 45 58 41 43 54 4c 59 29 20 7b 0a 09 09 09  = EXACTLY) {....
9fe0: 2f 2a 20 4c 69 74 65 72 61 6c 20 73 74 72 69 6e  /* Literal strin
9ff0: 67 2c 20 77 68 65 72 65 20 70 72 65 73 65 6e 74  g, where present
a000: 2e 20 2a 2f 0a 0a 09 09 09 77 68 69 6c 65 20 28  . */.....while (
a010: 70 72 65 67 2d 3e 70 72 6f 67 72 61 6d 5b 73 5d  preg->program[s]
a020: 29 20 7b 0a 09 09 09 09 62 75 66 5b 75 74 66 38  ) {.....buf[utf8
a030: 5f 66 72 6f 6d 75 6e 69 63 6f 64 65 28 62 75 66  _fromunicode(buf
a040: 2c 20 70 72 65 67 2d 3e 70 72 6f 67 72 61 6d 5b  , preg->program[
a050: 73 5d 29 5d 20 3d 20 30 3b 0a 09 09 09 09 70 72  s])] = 0;.....pr
a060: 69 6e 74 66 28 22 25 73 22 2c 20 62 75 66 29 3b  intf("%s", buf);
a070: 0a 09 09 09 09 73 2b 2b 3b 0a 09 09 09 7d 0a 09  .....s++;....}..
a080: 09 09 73 2b 2b 3b 0a 09 09 7d 0a 09 09 70 75 74  ..s++;...}...put
a090: 63 68 61 72 28 27 5c 6e 27 29 3b 0a 09 7d 0a 0a  char('\n');..}..
a0a0: 09 69 66 20 28 6f 70 20 3d 3d 20 45 4e 44 29 20  .if (op == END) 
a0b0: 7b 0a 09 09 2f 2a 20 48 65 61 64 65 72 20 66 69  {.../* Header fi
a0c0: 65 6c 64 73 20 6f 66 20 69 6e 74 65 72 65 73 74  elds of interest
a0d0: 2e 20 2a 2f 0a 09 09 69 66 20 28 70 72 65 67 2d  . */...if (preg-
a0e0: 3e 72 65 67 73 74 61 72 74 29 20 7b 0a 09 09 09  >regstart) {....
a0f0: 62 75 66 5b 75 74 66 38 5f 66 72 6f 6d 75 6e 69  buf[utf8_fromuni
a100: 63 6f 64 65 28 62 75 66 2c 20 70 72 65 67 2d 3e  code(buf, preg->
a110: 72 65 67 73 74 61 72 74 29 5d 20 3d 20 30 3b 0a  regstart)] = 0;.
a120: 09 09 09 70 72 69 6e 74 66 28 22 73 74 61 72 74  ...printf("start
a130: 20 27 25 73 27 20 22 2c 20 62 75 66 29 3b 0a 09   '%s' ", buf);..
a140: 09 7d 0a 09 09 69 66 20 28 70 72 65 67 2d 3e 72  .}...if (preg->r
a150: 65 67 61 6e 63 68 29 0a 09 09 09 70 72 69 6e 74  eganch)....print
a160: 66 28 22 61 6e 63 68 6f 72 65 64 20 22 29 3b 0a  f("anchored ");.
a170: 09 09 69 66 20 28 70 72 65 67 2d 3e 72 65 67 6d  ..if (preg->regm
a180: 75 73 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 69  ust != 0) {....i
a190: 6e 74 20 69 3b 0a 09 09 09 70 72 69 6e 74 66 28  nt i;....printf(
a1a0: 22 6d 75 73 74 20 68 61 76 65 3a 22 29 3b 0a 09  "must have:");..
a1b0: 09 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
a1c0: 3c 20 70 72 65 67 2d 3e 72 65 67 6d 6c 65 6e 3b  < preg->regmlen;
a1d0: 20 69 2b 2b 29 20 7b 0a 09 09 09 09 70 75 74 63   i++) {.....putc
a1e0: 68 61 72 28 70 72 65 67 2d 3e 70 72 6f 67 72 61  har(preg->progra
a1f0: 6d 5b 70 72 65 67 2d 3e 72 65 67 6d 75 73 74 20  m[preg->regmust 
a200: 2b 20 69 5d 29 3b 0a 09 09 09 7d 0a 09 09 09 70  + i]);....}....p
a210: 75 74 63 68 61 72 28 27 5c 6e 27 29 3b 0a 09 09  utchar('\n');...
a220: 7d 0a 09 7d 0a 09 70 72 69 6e 74 66 28 22 5c 6e  }..}..printf("\n
a230: 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67  ");.}../*. - reg
a240: 70 72 6f 70 20 2d 20 70 72 69 6e 74 61 62 6c 65  prop - printable
a250: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
a260: 6f 66 20 6f 70 63 6f 64 65 0a 20 2a 2f 0a 73 74  of opcode. */.st
a270: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
a280: 2a 72 65 67 70 72 6f 70 28 20 69 6e 74 20 6f 70  *regprop( int op
a290: 20 29 0a 7b 0a 09 73 74 61 74 69 63 20 63 68 61   ).{..static cha
a2a0: 72 20 62 75 66 5b 35 30 5d 3b 0a 0a 09 73 77 69  r buf[50];...swi
a2b0: 74 63 68 20 28 6f 70 29 20 7b 0a 09 63 61 73 65  tch (op) {..case
a2c0: 20 42 4f 4c 3a 0a 09 09 72 65 74 75 72 6e 20 22   BOL:...return "
a2d0: 42 4f 4c 22 3b 0a 09 63 61 73 65 20 45 4f 4c 3a  BOL";..case EOL:
a2e0: 0a 09 09 72 65 74 75 72 6e 20 22 45 4f 4c 22 3b  ...return "EOL";
a2f0: 0a 09 63 61 73 65 20 41 4e 59 3a 0a 09 09 72 65  ..case ANY:...re
a300: 74 75 72 6e 20 22 41 4e 59 22 3b 0a 09 63 61 73  turn "ANY";..cas
a310: 65 20 41 4e 59 4f 46 3a 0a 09 09 72 65 74 75 72  e ANYOF:...retur
a320: 6e 20 22 41 4e 59 4f 46 22 3b 0a 09 63 61 73 65  n "ANYOF";..case
a330: 20 41 4e 59 42 55 54 3a 0a 09 09 72 65 74 75 72   ANYBUT:...retur
a340: 6e 20 22 41 4e 59 42 55 54 22 3b 0a 09 63 61 73  n "ANYBUT";..cas
a350: 65 20 42 52 41 4e 43 48 3a 0a 09 09 72 65 74 75  e BRANCH:...retu
a360: 72 6e 20 22 42 52 41 4e 43 48 22 3b 0a 09 63 61  rn "BRANCH";..ca
a370: 73 65 20 45 58 41 43 54 4c 59 3a 0a 09 09 72 65  se EXACTLY:...re
a380: 74 75 72 6e 20 22 45 58 41 43 54 4c 59 22 3b 0a  turn "EXACTLY";.
a390: 09 63 61 73 65 20 4e 4f 54 48 49 4e 47 3a 0a 09  .case NOTHING:..
a3a0: 09 72 65 74 75 72 6e 20 22 4e 4f 54 48 49 4e 47  .return "NOTHING
a3b0: 22 3b 0a 09 63 61 73 65 20 42 41 43 4b 3a 0a 09  ";..case BACK:..
a3c0: 09 72 65 74 75 72 6e 20 22 42 41 43 4b 22 3b 0a  .return "BACK";.
a3d0: 09 63 61 73 65 20 45 4e 44 3a 0a 09 09 72 65 74  .case END:...ret
a3e0: 75 72 6e 20 22 45 4e 44 22 3b 0a 09 63 61 73 65  urn "END";..case
a3f0: 20 52 45 50 3a 0a 09 09 72 65 74 75 72 6e 20 22   REP:...return "
a400: 52 45 50 22 3b 0a 09 63 61 73 65 20 52 45 50 4d  REP";..case REPM
a410: 49 4e 3a 0a 09 09 72 65 74 75 72 6e 20 22 52 45  IN:...return "RE
a420: 50 4d 49 4e 22 3b 0a 09 63 61 73 65 20 52 45 50  PMIN";..case REP
a430: 58 3a 0a 09 09 72 65 74 75 72 6e 20 22 52 45 50  X:...return "REP
a440: 58 22 3b 0a 09 63 61 73 65 20 52 45 50 58 4d 49  X";..case REPXMI
a450: 4e 3a 0a 09 09 72 65 74 75 72 6e 20 22 52 45 50  N:...return "REP
a460: 58 4d 49 4e 22 3b 0a 09 63 61 73 65 20 57 4f 52  XMIN";..case WOR
a470: 44 41 3a 0a 09 09 72 65 74 75 72 6e 20 22 57 4f  DA:...return "WO
a480: 52 44 41 22 3b 0a 09 63 61 73 65 20 57 4f 52 44  RDA";..case WORD
a490: 5a 3a 0a 09 09 72 65 74 75 72 6e 20 22 57 4f 52  Z:...return "WOR
a4a0: 44 5a 22 3b 0a 09 63 61 73 65 20 4f 50 45 4e 4e  DZ";..case OPENN
a4b0: 43 3a 0a 09 09 72 65 74 75 72 6e 20 22 4f 50 45  C:...return "OPE
a4c0: 4e 22 3b 0a 09 63 61 73 65 20 43 4c 4f 53 45 4e  N";..case CLOSEN
a4d0: 43 3a 0a 09 09 72 65 74 75 72 6e 20 22 43 4c 4f  C:...return "CLO
a4e0: 53 45 22 3b 0a 09 64 65 66 61 75 6c 74 3a 0a 09  SE";..default:..
a4f0: 09 69 66 20 28 6f 70 20 3e 3d 20 4f 50 45 4e 20  .if (op >= OPEN 
a500: 26 26 20 6f 70 20 3c 20 43 4c 4f 53 45 29 20 7b  && op < CLOSE) {
a510: 0a 09 09 09 73 6e 70 72 69 6e 74 66 28 62 75 66  ....snprintf(buf
a520: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 22  , sizeof(buf), "
a530: 4f 50 45 4e 25 64 22 2c 20 6f 70 2d 4f 50 45 4e  OPEN%d", op-OPEN
a540: 29 3b 0a 09 09 7d 0a 09 09 65 6c 73 65 20 69 66  );...}...else if
a550: 20 28 6f 70 20 3e 3d 20 43 4c 4f 53 45 20 26 26   (op >= CLOSE &&
a560: 20 6f 70 20 3c 20 43 4c 4f 53 45 5f 45 4e 44 29   op < CLOSE_END)
a570: 20 7b 0a 09 09 09 73 6e 70 72 69 6e 74 66 28 62   {....snprintf(b
a580: 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c  uf, sizeof(buf),
a590: 20 22 43 4c 4f 53 45 25 64 22 2c 20 6f 70 2d 43   "CLOSE%d", op-C
a5a0: 4c 4f 53 45 29 3b 0a 09 09 7d 0a 09 09 65 6c 73  LOSE);...}...els
a5b0: 65 20 7b 0a 09 09 09 73 6e 70 72 69 6e 74 66 28  e {....snprintf(
a5c0: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
a5d0: 2c 20 22 3f 25 64 3f 5c 6e 22 2c 20 6f 70 29 3b  , "?%d?\n", op);
a5e0: 0a 09 09 7d 0a 09 09 72 65 74 75 72 6e 28 62 75  ...}...return(bu
a5f0: 66 29 3b 0a 09 7d 0a 7d 0a 23 65 6e 64 69 66 20  f);..}.}.#endif 
a600: 2f 2a 20 4a 49 4d 5f 42 4f 4f 54 53 54 52 41 50  /* JIM_BOOTSTRAP
a610: 20 2a 2f 0a 0a 73 69 7a 65 5f 74 20 72 65 67 65   */..size_t rege
a620: 72 72 6f 72 28 69 6e 74 20 65 72 72 63 6f 64 65  rror(int errcode
a630: 2c 20 63 6f 6e 73 74 20 72 65 67 65 78 5f 74 20  , const regex_t 
a640: 2a 70 72 65 67 2c 20 63 68 61 72 20 2a 65 72 72  *preg, char *err
a650: 62 75 66 2c 20 20 73 69 7a 65 5f 74 20 65 72 72  buf,  size_t err
a660: 62 75 66 5f 73 69 7a 65 29 0a 7b 0a 09 73 74 61  buf_size).{..sta
a670: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
a680: 65 72 72 6f 72 5f 73 74 72 69 6e 67 73 5b 5d 20  error_strings[] 
a690: 3d 20 7b 0a 09 09 22 73 75 63 63 65 73 73 22 2c  = {..."success",
a6a0: 0a 09 09 22 6e 6f 20 6d 61 74 63 68 22 2c 0a 09  ..."no match",..
a6b0: 09 22 62 61 64 20 70 61 74 74 65 72 6e 22 2c 0a  ."bad pattern",.
a6c0: 09 09 22 6e 75 6c 6c 20 61 72 67 75 6d 65 6e 74  .."null argument
a6d0: 22 2c 0a 09 09 22 75 6e 6b 6e 6f 77 6e 20 65 72  ",..."unknown er
a6e0: 72 6f 72 22 2c 0a 09 09 22 74 6f 6f 20 62 69 67  ror",..."too big
a6f0: 22 2c 0a 09 09 22 6f 75 74 20 6f 66 20 6d 65 6d  ",..."out of mem
a700: 6f 72 79 22 2c 0a 09 09 22 74 6f 6f 20 6d 61 6e  ory",..."too man
a710: 79 20 28 29 22 2c 0a 09 09 22 70 61 72 65 6e 74  y ()",..."parent
a720: 68 65 73 65 73 20 28 29 20 6e 6f 74 20 62 61 6c  heses () not bal
a730: 61 6e 63 65 64 22 2c 0a 09 09 22 62 72 61 63 65  anced",..."brace
a740: 73 20 7b 7d 20 6e 6f 74 20 62 61 6c 61 6e 63 65  s {} not balance
a750: 64 22 2c 0a 09 09 22 69 6e 76 61 6c 69 64 20 72  d",..."invalid r
a760: 65 70 65 74 69 74 69 6f 6e 20 63 6f 75 6e 74 28  epetition count(
a770: 73 29 22 2c 0a 09 09 22 65 78 74 72 61 20 63 68  s)",..."extra ch
a780: 61 72 61 63 74 65 72 73 22 2c 0a 09 09 22 2a 2b  aracters",..."*+
a790: 20 6f 66 20 65 6d 70 74 79 20 61 74 6f 6d 22 2c   of empty atom",
a7a0: 0a 09 09 22 6e 65 73 74 65 64 20 63 6f 75 6e 74  ..."nested count
a7b0: 22 2c 0a 09 09 22 69 6e 74 65 72 6e 61 6c 20 65  ",..."internal e
a7c0: 72 72 6f 72 22 2c 0a 09 09 22 63 6f 75 6e 74 20  rror",..."count 
a7d0: 66 6f 6c 6c 6f 77 73 20 6e 6f 74 68 69 6e 67 22  follows nothing"
a7e0: 2c 0a 09 09 22 74 72 61 69 6c 69 6e 67 20 62 61  ,..."trailing ba
a7f0: 63 6b 73 6c 61 73 68 22 2c 0a 09 09 22 63 6f 72  ckslash",..."cor
a800: 72 75 70 74 65 64 20 70 72 6f 67 72 61 6d 22 2c  rupted program",
a810: 0a 09 09 22 63 6f 6e 74 61 69 6e 73 20 6e 75 6c  ..."contains nul
a820: 6c 20 63 68 61 72 22 2c 0a 09 7d 3b 0a 09 63 6f  l char",..};..co
a830: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 3b 0a 0a  nst char *err;..
a840: 09 69 66 20 28 65 72 72 63 6f 64 65 20 3c 20 30  .if (errcode < 0
a850: 20 7c 7c 20 65 72 72 63 6f 64 65 20 3e 3d 20 52   || errcode >= R
a860: 45 47 5f 45 52 52 5f 4e 55 4d 29 20 7b 0a 09 09  EG_ERR_NUM) {...
a870: 65 72 72 20 3d 20 22 42 61 64 20 65 72 72 6f 72  err = "Bad error
a880: 20 63 6f 64 65 22 3b 0a 09 7d 0a 09 65 6c 73 65   code";..}..else
a890: 20 7b 0a 09 09 65 72 72 20 3d 20 65 72 72 6f 72   {...err = error
a8a0: 5f 73 74 72 69 6e 67 73 5b 65 72 72 63 6f 64 65  _strings[errcode
a8b0: 5d 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 73  ];..}...return s
a8c0: 6e 70 72 69 6e 74 66 28 65 72 72 62 75 66 2c 20  nprintf(errbuf, 
a8d0: 65 72 72 62 75 66 5f 73 69 7a 65 2c 20 22 25 73  errbuf_size, "%s
a8e0: 22 2c 20 65 72 72 29 3b 0a 7d 0a 0a 76 6f 69 64  ", err);.}..void
a8f0: 20 72 65 67 66 72 65 65 28 72 65 67 65 78 5f 74   regfree(regex_t
a900: 20 2a 70 72 65 67 29 0a 7b 0a 09 66 72 65 65 28   *preg).{..free(
a910: 70 72 65 67 2d 3e 70 72 6f 67 72 61 6d 29 3b 0a  preg->program);.
a920: 7d 0a 0a 23 65 6e 64 69 66 0a                    }..#endif.