In Perl_moreswitches(), avoid the strlen() inside sv_catpv() by moving
Nicholas Clark [Thu, 18 Oct 2007 07:17:46 +0000 (07:17 +0000)]
the strlen() earlier.
Brought to you by the Campaign for the Elimination of strlen().

p4raw-id: //depot/perl@32126

perl.c

diff --git a/perl.c b/perl.c
index d62b3bd..d2d748f 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -3167,6 +3167,7 @@ Perl_moreswitches(pTHX_ const char *s)
        forbid_setid('m', -1);  /* XXX ? */
        if (*++s) {
            const char *start;
+           const char *end;
            SV *sv;
            const char *use = "use ";
            /* -M-foo == 'no foo'       */
@@ -3177,8 +3178,9 @@ Perl_moreswitches(pTHX_ const char *s)
            start = s;
            /* We allow -M'Module qw(Foo Bar)'  */
            while(isALNUM(*s) || *s==':') ++s;
+           end = s + strlen(s);
            if (*s != '=') {
-               sv_catpv(sv, start);
+               sv_catpvn(sv, start, end - start);
                if (*(start-1) == 'm') {
                    if (*s != '\0')
                        Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
@@ -3189,12 +3191,13 @@ Perl_moreswitches(pTHX_ const char *s)
                     Perl_croak(aTHX_ "Module name required with -%c option",
                               s[-1]);
                sv_catpvn(sv, start, s-start);
-               sv_catpvs(sv, " split(/,/,q");
-               sv_catpvs(sv, "\0");        /* Use NUL as q//-delimiter. */
-               sv_catpv(sv, ++s);
+               /* Use NUL as q''-delimiter.  */
+               sv_catpvs(sv, " split(/,/,q\0");
+               ++s;
+               sv_catpvn(sv, s, end - s);
                sv_catpvs(sv,  "\0)");
            }
-           s += strlen(s);
+           s = end;
            Perl_av_create_and_push(aTHX_ &PL_preambleav, sv);
        }
        else