Integrate mainline (for regexp stuff).
[p5sagit/p5-mst-13.2.git] / ext / Encode / Encode.xs
index 40c3dc7..cdb1965 100644 (file)
@@ -14,7 +14,7 @@
 UNIMPLEMENTED(_encoded_utf8_to_bytes, I32)
 UNIMPLEMENTED(_encoded_bytes_to_utf8, I32)
 
-#ifdef USE_PERLIO
+#if defined(USE_PERLIO) && !defined(USE_SFIO)
 /* Define an encoding "layer" in the perliol.h sense.
    The layer defined here "inherits" in an object-oriented sense from the
    "perlio" layer with its PerlIOBuf_* "methods".
@@ -60,13 +60,12 @@ PerlIOEncode_pushed(PerlIO *f, const char *mode,const char *arg,STRLEN len)
  ENTER;
  SAVETMPS;
  PUSHMARK(sp);
- XPUSHs(sv_2mortal(newSVpv("Encode",0)));
  XPUSHs(sv_2mortal(newSVpvn(arg,len)));
  PUTBACK;
- if (perl_call_method("getEncoding",G_SCALAR) != 1)
+ if (perl_call_pv("Encode::find_encoding",G_SCALAR) != 1)
   {
    /* should never happen */
-   Perl_die(aTHX_ "Encode::getEncoding did not return a value");
+   Perl_die(aTHX_ "Encode::find_encoding did not return a value");
    return -1;
   }
  SPAGAIN;
@@ -325,20 +324,24 @@ PerlIO_funcs PerlIO_encode = {
  PerlIOBuf_get_cnt,
  PerlIOBuf_set_ptrcnt,
 };
-#endif
+#endif /* encode layer */
 
 void
 Encode_Define(pTHX_ encode_t *enc)
 {
- HV *hash  = get_hv("Encode::encoding",GV_ADD|GV_ADDMULTI);
+ dSP;
  HV *stash = gv_stashpv("Encode::XS", TRUE);
  SV *sv    = sv_bless(newRV_noinc(newSViv(PTR2IV(enc))),stash);
  int i = 0;
+ PUSHMARK(sp);
+ XPUSHs(sv);
  while (enc->name[i])
   {
    const char *name = enc->name[i++];
-   hv_store(hash,name,strlen(name),SvREFCNT_inc(sv),0);
+   XPUSHs(sv_2mortal(newSVpvn(name,strlen(name))));
   }
+ PUTBACK;
+ call_pv("Encode::define_encoding",G_DISCARD);
  SvREFCNT_dec(sv);
 }
 
@@ -382,8 +385,8 @@ encode_method(pTHX_ encode_t *enc, encpage_t *dir, SV *src, int check)
           if (!check && ckWARN_d(WARN_UTF8))
            {
             STRLEN clen;
-            UV ch = utf8_to_uv(s+slen,(SvCUR(src)-slen),&clen,0);
-            Perl_warner(aTHX_ WARN_UTF8, "\"\\x{%"UVxf"}\" does not map to %s", ch, enc->name[0]);
+            UV ch = utf8n_to_uvuni(s+slen,(SvCUR(src)-slen),&clen,0);
+            Perl_warner(aTHX_ WARN_UTF8, "\"\\N{U+%"UVxf"}\" does not map to %s", ch, enc->name[0]);
             /* FIXME: Skip over the character, copy in replacement and continue
              * but that is messy so for now just fail.
              */
@@ -637,7 +640,7 @@ _utf8_off(sv)
 
 BOOT:
 {
-#ifdef USE_PERLIO
+#if defined(USE_PERLIO) && !defined(USE_SFIO)
  PerlIO_define_layer(&PerlIO_encode);
 #endif
 #include "iso8859.def"