TODO
[perl.git] / regexp.h
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_data {
21     U32 count;
22     U8 *what;
23     void* data[1];
24 };
25
26 struct reg_substr_datum {
27     I32 min_offset;
28     I32 max_offset;
29     SV *substr;
30 };
31
32 struct reg_substr_data {
33     struct reg_substr_datum data[3];    /* Actual array */
34 };
35
36 typedef struct regexp {
37         I32 refcnt;
38         char **startp;
39         char **endp;
40         regnode *regstclass;
41         I32 minlen;             /* mininum possible length of $& */
42         I32 prelen;             /* length of precomp */
43         U32 nparens;            /* number of parentheses */
44         U32 lastparen;          /* last paren matched */
45         char *precomp;          /* pre-compilation regular expression */
46         char *subbase;          /* saved string so \digit works forever */
47         char *subbeg;           /* same, but not responsible for allocation */
48         char *subend;           /* end of subbase */
49         U16 naughty;            /* how exponential is this pattern? */
50         U16 reganch;            /* Internal use only +
51                                    Tainted information used by regexec? */
52 #if 0
53         SV *anchored_substr;    /* Substring at fixed position wrt start. */
54         I32 anchored_offset;    /* Position of it. */
55         SV *float_substr;       /* Substring at variable position wrt start. */
56         I32 float_min_offset;   /* Minimal position of it. */
57         I32 float_max_offset;   /* Maximal position of it. */
58         SV *check_substr;       /* Substring to check before matching. */
59         I32 check_offset_min;   /* Offset of the above. */
60         I32 check_offset_max;   /* Offset of the above. */
61 #else
62         struct reg_substr_data *substrs;
63 #endif
64         struct reg_data *data;  /* Additional data. */
65         regnode program[1];     /* Unwarranted chumminess with compiler. */
66 } regexp;
67
68 #define anchored_substr substrs->data[0].substr
69 #define anchored_offset substrs->data[0].min_offset
70 #define float_substr substrs->data[1].substr
71 #define float_min_offset substrs->data[1].min_offset
72 #define float_max_offset substrs->data[1].max_offset
73 #define check_substr substrs->data[2].substr
74 #define check_offset_min substrs->data[2].min_offset
75 #define check_offset_max substrs->data[2].max_offset
76
77 #define ROPT_ANCH               (ROPT_ANCH_BOL|ROPT_ANCH_MBOL|ROPT_ANCH_GPOS)
78 #define ROPT_ANCH_SINGLE        (ROPT_ANCH_BOL|ROPT_ANCH_GPOS)
79 #define ROPT_ANCH_BOL           1
80 #define ROPT_ANCH_MBOL          2
81 #define ROPT_ANCH_GPOS          4
82 #define ROPT_SKIP               8
83 #define ROPT_IMPLICIT           0x10    /* Converted .* to ^.* */
84 #define ROPT_NOSCAN             0x20    /* Check-string always at start. */
85 #define ROPT_GPOS_SEEN          0x40
86 #define ROPT_CHECK_ALL          0x80
87 #define ROPT_LOOKBEHIND_SEEN    0x100
88 #define ROPT_EVAL_SEEN          0x200
89 #define ROPT_TAINTED_SEEN       0x400
90 /* 0xf800 of reganch is used by PMf_COMPILETIME */
91
92 #define RX_MATCH_TAINTED(prog)  ((prog)->reganch & ROPT_TAINTED_SEEN)
93 #define RX_MATCH_TAINTED_on(prog) ((prog)->reganch |= ROPT_TAINTED_SEEN)
94 #define RX_MATCH_TAINTED_off(prog) ((prog)->reganch &= ~ROPT_TAINTED_SEEN)
95 #define RX_MATCH_TAINTED_set(prog, t) ((t) \
96                                        ? RX_MATCH_TAINTED_on(prog) \
97                                        : RX_MATCH_TAINTED_off(prog))
98
99 #define REXEC_COPY_STR  1               /* Need to copy the string. */
100 #define REXEC_CHECKED   2               /* check_substr already checked. */
101
102 #define ReREFCNT_inc(re) ((re && re->refcnt++), re)
103 #define ReREFCNT_dec(re) pregfree(re)