Further tweaks to make it easier to create regexp engine plug ins.
[p5sagit/p5-mst-13.2.git] / regcomp.h
index f591726..ce96da1 100644 (file)
--- a/regcomp.h
+++ b/regcomp.h
@@ -93,6 +93,47 @@ typedef OP OP_4tree;                 /* Will be redefined later. */
  * stored negative.]
  */
 
+/* This is the stuff that used to live in regexp.h that was truly
+   private to the engine itself. It now lives here. */
+
+/* swap buffer for paren structs */
+typedef struct regexp_paren_ofs {
+    I32 *startp;
+    I32 *endp;
+} regexp_paren_ofs;
+
+ typedef struct regexp_internal {
+        regexp_paren_ofs *swap; /* Swap copy of *startp / *endp */
+       U32 *offsets;           /* offset annotations 20001228 MJD 
+                                   data about mapping the program to the 
+                                   string*/
+        regnode *regstclass;    /* Optional startclass as identified or constructed
+                                   by the optimiser */
+        struct reg_data *data; /* Additional miscellaneous data used by the program.
+                                   Used to make it easier to clone and free arbitrary
+                                   data that the regops need. Often the ARG field of
+                                   a regop is an index into this structure */
+       regnode program[1];     /* Unwarranted chumminess with compiler. */
+} regexp_internal;
+
+#define RXi_SET(x,y) (x)->pprivate = (void*)(y)   
+#define RXi_GET(x)   ((regexp_internal *)((x)->pprivate))
+#define RXi_GET_DECL(r,ri) regexp_internal *ri = RXi_GET(r)
+/*
+ * Flags stored in regexp->intflags
+ * These are used only internally to the regexp engine
+ *
+ * See regexp.h for flags used externally to the regexp engine
+ */
+#define PREGf_SKIP             0x00000001
+#define PREGf_IMPLICIT         0x00000002 /* Converted .* to ^.* */
+#define PREGf_NAUGHTY          0x00000004 /* how exponential is this pattern? */
+#define PREGf_VERBARG_SEEN     0x00000008
+#define PREGf_CUTGROUP_SEEN    0x00000010
+
+
+/* this is where the old regcomp.h started */
+
 struct regnode_string {
     U8 str_len;
     U8  type;
@@ -376,7 +417,9 @@ EXTCONST U8 PL_varies[];
 #else
 EXTCONST U8 PL_varies[] = {
     BRANCH, BACK, STAR, PLUS, CURLY, CURLYX, REF, REFF, REFFL,
-    WHILEM, CURLYM, CURLYN, BRANCHJ, IFTHEN, SUSPEND, CLUMP, 0
+    WHILEM, CURLYM, CURLYN, BRANCHJ, IFTHEN, SUSPEND, CLUMP,
+    NREF, NREFF, NREFFL,
+    0
 };
 #endif
 
@@ -402,14 +445,13 @@ EXTCONST U8 PL_simple[] = {
 EXTCONST regexp_engine PL_core_reg_engine;
 #else /* DOINIT */
 EXTCONST regexp_engine PL_core_reg_engine = { 
-        Perl_pregcomp, 
+       Perl_re_compile,
         Perl_regexec_flags, 
         Perl_re_intuit_start,
         Perl_re_intuit_string, 
-        Perl_pregfree, 
-        Perl_reg_stringify,
+        Perl_regfree_internal, 
 #if defined(USE_ITHREADS)        
-        Perl_regdupe 
+        Perl_regdupe_internal
 #endif        
 };
 #endif /* DOINIT */
@@ -429,6 +471,8 @@ END_EXTERN_C
  *       strings resulting from casefolding the single-character entries
  *       in the character class
  *   t - trie struct
+ *   u - trie struct's widecharmap (a HV, so can't share, must dup)
+ *       also used for revcharmap and words under DEBUGGING
  *   T - aho-trie struct
  *   S - sv for named capture lookup
  * 20010712 mjd@plover.com
@@ -440,18 +484,6 @@ struct reg_data {
     void* data[1];
 };
 
-struct reg_substr_datum {
-    I32 min_offset;
-    I32 max_offset;
-    SV *substr;                /* non-utf8 variant */
-    SV *utf8_substr;   /* utf8 variant */
-    I32 end_shift;
-};
-
-struct reg_substr_data {
-    struct reg_substr_datum data[3];   /* Actual array */
-};
-
 #define anchored_substr substrs->data[0].substr
 #define anchored_utf8 substrs->data[0].utf8_substr
 #define anchored_offset substrs->data[0].min_offset
@@ -520,7 +552,6 @@ struct _reg_trie_data {
     U16             uniquecharcount; /* unique chars in trie (width of trans table) */
     U32             lasttrans;       /* last valid transition element */
     U16             *charmap;        /* byte to charid lookup array */
-    HV              *widecharmap;    /* code points > 255 to charid */
     reg_trie_state  *states;         /* state data */
     reg_trie_trans  *trans;          /* array of transition elements */
     char            *bitmap;         /* stclass bitmap */
@@ -537,10 +568,20 @@ struct _reg_trie_data {
     U32             wordcount;       /* Build only */
 #ifdef DEBUGGING
     STRLEN          charcount;       /* Build only */
-    AV              *words;          /* Array of words contained in trie, for dumping */
-    AV              *revcharmap;     /* Map of each charid back to its character representation */
 #endif
 };
+/* There is one (3 under DEBUGGING) pointers that logically belong in this
+   structure, but are held outside as they need duplication on thread cloning,
+   whereas the rest of the structure can be read only:
+    HV              *widecharmap;    code points > 255 to charid
+#ifdef DEBUGGING
+    AV              *words;          Array of words contained in trie, for dumping
+    AV              *revcharmap;     Map of each charid back to its character representation
+#endif
+*/
+
+#define TRIE_WORDS_OFFSET 2
+
 typedef struct _reg_trie_data reg_trie_data;
 
 /* refcount is first in both this and _reg_trie_data to allow a space
@@ -549,7 +590,7 @@ struct _reg_ac_data {
     U32              refcount;
     U32              *fail;
     reg_trie_state   *states;
-    reg_trie_data    *trie;
+    U32              trie;
 };
 typedef struct _reg_ac_data reg_ac_data;
 
@@ -577,10 +618,8 @@ typedef struct _reg_ac_data reg_ac_data;
 
 #ifdef DEBUGGING
 #define TRIE_CHARCOUNT(trie) ((trie)->charcount)
-#define TRIE_REVCHARMAP(trie) ((trie)->revcharmap)
 #else
 #define TRIE_CHARCOUNT(trie) (trie_charcount)
-#define TRIE_REVCHARMAP(trie) (trie_revcharmap)
 #endif
 
 #define RE_TRIE_MAXBUF_INIT 65536
@@ -742,3 +781,4 @@ re.pm, especially to the documentation.
 
 #endif /* DEBUG RELATED DEFINES */
 
+