Artifact 349f19a1e9e391b77f28c28848bff9a78dac23c9:
- File
jimregexp.c
-
2012-01-19 01:13:04
- part of checkin
[ff93f48860]
on branch trunk
- Fix some warnings identified by icc
The Intel C Compiler
Signed-off-by: Steve Bennett <steveb@workware.net.au> (user: steveb@workware.net.au
-
2012-01-19 01:13:04
- part of checkin
[ff93f48860]
on branch trunk
- Fix some warnings identified by icc
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.