summaryrefslogtreecommitdiff
path: root/sv.c
diff options
context:
space:
mode:
authorNick Ing-Simmons <nik@tiuk.ti.com>2001-03-12 21:00:13 +0000
committerNick Ing-Simmons <nik@tiuk.ti.com>2001-03-12 21:00:13 +0000
commit03cfe0aec1e921aae8754172fe1982455c07ce69 (patch)
tree91058c1d54edc3fdd5d8a8cc22fe8b3d7e82e73c /sv.c
parent5e12f4fbf2391bc262df1da61c1745c66dc76d71 (diff)
downloadperl-03cfe0aec1e921aae8754172fe1982455c07ce69.tar.gz
#ifdef'ed out code for 'USE_BYTES_DOWNGRADES' case.
p4raw-id: //depot/perlio@9110
Diffstat (limited to 'sv.c')
-rw-r--r--sv.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/sv.c b/sv.c
index 0a2c2c07b9..5976bd393e 100644
--- a/sv.c
+++ b/sv.c
@@ -3013,15 +3013,37 @@ Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
{
if (SvPOK(sv) && SvUTF8(sv)) {
if (SvCUR(sv)) {
- char *s;
+ U8 *s;
STRLEN len;
if (SvREADONLY(sv) && SvFAKE(sv))
sv_force_normal(sv);
- s = SvPV(sv, len);
- if (!utf8_to_bytes((U8*)s, &len)) {
+ s = (U8 *) SvPV(sv, len);
+ if (!utf8_to_bytes(s, &len)) {
if (fail_ok)
return FALSE;
+#ifdef USE_BYTES_DOWNGRADES
+ else if (IN_BYTE) {
+ U8 *d = s;
+ U8 *e = (U8 *) SvEND(sv);
+ int first = 1;
+ while (s < e) {
+ UV ch = utf8n_to_uvchr(s,(e-s),&len,0);
+ if (first && ch > 255) {
+ if (PL_op)
+ Perl_warner(aTHX_ WARN_UTF8, "Wide character in byte %s",
+ PL_op_desc[PL_op->op_type]);
+ else
+ Perl_warner(aTHX_ WARN_UTF8, "Wide character in byte");
+ first = 0;
+ }
+ *d++ = ch;
+ s += len;
+ }
+ *d = '\0';
+ len = (d - (U8 *) SvPVX(sv));
+ }
+#endif
else {
if (PL_op)
Perl_croak(aTHX_ "Wide character in %s",