diff options
author | Inaba Hiroto <inaba@st.rim.or.jp> | 2003-02-02 06:58:20 +0900 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2003-02-05 17:15:35 +0000 |
commit | 220e2d4e806a3c9c0a9f9b31667e8be830cbc55b (patch) | |
tree | 28905af26db33e5aba4ebee2d01aafaecdd67261 /sv.c | |
parent | 6efa47225d75a7e88a5d03044ee492ff6e1b7ee0 (diff) | |
download | perl-220e2d4e806a3c9c0a9f9b31667e8be830cbc55b.tar.gz |
[Patch] parsing under encoding (Re: [Encode] HEADS-UP; $Encode::VERSION++ to enhance filter option)([perl #16823])
Message-ID: <3E3BC46B.6C687CFD@st.rim.or.jp>
p4raw-id: //depot/perl@18660
Diffstat (limited to 'sv.c')
-rw-r--r-- | sv.c | 57 |
1 files changed, 46 insertions, 11 deletions
@@ -11168,14 +11168,14 @@ The PV of the sv is returned. char * Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding) { - if (SvPOK(sv) && !DO_UTF8(sv) && SvROK(encoding)) { - int vary = FALSE; + if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) { SV *uni; STRLEN len; char *s; dSP; ENTER; SAVETMPS; + save_re_context(); PUSHMARK(sp); EXTEND(SP, 3); XPUSHs(encoding); @@ -11196,13 +11196,6 @@ Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding) uni = POPs; PUTBACK; s = SvPV(uni, len); - { - U8 *t = (U8 *)s, *e = (U8 *)s + len; - while (t < e) { - if ((vary = !UTF8_IS_INVARIANT(*t++))) - break; - } - } if (s != SvPVX(sv)) { SvGROW(sv, len + 1); Move(s, SvPVX(sv), len, char); @@ -11211,12 +11204,54 @@ Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding) } FREETMPS; LEAVE; - if (vary) - SvUTF8_on(sv); SvUTF8_on(sv); } return SvPVX(sv); } +/* +=for apidoc sv_cat_decode + +The encoding is assumed to be an Encode object, the PV of the ssv is +assumed to be octets in that encoding and decoding the input starts +from the position which (PV + *offset) pointed to. The dsv will be +concatenated the decoded UTF-8 string from ssv. Decoding will terminate +when the string tstr appears in decoding output or the input ends on +the PV of the ssv. The value which the offset points will be modified +to the last input position on the ssv. +Returns TRUE if the terminator was found, else returns FALSE. + +=cut */ + +bool +Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding, + SV *ssv, int *offset, char *tstr, int tlen) +{ + if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) { + bool ret = FALSE; + SV *offsv; + dSP; + ENTER; + SAVETMPS; + save_re_context(); + PUSHMARK(sp); + EXTEND(SP, 6); + XPUSHs(encoding); + XPUSHs(dsv); + XPUSHs(ssv); + XPUSHs(offsv = sv_2mortal(newSViv(*offset))); + XPUSHs(sv_2mortal(newSVpvn(tstr, tlen))); + PUTBACK; + call_method("cat_decode", G_SCALAR); + SPAGAIN; + ret = SvTRUE(TOPs); + *offset = SvIV(offsv); + PUTBACK; + FREETMPS; + LEAVE; + return ret; + } + Perl_croak(aTHX_ "Invalid argument to sv_cat_decode."); +} |