]> thyrsus.com Git - ascii.git/commitdiff
Interpret single-sidigit single chars. From Random832 <random832@fastmail.us>
authorEric S. Raymond <esr@thyrsus.com>
Thu, 10 Mar 2011 04:44:42 +0000 (23:44 -0500)
committerEric S. Raymond <esr@thyrsus.com>
Thu, 10 Mar 2011 04:44:42 +0000 (23:44 -0500)
ascii.c

diff --git a/ascii.c b/ascii.c
index 0e53d83211579cf5365b2e78458ce2e1d55624ff..40b4301d64dc728c216d176b4c77caf252c33acb 100644 (file)
--- a/ascii.c
+++ b/ascii.c
@@ -211,7 +211,12 @@ static void ascii(char *str)
     /* interpret single characters as themselves */
     if (len == 1) { 
        speak((unsigned int)str[0]); 
-       return; 
+       /* also interpret single digits as numeric */
+       if(!line && strchr("0123456789ABCDEFabcdef",str[0])) {
+           int hval;
+           (void) sscanf(str, "%x", &hval);
+           speak(hval);
+       }       return; 
     }
 
     /* process multiple letters */ 
@@ -224,7 +229,7 @@ static void ascii(char *str)
 
     /* interpret ^-escapes as control-character notation */
     if (strcmp(str, "^?") == 0)
-         { speak((unsigned int)0x7F); return; } 
+    { speak((unsigned int)0x7F); return; } 
     else if (str[0] == '^' && len == 2)
     { speak((unsigned int)(str[1] & 0x1f)); return; }
 
@@ -233,20 +238,20 @@ static void ascii(char *str)
        for (ch = 7; ch < 14; ch++)
            for (ptr = &cnames[ch][1]; *ptr; ptr++)
                if (**ptr == '\\' && strcmp(str, *ptr) == 0)
-                   { speak((unsigned int)ch); return; }
+               { speak((unsigned int)ch); return; }
 
     /* interpret 2 and 3-character ASCII control mnemonics */
     if (len == 2 || len == 3)
     {
        /* first check for standard mnemonics */
        if (stricmp(str, "DEL") == 0)
-           { speak(0x7f); return; }
+       { speak(0x7f); return; }
        if (stricmp(str, "BL") == 0)
-           { speak(' '); return; }
+       { speak(' '); return; }
        else if (isalpha(str[0]))
            for (ch = 0; ch <= 32; ch++)
                if (!stricmp(str,cnames[ch][0]) || !strcmp(str,cnames[ch][1]))
-                   { speak(ch); return; }
+               { speak(ch); return; }
     }
 
     /* OK, now try to interpret the string as a numeric */
@@ -273,8 +278,8 @@ static void ascii(char *str)
            else if (tolower(str[0]) == 'x')
                (void) sscanf(str + 1, "%x", &hval);
            else if ((len >= 2) && (len <= 3) &&
-               (strspn(str,"0123456789ABCDEFabcdef") == (len-1)) &&
-               (tolower(str[len - 1]) == 'h'))
+                    (strspn(str,"0123456789ABCDEFabcdef") == (len-1)) &&
+                    (tolower(str[len - 1]) == 'h'))
                (void) sscanf(str, "%x", &hval);
 
        /* accept 0onn, \onnn, onnn and \nnn forms for octal */
@@ -319,7 +324,7 @@ static void ascii(char *str)
     }
 
     if (sscanf(str, "%d/%d", &hi, &lo) == 2)    /* code table reference?  */
-       { speak(hi*16 + lo); return; }
+    { speak(hi*16 + lo); return; }
     else if (len > 1 && isalpha(str[0]))       /* try to match long names */
     {
        char    canbuf[BUFSIZ], *ep;