- pregexec - match a regexp against a string
*/
I32
-Perl_pregexec(pTHX_ register regexp *prog, char *stringarg, register char *strend,
+Perl_pregexec(pTHX_ REGEXP * const prog, char* stringarg, register char *strend,
char *strbeg, I32 minend, SV *screamer, U32 nosave)
/* strend: pointer to null at end of string */
/* strbeg: real beginning of string */
deleted from the finite automaton. */
char *
-Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
- char *strend, U32 flags, re_scream_pos_data *data)
+Perl_re_intuit_start(pTHX_ REGEXP * const prog, SV *sv, char *strpos,
+ char *strend, const U32 flags, re_scream_pos_data *data)
{
dVAR;
register I32 start_shift = 0;
- regexec_flags - match a regexp against a string
*/
I32
-Perl_regexec_flags(pTHX_ register regexp *prog, char *stringarg, register char *strend,
+Perl_regexec_flags(pTHX_ REGEXP * const prog, char *stringarg, register char *strend,
char *strbeg, I32 minend, SV *sv, void *data, U32 flags)
/* strend: pointer to null at end of string */
/* strbeg: real beginning of string */
if (regtry(®info, &s))
goto got_it;
after_try:
- if (s >= end)
+ if (s > end)
goto phooey;
if (prog->extflags & RXf_USE_INTUIT) {
s = re_intuit_start(prog, sv, s + 1, strend, flags, NULL);
#undef ST
case FOLDCHAR:
n = ARG(scan);
- if (nextchr == (I32)n) {
- locinput += UTF8SKIP(locinput);
- } else {
- /* This malarky is to handle LATIN SMALL LETTER SHARP S
- properly. Sigh */
- if (0xDF==n && (UTF||do_utf8) &&
- toLOWER(locinput[0])=='s' && toLOWER(locinput[1])=='s')
- {
- locinput += 2;
- } else if (do_utf8) {
- U8 tmpbuf1[UTF8_MAXBYTES_CASE+1];
- STRLEN tmplen1;
- U8 tmpbuf2[UTF8_MAXBYTES_CASE+1];
- STRLEN tmplen2;
- to_uni_fold(n, tmpbuf1, &tmplen1);
- to_utf8_fold((U8*)locinput, tmpbuf2, &tmplen2);
- if (tmplen1!=tmplen2
- || !strnEQ((char *)tmpbuf1,(char *)tmpbuf2,tmplen1))
+ if ( n == (U32)what_len_TRICKYFOLD(locinput,do_utf8,ln) ) {
+ locinput += ln;
+ } else if ( 0xDF == n && !do_utf8 && !UTF ) {
+ sayNO;
+ } else {
+ U8 folded[UTF8_MAXBYTES_CASE+1];
+ STRLEN foldlen;
+ const char * const l = locinput;
+ char *e = PL_regeol;
+ to_uni_fold(n, folded, &foldlen);
+
+ if (ibcmp_utf8((const char*) folded, 0, foldlen, 1,
+ l, &e, 0, do_utf8)) {
sayNO;
- else
- locinput += UTF8SKIP(locinput);
- } else
- sayNO;
+ }
+ locinput = e;
}
nextchr = UCHARAT(locinput);
break;