From: Nicholas Clark Date: Fri, 5 Oct 2007 19:48:27 +0000 (+0000) Subject: Eliminate most *printf-like calls that use a simple "%c" format, X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=5e7aa789c35577c2a092ac2f2d75bcee74e9b7f1;p=p5sagit%2Fp5-mst-13.2.git Eliminate most *printf-like calls that use a simple "%c" format, replacing them with constructions that are more efficient because they avoid the overhead of the *printf format parser and interpreter code. p4raw-id: //depot/perl@32034 --- diff --git a/dump.c b/dump.c index dce8630..bdaf41a 100644 --- a/dump.c +++ b/dump.c @@ -279,7 +279,8 @@ Perl_pv_escape( pTHX_ SV *dsv, char const * const str, sv_catpvn(dsv, octbuf, chsize); wrote += chsize; } else { - Perl_sv_catpvf( aTHX_ dsv, "%c", c); + const char string = (char) c; + sv_catpvn(dsv, &string, 1); wrote++; } if ( flags & PERL_PV_ESCAPE_FIRSTCHAR ) @@ -2243,7 +2244,8 @@ Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8) Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c); } else { - Perl_sv_catpvf(aTHX_ dsv, "%c", c); + const char string = (char) c; + sv_catpvn(dsv, &string, 1); } break; } diff --git a/regcomp.c b/regcomp.c index dd48f3c..8757eb1 100644 --- a/regcomp.c +++ b/regcomp.c @@ -6484,6 +6484,7 @@ S_reg_namedseq(pTHX_ RExC_state_t *pRExC_state, UV *valuep) | PERL_SCAN_DISALLOW_PREFIX | (SIZE_ONLY ? PERL_SCAN_SILENT_ILLDIGIT : 0); UV cp; + unsigned char string; len = (STRLEN)(endbrace - name - 2); cp = grok_hex(name + 2, &len, &fl, NULL); if ( len != (STRLEN)(endbrace - name - 2) ) { @@ -6495,7 +6496,8 @@ S_reg_namedseq(pTHX_ RExC_state_t *pRExC_state, UV *valuep) *valuep = cp; return NULL; } - sv_str= Perl_newSVpvf_nocontext("%c",(int)cp); + string = (unsigned char) cp; + sv_str= newSVpvn(&string, 1); } else { /* fetch the charnames handler for this scope */ HV * const table = GvHV(PL_hintgv); @@ -9666,10 +9668,12 @@ S_put_byte(pTHX_ SV *sv, int c) { if (isCNTRL(c) || c == 255 || !isPRINT(c)) Perl_sv_catpvf(aTHX_ sv, "\\%o", c); - else if (c == '-' || c == ']' || c == '\\' || c == '^') - Perl_sv_catpvf(aTHX_ sv, "\\%c", c); - else - Perl_sv_catpvf(aTHX_ sv, "%c", c); + else { + const unsigned char string = (unsigned char) c; + if (c == '-' || c == ']' || c == '\\' || c == '^') + sv_catpvs(sv, "\\"); + sv_catpvn(sv, &string, 1); + } } diff --git a/toke.c b/toke.c index be7bacf..7037a43 100644 --- a/toke.c +++ b/toke.c @@ -12510,8 +12510,10 @@ Perl_yyerror(pTHX_ const char *s) SV * const where_sv = sv_2mortal(newSVpvs("next char ")); if (yychar < 32) Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar)); - else if (isPRINT_LC(yychar)) - Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar); + else if (isPRINT_LC(yychar)) { + const unsigned char string = (unsigned char) yychar; + sv_catpvn(where_sv, &string, 1); + } else Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255); where = SvPVX_const(where_sv); diff --git a/utf8.c b/utf8.c index a761d82..c665a41 100644 --- a/utf8.c +++ b/utf8.c @@ -2167,12 +2167,14 @@ Perl_pv_uni_display(pTHX_ SV *dsv, const U8 *spv, STRLEN len, STRLEN pvlim, UV f default: break; } if (ok) { - Perl_sv_catpvf(aTHX_ dsv, "\\%c", ok); + const unsigned char string = (unsigned char) ok; + sv_catpvn(dsv, &string, 1); } } /* isPRINT() is the locale-blind version. */ if (!ok && (flags & UNI_DISPLAY_ISPRINT) && isPRINT(c)) { - Perl_sv_catpvf(aTHX_ dsv, "%c", c); + const unsigned char string = (unsigned char) c; + sv_catpvn(dsv, &string, 1); ok = 1; } }