|
2 | 2 | #include "EXTERN.h" |
3 | 3 | #include "perl.h" |
4 | 4 | #include "XSUB.h" |
| 5 | + |
5 | 6 | #define U8 U8 |
| 7 | +#ifndef get_svs |
| 8 | +# define get_svs(str, flags) get_sv((str), (flags)) |
| 9 | +# define get_avs(str, flags) get_av((str), (flags)) |
| 10 | +# define get_hvs(str, flags) get_hv((str), (flags)) |
| 11 | +#endif |
| 12 | +#ifndef SvPVCLEAR |
| 13 | +# define SvPVCLEAR(sv) sv_setpvs(sv, "") |
| 14 | +#endif |
6 | 15 |
|
7 | 16 | #define OUR_DEFAULT_FB "Encode::PERLQQ" |
8 | 17 |
|
@@ -163,7 +172,7 @@ PerlIOEncode_pushed(pTHX_ PerlIO * f, const char *mode, SV * arg, PerlIO_funcs * |
163 | 172 | PerlIOBase(f)->flags |= PERLIO_F_UTF8; |
164 | 173 | } |
165 | 174 |
|
166 | | - e->chk = newSVsv(get_sv("PerlIO::encoding::fallback", 0)); |
| 175 | + e->chk = newSVsv(get_svs("PerlIO::encoding::fallback", 0)); |
167 | 176 | e->inEncodeCall = 0; |
168 | 177 |
|
169 | 178 | FREETMPS; |
@@ -203,7 +212,7 @@ PerlIOEncode_get_base(pTHX_ PerlIO * f) |
203 | 212 | e->base.bufsiz = 1024; |
204 | 213 | if (!e->bufsv) { |
205 | 214 | e->bufsv = newSV(e->base.bufsiz); |
206 | | - sv_setpvn(e->bufsv, "", 0); |
| 215 | + SvPVCLEAR(e->bufsv); |
207 | 216 | } |
208 | 217 | e->base.buf = (STDCHAR *) SvPVX(e->bufsv); |
209 | 218 | if (!e->base.ptr) |
@@ -307,42 +316,19 @@ PerlIOEncode_fill(pTHX_ PerlIO * f) |
307 | 316 | goto end_of_file; |
308 | 317 | } |
309 | 318 | } |
310 | | - if (SvCUR(e->dataSV)) { |
311 | | - /* something left over from last time - create a normal |
312 | | - SV with new data appended |
313 | | - */ |
314 | | - if (use + SvCUR(e->dataSV) > e->base.bufsiz) { |
315 | | - if (e->flags & NEEDS_LINES) { |
316 | | - /* Have to grow buffer */ |
317 | | - e->base.bufsiz = use + SvCUR(e->dataSV); |
318 | | - PerlIOEncode_get_base(aTHX_ f); |
319 | | - } |
320 | | - else { |
321 | | - use = e->base.bufsiz - SvCUR(e->dataSV); |
322 | | - } |
323 | | - } |
324 | | - sv_catpvn(e->dataSV,(char*)ptr,use); |
325 | | - } |
326 | | - else { |
327 | | - /* Create a "dummy" SV to represent the available data from layer below */ |
328 | | - if (SvLEN(e->dataSV) && SvPVX_const(e->dataSV)) { |
329 | | - Safefree(SvPVX_mutable(e->dataSV)); |
330 | | - } |
331 | | - if (use > (SSize_t)e->base.bufsiz) { |
332 | | - if (e->flags & NEEDS_LINES) { |
333 | | - /* Have to grow buffer */ |
334 | | - e->base.bufsiz = use; |
335 | | - PerlIOEncode_get_base(aTHX_ f); |
336 | | - } |
337 | | - else { |
338 | | - use = e->base.bufsiz; |
| 319 | + if (!SvCUR(e->dataSV)) |
| 320 | + SvPVCLEAR(e->dataSV); |
| 321 | + if (use + SvCUR(e->dataSV) > e->base.bufsiz) { |
| 322 | + if (e->flags & NEEDS_LINES) { |
| 323 | + /* Have to grow buffer */ |
| 324 | + e->base.bufsiz = use + SvCUR(e->dataSV); |
| 325 | + PerlIOEncode_get_base(aTHX_ f); |
339 | 326 | } |
| 327 | + else { |
| 328 | + use = e->base.bufsiz - SvCUR(e->dataSV); |
340 | 329 | } |
341 | | - SvPV_set(e->dataSV, (char *) ptr); |
342 | | - SvLEN_set(e->dataSV, 0); /* Hands off sv.c - it isn't yours */ |
343 | | - SvCUR_set(e->dataSV,use); |
344 | | - SvPOK_only(e->dataSV); |
345 | 330 | } |
| 331 | + sv_catpvn(e->dataSV,(char*)ptr,use); |
346 | 332 | SvUTF8_off(e->dataSV); |
347 | 333 | PUSHMARK(sp); |
348 | 334 | XPUSHs(e->enc); |
@@ -661,7 +647,7 @@ PROTOTYPES: ENABLE |
661 | 647 |
|
662 | 648 | BOOT: |
663 | 649 | { |
664 | | - SV *chk = get_sv("PerlIO::encoding::fallback", GV_ADD|GV_ADDMULTI); |
| 650 | + SV *chk = get_svs("PerlIO::encoding::fallback", GV_ADD|GV_ADDMULTI); |
665 | 651 | /* |
666 | 652 | * we now "use Encode ()" here instead of |
667 | 653 | * PerlIO/encoding.pm. This avoids SEGV when ":encoding()" |
|
0 commit comments