SV * enc;
} PerlIOEncode;
+SV *
+PerlIOEncode_getarg(PerlIO *f)
+{
+ PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
+ SV *sv = &PL_sv_undef;
+ if (e->enc)
+ {
+ dSP;
+ ENTER;
+ SAVETMPS;
+ PUSHMARK(sp);
+ XPUSHs(e->enc);
+ PUTBACK;
+ if (perl_call_method("name",G_SCALAR) == 1)
+ {
+ SPAGAIN;
+ sv = newSVsv(POPs);
+ PUTBACK;
+ }
+ }
+ return sv;
+}
IV
-PerlIOEncode_pushed(PerlIO *f, const char *mode,const char *arg,STRLEN len)
+PerlIOEncode_pushed(PerlIO *f, const char *mode, SV *arg)
{
PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
dTHX;
dSP;
IV code;
- code = PerlIOBuf_pushed(f,mode,Nullch,0);
+ code = PerlIOBuf_pushed(f,mode,Nullsv);
ENTER;
SAVETMPS;
PUSHMARK(sp);
- XPUSHs(sv_2mortal(newSVpvn(arg,len)));
+ XPUSHs(arg);
PUTBACK;
if (perl_call_pv("Encode::find_encoding",G_SCALAR) != 1)
{
{
e->enc = Nullsv;
errno = EINVAL;
- Perl_warner(aTHX_ WARN_IO, "Cannot find encoding \"%.*s\"", (int) len, arg);
+ Perl_warner(aTHX_ WARN_IO, "Cannot find encoding \"%"SVf"\"", arg);
return -1;
}
SvREFCNT_inc(e->enc);
{
PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
IV code = 0;
- dTHX;
- if (e->bufsv && (PerlIOBase(f)->flags & (PERLIO_F_RDBUF|PERLIO_F_WRBUF)))
+ if (e->bufsv && (PerlIOBase(f)->flags & (PERLIO_F_RDBUF|PERLIO_F_WRBUF))
+ &&(e->base.ptr > e->base.buf)
+ )
{
+ dTHX;
dSP;
SV *str;
char *s;
Off_t
PerlIOEncode_tell(PerlIO *f)
{
+ dTHX;
PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
/* Unfortunately the only way to get a postion is to back-translate,
the UTF8-bytes we have buf..ptr and adjust accordingly.
if ((PerlIOBase(f)->flags & PERLIO_F_RDBUF) && b->ptr < b->end)
{
Size_t count = b->end - b->ptr;
- PerlIO_push(f,&PerlIO_pending,"r",Nullch,0);
+ PerlIO_push(aTHX_ f,&PerlIO_pending,"r",Nullsv);
/* Save what we have left to read */
PerlIOSelf(f,PerlIOBuf)->bufsiz = count;
PerlIO_unread(f,b->ptr,count);
"encoding",
sizeof(PerlIOEncode),
PERLIO_K_BUFFERED,
- PerlIOBase_fileno,
- PerlIOBuf_open,
PerlIOEncode_pushed,
PerlIOEncode_popped,
+ PerlIOBuf_open,
+ PerlIOEncode_getarg,
+ PerlIOBase_fileno,
PerlIOBuf_read,
PerlIOBuf_unread,
PerlIOBuf_write,
PerlIOBase_eof,
PerlIOBase_error,
PerlIOBase_clearerr,
- PerlIOBuf_setlinebuf,
+ PerlIOBase_setlinebuf,
PerlIOEncode_get_base,
PerlIOBuf_bufsiz,
PerlIOBuf_get_ptr,
SvCUR_set(src,SvCUR(src)-slen);
}
}
+ else
+ {
+ SvCUR_set(dst,slen);
+ SvPOK_on(dst);
+ }
return dst;
}
PROTOTYPES: ENABLE
void
-Method_decode(obj,src,check = 0)
+Method_decode(obj,src,check = FALSE)
SV * obj
SV * src
-int check
+bool check
CODE:
{
encode_t *enc = INT2PTR(encode_t *, SvIV(SvRV(obj)));
}
void
-Method_encode(obj,src,check = 0)
+Method_encode(obj,src,check = FALSE)
SV * obj
SV * src
-int check
+bool check
CODE:
{
encode_t *enc = INT2PTR(encode_t *, SvIV(SvRV(obj)));
STRLEN len;
U8 *s = (U8*)SvPV(sv, len);
+ RETVAL = 0;
if (SvTRUE(check)) {
/* Must do things the slow way */
U8 *dest;
BOOT:
{
#if defined(USE_PERLIO) && !defined(USE_SFIO)
- PerlIO_define_layer(&PerlIO_encode);
+ PerlIO_define_layer(aTHX_ &PerlIO_encode);
#endif
#include "iso8859.def"
#include "EBCDIC.def"