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