summaryrefslogtreecommitdiff
path: root/ext/Encode/Encode.xs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/Encode/Encode.xs')
-rw-r--r--ext/Encode/Encode.xs44
1 files changed, 18 insertions, 26 deletions
diff --git a/ext/Encode/Encode.xs b/ext/Encode/Encode.xs
index 77d53af2d1..3747b6d921 100644
--- a/ext/Encode/Encode.xs
+++ b/ext/Encode/Encode.xs
@@ -1,5 +1,5 @@
/*
- $Id: Encode.xs,v 2.0 2004/05/16 20:55:15 dankogai Exp $
+ $Id: Encode.xs,v 2.1 2004/10/22 19:35:52 dankogai Exp $
*/
#define PERL_NO_GET_CONTEXT
@@ -157,24 +157,15 @@ encode_method(pTHX_ encode_t * enc, encpage_t * dir, SV * src,
if (check & ENCODE_RETURN_ON_ERR){
goto ENCODE_SET_SRC;
}
- if (check & ENCODE_PERLQQ){
- SV* perlqq =
- sv_2mortal(newSVpvf("\\x{%04"UVxf"}", (UV)ch));
+ if (check & (ENCODE_PERLQQ|ENCODE_HTMLCREF|ENCODE_XMLCREF)){
+ SV* subchar =
+ newSVpvf(check & ENCODE_PERLQQ ? "\\x{%04"UVxf"}" :
+ check & ENCODE_HTMLCREF ? "&#%" UVuf ";" :
+ "&#x%" UVxf ";", (UV)ch);
sdone += slen + clen;
- ddone += dlen + SvCUR(perlqq);
- sv_catsv(dst, perlqq);
- }else if (check & ENCODE_HTMLCREF){
- SV* htmlcref =
- sv_2mortal(newSVpvf("&#%" UVuf ";", (UV)ch));
- sdone += slen + clen;
- ddone += dlen + SvCUR(htmlcref);
- sv_catsv(dst, htmlcref);
- }else if (check & ENCODE_XMLCREF){
- SV* xmlcref =
- sv_2mortal(newSVpvf("&#x%" UVxf ";", (UV)ch));
- sdone += slen + clen;
- ddone += dlen + SvCUR(xmlcref);
- sv_catsv(dst, xmlcref);
+ ddone += dlen + SvCUR(subchar);
+ sv_catsv(dst, subchar);
+ SvREFCNT_dec(subchar);
} else {
/* fallback char */
sdone += slen + clen;
@@ -200,11 +191,11 @@ encode_method(pTHX_ encode_t * enc, encpage_t * dir, SV * src,
}
if (check &
(ENCODE_PERLQQ|ENCODE_HTMLCREF|ENCODE_XMLCREF)){
- SV* perlqq =
- sv_2mortal(newSVpvf("\\x%02" UVXf, (UV)s[slen]));
+ SV* subchar = newSVpvf("\\x%02" UVXf, (UV)s[slen]);
sdone += slen + 1;
- ddone += dlen + SvCUR(perlqq);
- sv_catsv(dst, perlqq);
+ ddone += dlen + SvCUR(subchar);
+ sv_catsv(dst, subchar);
+ SvREFCNT_dec(subchar);
} else {
sdone += slen + 1;
ddone += dlen + strlen(FBCHAR_UTF8);
@@ -297,7 +288,7 @@ CODE:
U8 skip = UTF8SKIP(s);
if ((s + skip) > e) {
/* Partial character - done */
- break;
+ goto decode_utf8_fallback;
}
else if (is_utf8_char(s)) {
/* Whole char is good */
@@ -313,6 +304,7 @@ CODE:
/* Invalid start byte */
}
/* If we get here there is something wrong with alleged UTF-8 */
+ decode_utf8_fallback:
if (check & ENCODE_DIE_ON_ERR){
Perl_croak(aTHX_ ERR_DECODE_NOMAP, "utf8", (UV)*s);
XSRETURN(0);
@@ -325,9 +317,9 @@ CODE:
break;
}
if (check & (ENCODE_PERLQQ|ENCODE_HTMLCREF|ENCODE_XMLCREF)){
- SV* perlqq = newSVpvf("\\x%02" UVXf, (UV)*s);
- sv_catsv(dst, perlqq);
- SvREFCNT_dec(perlqq);
+ SV* subchar = newSVpvf("\\x%02" UVXf, (UV)*s);
+ sv_catsv(dst, subchar);
+ SvREFCNT_dec(subchar);
} else {
sv_catpv(dst, FBCHAR_UTF8);
}