From: Eric S. Raymond Date: Thu, 10 Mar 2011 04:44:42 +0000 (-0500) Subject: Interpret single-sidigit single chars. From Random832 X-Git-Tag: 3.11~4 X-Git-Url: http://thyrsus.com/gitweb/?a=commitdiff_plain;h=ec0f8af3347e626d84776a26b3b30670a009a8ec;p=ascii.git Interpret single-sidigit single chars. From Random832 --- diff --git a/ascii.c b/ascii.c index 0e53d83..40b4301 100644 --- 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;