#define HOPc(pos,off) ((char*)HOP(pos,off))
#define HOPMAYBEc(pos,off) ((char*)HOPMAYBE(pos,off))
+#define HOPBACK(pos, off) ( \
+ (UTF && DO_UTF8(PL_reg_sv)) \
+ ? reghopmaybe((U8*)pos, -off) \
+ : (pos - off >= PL_bostr) \
+ ? (U8*)(pos - off) \
+ : (U8*)NULL \
+)
+#define HOPBACKc(pos, off) (char*)HOPBACK(pos, off)
+
#define reghop3_c(pos,off,lim) ((char*)reghop3((U8*)pos, off, (U8*)lim))
#define reghopmaybe3_c(pos,off,lim) ((char*)reghopmaybe3((U8*)pos, off, (U8*)lim))
#define HOP3(pos,off,lim) (DO_UTF8(PL_reg_sv) ? reghop3((U8*)pos, off, (U8*)lim) : (U8*)(pos + off))
int paren_elems_to_push = (PL_regsize - parenfloor) * REGCP_PAREN_ELEMS;
int p;
+ if (paren_elems_to_push < 0)
+ Perl_croak(aTHX_ "panic: paren_elems_to_push < 0");
+
#define REGCP_OTHER_ELEMS 5
SSCHECK(paren_elems_to_push + REGCP_OTHER_ELEMS);
for (p = PL_regsize; p > parenfloor; p--) {
/* FALL THROUGH */
case BOUND:
if (do_utf8) {
- if (s == startpos)
+ if (s == PL_bostr)
tmp = '\n';
else {
U8 *r = reghop3((U8*)s, -1, (U8*)startpos);
}
}
else {
- tmp = (s != startpos) ? UCHARAT(s - 1) : '\n';
+ tmp = (s != PL_bostr) ? UCHARAT(s - 1) : '\n';
tmp = ((OP(c) == BOUND ? isALNUM(tmp) : isALNUM_LC(tmp)) != 0);
while (s < strend) {
if (tmp ==
/* FALL THROUGH */
case NBOUND:
if (do_utf8) {
- if (s == startpos)
+ if (s == PL_bostr)
tmp = '\n';
else {
U8 *r = reghop3((U8*)s, -1, (U8*)startpos);
}
}
else {
- tmp = (s != startpos) ? UCHARAT(s - 1) : '\n';
+ tmp = (s != PL_bostr) ? UCHARAT(s - 1) : '\n';
tmp = ((OP(c) == NBOUND ?
isALNUM(tmp) : isALNUM_LC(tmp)) != 0);
while (s < strend) {
if (strend - startpos < minlen) goto phooey;
}
- if (startpos == strbeg) /* is ^ valid at stringarg? */
- PL_regprev = '\n';
- else {
- if (prog->reganch & ROPT_UTF8 && do_utf8) {
- U8 *s = reghop3((U8*)stringarg, -1, (U8*)strbeg);
- PL_regprev = utf8n_to_uvchr(s, (U8*)stringarg - s, NULL, 0);
- }
- else
- PL_regprev = (U32)stringarg[-1];
- if (!PL_multiline && PL_regprev == '\n')
- PL_regprev = '\0'; /* force ^ to NOT match */
- }
-
/* Check validity of program. */
if (UCHARAT(prog->program) != REG_MAGIC) {
Perl_croak(aTHX_ "corrupted regexp program");
PL_reg_ganch = startpos;
else if (sv && SvTYPE(sv) >= SVt_PVMG
&& SvMAGIC(sv)
- && (mg = mg_find(sv, 'g')) && mg->mg_len >= 0) {
+ && (mg = mg_find(sv, PERL_MAGIC_regex_global))
+ && mg->mg_len >= 0) {
PL_reg_ganch = strbeg + mg->mg_len; /* Defined pos() */
if (prog->reganch & ROPT_ANCH_GPOS) {
if (s > PL_reg_ganch)
}
if (!(SvTYPE(PL_reg_sv) >= SVt_PVMG && SvMAGIC(PL_reg_sv)
- && (mg = mg_find(PL_reg_sv, 'g')))) {
+ && (mg = mg_find(PL_reg_sv, PERL_MAGIC_regex_global)))) {
/* prepare for quick setting of pos */
- sv_magic(PL_reg_sv, (SV*)0, 'g', Nullch, 0);
- mg = mg_find(PL_reg_sv, 'g');
+ sv_magic(PL_reg_sv, (SV*)0,
+ PERL_MAGIC_regex_global, Nullch, 0);
+ mg = mg_find(PL_reg_sv, PERL_MAGIC_regex_global);
mg->mg_len = -1;
}
PL_reg_magic = mg;
switch (OP(scan)) {
case BOL:
- if (locinput == PL_bostr
- ? PL_regprev == '\n'
- : (PL_multiline &&
- (nextchr || locinput < PL_regeol) && locinput[-1] == '\n') )
+ if (locinput == PL_bostr || (PL_multiline &&
+ (nextchr || locinput < PL_regeol) && locinput[-1] == '\n') )
{
/* regtill = regbol; */
break;
}
sayNO;
case MBOL:
- if (locinput == PL_bostr
- ? PL_regprev == '\n'
- : ((nextchr || locinput < PL_regeol) && locinput[-1] == '\n') )
+ if (locinput == PL_bostr ||
+ ((nextchr || locinput < PL_regeol) && locinput[-1] == '\n'))
{
break;
}
if (!nextchr)
sayNO;
if (do_utf8) {
+ LOAD_UTF8_CHARCLASS(alnum,"a");
if (!(OP(scan) == ALNUM
? swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8)
: isALNUM_LC_utf8((U8*)locinput)))
case NBOUND:
/* was last char in word? */
if (do_utf8) {
- if (locinput == PL_regbol)
- ln = PL_regprev;
+ if (locinput == PL_bostr)
+ ln = '\n';
else {
U8 *r = reghop((U8*)locinput, -1);
}
}
else {
- ln = (locinput != PL_regbol) ?
- UCHARAT(locinput - 1) : PL_regprev;
+ ln = (locinput != PL_bostr) ?
+ UCHARAT(locinput - 1) : '\n';
if (OP(scan) == BOUND || OP(scan) == NBOUND) {
ln = isALNUM(ln);
n = isALNUM(nextchr);
SV *sv = SvROK(ret) ? SvRV(ret) : ret;
if(SvMAGICAL(sv))
- mg = mg_find(sv, 'r');
+ mg = mg_find(sv, PERL_MAGIC_qr);
}
if (mg) {
re = (regexp *)mg->mg_obj;
re = CALLREGCOMP(aTHX_ t, t + len, &pm);
if (!(SvFLAGS(ret)
& (SVs_TEMP | SVs_PADTMP | SVf_READONLY)))
- sv_magic(ret,(SV*)ReREFCNT_inc(re),'r',0,0);
+ sv_magic(ret,(SV*)ReREFCNT_inc(re),
+ PERL_MAGIC_qr,0,0);
PL_regprecomp = oprecomp;
PL_regsize = osize;
PL_regnpar = onpar;
case UNLESSM:
n = 0;
if (scan->flags) {
- if (UTF) { /* XXXX This is absolutely
- broken, we read before
- start of string. */
- s = HOPMAYBEc(locinput, -scan->flags);
- if (!s)
- goto say_yes;
- PL_reginput = s;
- }
- else {
- if (locinput < PL_bostr + scan->flags)
- goto say_yes;
- PL_reginput = locinput - scan->flags;
- goto do_ifmatch;
- }
+ s = HOPBACKc(locinput, scan->flags);
+ if (!s)
+ goto say_yes;
+ PL_reginput = s;
}
else
PL_reginput = locinput;
case IFMATCH:
n = 1;
if (scan->flags) {
- if (UTF) { /* XXXX This is absolutely
- broken, we read before
- start of string. */
- s = HOPMAYBEc(locinput, -scan->flags);
- if (!s || s < PL_bostr)
- goto say_no;
- PL_reginput = s;
- }
- else {
- if (locinput < PL_bostr + scan->flags)
- goto say_no;
- PL_reginput = locinput - scan->flags;
- goto do_ifmatch;
- }
+ s = HOPBACKc(locinput, scan->flags);
+ if (!s)
+ goto say_no;
+ PL_reginput = s;
}
else
PL_reginput = locinput;