5 #define UNIMPLEMENTED(x,y) y x (SV *sv, char *encoding) { \
6 Perl_croak(aTHX_ "panic_unimplemented"); \
7 return (y)0; /* fool picky compilers */ \
9 UNIMPLEMENTED(_encoded_utf8_to_bytes, I32)
10 UNIMPLEMENTED(_encoded_bytes_to_utf8, I32)
17 PerlIOBuf base; /* PerlIOBuf stuff */
24 PerlIOEncode_pushed(PerlIO *f, const char *mode,const char *arg,STRLEN len)
26 PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
30 code = PerlIOBuf_pushed(f,mode,Nullch,0);
34 XPUSHs(sv_2mortal(newSVpv("Encode",0)));
35 XPUSHs(sv_2mortal(newSVpvn(arg,len)));
37 if (perl_call_method("getEncoding",G_SCALAR) != 1)
47 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
52 PerlIOEncode_popped(PerlIO *f)
54 PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
63 SvREFCNT_dec(e->bufsv);
70 PerlIOEncode_get_base(PerlIO *f)
72 PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
75 e->base.bufsiz = 1024;
78 e->bufsv = newSV(e->base.bufsiz);
79 sv_setpvn(e->bufsv,"",0);
81 e->base.buf = SvPVX(e->bufsv);
83 e->base.ptr = e->base.buf;
85 e->base.end = e->base.buf;
86 if (e->base.ptr < e->base.buf || e->base.ptr > e->base.buf+SvLEN(e->bufsv))
88 Perl_warn(aTHX_ " ptr %p(%p)%p",
89 e->base.buf,e->base.ptr,e->base.buf+SvLEN(e->bufsv));
92 if (SvLEN(e->bufsv) < e->base.bufsiz)
94 SSize_t poff = e->base.ptr - e->base.buf;
95 SSize_t eoff = e->base.end - e->base.buf;
96 e->base.buf = SvGROW(e->bufsv,e->base.bufsiz);
97 e->base.ptr = e->base.buf + poff;
98 e->base.end = e->base.buf + eoff;
100 if (e->base.ptr < e->base.buf || e->base.ptr > e->base.buf+SvLEN(e->bufsv))
102 Perl_warn(aTHX_ " ptr %p(%p)%p",
103 e->base.buf,e->base.ptr,e->base.buf+SvLEN(e->bufsv));
116 PerlIOEncode_fill(PerlIO *f)
118 PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
123 code = PerlIOBuf_fill(f);
127 SvCUR_set(e->bufsv, e->base.end - e->base.buf);
128 SvUTF8_off(e->bufsv);
136 if (perl_call_method("toUnicode",G_SCALAR) != 1)
141 sv_setsv(e->bufsv,uni);
142 sv_utf8_upgrade(e->bufsv);
143 e->base.buf = SvPVX(e->bufsv);
144 e->base.end = e->base.buf+SvCUR(e->bufsv);
145 e->base.ptr = e->base.buf;
153 PerlIOEncode_flush(PerlIO *f)
155 PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
158 if (e->bufsv && (PerlIOBase(f)->flags & (PERLIO_F_RDBUF|PERLIO_F_WRBUF)))
168 SvCUR_set(e->bufsv, e->base.end - e->base.buf);
173 if (perl_call_method("fromUnicode",G_SCALAR) != 1)
178 sv_setsv(e->bufsv,str);
179 SvUTF8_off(e->bufsv);
180 e->base.buf = SvPVX(e->bufsv);
181 e->base.ptr = e->base.buf+SvCUR(e->bufsv);
184 if (PerlIOBuf_flush(f) != 0)
191 PerlIOEncode_close(PerlIO *f)
193 PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
194 IV code = PerlIOBase_close(f);
198 SvREFCNT_dec(e->bufsv);
204 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
208 PerlIO_funcs PerlIO_encode = {
210 sizeof(PerlIOEncode),
229 PerlIOBuf_setlinebuf,
230 PerlIOEncode_get_base,
234 PerlIOBuf_set_ptrcnt,
238 void call_failure (SV *routine, U8* done, U8* dest, U8* orig) {}
240 MODULE = Encode PACKAGE = Encode
245 _bytes_to_utf8(sv, ...)
249 SV * encoding = items == 2 ? ST(1) : Nullsv;
252 RETVAL = _encoded_bytes_to_utf8(sv, SvPV_nolen(encoding));
255 U8* s = (U8*)SvPV(sv, len);
258 converted = bytes_to_utf8(s, &len); /* This allocs */
259 sv_setpvn(sv, (char *)converted, len);
260 SvUTF8_on(sv); /* XXX Should we? */
261 Safefree(converted); /* ... so free it */
269 _utf8_to_bytes(sv, ...)
273 SV * to = items > 1 ? ST(1) : Nullsv;
274 SV * check = items > 2 ? ST(2) : Nullsv;
277 RETVAL = _encoded_utf8_to_bytes(sv, SvPV_nolen(to));
280 U8 *s = (U8*)SvPV(sv, len);
283 /* Must do things the slow way */
285 U8 *src = (U8*)savepv((char *)s); /* We need a copy to pass to check() */
288 New(83, dest, len, U8); /* I think */
297 /* Have to do it all ourselves because of error routine,
301 if (!(uv & 0x20)) { ulen = 2; uv &= 0x1f; }
302 else if (!(uv & 0x10)) { ulen = 3; uv &= 0x0f; }
303 else if (!(uv & 0x08)) { ulen = 4; uv &= 0x07; }
304 else if (!(uv & 0x04)) { ulen = 5; uv &= 0x03; }
305 else if (!(uv & 0x02)) { ulen = 6; uv &= 0x01; }
306 else if (!(uv & 0x01)) { ulen = 7; uv = 0; }
307 else { ulen = 13; uv = 0; }
309 /* Note change to utf8.c variable naming, for variety */
311 if ((*s & 0xc0) != 0x80)
315 uv = (uv << 6) | (*s++ & 0x3f);
319 call_failure(check, s, dest, src);
320 /* Now what happens? */
326 RETVAL = (utf8_to_bytes(s, &len) ? len : 0);
333 _chars_to_utf8(sv, from, ...)
338 SV * check = items == 3 ? ST(2) : Nullsv;
339 RETVAL = &PL_sv_undef;
345 _utf8_to_chars(sv, to, ...)
350 SV * check = items == 3 ? ST(2) : Nullsv;
351 RETVAL = &PL_sv_undef;
357 _utf8_to_chars_check(sv, ...)
361 SV * check = items == 2 ? ST(1) : Nullsv;
362 RETVAL = &PL_sv_undef;
368 _bytes_to_chars(sv, from, ...)
373 SV * check = items == 3 ? ST(2) : Nullsv;
374 RETVAL = &PL_sv_undef;
380 _chars_to_bytes(sv, to, ...)
385 SV * check = items == 3 ? ST(2) : Nullsv;
386 RETVAL = &PL_sv_undef;
392 _from_to(sv, from, to, ...)
398 SV * check = items == 4 ? ST(3) : Nullsv;
399 RETVAL = &PL_sv_undef;
409 SV * check = items == 2 ? ST(1) : Nullsv;
411 RETVAL = SvUTF8(sv) ? 1 : 0;
414 !is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
429 SV *rsv = newSViv(SvUTF8(sv));
433 RETVAL = &PL_sv_undef;
445 SV *rsv = newSViv(SvUTF8(sv));
449 RETVAL = &PL_sv_undef;
456 _utf_to_utf(sv, from, to, ...)
462 SV * check = items == 4 ? ST(3) : Nullsv;
463 RETVAL = &PL_sv_undef;
471 PerlIO_define_layer(&PerlIO_encode);