This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: [PATCH] Cray XT4/Catamount build
[perl5.git] / regexp.h
index 1353a92..4001dc1 100644 (file)
--- a/regexp.h
+++ b/regexp.h
@@ -151,9 +151,9 @@ typedef struct regexp_engine {
   paren name. >= 1 is reserved for actual numbered captures, i.e. $1,
   $2 etc.
 */
-#define RXf_PREMATCH  -2 /* $` / ${^PREMATCH}  */
-#define RXf_POSTMATCH -1 /* $' / ${^POSTMATCH} */
-#define RXf_MATCH      0 /* $& / ${^MATCH}     */
+#define RX_BUFF_IDX_PREMATCH  -2 /* $` / ${^PREMATCH}  */
+#define RX_BUFF_IDX_POSTMATCH -1 /* $' / ${^POSTMATCH} */
+#define RX_BUFF_IDX_FULLMATCH      0 /* $& / ${^MATCH}     */
 
 /*
   Flags that are passed to the named_buff and named_buff_iter
@@ -163,23 +163,58 @@ typedef struct regexp_engine {
 */
 
 /* The Tie::Hash::NamedCapture operation this is part of, if any */
-#define RXf_HASH_FETCH     0x0001
-#define RXf_HASH_STORE     0x0002
-#define RXf_HASH_DELETE    0x0004
-#define RXf_HASH_CLEAR     0x0008
-#define RXf_HASH_EXISTS    0x0010
-#define RXf_HASH_SCALAR    0x0020
-#define RXf_HASH_FIRSTKEY  0x0040
-#define RXf_HASH_NEXTKEY   0x0080
+#define RXapif_FETCH     0x0001
+#define RXapif_STORE     0x0002
+#define RXapif_DELETE    0x0004
+#define RXapif_CLEAR     0x0008
+#define RXapif_EXISTS    0x0010
+#define RXapif_SCALAR    0x0020
+#define RXapif_FIRSTKEY  0x0040
+#define RXapif_NEXTKEY   0x0080
 
 /* Whether %+ or %- is being operated on */
-#define RXf_HASH_ONE       0x0100 /* %+ */
-#define RXf_HASH_ALL       0x0200 /* %- */
+#define RXapif_ONE       0x0100 /* %+ */
+#define RXapif_ALL       0x0200 /* %- */
 
 /* Whether this is being called from a re:: function */
-#define RXf_HASH_REGNAME         0x0400
-#define RXf_HASH_REGNAMES        0x0800
-#define RXf_HASH_REGNAMES_COUNT  0x1000 
+#define RXapif_REGNAME         0x0400
+#define RXapif_REGNAMES        0x0800
+#define RXapif_REGNAMES_COUNT  0x1000 
+
+/*
+=head1 REGEXP Functions
+
+=for apidoc Am|REGEXP *|SvRX|SV *sv
+
+Convenience macro to get the REGEXP from a SV. This is approximately
+equivalent to the following snippet:
+
+    if (SvMAGICAL(sv))
+        mg_get(sv);
+    if (SvROK(sv) &&
+        (tmpsv = (SV*)SvRV(sv)) &&
+        SvTYPE(tmpsv) == SVt_PVMG &&
+        (tmpmg = mg_find(tmpsv, PERL_MAGIC_qr)))
+    {
+        return (REGEXP *)tmpmg->mg_obj;
+    }
+
+NULL will be returned if a REGEXP* is not found.
+
+=for apidoc Am|bool|SvRXOK|SV* sv
+
+Returns a boolean indicating whether the SV contains qr magic
+(PERL_MAGIC_qr).
+
+If you want to do something with the REGEXP* later use SvRX instead
+and check for NULL.
+
+=cut
+*/
+
+#define SvRX(sv)   (Perl_get_re_arg(aTHX_ sv))
+#define SvRXOK(sv) (Perl_get_re_arg(aTHX_ sv) ? TRUE : FALSE)
+
 
 /* Flags stored in regexp->extflags 
  * These are used by code external to the regexp engine
@@ -187,6 +222,10 @@ typedef struct 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.
+ *
+ * NOTE: if you modify any RXf flags you should run regen.pl or regcomp.pl
+ * so that regnodes.h is updated with the changes. 
+ *
  */
 
 /* Anchor and GPOS related stuff */
@@ -205,6 +244,7 @@ typedef struct regexp_engine {
 #define RXf_SKIPWHITE          0x00000100 /* Pattern is for a split / / */
 #define RXf_START_ONLY         0x00000200 /* Pattern is /^/ */
 #define RXf_WHITE              0x00000400 /* Pattern is /\s+/ */
+#define RXf_NULL               0x40000000 /* Pattern is // */
 
 /* 0x1F800 of extflags is used by (RXf_)PMf_COMPILETIME */
 #define RXf_PMf_LOCALE         0x00000800 /* use locale */
@@ -212,7 +252,7 @@ typedef struct regexp_engine {
 #define RXf_PMf_SINGLELINE     0x00002000 /* /s         */
 #define RXf_PMf_FOLD           0x00004000 /* /i         */
 #define RXf_PMf_EXTENDED       0x00008000 /* /x         */
-#define RXf_PMf_KEEPCOPY       0x00010000 /* /k         */
+#define RXf_PMf_KEEPCOPY       0x00010000 /* /p         */
 /* 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)
@@ -254,6 +294,11 @@ typedef struct regexp_engine {
 #define M_PAT_MODS      QR_PAT_MODS     LOOP_PAT_MODS
 #define S_PAT_MODS      M_PAT_MODS      EXEC_PAT_MODS
 
+/*
+ * NOTE: if you modify any RXf flags you should run regen.pl or regcomp.pl
+ * so that regnodes.h is updated with the changes. 
+ *
+ */
 
 /* What we have seen */
 #define RXf_LOOKBEHIND_SEEN    0x00020000
@@ -272,7 +317,14 @@ typedef struct regexp_engine {
 #define RXf_USE_INTUIT_NOML    0x01000000
 #define RXf_USE_INTUIT_ML      0x02000000
 #define RXf_INTUIT_TAIL        0x04000000
-/* one bit here */
+
+/*
+  Set in Perl_pmruntime if op_flags & OPf_SPECIAL, i.e. split. Will
+  be used by regex engines to check whether they should set
+  RXf_SKIPWHITE
+*/
+#define RXf_SPLIT           0x08000000
+
 #define RXf_USE_INTUIT         (RXf_USE_INTUIT_NOML|RXf_USE_INTUIT_ML)
 
 /* Copy and tainted info */
@@ -280,6 +332,11 @@ typedef struct regexp_engine {
 #define RXf_TAINTED_SEEN       0x20000000
 #define RXf_TAINTED             0x80000000 /* this pattern is tainted */
 
+/*
+ * NOTE: if you modify any RXf flags you should run regen.pl or regcomp.pl
+ * so that regnodes.h is updated with the changes. 
+ *
+ */
 
 #define RX_HAS_CUTGROUP(prog) ((prog)->intflags & PREGf_CUTGROUP_SEEN)
 #define RX_MATCH_TAINTED(prog) ((prog)->extflags & RXf_TAINTED_SEEN)