#define get_ANYOF_cp_list_for_ssc(a,b) S_get_ANYOF_cp_list_for_ssc(aTHX_ a,b)
#define get_invlist_iter_addr S_get_invlist_iter_addr
#define grok_bslash_N(a,b,c,d,e,f) S_grok_bslash_N(aTHX_ a,b,c,d,e,f)
+#define handle_named_backref(a,b,c,d) S_handle_named_backref(aTHX_ a,b,c,d)
#define handle_possible_posix(a,b,c,d) S_handle_possible_posix(aTHX_ a,b,c,d)
#define handle_regex_sets(a,b,c,d,e) S_handle_regex_sets(aTHX_ a,b,c,d,e)
#define invlist_clone(a) S_invlist_clone(aTHX_ a)
STATIC bool S_grok_bslash_N(pTHX_ RExC_state_t *pRExC_state, regnode** nodep, UV *code_point_p, int* cp_count, I32 *flagp, const U32 depth);
#define PERL_ARGS_ASSERT_GROK_BSLASH_N \
assert(pRExC_state); assert(flagp)
+PERL_STATIC_INLINE regnode* S_handle_named_backref(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, char * parse_start, char ch);
+#define PERL_ARGS_ASSERT_HANDLE_NAMED_BACKREF \
+ assert(pRExC_state); assert(flagp); assert(parse_start)
STATIC int S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, const char* const s, char ** updated_parse_ptr, AV** posix_warnings);
#define PERL_ARGS_ASSERT_HANDLE_POSSIBLE_POSIX \
assert(pRExC_state); assert(s)
#define REGTAIL_STUDY(x,y,z) regtail((x),(y),(z),depth+1)
#endif
+PERL_STATIC_INLINE regnode *
+S_handle_named_backref(pTHX_ RExC_state_t *pRExC_state,
+ I32 *flagp,
+ char * parse_start,
+ char ch
+ )
+{
+ regnode *ret;
+ char* name_start = RExC_parse;
+ U32 num = 0;
+
+ GET_RE_DEBUG_FLAGS_DECL;
+
+ SV *sv_dat = reg_scan_name(pRExC_state, SIZE_ONLY
+ ? REG_RSN_RETURN_NULL
+ : REG_RSN_RETURN_DATA);
+ PERL_ARGS_ASSERT_HANDLE_NAMED_BACKREF;
+
+ if (RExC_parse == name_start || *RExC_parse != ch) {
+ /* diag_listed_as: Sequence \%s... not terminated in regex; marked by <-- HERE in m/%s/ */
+ vFAIL2("Sequence %.3s... not terminated",parse_start);
+ }
+
+ if (!SIZE_ONLY) {
+ num = add_data( pRExC_state, STR_WITH_LEN("S"));
+ RExC_rxi->data->data[num]=(void*)sv_dat;
+ SvREFCNT_inc_simple_void(sv_dat);
+ }
+ RExC_sawback = 1;
+ ret = reganode(pRExC_state,
+ ((! FOLD)
+ ? NREF
+ : (ASCII_FOLD_RESTRICTED)
+ ? NREFFA
+ : (AT_LEAST_UNI_SEMANTICS)
+ ? NREFFU
+ : (LOC)
+ ? NREFFL
+ : NREFF),
+ num);
+ *flagp |= HASWIDTH;
+
+ Set_Node_Offset(ret, parse_start+1);
+ Set_Node_Cur_Length(ret, parse_start);
+
+ nextchar(pRExC_state);
+ return ret;
+}
+
/* Returns NULL, setting *flagp to TRYAGAIN at the end of (?) that only sets
flags. Returns NULL, setting *flagp to RESTART_PASS1 if the sizing scan
needs to be restarted, or'd with NEED_UTF8 if the pattern needs to be
goto named_recursion;
}
else if (paren == '=') { /* (?P=...) named backref */
- /* this pretty much dupes the code for \k<NAME> in
- * regatom(), if you change this make sure you change that
- * */
- char* name_start = RExC_parse;
- U32 num = 0;
- SV *sv_dat = reg_scan_name(pRExC_state,
- SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
- if (RExC_parse == name_start || *RExC_parse != ')')
- /* diag_listed_as: Sequence ?P=... not terminated in regex; marked by <-- HERE in m/%s/ */
- vFAIL2("Sequence %.3s... not terminated",parse_start);
-
- if (!SIZE_ONLY) {
- num = add_data( pRExC_state, STR_WITH_LEN("S"));
- RExC_rxi->data->data[num]=(void*)sv_dat;
- SvREFCNT_inc_simple_void(sv_dat);
- }
- RExC_sawback = 1;
- ret = reganode(pRExC_state,
- ((! FOLD)
- ? NREF
- : (ASCII_FOLD_RESTRICTED)
- ? NREFFA
- : (AT_LEAST_UNI_SEMANTICS)
- ? NREFFU
- : (LOC)
- ? NREFFL
- : NREFF),
- num);
- *flagp |= HASWIDTH;
-
- Set_Node_Offset(ret, parse_start+1);
- Set_Node_Cur_Length(ret, parse_start);
-
- nextchar(pRExC_state);
- return ret;
+ return handle_named_backref(pRExC_state, flagp,
+ parse_start, ')');
}
--RExC_parse;
RExC_parse += SKIP_IF_CHAR(RExC_parse);
/* diag_listed_as: Sequence \%s... not terminated in regex; marked by <-- HERE in m/%s/ */
vFAIL2("Sequence %.2s... not terminated",parse_start);
} else {
- /* this pretty much dupes the code for (?P=...) in reg(), if
- you change this make sure you change that */
- char* name_start = (RExC_parse += 2);
- U32 num = 0;
- SV *sv_dat = reg_scan_name(pRExC_state,
- SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
- ch= (ch == '<') ? '>' : (ch == '{') ? '}' : '\'';
- if (RExC_parse == name_start || *RExC_parse != ch)
- /* diag_listed_as: Sequence \%s... not terminated in regex; marked by <-- HERE in m/%s/ */
- vFAIL2("Sequence %.3s... not terminated",parse_start);
-
- if (!SIZE_ONLY) {
- num = add_data( pRExC_state, STR_WITH_LEN("S"));
- RExC_rxi->data->data[num]=(void*)sv_dat;
- SvREFCNT_inc_simple_void(sv_dat);
- }
-
- RExC_sawback = 1;
- ret = reganode(pRExC_state,
- ((! FOLD)
- ? NREF
- : (ASCII_FOLD_RESTRICTED)
- ? NREFFA
- : (AT_LEAST_UNI_SEMANTICS)
- ? NREFFU
- : (LOC)
- ? NREFFL
- : NREFF),
- num);
- *flagp |= HASWIDTH;
-
- /* override incorrect value set in reganode MJD */
- Set_Node_Offset(ret, parse_start+1);
- Set_Node_Cur_Length(ret, parse_start);
- nextchar(pRExC_state);
-
+ RExC_parse += 2;
+ ret = handle_named_backref(pRExC_state,
+ flagp,
+ parse_start,
+ (ch == '<')
+ ? '>'
+ : (ch == '{')
+ ? '}'
+ : '\'');
}
break;
}