} PerlIOEncode;
SV *
-PerlIOEncode_getarg(PerlIO *f)
+PerlIOEncode_getarg(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
{
- dTHX;
PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
SV *sv = &PL_sv_undef;
if (e->enc)
}
IV
-PerlIOEncode_pushed(PerlIO *f, const char *mode, SV *arg)
+PerlIOEncode_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg)
{
PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
- dTHX;
dSP;
IV code;
- code = PerlIOBuf_pushed(f,mode,Nullsv);
+ code = PerlIOBuf_pushed(aTHX_ f,mode,Nullsv);
ENTER;
SAVETMPS;
PUSHMARK(sp);
}
IV
-PerlIOEncode_popped(PerlIO *f)
+PerlIOEncode_popped(pTHX_ PerlIO *f)
{
PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
- dTHX;
if (e->enc)
{
SvREFCNT_dec(e->enc);
}
STDCHAR *
-PerlIOEncode_get_base(PerlIO *f)
+PerlIOEncode_get_base(pTHX_ PerlIO *f)
{
PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
- dTHX;
if (!e->base.bufsiz)
e->base.bufsiz = 1024;
if (!e->bufsv)
}
IV
-PerlIOEncode_fill(PerlIO *f)
+PerlIOEncode_fill(pTHX_ PerlIO *f)
{
PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
- dTHX;
dSP;
IV code;
- code = PerlIOBuf_fill(f);
+ code = PerlIOBuf_fill(aTHX_ f);
if (code == 0)
{
SV *uni;
}
IV
-PerlIOEncode_flush(PerlIO *f)
+PerlIOEncode_flush(pTHX_ PerlIO *f)
{
PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
IV code = 0;
&&(e->base.ptr > e->base.buf)
)
{
- dTHX;
dSP;
SV *str;
char *s;
e->base.end = e->base.ptr + left;
FREETMPS;
LEAVE;
- if (PerlIOBuf_flush(f) != 0)
+ if (PerlIOBuf_flush(aTHX_ f) != 0)
code = -1;
}
return code;
}
IV
-PerlIOEncode_close(PerlIO *f)
+PerlIOEncode_close(pTHX_ PerlIO *f)
{
PerlIOEncode *e = PerlIOSelf(f,PerlIOEncode);
- IV code = PerlIOBase_close(f);
- dTHX;
+ IV code = PerlIOBase_close(aTHX_ f);
if (e->bufsv)
{
SvREFCNT_dec(e->bufsv);
}
Off_t
-PerlIOEncode_tell(PerlIO *f)
+PerlIOEncode_tell(pTHX_ 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.
}
PerlIO *
-PerlIOEncode_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *params)
+PerlIOEncode_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *params, int flags)
{
- if ((f = PerlIOBase_dup(aTHX_ f, o, params)))
+ if ((f = PerlIOBase_dup(aTHX_ f, o, params, flags)))
{
PerlIOEncode *fe = PerlIOSelf(f,PerlIOEncode);
PerlIOEncode *oe = PerlIOSelf(o,PerlIOEncode);
#endif /* encode layer */
void
-Encode_Define(pTHX_ encode_t *enc)
+Encode_XSEncoding(pTHX_ encode_t *enc)
{
dSP;
HV *stash = gv_stashpv("Encode::XS", TRUE);
{
case ENCODE_NOSPACE:
{
- STRLEN need = (slen) ? (SvLEN(dst)*SvCUR(src)/slen) : (dlen + UTF8_MAXLEN);
- if (need <= SvLEN(dst))
- need += UTF8_MAXLEN;
+ STRLEN need = dlen + UTF8_MAXLEN * 128; /* 128 is too big or small? */
d = (U8 *) SvGROW(dst, need);
+ if (dlen >= SvLEN(dst))
+ {
+ Perl_croak(aTHX_ "Destination couldn't be grown (the need may be miscalculated).");
+ }
dlen = SvLEN(dst);
slen = SvCUR(src);
break;
bool check
CODE:
{
+ if (SvGMAGICAL(sv)) /* it could be $1, for example */
+ sv = newSVsv(sv); /* GMAGIG will be done */
if (SvPOK(sv)) {
RETVAL = SvUTF8(sv) ? TRUE : FALSE;
if (RETVAL &&
} else {
RETVAL = FALSE;
}
+ if (sv != ST(0))
+ SvREFCNT_dec(sv); /* it was a temp copy */
}
OUTPUT:
RETVAL