+
+XS(XS_Internals_inc_sub_generation)
+{
+ dVAR;
+ /* Using dXSARGS would also have dITEM and dSP,
+ * which define 2 unused local variables. */
+ dAXMARK;
+ PERL_UNUSED_ARG(cv);
+ PERL_UNUSED_VAR(mark);
+ ++PL_sub_generation;
+ XSRETURN_EMPTY;
+}
+
+XS(XS_re_is_regexp)
+{
+ dVAR;
+ dXSARGS;
+ if (items != 1)
+ Perl_croak(aTHX_ "Usage: %s(%s)", "re::is_regexp", "sv");
+ PERL_UNUSED_VAR(cv); /* -W */
+ PERL_UNUSED_VAR(ax); /* -Wall */
+ SP -= items;
+ {
+ SV * sv = ST(0);
+ if ( Perl_get_re_arg( aTHX_ sv, 0, NULL ) )
+ {
+ XSRETURN_YES;
+ } else {
+ XSRETURN_NO;
+ }
+ /* NOTREACHED */
+ PUTBACK;
+ return;
+ }
+}
+
+XS(XS_re_regname)
+{
+
+ dVAR;
+ dXSARGS;
+ if (items < 1 || items > 3)
+ Perl_croak(aTHX_ "Usage: %s(%s)", "re::regname", "sv, qr = NULL, all = NULL");
+ PERL_UNUSED_VAR(cv); /* -W */
+ PERL_UNUSED_VAR(ax); /* -Wall */
+ SP -= items;
+ {
+ SV * sv = ST(0);
+ SV * qr;
+ SV * all;
+ regexp *re = NULL;
+ SV *bufs = NULL;
+
+ if (items < 2)
+ qr = NULL;
+ else {
+ qr = ST(1);
+ }
+
+ if (items < 3)
+ all = NULL;
+ else {
+ all = ST(2);
+ }
+ {
+ re = Perl_get_re_arg( aTHX_ qr, 1, NULL);
+ if (SvPOK(sv) && re && re->paren_names) {
+ bufs = CALLREG_NAMEDBUF(re,sv,all && SvTRUE(all));
+ if (bufs) {
+ if (all && SvTRUE(all))
+ XPUSHs(newRV(bufs));
+ else
+ XPUSHs(SvREFCNT_inc(bufs));
+ XSRETURN(1);
+ }
+ }
+ XSRETURN_UNDEF;
+ }
+ PUTBACK;
+ return;
+ }
+}
+
+XS(XS_re_regnames)
+{
+ dVAR;
+ dXSARGS;
+ if (items < 0 || items > 2)
+ Perl_croak(aTHX_ "Usage: %s(%s)", "re::regnames", "sv = NULL, all = NULL");
+ PERL_UNUSED_VAR(cv); /* -W */
+ PERL_UNUSED_VAR(ax); /* -Wall */
+ SP -= items;
+ {
+ SV * sv;
+ SV * all;
+ regexp *re = NULL;
+ IV count = 0;
+
+ if (items < 1)
+ sv = NULL;
+ else {
+ sv = ST(0);
+ }
+
+ if (items < 2)
+ all = NULL;
+ else {
+ all = ST(1);
+ }
+ {
+ re = Perl_get_re_arg( aTHX_ sv, 1, NULL );
+ if (re && re->paren_names) {
+ HV *hv= re->paren_names;
+ (void)hv_iterinit(hv);
+ while (1) {
+ HE *temphe = hv_iternext_flags(hv,0);
+ if (temphe) {
+ IV i;
+ IV parno = 0;
+ SV* sv_dat = HeVAL(temphe);
+ I32 *nums = (I32*)SvPVX(sv_dat);
+ for ( i = 0; i < SvIVX(sv_dat); i++ ) {
+ if ((I32)(re->lastcloseparen) >= nums[i] &&
+ re->startp[nums[i]] != -1 &&
+ re->endp[nums[i]] != -1)
+ {
+ parno = nums[i];
+ break;
+ }
+ }
+ if (parno || (all && SvTRUE(all))) {
+ STRLEN len;
+ char *pv = HePV(temphe, len);
+ if ( GIMME_V == G_ARRAY )
+ XPUSHs(newSVpvn(pv,len));
+ count++;
+ }
+ } else {
+ break;
+ }
+ }
+ }
+ if ( GIMME_V == G_ARRAY )
+ XSRETURN(count);
+ else
+ XSRETURN_UNDEF;
+ }
+ PUTBACK;
+ return;
+ }
+}
+
+
+XS(XS_re_regnames_iterinit)
+{
+ dVAR;
+ dXSARGS;
+ if (items < 0 || items > 1)
+ Perl_croak(aTHX_ "Usage: %s(%s)", "re::regnames_iterinit", "sv = NULL");
+ PERL_UNUSED_VAR(cv); /* -W */
+ PERL_UNUSED_VAR(ax); /* -Wall */
+ SP -= items;
+ {
+ SV * sv;
+ regexp *re = NULL;
+
+ if (items < 1)
+ sv = NULL;
+ else {
+ sv = ST(0);
+ }
+ {
+ re = Perl_get_re_arg( aTHX_ sv, 1, NULL );
+ if (re && re->paren_names) {
+ (void)hv_iterinit(re->paren_names);
+ XPUSHs(newSViv(HvTOTALKEYS(re->paren_names)));
+ } else {
+ XSRETURN_UNDEF;
+ }
+ }
+ PUTBACK;
+ return;
+ }
+}
+
+
+XS(XS_re_regnames_iternext)
+{
+ dVAR;
+ dXSARGS;
+ if (items < 0 || items > 2)
+ Perl_croak(aTHX_ "Usage: %s(%s)", "re::regnames_iternext", "sv = NULL, all = NULL");
+ PERL_UNUSED_VAR(cv); /* -W */
+ PERL_UNUSED_VAR(ax); /* -Wall */
+ SP -= items;
+ {
+ SV * sv;
+ SV * all;
+ regexp *re;
+
+ if (items < 1)
+ sv = NULL;
+ else {
+ sv = ST(0);
+ }
+
+ if (items < 2)
+ all = NULL;
+ else {
+ all = ST(1);
+ }
+ {
+ re = Perl_get_re_arg( aTHX_ sv, 1, NULL );
+ if (re && re->paren_names) {
+ HV *hv= re->paren_names;
+ while (1) {
+ HE *temphe = hv_iternext_flags(hv,0);
+ if (temphe) {
+ IV i;
+ IV parno = 0;
+ SV* sv_dat = HeVAL(temphe);
+ I32 *nums = (I32*)SvPVX(sv_dat);
+ for ( i = 0; i < SvIVX(sv_dat); i++ ) {
+ if ((I32)(re->lastcloseparen) >= nums[i] &&
+ re->startp[nums[i]] != -1 &&
+ re->endp[nums[i]] != -1)
+ {
+ parno = nums[i];
+ break;
+ }
+ }
+ if (parno || (all && SvTRUE(all))) {
+ STRLEN len;
+ char *pv = HePV(temphe, len);
+ XPUSHs(newSVpvn(pv,len));
+ XSRETURN(1);
+ }
+ } else {
+ break;
+ }
+ }
+ }
+ XSRETURN_UNDEF;
+ }
+ PUTBACK;
+ return;
+ }
+}
+
+
+XS(XS_re_regnames_count)
+{
+ SV * sv;
+ regexp *re = NULL;
+ dVAR;
+ dXSARGS;
+
+ if (items < 0 || items > 1)
+ Perl_croak(aTHX_ "Usage: %s(%s)", "re::regnames_count", "sv = NULL");
+ PERL_UNUSED_VAR(cv); /* -W */
+ PERL_UNUSED_VAR(ax); /* -Wall */
+ SP -= items;
+ if (items < 1)
+ sv = NULL;
+ else {
+ sv = ST(0);
+ }
+ re = Perl_get_re_arg( aTHX_ sv, 1, NULL );
+ if (re && re->paren_names) {
+ XPUSHs(newSViv(HvTOTALKEYS(re->paren_names)));
+ } else {
+ XSRETURN_UNDEF;
+ }
+ PUTBACK;
+ return;
+}
+
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */