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); }
In reply to Re^2: XS Prepending space to an SVs PV
by salva
in thread XS Prepending space to an SVs PV
by BrowserUk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |