#include "XSUB.h"
#define U8 U8
#include "encode.h"
-#include "iso8859.h"
+#include "8859.h"
#include "EBCDIC.h"
#include "Symbols.h"
} 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);
e->enc = Nullsv;
errno = EINVAL;
Perl_warner(aTHX_ WARN_IO, "Cannot find encoding \"%"SVf"\"", arg);
- return -1;
+ code = -1;
+ }
+ else
+ {
+ SvREFCNT_inc(e->enc);
+ PerlIOBase(f)->flags |= PERLIO_F_UTF8;
}
- SvREFCNT_inc(e->enc);
FREETMPS;
LEAVE;
- PerlIOBase(f)->flags |= PERLIO_F_UTF8;
return code;
}
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
#if defined(USE_PERLIO) && !defined(USE_SFIO)
PerlIO_define_layer(aTHX_ &PerlIO_encode);
#endif
-#include "iso8859.def"
+#include "8859.def"
#include "EBCDIC.def"
#include "Symbols.def"
}