1 2 /* The following macros are 15-20% faster than using the usual [but 3 * much more compact] (c + 1 - '0') sort of translation. 4 */ 5 #define translate_octal(cc, s) \ 6 { \ 7 register i; \ 8 for (cc = 0, i=4; isdigit(*s) && *s != '8' && *s != '9' && --i != 0;) { \ 9 cc <<= 3; \ 10 switch (*s++) { \ 11 case '0': \ 12 break; \ 13 case '1': \ 14 cc |= 1; \ 15 break; \ 16 case '2': \ 17 cc |= 2; \ 18 break; \ 19 case '3': \ 20 cc |= 3; \ 21 break; \ 22 case '4': \ 23 cc |= 4; \ 24 break; \ 25 case '5': \ 26 cc |= 5; \ 27 break; \ 28 case '6': \ 29 cc |= 6; \ 30 break; \ 31 default: \ 32 cc |= 7; \ 33 break; \ 34 } \ 35 } \ 36 } 37 38 #define translate_hex(cc, s) \ 39 { \ 40 for (cc = 0; isxdigit(*s); ) { \ 41 cc <<= 4; \ 42 switch (*s++) { \ 43 case '0': \ 44 break; \ 45 case '1': \ 46 cc |= 1; \ 47 break; \ 48 case '2': \ 49 cc |= 2; \ 50 break; \ 51 case '3': \ 52 cc |= 3; \ 53 break; \ 54 case '4': \ 55 cc |= 4; \ 56 break; \ 57 case '5': \ 58 cc |= 5; \ 59 break; \ 60 case '6': \ 61 cc |= 6; \ 62 break; \ 63 case '7': \ 64 cc |= 7; \ 65 break; \ 66 case '8': \ 67 cc |= 8; \ 68 break; \ 69 case '9': \ 70 cc |= 9; \ 71 break; \ 72 case 'a': \ 73 case 'A': \ 74 cc |= 10; \ 75 break; \ 76 case 'b': \ 77 case 'B': \ 78 cc |= 11; \ 79 break; \ 80 case 'c': \ 81 case 'C': \ 82 cc |= 12; \ 83 break; \ 84 case 'd': \ 85 case 'D': \ 86 cc |= 13; \ 87 break; \ 88 case 'e': \ 89 case 'E': \ 90 cc |= 14; \ 91 break; \ 92 default: \ 93 cc |= 15; \ 94 break; \ 95 } \ 96 } \ 97 } 98