Sisyphus said:
.
.
A neat little Inline C routine .... so I saved the code and ran it:
-----------------------------
D:\pscrpt\inline\>cat char2octal.pl
use warnings;
use Inline C => Config =>
BUILD_NOISY => 1;
use Inline C => <<'EOC';
SV* c2o(SV* a) {
STRLEN len;
int i;
unsigned char * s;
SV* ret;
s = SvPV(a,len);
ret = newSV(4*len);
for (i=0; i<len; i++,s++) {
sv_catpvf(ret, "\\%03o", *s);
}
return ret;
}
EOC
print c2o('abcdABCD'), "\n"; #line 22
D:\pscrpt\inline\>perl char2octal.pl
Use of uninitialized value in subroutine entry at char2octal.pl line 22.
\141\142\143\144\101\102\103\104
-----------------------------
I'm sure it's one of those questions that will make me go "Doh!", but I
can't for the life of me see what is causing that "uninitialized"
warning. Any hints ? (I'm running perl 5.8.8 on Win32.)
Ah, I forgot to turn on warnings and so never saw it.
Apparently sv_catpvf, unlike .= operator, doesn't care for undefined
values. So make that:
ret = newSV(4*len);
sv_setpv(ret, "");
for (i=0; i<len; i++,s++) {
I guess Inline warnings all get reported as being at subroutine entry?
For what it's worth, I've made another uglier one that is about twice again
as fast. This is going to wrap like crazy:
Xho
SV* sol32(SV* a) {
static const char * cache[]={"\\000","\\001","\\002","\\003","\\004",
"\\005","\\006","\\007","\\010","\\011","\\012","\\013","\\014","\\015",
"\\016","\\017","\\020","\\021","\\022","\\023","\\024","\\025","\\026",
"\\027","\\030","\\031","\\032","\\033","\\034","\\035","\\036","\\037",
"\\040","\\041","\\042","\\043","\\044","\\045","\\046","\\047","\\050",
"\\051","\\052","\\053","\\054","\\055","\\056","\\057","\\060","\\061",
"\\062","\\063","\\064","\\065","\\066","\\067","\\070","\\071","\\072",
"\\073","\\074","\\075","\\076","\\077","\\100","\\101","\\102","\\103",
"\\104","\\105","\\106","\\107","\\110","\\111","\\112","\\113","\\114",
"\\115","\\116","\\117","\\120","\\121","\\122","\\123","\\124","\\125",
"\\126","\\127","\\130","\\131","\\132","\\133","\\134","\\135","\\136",
"\\137","\\140","\\141","\\142","\\143","\\144","\\145","\\146","\\147",
"\\150","\\151","\\152","\\153","\\154","\\155","\\156","\\157","\\160",
"\\161","\\162","\\163","\\164","\\165","\\166","\\167","\\170","\\171",
"\\172","\\173","\\174","\\175","\\176","\\177","\\200","\\201","\\202",
"\\203","\\204","\\205","\\206","\\207","\\210","\\211","\\212","\\213",
"\\214","\\215","\\216","\\217","\\220","\\221","\\222","\\223","\\224",
"\\225","\\226","\\227","\\230","\\231","\\232","\\233","\\234","\\235",
"\\236","\\237","\\240","\\241","\\242","\\243","\\244","\\245","\\246",
"\\247","\\250","\\251","\\252","\\253","\\254","\\255","\\256","\\257",
"\\260","\\261","\\262","\\263","\\264","\\265","\\266","\\267","\\270",
"\\271","\\272","\\273","\\274","\\275","\\276","\\277","\\300","\\301",
"\\302","\\303","\\304","\\305","\\306","\\307","\\310","\\311","\\312",
"\\313","\\314","\\315","\\316","\\317","\\320","\\321","\\322","\\323",
"\\324","\\325","\\326","\\327","\\330","\\331","\\332","\\333","\\334",
"\\335","\\336","\\337","\\340","\\341","\\342","\\343","\\344","\\345",
"\\346","\\347","\\350","\\351","\\352","\\353","\\354","\\355","\\356",
"\\357","\\360","\\361","\\362","\\363","\\364","\\365","\\366","\\367",
"\\370","\\371","\\372","\\373","\\374","\\375","\\376","\\377"};
STRLEN len;
int i;
unsigned char * s;
SV* ret;
s = SvPV(a,len);
ret = newSV(4*len);
sv_setpv(ret, "");
for (i=0; i<len; i++,s++) {
sv_catpv(ret, cache[*s]);
};
return ret;
};