New separations for the pattern match operator documentation,
[p5sagit/p5-mst-13.2.git] / regexp.h
index ad59cc7..156e60b 100644 (file)
--- a/regexp.h
+++ b/regexp.h
@@ -66,44 +66,53 @@ typedef struct regexp_paren_pair {
   regexp's data array based on the data item's type.
 */
 
+#define _REGEXP_COMMON                                                 \
+        /* what engine created this regexp? */                         \
+       const struct regexp_engine* engine;                             \
+       REGEXP *mother_re; /* what re is this a lightweight copy of? */ \
+       /* Information about the match that the perl core uses to */    \
+       /* manage things */                                             \
+       U32 extflags;   /* Flags used both externally and internally */ \
+       I32 minlen;     /* mininum possible length of string to match */\
+       I32 minlenret;  /* mininum possible length of $& */             \
+       U32 gofs;       /* chars left of pos that we search from */     \
+       /* substring data about strings that must appear in the */      \
+       /* final match, used for optimisations */                       \
+       struct reg_substr_data *substrs;                                \
+       U32 nparens;    /* number of capture buffers */                 \
+       /* private engine specific data */                              \
+       U32 intflags;   /* Engine Specific Internal flags */            \
+       void *pprivate; /* Data private to the regex engine which */    \
+                       /* created this object. */                      \
+       /* Data about the last/current match. These are modified */     \
+       /* during matching */                                           \
+       U32 lastparen;                  /* last open paren matched */   \
+       U32 lastcloseparen;             /* last close paren matched */  \
+       regexp_paren_pair *swap;        /* Swap copy of *offs */        \
+       /* Array of offsets for (@-) and (@+) */                        \
+       regexp_paren_pair *offs;                                        \
+       /* saved or original string so \digit works forever. */         \
+       char *subbeg;                                                   \
+       SV_SAVED_COPY   /* If non-NULL, SV which is COW from original */\
+       I32 sublen;     /* Length of string pointed by subbeg */        \
+       /* Information about the match that isn't often used */         \
+       /* offset from wrapped to the start of precomp */               \
+       PERL_BITFIELD32 pre_prefix:4;                                   \
+       /* number of eval groups in the pattern - for security checks */\
+       PERL_BITFIELD32 seen_evals:28
+
 typedef struct regexp {
        _XPV_HEAD;
        _XPVMG_HEAD;
-        /* what engine created this regexp? */
-       const struct regexp_engine* engine; 
-       REGEXP *mother_re;      /* what re is this a lightweight copy of? */
-       
-       /* Information about the match that the perl core uses to manage things */
-       U32 extflags;           /* Flags used both externally and internally */
-       I32 minlen;             /* mininum possible length of string to match */
-       I32 minlenret;          /* mininum possible length of $& */
-       U32 gofs;               /* chars left of pos that we search from */
-       struct reg_substr_data *substrs; /* substring data about strings that must appear
-                                   in the final match, used for optimisations */
-       U32 nparens;            /* number of capture buffers */
-
-        /* private engine specific data */
-       U32 intflags;           /* Engine Specific Internal flags */
-       void *pprivate;         /* Data private to the regex engine which 
-                                   created this object. */
-        
-        /* Data about the last/current match. These are modified during matching*/
-        U32 lastparen;         /* last open paren matched */
-       U32 lastcloseparen;     /* last close paren matched */
-        regexp_paren_pair *swap;  /* Swap copy of *offs */ 
-        regexp_paren_pair *offs;  /* Array of offsets for (@-) and (@+) */
-
-       char *subbeg;           /* saved or original string 
-                                  so \digit works forever. */
-       SV_SAVED_COPY           /* If non-NULL, SV which is COW from original */
-       I32 sublen;             /* Length of string pointed by subbeg */
-        
-        
-        /* Information about the match that isn't often used */
-       unsigned pre_prefix:4;  /* offset from wrapped to the start of precomp */
-       unsigned seen_evals:28; /* number of eval groups in the pattern - for security checks */ 
+       _REGEXP_COMMON;
 } regexp;
 
+struct regexp_allocated {
+       _XPV_ALLOCATED_HEAD;
+       _XPVMG_HEAD;
+       _REGEXP_COMMON;
+};
+
 /*        HV *paren_names;      Optional hash of paren names
          now stored in the IV union */
 
@@ -120,7 +129,7 @@ typedef struct re_scream_pos_data_s
  * Any regex engine implementation must be able to build one of these.
  */
 typedef struct regexp_engine {
-    REGEXP* (*comp) (pTHX_ const SV * const pattern, const U32 flags);
+    REGEXP* (*comp) (pTHX_ const SV * const pattern, U32 flags);
     I32     (*exec) (pTHX_ REGEXP * const rx, char* stringarg, char* strend,
                      char* strbeg, I32 minend, SV* screamer,
                      void* data, U32 flags);
@@ -369,14 +378,46 @@ and check for NULL.
 #define RX_WRAPPED(prog)       SvPVX(prog)
 #define RX_WRAPLEN(prog)       SvCUR(prog)
 #define RX_CHECK_SUBSTR(prog)  (((struct regexp *)SvANY(prog))->check_substr)
-#define RX_EXTFLAGS(prog)      RXp_EXTFLAGS((struct regexp *)SvANY(prog))
 #define RX_REFCNT(prog)                SvREFCNT(prog)
-#define RX_ENGINE(prog)                (((struct regexp *)SvANY(prog))->engine)
-#define RX_SUBBEG(prog)                (((struct regexp *)SvANY(prog))->subbeg)
-#define RX_OFFS(prog)          (((struct regexp *)SvANY(prog))->offs)
-#define RX_NPARENS(prog)       (((struct regexp *)SvANY(prog))->nparens)
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#  define RX_EXTFLAGS(prog)                                            \
+    (*({                                                               \
+       const REGEXP *const thwape = (prog);                            \
+       assert(SvTYPE(thwape) == SVt_REGEXP);                           \
+       &RXp_EXTFLAGS(SvANY(thwape));                                   \
+    }))
+#  define RX_ENGINE(prog)                                              \
+    (*({                                                               \
+       const REGEXP *const thwape = (prog);                            \
+       assert(SvTYPE(thwape) == SVt_REGEXP);                           \
+       &SvANY(thwape)->engine;                                         \
+    }))
+#  define RX_SUBBEG(prog)                                              \
+    (*({                                                               \
+       const REGEXP *const thwape = (prog);                            \
+       assert(SvTYPE(thwape) == SVt_REGEXP);                           \
+       &SvANY(thwape)->subbeg;                                         \
+    }))
+#  define RX_OFFS(prog)                                                        \
+    (*({                                                               \
+       const REGEXP *const thwape = (prog);                            \
+       assert(SvTYPE(thwape) == SVt_REGEXP);                           \
+       &SvANY(thwape)->offs;                                           \
+    }))
+#  define RX_NPARENS(prog)                                             \
+    (*({                                                               \
+       const REGEXP *const thwape = (prog);                            \
+       assert(SvTYPE(thwape) == SVt_REGEXP);                           \
+       &SvANY(thwape)->nparens;                                        \
+    }))
+#else
+#  define RX_EXTFLAGS(prog)    RXp_EXTFLAGS((struct regexp *)SvANY(prog))
+#  define RX_ENGINE(prog)      (((struct regexp *)SvANY(prog))->engine)
+#  define RX_SUBBEG(prog)      (((struct regexp *)SvANY(prog))->subbeg)
+#  define RX_OFFS(prog)                (((struct regexp *)SvANY(prog))->offs)
+#  define RX_NPARENS(prog)     (((struct regexp *)SvANY(prog))->nparens)
+#endif
 #define RX_SUBLEN(prog)                (((struct regexp *)SvANY(prog))->sublen)
-#define RX_SUBBEG(prog)                (((struct regexp *)SvANY(prog))->subbeg)
 #define RX_MINLEN(prog)                (((struct regexp *)SvANY(prog))->minlen)
 #define RX_MINLENRET(prog)     (((struct regexp *)SvANY(prog))->minlenret)
 #define RX_GOFS(prog)          (((struct regexp *)SvANY(prog))->gofs)
@@ -423,12 +464,14 @@ and check for NULL.
 #define REXEC_IGNOREPOS        0x08            /* \G matches at start. */
 #define REXEC_NOT_FIRST        0x10            /* This is another iteration of //g. */
 
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
 #  define ReREFCNT_inc(re)                                             \
     ({                                                                 \
        /* This is here to generate a casting warning if incorrect.  */ \
        REGEXP *const zwapp = (re);                                     \
+       assert(SvTYPE(zwapp) == SVt_REGEXP);                            \
        SvREFCNT_inc(zwapp);                                            \
+       zwapp;                                                          \
     })
 #  define ReREFCNT_dec(re)                                             \
     ({                                                                 \
@@ -438,7 +481,7 @@ and check for NULL.
     })
 #else
 #  define ReREFCNT_dec(re)     SvREFCNT_dec(re)
-#  define ReREFCNT_inc(re)     SvREFCNT_inc(re)
+#  define ReREFCNT_inc(re)     ((REGEXP *) SvREFCNT_inc(re))
 #endif
 
 /* FIXME for plugins. */