xref: /openbsd-src/gnu/usr.bin/perl/regexp.h (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1 /*    regexp.h
2  */
3 
4 /*
5  * Definitions etc. for regexp(3) routines.
6  *
7  * Caveat:  this is V8 regexp(3) [actually, a reimplementation thereof],
8  * not the System V one.
9  */
10 
11 
12 struct regnode {
13     U8	flags;
14     U8  type;
15     U16 next_off;
16 };
17 
18 typedef struct regnode regnode;
19 
20 struct reg_substr_data;
21 
22 struct reg_data;
23 
24 typedef struct regexp {
25 	I32 *startp;
26 	I32 *endp;
27 	regnode *regstclass;
28         struct reg_substr_data *substrs;
29 	char *precomp;		/* pre-compilation regular expression */
30         struct reg_data *data;	/* Additional data. */
31 	char *subbeg;		/* saved or original string
32 				   so \digit works forever. */
33 	I32 sublen;		/* Length of string pointed by subbeg */
34 	I32 refcnt;
35 	I32 minlen;		/* mininum possible length of $& */
36 	I32 prelen;		/* length of precomp */
37 	U32 nparens;		/* number of parentheses */
38 	U32 lastparen;		/* last paren matched */
39 	U32 reganch;		/* Internal use only +
40 				   Tainted information used by regexec? */
41 	regnode program[1];	/* Unwarranted chumminess with compiler. */
42 } regexp;
43 
44 #define ROPT_ANCH		(ROPT_ANCH_BOL|ROPT_ANCH_MBOL|ROPT_ANCH_GPOS|ROPT_ANCH_SBOL)
45 #define ROPT_ANCH_SINGLE	(ROPT_ANCH_SBOL|ROPT_ANCH_GPOS)
46 #define ROPT_ANCH_BOL	 	0x00001
47 #define ROPT_ANCH_MBOL	 	0x00002
48 #define ROPT_ANCH_SBOL	 	0x00004
49 #define ROPT_ANCH_GPOS	 	0x00008
50 #define ROPT_SKIP		0x00010
51 #define ROPT_IMPLICIT		0x00020	/* Converted .* to ^.* */
52 #define ROPT_NOSCAN		0x00040	/* Check-string always at start. */
53 #define ROPT_GPOS_SEEN		0x00080
54 #define ROPT_CHECK_ALL		0x00100
55 #define ROPT_LOOKBEHIND_SEEN	0x00200
56 #define ROPT_EVAL_SEEN		0x00400
57 
58 /* 0xf800 of reganch is used by PMf_COMPILETIME */
59 
60 #define ROPT_UTF8		0x10000
61 #define ROPT_NAUGHTY		0x20000 /* how exponential is this pattern? */
62 #define ROPT_COPY_DONE		0x40000	/* subbeg is a copy of the string */
63 #define ROPT_TAINTED_SEEN	0x80000
64 
65 #define RE_USE_INTUIT_NOML	0x0100000 /* Best to intuit before matching */
66 #define RE_USE_INTUIT_ML	0x0200000
67 #define REINT_AUTORITATIVE_NOML	0x0400000 /* Can trust a positive answer */
68 #define REINT_AUTORITATIVE_ML	0x0800000
69 #define REINT_ONCE_NOML		0x1000000 /* Intuit can succed once only. */
70 #define REINT_ONCE_ML		0x2000000
71 #define RE_INTUIT_ONECHAR	0x4000000
72 #define RE_INTUIT_TAIL		0x8000000
73 
74 #define RE_USE_INTUIT		(RE_USE_INTUIT_NOML|RE_USE_INTUIT_ML)
75 #define REINT_AUTORITATIVE	(REINT_AUTORITATIVE_NOML|REINT_AUTORITATIVE_ML)
76 #define REINT_ONCE		(REINT_ONCE_NOML|REINT_ONCE_ML)
77 
78 #define RX_MATCH_TAINTED(prog)	((prog)->reganch & ROPT_TAINTED_SEEN)
79 #define RX_MATCH_TAINTED_on(prog) ((prog)->reganch |= ROPT_TAINTED_SEEN)
80 #define RX_MATCH_TAINTED_off(prog) ((prog)->reganch &= ~ROPT_TAINTED_SEEN)
81 #define RX_MATCH_TAINTED_set(prog, t) ((t) \
82 				       ? RX_MATCH_TAINTED_on(prog) \
83 				       : RX_MATCH_TAINTED_off(prog))
84 
85 #define RX_MATCH_COPIED(prog)		((prog)->reganch & ROPT_COPY_DONE)
86 #define RX_MATCH_COPIED_on(prog)	((prog)->reganch |= ROPT_COPY_DONE)
87 #define RX_MATCH_COPIED_off(prog)	((prog)->reganch &= ~ROPT_COPY_DONE)
88 #define RX_MATCH_COPIED_set(prog,t)	((t) \
89 					 ? RX_MATCH_COPIED_on(prog) \
90 					 : RX_MATCH_COPIED_off(prog))
91 
92 #define REXEC_COPY_STR	0x01		/* Need to copy the string. */
93 #define REXEC_CHECKED	0x02		/* check_substr already checked. */
94 #define REXEC_SCREAM	0x04		/* use scream table. */
95 #define REXEC_IGNOREPOS	0x08		/* \G matches at start. */
96 #define REXEC_NOT_FIRST	0x10		/* This is another iteration of //g. */
97 #define REXEC_ML	0x20		/* $* was set. */
98 
99 #define ReREFCNT_inc(re) ((void)(re && re->refcnt++), re)
100 #define ReREFCNT_dec(re) CALLREGFREE(aTHX_ re)
101 
102 #define FBMcf_TAIL_DOLLAR	1
103 #define FBMcf_TAIL_DOLLARM	2
104 #define FBMcf_TAIL_Z		4
105 #define FBMcf_TAIL_z		8
106 #define FBMcf_TAIL		(FBMcf_TAIL_DOLLAR|FBMcf_TAIL_DOLLARM|FBMcf_TAIL_Z|FBMcf_TAIL_z)
107 
108 #define FBMrf_MULTILINE	1
109 
110 struct re_scream_pos_data_s;
111