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".
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)
- return -1;
+ if (perl_call_pv("Encode::find_encoding",G_SCALAR) != 1)
+ {
+ /* should never happen */
+ Perl_die(aTHX_ "Encode::find_encoding did not return a value");
+ return -1;
+ }
SPAGAIN;
e->enc = POPs;
PUTBACK;
if (!SvROK(e->enc))
- return -1;
+ {
+ e->enc = Nullsv;
+ errno = EINVAL;
+ Perl_warner(aTHX_ WARN_IO, "Cannot find encoding \"%.*s\"", (int) len, arg);
+ return -1;
+ }
SvREFCNT_inc(e->enc);
FREETMPS;
LEAVE;
XPUSHs(e->bufsv);
XPUSHs(&PL_sv_yes);
PUTBACK;
- if (perl_call_method("toUnicode",G_SCALAR) != 1)
+ if (perl_call_method("decode",G_SCALAR) != 1)
code = -1;
SPAGAIN;
uni = POPs;
XPUSHs(e->bufsv);
XPUSHs(&PL_sv_yes);
PUTBACK;
- if (perl_call_method("fromUnicode",G_SCALAR) != 1)
+ if (perl_call_method("encode",G_SCALAR) != 1)
code = -1;
SPAGAIN;
str = POPs;
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);
- hv_store(hash,enc->name,strlen(enc->name),sv,0);
+ int i = 0;
+ PUSHMARK(sp);
+ XPUSHs(sv);
+ while (enc->name[i])
+ {
+ const char *name = enc->name[i++];
+ XPUSHs(sv_2mortal(newSVpvn(name,strlen(name))));
+ }
+ PUTBACK;
+ call_pv("Encode::define_encoding",G_DISCARD);
+ SvREFCNT_dec(sv);
}
void call_failure (SV *routine, U8* done, U8* dest, U8* orig) {}
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{%x}\" does not map to %s", ch, enc->name);
+ 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.
*/
{
/* UTF-8 is supposed to be "Universal" so should not happen */
Perl_croak(aTHX_ "%s '%.*s' does not map to UTF-8",
- enc->name, (SvCUR(src)-slen),s+slen);
+ enc->name[0], (int)(SvCUR(src)-slen),s+slen);
}
break;
if (!check && ckWARN_d(WARN_UTF8))
{
Perl_warner(aTHX_ WARN_UTF8, "Partial %s character",
- (dir == enc->f_utf8) ? "UTF-8" : enc->name);
+ (dir == enc->f_utf8) ? "UTF-8" : enc->name[0]);
}
return &PL_sv_undef;
default:
Perl_croak(aTHX_ "Unexpected code %d converting %s %s",
- code, (dir == enc->f_utf8) ? "to" : "from",enc->name);
+ code, (dir == enc->f_utf8) ? "to" : "from",enc->name[0]);
return &PL_sv_undef;
}
}
sv_utf8_decode(sv)
SV * sv
-void
+STRLEN
sv_utf8_upgrade(sv)
SV * sv
SV * sv
bool failok
-MODULE = Encode PACKAGE = Encode::XS PREFIX = Encode_
+MODULE = Encode PACKAGE = Encode::XS PREFIX = Method_
PROTOTYPES: ENABLE
void
-Encode_toUnicode(obj,src,check = 0)
+Method_decode(obj,src,check = 0)
SV * obj
SV * src
int check
}
void
-Encode_fromUnicode(obj,src,check = 0)
+Method_encode(obj,src,check = 0)
SV * obj
SV * src
int check
OUTPUT:
RETVAL
-SV *
-_chars_to_utf8(sv, from, ...)
- SV * sv
- SV * from
- CODE:
- {
- SV * check = items == 3 ? ST(2) : Nullsv;
- RETVAL = &PL_sv_undef;
- }
- OUTPUT:
- RETVAL
-
-SV *
-_utf8_to_chars(sv, to, ...)
- SV * sv
- SV * to
- CODE:
- {
- SV * check = items == 3 ? ST(2) : Nullsv;
- RETVAL = &PL_sv_undef;
- }
- OUTPUT:
- RETVAL
-
-SV *
-_utf8_to_chars_check(sv, ...)
- SV * sv
- CODE:
- {
- SV * check = items == 2 ? ST(1) : Nullsv;
- RETVAL = &PL_sv_undef;
- }
- OUTPUT:
- RETVAL
-
-SV *
-_bytes_to_chars(sv, from, ...)
- SV * sv
- SV * from
- CODE:
- {
- SV * check = items == 3 ? ST(2) : Nullsv;
- RETVAL = &PL_sv_undef;
- }
- OUTPUT:
- RETVAL
-
-SV *
-_chars_to_bytes(sv, to, ...)
- SV * sv
- SV * to
- CODE:
- {
- SV * check = items == 3 ? ST(2) : Nullsv;
- RETVAL = &PL_sv_undef;
- }
- OUTPUT:
- RETVAL
-
-SV *
-_from_to(sv, from, to, ...)
- SV * sv
- SV * from
- SV * to
- CODE:
- {
- SV * check = items == 4 ? ST(3) : Nullsv;
- RETVAL = &PL_sv_undef;
- }
- OUTPUT:
- RETVAL
-
bool
-_is_utf8(sv, ...)
- SV * sv
+is_utf8(sv, check = FALSE)
+SV * sv
+bool check
CODE:
{
- SV * check = items == 2 ? ST(1) : Nullsv;
if (SvPOK(sv)) {
- RETVAL = SvUTF8(sv) ? 1 : 0;
+ RETVAL = SvUTF8(sv) ? TRUE : FALSE;
if (RETVAL &&
- SvTRUE(check) &&
+ check &&
!is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
RETVAL = FALSE;
} else {
RETVAL
SV *
-_on_utf8(sv)
+_utf8_on(sv)
SV * sv
CODE:
{
RETVAL
SV *
-_off_utf8(sv)
+_utf8_off(sv)
SV * sv
CODE:
{
OUTPUT:
RETVAL
-SV *
-_utf_to_utf(sv, from, to, ...)
- SV * sv
- SV * from
- SV * to
- CODE:
- {
- SV * check = items == 4 ? ST(3) : Nullsv;
- RETVAL = &PL_sv_undef;
- }
- OUTPUT:
- RETVAL
-
BOOT:
{
-#ifdef USE_PERLIO
+#if defined(USE_PERLIO) && !defined(USE_SFIO)
PerlIO_define_layer(&PerlIO_encode);
#endif
#include "iso8859.def"