Author: jilles
Date: Tue Nov 23 22:17:39 2010
New Revision: 215783
URL: http://svn.freebsd.org/changeset/base/215783

Log:
  sh: Code size optimizations to "stack string" memory allocation:
  * Prefer one CHECKSTRSPACE with multiple USTPUTC to multiple STPUTC.
  * Add STPUTS macro (based on function) and use it instead of loops that add
    nul-terminated strings to the stack string.
  
  No functional change is intended, but code size is about 1K less on i386.

Modified:
  head/bin/sh/cd.c
  head/bin/sh/eval.c
  head/bin/sh/expand.c
  head/bin/sh/histedit.c
  head/bin/sh/memalloc.c
  head/bin/sh/memalloc.h
  head/bin/sh/miscbltin.c
  head/bin/sh/parser.c

Modified: head/bin/sh/cd.c
==============================================================================
--- head/bin/sh/cd.c    Tue Nov 23 22:17:06 2010        (r215782)
+++ head/bin/sh/cd.c    Tue Nov 23 22:17:39 2010        (r215783)
@@ -192,8 +192,7 @@ cdlogical(char *dest)
                        STPUTC('/', p);
                first = 0;
                component = q;
-               while (*q)
-                       STPUTC(*q++, p);
+               STPUTS(q, p);
                if (equal(component, ".."))
                        continue;
                STACKSTRNUL(p);
@@ -273,10 +272,8 @@ findcwd(char *dir)
        scopy(dir, cdcomppath);
        STARTSTACKSTR(new);
        if (*dir != '/') {
-               p = curdir;
-               while (*p)
-                       STPUTC(*p++, new);
-               if (p[-1] == '/')
+               STPUTS(curdir, new);
+               if (STTOPC(new) == '/')
                        STUNPUTC(new);
        }
        while ((p = getcomponent()) != NULL) {
@@ -284,8 +281,7 @@ findcwd(char *dir)
                        while (new > stackblock() && (STUNPUTC(new), *new) != 
'/');
                } else if (*p != '\0' && ! equal(p, ".")) {
                        STPUTC('/', new);
-                       while (*p)
-                               STPUTC(*p++, new);
+                       STPUTS(p, new);
                }
        }
        if (new == stackblock())

Modified: head/bin/sh/eval.c
==============================================================================
--- head/bin/sh/eval.c  Tue Nov 23 22:17:06 2010        (r215782)
+++ head/bin/sh/eval.c  Tue Nov 23 22:17:39 2010        (r215783)
@@ -135,8 +135,7 @@ evalcmd(int argc, char **argv)
                         STARTSTACKSTR(concat);
                         ap = argv + 2;
                         for (;;) {
-                                while (*p)
-                                        STPUTC(*p++, concat);
+                                STPUTS(p, concat);
                                 if ((p = *ap++) == NULL)
                                         break;
                                 STPUTC(' ', concat);

Modified: head/bin/sh/expand.c
==============================================================================
--- head/bin/sh/expand.c        Tue Nov 23 22:17:06 2010        (r215782)
+++ head/bin/sh/expand.c        Tue Nov 23 22:17:39 2010        (r215783)
@@ -225,6 +225,7 @@ argstr(char *p, int flag)
        if (*p == '~' && (flag & (EXP_TILDE | EXP_VARTILDE)))
                p = exptilde(p, flag);
        for (;;) {
+               CHECKSTRSPACE(2, expdest);
                switch (c = *p++) {
                case '\0':
                case CTLENDVAR:
@@ -235,16 +236,16 @@ argstr(char *p, int flag)
                        if (p[0] == CTLVAR && p[2] == '@' && p[3] == '=')
                                break;
                        if ((flag & EXP_FULL) != 0)
-                               STPUTC(c, expdest);
+                               USTPUTC(c, expdest);
                        break;
                case CTLQUOTEEND:
                        lit_quoted = 0;
                        break;
                case CTLESC:
                        if (quotes)
-                               STPUTC(c, expdest);
+                               USTPUTC(c, expdest);
                        c = *p++;
-                       STPUTC(c, expdest);
+                       USTPUTC(c, expdest);
                        if (split_lit && !lit_quoted)
                                recordregion(expdest - stackblock() -
                                    (quotes ? 2 : 1),
@@ -267,7 +268,7 @@ argstr(char *p, int flag)
                         * sort of a hack - expand tildes in variable
                         * assignments (after the first '=' and after ':'s).
                         */
-                       STPUTC(c, expdest);
+                       USTPUTC(c, expdest);
                        if (split_lit && !lit_quoted)
                                recordregion(expdest - stackblock() - 1,
                                    expdest - stackblock(), 0);
@@ -279,7 +280,7 @@ argstr(char *p, int flag)
                        }
                        break;
                default:
-                       STPUTC(c, expdest);
+                       USTPUTC(c, expdest);
                        if (split_lit && !lit_quoted)
                                recordregion(expdest - stackblock() - 1,
                                    expdest - stackblock(), 0);
@@ -902,8 +903,7 @@ varvalue(char *name, int quoted, int sub
                        STPUTC(*p++, expdest); \
                } \
        } else \
-               while (*p) \
-                       STPUTC(*p++, expdest); \
+               STPUTS(p, expdest); \
        } while (0)
 
 
@@ -1573,8 +1573,7 @@ cvtnum(int num, char *buf)
        if (neg)
                *--p = '-';
 
-       while (*p)
-               STPUTC(*p++, buf);
+       STPUTS(p, buf);
        return buf;
 }
 

Modified: head/bin/sh/histedit.c
==============================================================================
--- head/bin/sh/histedit.c      Tue Nov 23 22:17:06 2010        (r215782)
+++ head/bin/sh/histedit.c      Tue Nov 23 22:17:39 2010        (r215783)
@@ -411,8 +411,7 @@ fc_replace(const char *s, char *p, char 
        STARTSTACKSTR(dest);
        while (*s) {
                if (*s == *p && strncmp(s, p, plen) == 0) {
-                       while (*r)
-                               STPUTC(*r++, dest);
+                       STPUTS(r, dest);
                        s += plen;
                        *p = '\0';      /* so no more matches */
                } else

Modified: head/bin/sh/memalloc.c
==============================================================================
--- head/bin/sh/memalloc.c      Tue Nov 23 22:17:06 2010        (r215782)
+++ head/bin/sh/memalloc.c      Tue Nov 23 22:17:39 2010        (r215783)
@@ -340,3 +340,20 @@ ungrabstackstr(char *s, char *p)
        stacknxt = s;
        sstrnleft = stacknleft - (p - s);
 }
+
+
+char *
+stputbin(const char *data, int len, char *p)
+{
+       int i;
+
+       for (i = 0; i < len; i++)
+               STPUTC(data[i], p);
+       return (p);
+}
+
+char *
+stputs(const char *data, char *p)
+{
+       return (stputbin(data, strlen(data), p));
+}

Modified: head/bin/sh/memalloc.h
==============================================================================
--- head/bin/sh/memalloc.h      Tue Nov 23 22:17:06 2010        (r215782)
+++ head/bin/sh/memalloc.h      Tue Nov 23 22:17:39 2010        (r215783)
@@ -61,6 +61,8 @@ void grabstackblock(int);
 char *growstackstr(void);
 char *makestrspace(void);
 void ungrabstackstr(char *, char *);
+char *stputbin(const char *data, int len, char *p);
+char *stputs(const char *data, char *p);
 
 
 
@@ -82,3 +84,5 @@ void ungrabstackstr(char *, char *);
 #define STTOPC(p)      p[-1]
 #define STADJUST(amount, p)    (p += (amount), sstrnleft -= (amount))
 #define grabstackstr(p)        stalloc(stackblocksize() - sstrnleft)
+#define STPUTBIN(s, len, p)    p = stputbin((s), (len), p)
+#define STPUTS(s, p)   p = stputs((s), p)

Modified: head/bin/sh/miscbltin.c
==============================================================================
--- head/bin/sh/miscbltin.c     Tue Nov 23 22:17:06 2010        (r215782)
+++ head/bin/sh/miscbltin.c     Tue Nov 23 22:17:39 2010        (r215783)
@@ -172,11 +172,12 @@ readcmd(int argc __unused, char **argv _
                }
                if (c == '\0')
                        continue;
+               CHECKSTRSPACE(1, p);
                if (backslash) {
                        backslash = 0;
                        startword = 0;
                        if (c != '\n')
-                               STPUTC(c, p);
+                               USTPUTC(c, p);
                        continue;
                }
                if (!rflag && c == '\\') {
@@ -194,14 +195,14 @@ readcmd(int argc __unused, char **argv _
                        if (is_ifs == 1) {
                                /* Ignore leading IFS whitespace */
                                if (saveall)
-                                       STPUTC(c, p);
+                                       USTPUTC(c, p);
                                continue;
                        }
                        if (is_ifs == 2 && startword == 1) {
                                /* Only one non-whitespace IFS per word */
                                startword = 2;
                                if (saveall)
-                                       STPUTC(c, p);
+                                       USTPUTC(c, p);
                                continue;
                        }
                }
@@ -212,7 +213,7 @@ readcmd(int argc __unused, char **argv _
                        if (saveall)
                                /* Not just a spare terminator */
                                saveall++;
-                       STPUTC(c, p);
+                       USTPUTC(c, p);
                        continue;
                }
 
@@ -222,7 +223,7 @@ readcmd(int argc __unused, char **argv _
                if (ap[1] == NULL) {
                        /* Last variable needs all IFS chars */
                        saveall++;
-                       STPUTC(c, p);
+                       USTPUTC(c, p);
                        continue;
                }
 

Modified: head/bin/sh/parser.c
==============================================================================
--- head/bin/sh/parser.c        Tue Nov 23 22:17:06 2010        (r215782)
+++ head/bin/sh/parser.c        Tue Nov 23 22:17:39 2010        (r215783)
@@ -1017,6 +1017,7 @@ parsebackq(char *out, struct nodelist **
                                setprompt(2);
                                needprompt = 0;
                        }
+                       CHECKSTRSPACE(2, oout);
                        switch (c = pgetc()) {
                        case '`':
                                goto done;
@@ -1031,14 +1032,14 @@ parsebackq(char *out, struct nodelist **
                                        /*
                                         * If eating a newline, avoid putting
                                         * the newline into the new character
-                                        * stream (via the STPUTC after the
+                                        * stream (via the USTPUTC after the
                                         * switch).
                                         */
                                        continue;
                                }
                                 if (c != '\\' && c != '`' && c != '$'
                                     && (!dblquote || c != '"'))
-                                        STPUTC('\\', oout);
+                                        USTPUTC('\\', oout);
                                break;
 
                        case '\n':
@@ -1054,10 +1055,10 @@ parsebackq(char *out, struct nodelist **
                        default:
                                break;
                        }
-                       STPUTC(c, oout);
+                       USTPUTC(c, oout);
                 }
 done:
-                STPUTC('\0', oout);
+                USTPUTC('\0', oout);
                 olen = oout - stackblock();
                INTOFF;
                ostr = ckmalloc(olen);
@@ -1444,7 +1445,6 @@ parsesub: {
        char *p;
        static const char types[] = "}-+?=";
        int bracketed_name = 0; /* used to handle ${[0-9]*} variables */
-       int i;
        int linno;
        int length;
 
@@ -1498,8 +1498,7 @@ parsesub: {
                                        linno -= funclinno - 1;
                                snprintf(buf, sizeof(buf), "%d", linno);
                                STADJUST(-6, out);
-                               for (i = 0; buf[i] != '\0'; i++)
-                                       STPUTC(buf[i], out);
+                               STPUTS(buf, out);
                                flags |= VSLINENO;
                        }
                } else if (is_digit(c)) {
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to