if (CopLINE(cop))
Perl_sv_catpvf(aTHX_ sv, " at %s line %"IVdf,
- CopFILE(cop), (IV)CopLINE(cop));
+ OutCopFILE(cop), (IV)CopLINE(cop));
if (GvIO(PL_last_in_gv) && IoLINES(GvIOp(PL_last_in_gv))) {
bool line_mode = (RsSIMPLE(PL_rs) &&
SvCUR(PL_rs) == 1 && *SvPVX(PL_rs) == '\n');
CV *cv;
SV *msv;
STRLEN msglen;
+ IO *io;
+ MAGIC *mg;
msv = vmess(pat, args);
message = SvPV(msv, msglen);
return;
}
}
+
+ /* if STDERR is tied, use it instead */
+ if (PL_stderrgv && (io = GvIOp(PL_stderrgv))
+ && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar))) {
+ dSP; ENTER;
+ PUSHMARK(SP);
+ XPUSHs(SvTIED_obj((SV*)io, mg));
+ XPUSHs(sv_2mortal(newSVpvn(message, msglen)));
+ PUTBACK;
+ call_method("PRINT", G_SCALAR);
+ LEAVE;
+ return;
+ }
+
{
PerlIO *serr = Perl_error_log;
for (;;) {
rev = 0;
{
- /* this is atoi() that tolerates underscores */
- char *end = pos;
- UV mult = 1;
- if ( *(s-1) == '_') {
- mult = 10;
- }
- while (--end >= s) {
- UV orev;
- orev = rev;
- rev += (*end - '0') * mult;
- mult *= 10;
- if (orev > rev && ckWARN_d(WARN_OVERFLOW))
- Perl_warner(aTHX_ WARN_OVERFLOW,
- "Integer overflow in decimal number");
- }
+ /* this is atoi() that tolerates underscores */
+ char *end = pos;
+ UV mult = 1;
+ if ( *(s-1) == '_') {
+ mult = 10;
+ }
+ while (--end >= s) {
+ UV orev;
+ orev = rev;
+ rev += (*end - '0') * mult;
+ mult *= 10;
+ if (orev > rev && ckWARN_d(WARN_OVERFLOW))
+ Perl_warner(aTHX_ WARN_OVERFLOW,
+ "Integer overflow in decimal number");
+ }
}
+#ifdef EBCDIC
+ if (rev > 0x7FFFFFFF)
+ Perl_croak(aTHX "In EBCDIC the v-string components cannot exceed 2147483647");
+#endif
/* Append native character for the rev point */
tmpend = uvchr_to_utf8(tmpbuf, rev);
sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
- SvUTF8_on(sv);
+ SvUTF8_on(sv);
if ( (*pos == '.' || *pos == '_') && isDIGIT(pos[1]))
- s = ++pos;
+ s = ++pos;
else {
- s = pos;
- break;
+ s = pos;
+ break;
}
while (isDIGIT(*pos) )
- pos++;
+ pos++;
}
SvPOK_on(sv);
SvREADONLY_on(sv);
{
}
+/*
+=for apidoc memcmp_byte_utf8
+
+Similar to memcmp(), but the first string is with bytes, the second
+with utf8. Takes into account that the lengths may be different.
+=cut
+*/
+int
+Perl_memcmp_byte_utf8(pTHX_ char *sb, STRLEN lbyte, char *su, STRLEN lutf)
+{
+ U8 *sbyte = (U8*)sb;
+ U8 *sutf = (U8*)su;
+ U8 *ebyte = sbyte + lbyte;
+ U8 *eutf = sutf + lutf;
+
+ while (sbyte < ebyte) {
+ if (sutf >= eutf)
+ return 1; /* utf one shorter */
+ if (NATIVE_IS_INVARIANT(*sbyte)) {
+ if (*sbyte != *sutf)
+ return *sbyte - *sutf;
+ sbyte++; sutf++; /* CONTINUE */
+ } else if ((*sutf & UTF_CONTINUATION_MASK) ==
+ (*sbyte >> UTF_ACCUMULATION_SHIFT)) {
+ if ((sutf[1] & UTF_CONTINUATION_MASK) !=
+ (*sbyte & UTF_CONTINUATION_MASK))
+ return (*sbyte & UTF_CONTINUATION_MASK) -
+ (*sutf & UTF_CONTINUATION_MASK);
+ sbyte++, sutf += 2; /* CONTINUE */
+ } else
+ return (*sbyte >> UTF_ACCUMULATION_SHIFT) -
+ (*sutf & UTF_CONTINUATION_MASK);
+ }
+ if (sutf >= eutf)
+ return 0;
+ return -1; /* byte one shorter */
+}