in reply to Re: XS Prepending space to an SVs PV
in thread XS Prepending space to an SVs PV
static char * my_sv_unchop(pTHX_ SV *sv, STRLEN size, STRLEN reserve) { STRLEN len; char *pv = SvPV(sv, len); IV off = SvOOK(sv) ? SvIVX(sv) : 0; if (!size) return pv; if (off >= size) { SvLEN_set(sv, SvLEN(sv) + size); SvCUR_set(sv, len + size); SvPV_set(sv, pv - size); if (off == size) SvFLAGS(sv) &= ~SVf_OOK; else SvIV_set(sv, off - size); } else { size += reserve; if ((size < reserve) || (len + size < size)) Perl_croak(aTHX_ "panic: memory wrap"); if (len + size <= off + SvLEN(sv)) { SvCUR_set(sv, len + size); SvPV_set(sv, pv - off); Move(pv, pv + size - off, len, char); if (off) { SvLEN_set(sv, SvLEN(sv) + off ); SvFLAGS(sv) &= ~SVf_OOK; } } else { SV *tmp = sv_2mortal(newSV(len + size)); char *tmp_pv; SvPOK_on(tmp); tmp_pv = SvPV_nolen(tmp); Move(pv, tmp_pv + size, len, char); SvCUR_set(tmp, len + size); sv_setsv(sv, tmp); } if (reserve) sv_chop(sv, SvPVX(sv) + reserve); } return SvPVX(sv); }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: XS Prepending space to an SVs PV
by BrowserUk (Patriarch) on Apr 27, 2006 at 01:58 UTC | |
by salva (Canon) on Apr 27, 2006 at 08:48 UTC |