Convert ext/B/t/debug.t to Test::More. (Diagnostics are good, m'kay)
[p5sagit/p5-mst-13.2.git] / regexp.h
index abc744c..a2e0fc1 100644 (file)
--- a/regexp.h
+++ b/regexp.h
@@ -1,7 +1,7 @@
 /*    regexp.h
  *
  *    Copyright (C) 1993, 1994, 1996, 1997, 1999, 2000, 2001, 2003,
- *    by Larry Wall and others
+ *    2005, 2006 by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -15,8 +15,8 @@
  * 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 */
+/* we don't want to include this stuff if we are inside of
+   an external regex engine based on the core one - like re 'debug'*/
 
 struct regnode {
     U8 flags;
@@ -32,10 +32,16 @@ struct reg_data;
 
 struct regexp_engine;
 
-typedef struct regexp_paren_ofs {
-    I32 *startp;
-    I32 *endp;
-} regexp_paren_ofs;
+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 */
+};
 
 #ifdef PERL_OLD_COPY_ON_WRITE
 #define SV_SAVED_COPY   SV *saved_copy; /* If non-NULL, SV which is COW from original */
@@ -83,34 +89,18 @@ typedef struct regexp {
        I32 refcnt;             /* Refcount of this regexp */
 } regexp;
 
-
-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)
-
+/* used for high speed searches */
 typedef struct re_scream_pos_data_s
 {
     char **scream_olds;                /* match pos */
     I32 *scream_pos;           /* Internal iterator of scream. */
 } re_scream_pos_data;
 
+/* regexp_engine structure. This is the dispatch table for regexes.
+ * Any regex engine implementation must be able to build one of these.
+ */
 typedef struct regexp_engine {
     regexp* (*comp) (pTHX_ char* exp, char* xend, PMOP* pm);
-    regexp* (*compile) (pTHX_ char *exp, char *xend, PMOP *pm);
     I32            (*exec) (pTHX_ regexp* prog, char* stringarg, char* strend,
                            char* strbeg, I32 minend, SV* screamer,
                            void* data, U32 flags);
@@ -124,19 +114,12 @@ typedef struct regexp_engine {
 #endif    
 } regexp_engine;
 
-/* 
- * Flags stored in regexp->intflags 
- * These are used only internally 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
-
-
 /* Flags stored in regexp->extflags 
  * These are used by code external to the regexp engine
+ *
+ * Note that flags starting with RXf_PMf_ have exact equivalents
+ * stored in op_pmflags and which are defined in op.h, they are defined
+ * numerically here only for clarity.
  */
 
 /* Anchor and GPOS related stuff */
@@ -146,24 +129,33 @@ typedef struct regexp_engine {
 #define RXf_ANCH_GPOS          0x00000008
 #define RXf_GPOS_SEEN          0x00000010
 #define RXf_GPOS_FLOAT         0x00000020
-/* five bits here */
+/* two bits here */
 #define RXf_ANCH               (RXf_ANCH_BOL|RXf_ANCH_MBOL|RXf_ANCH_GPOS|RXf_ANCH_SBOL)
 #define RXf_GPOS_CHECK          (RXf_GPOS_SEEN|RXf_ANCH_GPOS)
-#define RXf_ANCH_SINGLE         (RXf_ANCH_SBOL|RXf_ANCH_GPOS)        
-/* 
- * 0xF800 of extflags is used by PMf_COMPILETIME 
- * These are the regex equivelent of the PMf_xyz stuff defined 
- * in op.h
- */
-#define RXf_PMf_LOCALE         0x00000800
-#define RXf_PMf_MULTILINE      0x00001000
-#define RXf_PMf_SINGLELINE     0x00002000
-#define RXf_PMf_FOLD           0x00004000
-#define RXf_PMf_EXTENDED       0x00008000
-#define RXf_PMf_COMPILETIME    (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_LOCALE|RXf_PMf_FOLD|RXf_PMf_EXTENDED)
+#define RXf_ANCH_SINGLE         (RXf_ANCH_SBOL|RXf_ANCH_GPOS)
+
+/* Flags indicating special patterns */
+#define RXf_START_ONLY         0x00000200 /* Pattern is /^/ */
+#define RXf_WHITE              0x00000400 /* Pattern is /\s+/ */
+
+/* 0xF800 of extflags is used by (RXf_)PMf_COMPILETIME */
+#define RXf_PMf_LOCALE         0x00000800 /* use locale */
+#define RXf_PMf_MULTILINE      0x00001000 /* /m         */
+#define RXf_PMf_SINGLELINE     0x00002000 /* /s         */
+#define RXf_PMf_FOLD           0x00004000 /* /i         */
+#define RXf_PMf_EXTENDED       0x00008000 /* /x         */
+#define RXf_PMf_KEEPCOPY       0x00010000 /* /k         */
+/* these flags are transfered from the PMOP->op_pmflags member during compilation */
+#define RXf_PMf_STD_PMMOD      (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_FOLD|RXf_PMf_EXTENDED)
+#define RXf_PMf_COMPILETIME    (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_LOCALE|RXf_PMf_FOLD|RXf_PMf_EXTENDED|RXf_PMf_KEEPCOPY)
+
+#define CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl)                        \
+    case IGNORE_PAT_MOD:    *(pmfl) |= RXf_PMf_FOLD;       break;   \
+    case MULTILINE_PAT_MOD: *(pmfl) |= RXf_PMf_MULTILINE;  break;   \
+    case SINGLE_PAT_MOD:    *(pmfl) |= RXf_PMf_SINGLELINE; break;   \
+    case XTENDED_PAT_MOD:   *(pmfl) |= RXf_PMf_EXTENDED;   break
 
 /* What we have seen */
-/* one bit here */
 #define RXf_LOOKBEHIND_SEEN    0x00020000
 #define RXf_EVAL_SEEN          0x00040000
 #define RXf_CANY_SEEN          0x00080000
@@ -386,6 +378,10 @@ typedef struct regmatch_state {
            SV* mark_name;
            char *mark_loc;
        } mark;
+       
+       struct {
+           int val;
+       } keeper;
     } u;
 } regmatch_state;
 
@@ -459,6 +455,7 @@ struct re_save_state {
 
 #define SAVESTACK_ALLOC_FOR_RE_SAVE_STATE \
        (1 + ((sizeof(struct re_save_state) - 1) / sizeof(*PL_savestack)))
+
 /*
  * Local variables:
  * c-indentation-style: bsd