diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 2000-02-07 19:01:08 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 2000-02-07 19:01:08 +0000 |
commit | 234a4bc6763f850602ce9515d905ee1c14f004d4 (patch) | |
tree | 22fdd9e1e038d7b7b0e7be522495c7282350281b | |
parent | ac1fa8375ae1ea15a93ee4e83db6da329c197cd4 (diff) | |
download | perl-234a4bc6763f850602ce9515d905ee1c14f004d4.tar.gz |
stringify "\x{FFF}" to utf8 correctly; set SvUTF8 on "\x{XX}"
only when XX > 127
p4raw-id: //depot/perl@5033
-rw-r--r-- | pp_hot.c | 2 | ||||
-rw-r--r-- | toke.c | 12 |
2 files changed, 11 insertions, 3 deletions
@@ -87,6 +87,8 @@ PP(pp_stringify) char *s; s = SvPV(TOPs,len); sv_setpvn(TARG,s,len); + if (SvUTF8(TOPs) && !IN_BYTE) + SvUTF8_on(TARG); SETTARG; RETURN; } @@ -1356,18 +1356,24 @@ S_scan_const(pTHX_ char *start) ++s; if (*s == '{') { char* e = strchr(s, '}'); + UV uv; if (!e) { yyerror("Missing right brace on \\x{}"); e = s; } /* note: utf always shorter than hex */ - d = (char*)uv_to_utf8((U8*)d, - (UV)scan_hex(s + 1, e - s - 1, &len)); + uv = (UV)scan_hex(s + 1, e - s - 1, &len); + if (uv > 127) { + d = (char*)uv_to_utf8((U8*)d, uv); + has_utf = TRUE; + } + else + *d++ = (char)uv; s = e + 1; - has_utf = TRUE; } else { + /* XXX collapse this branch into the one above */ UV uv = (UV)scan_hex(s, 2, &len); if (utf && PL_lex_inwhat == OP_TRANS && utf != (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) |