No semicolons after blocks.
[p5sagit/p5-mst-13.2.git] / ext / Encode / Encode.xs
index 9806d59..886fb89 100644 (file)
@@ -1,5 +1,5 @@
 /*
- $Id: Encode.xs,v 1.29 2002/04/19 05:36:43 dankogai Exp $
+ $Id: Encode.xs,v 1.33 2002/04/22 03:43:05 dankogai Exp $
  */
 
 #define PERL_NO_GET_CONTEXT
@@ -8,6 +8,7 @@
 #include "XSUB.h"
 #define U8 U8
 #include "encode.h"
+# define PERLIO_FILENAME "PerlIO/encoding.pm"
 
 /* set 1 or more to profile.  t/encoding.t dumps core because of
    Perl_warner and PerlIO don't work well */
@@ -25,7 +26,7 @@
 UNIMPLEMENTED(_encoded_utf8_to_bytes, I32)
 UNIMPLEMENTED(_encoded_bytes_to_utf8, I32)
 
-    void
+void
 Encode_XSEncoding(pTHX_ encode_t * enc)
 {
     dSP;
@@ -122,7 +123,8 @@ encode_method(pTHX_ encode_t * enc, encpage_t * dir, SV * src,
            if (dir == enc->f_utf8) { 
                STRLEN clen;
                UV ch =
-                   utf8n_to_uvuni(s+slen, (SvCUR(src)-slen), &clen, 0);
+                   utf8n_to_uvuni(s+slen, (SvCUR(src)-slen), 
+                                  &clen, UTF8_ALLOW_ANY|UTF8_CHECK_ONLY);
                if (check & ENCODE_DIE_ON_ERR) {
                    Perl_croak(
                        aTHX_ "\"\\N{U+%" UVxf "}\" does not map to %s, %d", 
@@ -179,9 +181,9 @@ encode_method(pTHX_ encode_t * enc, encpage_t * dir, SV * src,
                }
            }
            /* settle variables when fallback */
-           dlen = SvCUR(dst); 
-           d   = (U8*)SvPVX(dst) + dlen; 
-           s   = (U8*)SvPVX(src) + sdone; 
+           d    = (U8 *)SvEND(dst);
+            dlen = SvLEN(dst) - ddone - 1;
+           s    = (U8*)SvPVX(src) + sdone; 
            slen = tlen - sdone;
            break;
 
@@ -193,8 +195,8 @@ encode_method(pTHX_ encode_t * enc, encpage_t * dir, SV * src,
        }
     }
  ENCODE_SET_SRC:
-    if (check & ~ENCODE_LEAVE_SRC){ 
-       sdone = SvCUR(src) - (slen+sdone);
+    if (check && !(check & ENCODE_LEAVE_SRC)){
+       sdone = SvCUR(src) - (slen+sdone);
        if (sdone) {
            sv_setpvn(src, (char*)s+slen, sdone);
        }
@@ -262,6 +264,32 @@ CODE:
     XSRETURN(1);
 }
 
+void
+Method_needs_lines(obj)
+SV *   obj
+CODE:
+{
+    encode_t *enc = INT2PTR(encode_t *, SvIV(SvRV(obj)));
+    ST(0) = &PL_sv_no;
+    XSRETURN(1);
+}
+
+void
+Method_perlio_ok(obj)
+SV *   obj
+CODE:
+{
+    encode_t *enc = INT2PTR(encode_t *, SvIV(SvRV(obj)));
+    if (hv_exists(get_hv("INC", 0), 
+                 PERLIO_FILENAME, strlen(PERLIO_FILENAME)))
+    {
+       ST(0) = &PL_sv_yes;
+    }else{
+       ST(0) = &PL_sv_no;
+    }
+    XSRETURN(1);
+}
+
 MODULE = Encode         PACKAGE = Encode
 
 PROTOTYPES: ENABLE