perlunifaq, uniintro: fix for 80 col display
[p5sagit/p5-mst-13.2.git] / ext / re / re.xs
index b82062a..8bc305e 100644 (file)
@@ -6,39 +6,61 @@
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
+#include "re_comp.h"
 
 
 START_EXTERN_C
 
-extern regexp* my_regcomp (pTHX_ char* exp, char* xend, PMOP* pm);
-extern I32     my_regexec (pTHX_ regexp* prog, char* stringarg, char* strend,
+extern REGEXP* my_re_compile (pTHX_ SV * const pattern, const U32 pm_flags);
+extern I32     my_regexec (pTHX_ REGEXP * const prog, char* stringarg, char* strend,
                            char* strbeg, I32 minend, SV* screamer,
                            void* data, U32 flags);
-extern void    my_regfree (pTHX_ struct regexp* r);
-extern char*   my_re_intuit_start (pTHX_ regexp *prog, SV *sv, char *strpos,
-                                   char *strend, U32 flags,
+
+extern char*   my_re_intuit_start (pTHX_ REGEXP * const prog, SV *sv, char *strpos,
+                                   char *strend, const U32 flags,
                                    struct re_scream_pos_data_s *data);
-extern SV*     my_re_intuit_string (pTHX_ regexp *prog);
-extern char*   my_reg_stringify (pTHX_ MAGIC *mg, U32 *flags, STRLEN *lp, I32 *haseval);
+extern SV*     my_re_intuit_string (pTHX_ REGEXP * const prog);
+
+extern void    my_regfree (pTHX_ REGEXP * const r);
+
+extern void    my_reg_numbered_buff_fetch(pTHX_ REGEXP * const rx, const I32 paren,
+                                          SV * const usesv);
+extern void    my_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren,
+                                          SV const * const value);
+extern I32     my_reg_numbered_buff_length(pTHX_ REGEXP * const rx,
+                                           const SV * const sv, const I32 paren);
 
+extern SV*     my_reg_named_buff(pTHX_ REGEXP * const, SV * const, SV * const,
+                              const U32);
+extern SV*     my_reg_named_buff_iter(pTHX_ REGEXP * const rx,
+                                   const SV * const lastkey, const U32 flags);
+
+extern SV*      my_reg_qr_package(pTHX_ REGEXP * const rx);
 #if defined(USE_ITHREADS)
-extern regexp* my_regdupe (pTHX_ const regexp *r, CLONE_PARAMS *param);
+extern void*   my_regdupe (pTHX_ REGEXP * const r, CLONE_PARAMS *param);
 #endif
 
-EXTERN_C const struct regexp_engine my_reg_engine = { 
-        my_regcomp, 
+EXTERN_C const struct regexp_engine my_reg_engine;
+
+END_EXTERN_C
+
+const struct regexp_engine my_reg_engine = { 
+        my_re_compile, 
         my_regexec, 
         my_re_intuit_start, 
         my_re_intuit_string, 
         my_regfree, 
-        my_reg_stringify,
+        my_reg_numbered_buff_fetch,
+        my_reg_numbered_buff_store,
+        my_reg_numbered_buff_length,
+        my_reg_named_buff,
+        my_reg_named_buff_iter,
+        my_reg_qr_package,
 #if defined(USE_ITHREADS)
         my_regdupe 
 #endif
 };
 
-END_EXTERN_C
-
 MODULE = re    PACKAGE = re
 
 void
@@ -47,120 +69,33 @@ install()
         PL_colorset = 0;       /* Allow reinspection of ENV. */
         /* PL_debug |= DEBUG_r_FLAG; */
        XPUSHs(sv_2mortal(newSViv(PTR2IV(&my_reg_engine))));
-       
 
 void
-is_regexp(sv)
+regmust(sv)
     SV * sv
 PROTOTYPE: $
 PREINIT:
-    MAGIC *mg;
+    REGEXP *re;
 PPCODE:
 {
-    if (SvMAGICAL(sv))  
-        mg_get(sv);
-    if (SvROK(sv) && 
-        (sv = (SV*)SvRV(sv)) &&     /* assign deliberate */
-        SvTYPE(sv) == SVt_PVMG && 
-        (mg = mg_find(sv, PERL_MAGIC_qr))) /* assign deliberate */
+    if ((re = SvRX(sv))) /* assign deliberate */
     {
-        XSRETURN_YES;
-    } else {
-        XSRETURN_NO;
-    }
-    /* NOTREACHED */        
-}        
-       
-void
-regexp_pattern(sv)
-    SV * sv
-PROTOTYPE: $
-PREINIT:
-    MAGIC *mg;
-PPCODE:
-{
-    /*
-       Checks if a reference is a regex or not. If the parameter is
-       not a ref, or is not the result of a qr// then returns false
-       in scalar context and an empty list in list context.
-       Otherwise in list context it returns the pattern and the
-       modifiers, in scalar context it returns the pattern just as it
-       would if the qr// was stringified normally, regardless as
-       to the class of the variable and any strigification overloads
-       on the object. 
-    */
-
-    if (SvMAGICAL(sv))  
-        mg_get(sv);
-    if (SvROK(sv) && 
-        (sv = (SV*)SvRV(sv)) &&     /* assign deliberate */
-        SvTYPE(sv) == SVt_PVMG && 
-        (mg = mg_find(sv, PERL_MAGIC_qr))) /* assign deliberate */
-    {
-    
-        /* Housten, we have a regex! */
-        SV *pattern;
-        regexp *re = (regexp *)mg->mg_obj;
-        STRLEN patlen = 0;
-        STRLEN left = 0;
-        char reflags[6];
-        
-        if ( GIMME_V == G_ARRAY ) {
-            /*
-               we are in list context so stringify
-               the modifiers that apply. We ignore "negative
-               modifiers" in this scenario. 
-            */
-
-            char *fptr = "msix";
-            char ch;
-            U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
-
-            while((ch = *fptr++)) {
-                if(reganch & 1) {
-                    reflags[left++] = ch;
-                }
-                reganch >>= 1;
-            }
-
-            pattern = sv_2mortal(newSVpvn(re->precomp,re->prelen));
-            if (re->reganch & ROPT_UTF8) SvUTF8_on(pattern);
-
-            /* return the pattern and the modifiers */
-            XPUSHs(pattern);
-            XPUSHs(sv_2mortal(newSVpvn(reflags,left)));
-            XSRETURN(2);
-        } else {
-            /* Scalar, so use the string that Perl would return */
-            if (!mg->mg_ptr) 
-                CALLREG_STRINGIFY(mg,0,0);
-            
-            /* return the pattern in (?msix:..) format */
-            pattern = sv_2mortal(newSVpvn(mg->mg_ptr,mg->mg_len));
-            if (re->reganch & ROPT_UTF8) 
-                SvUTF8_on(pattern);
-            XPUSHs(pattern);
-            XSRETURN(1);
+        SV *an = &PL_sv_no;
+        SV *fl = &PL_sv_no;
+        if (RX_ANCHORED_SUBSTR(re)) {
+            an = newSVsv(RX_ANCHORED_SUBSTR(re));
+        } else if (RX_ANCHORED_UTF8(re)) {
+            an = newSVsv(RX_ANCHORED_UTF8(re));
         }
-    } else {
-        /* It ain't a regexp folks */
-        if ( GIMME_V == G_ARRAY ) {
-            /* return the empty list */
-            XSRETURN_UNDEF;
-        } else {
-            /* Because of the (?:..) wrapping involved in a 
-               stringified pattern it is impossible to get a 
-               result for a real regexp that would evaluate to 
-               false. Therefore we can return PL_sv_no to signify
-               that the object is not a regex, this means that one 
-               can say
-               
-                 if (regex($might_be_a_regex) eq '(?:foo)') { }
-               
-               and not worry about undefined values.
-            */
-            XSRETURN_NO;
-        }    
+        if (RX_FLOAT_SUBSTR(re)) {
+            fl = newSVsv(RX_FLOAT_SUBSTR(re));
+        } else if (RX_FLOAT_UTF8(re)) {
+            fl = newSVsv(RX_FLOAT_UTF8(re));
+        }
+        XPUSHs(an);
+        XPUSHs(fl);
+        XSRETURN(2);
     }
-    /* NOT-REACHED */
-}
\ No newline at end of file
+    XSRETURN_UNDEF;
+}
+