* Caveat: this is V8 regexp(3) [actually, a reimplementation thereof],
* not the System V one.
*/
-
+#ifndef PLUGGABLE_RE_EXTENSION
+/* we don't want to include this stuff if we are inside Nicholas'
+ * pluggable regex engine code */
struct regnode {
U8 flags;
#define ROPT_ANCH (ROPT_ANCH_BOL|ROPT_ANCH_MBOL|ROPT_ANCH_GPOS|ROPT_ANCH_SBOL)
#define ROPT_ANCH_SINGLE (ROPT_ANCH_SBOL|ROPT_ANCH_GPOS)
-#define ROPT_ANCH_BOL 0x00001
-#define ROPT_ANCH_MBOL 0x00002
-#define ROPT_ANCH_SBOL 0x00004
-#define ROPT_ANCH_GPOS 0x00008
-#define ROPT_SKIP 0x00010
-#define ROPT_IMPLICIT 0x00020 /* Converted .* to ^.* */
-#define ROPT_NOSCAN 0x00040 /* Check-string always at start. */
-#define ROPT_GPOS_SEEN 0x00080
-#define ROPT_CHECK_ALL 0x00100
-#define ROPT_LOOKBEHIND_SEEN 0x00200
-#define ROPT_EVAL_SEEN 0x00400
-#define ROPT_CANY_SEEN 0x00800
+#define ROPT_ANCH_BOL 0x00000001
+#define ROPT_ANCH_MBOL 0x00000002
+#define ROPT_ANCH_SBOL 0x00000004
+#define ROPT_ANCH_GPOS 0x00000008
+#define ROPT_SKIP 0x00000010
+#define ROPT_IMPLICIT 0x00000020 /* Converted .* to ^.* */
+#define ROPT_NOSCAN 0x00000040 /* Check-string always at start. */
+#define ROPT_GPOS_SEEN 0x00000080
+#define ROPT_CHECK_ALL 0x00000100
+#define ROPT_LOOKBEHIND_SEEN 0x00000200
+#define ROPT_EVAL_SEEN 0x00000400
+#define ROPT_CANY_SEEN 0x00000800
#define ROPT_SANY_SEEN ROPT_CANY_SEEN /* src bckwrd cmpt */
/* 0xf800 of reganch is used by PMf_COMPILETIME */
-#define ROPT_UTF8 0x10000
-#define ROPT_NAUGHTY 0x20000 /* how exponential is this pattern? */
-#define ROPT_COPY_DONE 0x40000 /* subbeg is a copy of the string */
-#define ROPT_TAINTED_SEEN 0x80000
+#define ROPT_UTF8 0x00010000
+#define ROPT_NAUGHTY 0x00020000 /* how exponential is this pattern? */
+#define ROPT_COPY_DONE 0x00040000 /* subbeg is a copy of the string */
+#define ROPT_TAINTED_SEEN 0x00080000
#define ROPT_MATCH_UTF8 0x10000000 /* subbeg is utf-8 */
-#define RE_USE_INTUIT_NOML 0x0100000 /* Best to intuit before matching */
-#define RE_USE_INTUIT_ML 0x0200000
-#define REINT_AUTORITATIVE_NOML 0x0400000 /* Can trust a positive answer */
-#define REINT_AUTORITATIVE_ML 0x0800000
-#define REINT_ONCE_NOML 0x1000000 /* Intuit can succed once only. */
-#define REINT_ONCE_ML 0x2000000
-#define RE_INTUIT_ONECHAR 0x4000000
-#define RE_INTUIT_TAIL 0x8000000
+#define RE_USE_INTUIT_NOML 0x00100000 /* Best to intuit before matching */
+#define RE_USE_INTUIT_ML 0x00200000
+#define REINT_AUTORITATIVE_NOML 0x00400000 /* Can trust a positive answer */
+#define REINT_AUTORITATIVE_ML 0x00800000
+#define REINT_ONCE_NOML 0x01000000 /* Intuit can succed once only. */
+#define REINT_ONCE_ML 0x02000000
+#define RE_INTUIT_ONECHAR 0x04000000
+#define RE_INTUIT_TAIL 0x08000000
+
#define RE_USE_INTUIT (RE_USE_INTUIT_NOML|RE_USE_INTUIT_ML)
#define REINT_AUTORITATIVE (REINT_AUTORITATIVE_NOML|REINT_AUTORITATIVE_ML)
#define RX_MATCH_COPIED_set(prog,t) ((t) \
? RX_MATCH_COPIED_on(prog) \
: RX_MATCH_COPIED_off(prog))
+#endif /* PLUGGABLE_RE_EXTENSION */
+
+/* Stuff that needs to be included in the plugable extension goes below here */
+
+#define RE_DEBUG_BIT 0x20000000
+#define RX_DEBUG(prog) ((prog)->reganch & RE_DEBUG_BIT)
+#define RX_DEBUG_on(prog) ((prog)->reganch |= RE_DEBUG_BIT)
#ifdef PERL_OLD_COPY_ON_WRITE
#define RX_MATCH_COPY_FREE(rx) \
typedef I32 CHECKPOINT;
-typedef enum {
- resume_TRIE1,
- resume_TRIE2,
- resume_EVAL,
- resume_CURLYX,
- resume_WHILEM1,
- resume_WHILEM2,
- resume_WHILEM3,
- resume_WHILEM4,
- resume_WHILEM5,
- resume_WHILEM6,
- resume_CURLYM1,
- resume_CURLYM2,
- resume_CURLYM3,
- resume_IFMATCH,
- resume_PLUS1,
- resume_PLUS2,
- resume_PLUS3,
- resume_PLUS4
-} regmatch_resume_states;
-
-
typedef struct regmatch_state {
/* these vars contain state that needs to be maintained
* across the main while loop ... */
- regmatch_resume_states resume_state; /* where to jump to on return */
+ int resume_state; /* where to jump to on return */
regnode *scan; /* Current node. */
regnode *next; /* Next node. */
bool minmod; /* the next "{n,m}" is a "{n,m}?" */
struct {
reg_trie_accepted *accept_buff;
- U32 accepted; /* how many accepting states we have seen */
+ U32 accepted; /* how many accepting states we have seen */
+ regnode *B; /* node following the trie */
+ regnode *me; /* only needed for debugging */
} trie;
struct {
int toggleutf;
CHECKPOINT cp; /* remember current savestack indexes */
CHECKPOINT lastcp;
+ regnode *B; /* the node following us */
} eval;
struct {
} whilem;
struct {
+ I32 lastparen;
+ regnode *next_branch; /* next branch node */
+ CHECKPOINT cp;
+ } branch;
+
+ struct {
/* this first element must match u.yes */
struct regmatch_state *prev_yes_state;
- I32 paren;
I32 c1, c2; /* case fold search */
- CHECKPOINT lastcp;
- I32 l;
- I32 matches;
- I32 maxwanted;
+ CHECKPOINT cp;
+ I32 alen; /* length of first-matched A string */
+ I32 count;
bool minmod;
+ regnode *A, *B; /* the nodes corresponding to /A*B/ */
+ regnode *me; /* the curlym node */
} curlym;
struct {
I32 paren;
- CHECKPOINT lastcp;
+ CHECKPOINT cp;
I32 c1, c2; /* case fold search */
- char *e;
- char *old;
+ char *maxpos; /* highest possible point in string to match */
+ char *oldloc; /* the previous locinput */
int count;
- } plus; /* and CURLYN/CURLY/STAR */
+ int min, max; /* {m,n} */
+ regnode *A, *B; /* the nodes corresponding to /A*B/ */
+ } curly; /* and CURLYN/PLUS/STAR */
struct {
/* this first element must match u.yes */
struct regmatch_state *prev_yes_state;
I32 wanted;
+ regnode *me; /* the IFMATCH/SUSPEND/UNLESSM node */
} ifmatch; /* and SUSPEND/UNLESSM */
} u;
} regmatch_state;