small optimizations of toupper/tolower
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 23 Oct 2009 11:03:59 +0000 (13:03 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 23 Oct 2009 11:03:59 +0000 (13:03 +0200)
function                                             old     new   delta
in_ib                                                191     172     -19

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/awk.c
networking/interface.c

index 17244f9e69fbe30fb78a5ece0baeeea686f7a3cc..bc1d9386824f527b2496d3b349b2ff3c4e5433bb 100644 (file)
@@ -2031,7 +2031,6 @@ static NOINLINE var *exec_builtin(node *op, var *res)
 {
 #define tspl (G.exec_builtin__tspl)
 
-       int (*to_xxx)(int);
        var *tv;
        node *an[4];
        var *av[4];
@@ -2061,7 +2060,8 @@ static NOINLINE var *exec_builtin(node *op, var *res)
        if ((uint32_t)nargs < (info >> 30))
                syntax_error(EMSG_TOO_FEW_ARGS);
 
-       switch (info & OPNMASK) {
+       info &= OPNMASK;
+       switch (info) {
 
        case B_a2:
 #if ENABLE_FEATURE_AWK_LIBM
@@ -2126,15 +2126,12 @@ static NOINLINE var *exec_builtin(node *op, var *res)
                break;
 
        case B_lo:
-               to_xxx = tolower;
-               goto lo_cont;
-
        case B_up:
-               to_xxx = toupper;
- lo_cont:
                s1 = s = xstrdup(as[0]);
                while (*s1) {
-                       *s1 = (*to_xxx)(*s1);
+                       //*s1 = (info == B_up) ? toupper(*s1) : tolower(*s1);
+                       if ((unsigned char)((*s1 | 0x20) - 'a') <= ('z' - 'a'))
+                               *s1 = (info == B_up) ? (*s1 & 0xdf) : (*s1 | 0x20);
                        s1++;
                }
                setvar_p(res, s);
index fe6b23dbc821dc90d281aca19631be0aff28c04a..b64d24a58b73d68e64d6011ab6e55e9699d5ce96 100644 (file)
@@ -1242,10 +1242,8 @@ int FAST_FUNC in_ib(const char *bufp, struct sockaddr *sap)
                c = *bufp++;
                if (isdigit(c))
                        val = c - '0';
-               else if (c >= 'a' && c <= 'f')
-                       val = c - 'a' + 10;
-               else if (c >= 'A' && c <= 'F')
-                       val = c - 'A' + 10;
+               else if ((c|0x20) >= 'a' && (c|0x20) <= 'f')
+                       val = (c|0x20) - ('a' - 10);
                else {
                        errno = EINVAL;
                        return -1;
@@ -1254,17 +1252,15 @@ int FAST_FUNC in_ib(const char *bufp, struct sockaddr *sap)
                c = *bufp;
                if (isdigit(c))
                        val |= c - '0';
-               else if (c >= 'a' && c <= 'f')
-                       val |= c - 'a' + 10;
-               else if (c >= 'A' && c <= 'F')
-                       val |= c - 'A' + 10;
-               else if (c == ':' || c == 0)
+               else if ((c|0x20) >= 'a' && (c|0x20) <= 'f')
+                       val |= (c|0x20) - ('a' - 10);
+               else if (c == ':' || c == '\0')
                        val >>= 4;
                else {
                        errno = EINVAL;
                        return -1;
                }
-               if (c != 0)
+               if (c != '\0')
                        bufp++;
                *ptr++ = (unsigned char) (val & 0377);
                i++;