[Encode] 1.83 + bleedperl patch released
[p5sagit/p5-mst-13.2.git] / ext / Encode / Encode.xs
index 57fc9a0..4d30914 100644 (file)
@@ -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);