Data-Util
view release on metacpan or search on metacpan
xs-src/misc_scalar.c view on Meta::CPAN
if(len > 0){
sv_catpvs(dsv, ", ...");
}
}
sv_catpvs(dsv, "]");
}
else if(SvTYPE(x) == SVt_PVHV){
I32 klen;
char* key;
SV* val;
hv_iterinit((HV*)x);
val = hv_iternextsv((HV*)x, &key, &klen);
sv_catpvs(dsv, "{");
if(val){
if(!is_identifier_cstr(key, klen)){
SV* const sv = sv_newmortal();
key = pv_display(sv, key, klen, klen, PV_LIMIT);
}
Perl_sv_catpvf(aTHX_ dsv, "%s => ", key);
du_neat_cat(aTHX_ dsv, val, level+1);
if(hv_iternext((HV*)x)){
sv_catpvs(dsv, ", ...");
}
}
sv_catpvs(dsv, "}");
}
else if(SvTYPE(x) == SVt_PVCV){
GV* const gv = CvGV((CV*)x);
Perl_sv_catpvf(aTHX_ dsv, "\\&%s::%s(0x%p)", HvNAME(GvSTASH(gv)), GvNAME(gv), x);
}
else{
sv_catpvs(dsv, "\\");
du_neat_cat(aTHX_ dsv, x, level+1);
}
}
else if(isGV(x)){
sv_catsv(dsv, x);
}
else if(SvOK(x)){
if(SvPOKp(x)){
STRLEN cur;
char* const pv = SvPV(x, cur); /* pv_sisplay requires char*, not const char* */
SV* const sv = sv_newmortal();
pv_display(sv, pv, cur, cur, PV_LIMIT);
sv_catsv(dsv, sv);
}
else{
NV const nv = SvNV(x);
if(nv == NV_INF){
sv_catpvs(dsv, "+Inf");
}
else if(nv == -NV_INF){
sv_catpvs(dsv, "-Inf");
}
else if(Perl_isnan(nv)){
sv_catpvs(dsv, "NaN");
}
else{
Perl_sv_catpvf(aTHX_ dsv, "%"NVgf, nv);
}
}
}
else{
sv_catpvs(dsv, "undef");
}
}
const char*
du_neat(pTHX_ SV* x){
SV* const dsv = newSV(100);
sv_2mortal(dsv);
sv_setpvs(dsv, "");
ENTER;
SAVETMPS;
SvGETMAGIC(x);
du_neat_cat(aTHX_ dsv, x, 0);
FREETMPS;
LEAVE;
return SvPVX(dsv);
}
( run in 1.189 second using v1.01-cache-2.11-cpan-39bf76dae61 )