X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FEncode%2FEncode.xs;h=4d30914995b13f9154de12b7db4eaea1cedabb42;hb=b536bf570905070470ba64c88c9fb4f28bfa54f3;hp=57fc9a01d65438c71b8c4e211fe8b7b465425b5b;hpb=a7010e7fe2e8c56b69f901be3c3f0c98f71857bb;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/Encode/Encode.xs b/ext/Encode/Encode.xs index 57fc9a0..4d30914 100644 --- a/ext/Encode/Encode.xs +++ b/ext/Encode/Encode.xs @@ -1,5 +1,5 @@ /* - $Id: Encode.xs,v 1.46 2002/05/20 15:25:44 dankogai Exp dankogai $ + $Id: Encode.xs,v 1.52 2002/11/18 17:28:49 dankogai Exp dankogai $ */ #define PERL_NO_GET_CONTEXT @@ -241,7 +241,7 @@ encode_method(pTHX_ encode_t * enc, encpage_t * dir, SV * src, MODULE = Encode PACKAGE = Encode::utf8 PREFIX = Method_ void -Method_decode(obj,src,check = 0) +Method_decode_xs(obj,src,check = 0) SV * obj SV * src int check @@ -250,11 +250,11 @@ CODE: STRLEN slen; U8 *s = (U8 *) SvPV(src, slen); U8 *e = (U8 *) SvEND(src); - SV *dst = newSV(slen); + SV *dst = newSV(slen>0?slen:1); /* newSV() abhors 0 -- inaba */ SvPOK_only(dst); SvCUR_set(dst,0); if (SvUTF8(src)) { - s = utf8_to_bytes(s,&slen); + s = utf8_to_bytes(s,&slen); if (s) { SvCUR_set(src,slen); SvUTF8_off(src); @@ -276,7 +276,7 @@ CODE: sv_catpvn(dst,(char *)s,skip); s += skip; continue; - } + } else { /* starts ok but isn't "good" */ } @@ -321,7 +321,7 @@ CODE: } void -Method_encode(obj,src,check = 0) +Method_encode_xs(obj,src,check = 0) SV * obj SV * src int check @@ -330,7 +330,7 @@ CODE: STRLEN slen; U8 *s = (U8 *) SvPV(src, slen); U8 *e = (U8 *) SvEND(src); - SV *dst = newSV(slen); + SV *dst = newSV(slen>0?slen:1); /* newSV() abhors 0 -- inaba */ if (SvUTF8(src)) { /* Already encoded - trust it and just copy the octets */ sv_setpvn(dst,(char *)s,(e-s)); @@ -338,7 +338,7 @@ CODE: } else { /* Native bytes - can always encode */ - U8 *d = (U8 *) SvGROW(dst,2*slen); + U8 *d = (U8 *) SvGROW(dst, 2*slen+1); /* +1 or assertion will botch */ while (s < e) { UV uv = NATIVE_TO_UNI((UV) *s++); if (UNI_IS_INVARIANT(uv)) @@ -388,6 +388,9 @@ int check CODE: { encode_t *enc = INT2PTR(encode_t *, SvIV(SvRV(obj))); + if (SvUTF8(src)) { + sv_utf8_downgrade(src, FALSE); + } ST(0) = encode_method(aTHX_ enc, enc->t_utf8, src, check); SvUTF8_on(ST(0)); XSRETURN(1);