1 /*-
2 * Copyright (c) 1992, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 * Copyright (c) 1992, 1993, 1994, 1995, 1996
5 * Keith Bostic. All rights reserved.
6 *
7 * See the LICENSE file for redistribution information.
8 */
9
10 #ifndef MULTIBYTE_H
11 #define MULTIBYTE_H
12
13 /*
14 * Fundamental character types.
15 *
16 * CHAR_T An integral type that can hold any character.
17 * ARG_CHAR_T The type of a CHAR_T when passed as an argument using
18 * traditional promotion rules. It should also be able
19 * to be compared against any CHAR_T for equality without
20 * problems.
21 * UCHAR_T The shortest unified character type (8-bit clean).
22 * RCHAR_T The character type used by the internal regex engine.
23 *
24 * If no integral type can hold a character, don't even try the port.
25 */
26 typedef int ARG_CHAR_T;
27
28 #ifdef USE_WIDECHAR
29 #include <wchar.h>
30 #include <wctype.h>
31
32 typedef wchar_t CHAR_T;
33 typedef wint_t UCHAR_T;
34 typedef wchar_t RCHAR_T;
35 #define REOF WEOF
36
37 #define STRLEN wcslen
38 #define STRTOL wcstol
39 #define STRTOUL wcstoul
40 #define SPRINTF swprintf
41 #define STRCMP wcscmp
42 #define STRPBRK wcspbrk
43 #define ISBLANK iswblank
44 #define ISCNTRL iswcntrl
45 #define ISDIGIT iswdigit
46 #define ISXDIGIT iswxdigit
47 #define ISGRAPH iswgraph
48 #define ISLOWER iswlower
49 #define ISPRINT iswprint
50 #define ISPUNCT iswpunct
51 #define ISSPACE iswspace
52 #define ISUPPER iswupper
53 #define TOLOWER towlower
54 #define TOUPPER towupper
55 #define STRSET wmemset
56 #define STRCHR wcschr
57 #define STRRCHR wcsrchr
58 #define GETC getwc
59
60 #define L(ch) L ## ch
61 #define WS "%ls"
62 #define WVS "%*ls"
63 #define WC "%lc"
64
65 #else
66 typedef u_char CHAR_T;
67 typedef u_char UCHAR_T;
68 typedef char RCHAR_T;
69 #define REOF EOF
70
71 #define STRLEN strlen
72 #define STRTOL(a,b,c) (strtol(a,(char**)b,c))
73 #define STRTOUL(a,b,c) (strtoul(a,(char**)b,c))
74 #define SPRINTF snprintf
75 #define STRCMP strcmp
76 #define STRPBRK strpbrk
77 #define ISBLANK isblank
78 #define ISCNTRL iscntrl
79 #define ISDIGIT isdigit
80 #define ISXDIGIT isxdigit
81 #define ISGRAPH isgraph
82 #define ISLOWER islower
83 #define ISPRINT isprint
84 #define ISPUNCT ispunct
85 #define ISSPACE isspace
86 #define ISUPPER isupper
87 #define TOLOWER tolower
88 #define TOUPPER toupper
89 #define STRSET memset
90 #define STRCHR strchr
91 #define STRRCHR strrchr
92 #define GETC getc
93
94 #define L(ch) ch
95 #define WS "%s"
96 #define WVS "%*s"
97 #define WC "%c"
98
99 #endif
100
101 #if defined(USE_WIDECHAR) && defined(DEBUG)
102 #define MEMCPY wmemcpy
103 #define MEMMOVE wmemmove
104 #define MEMCMP wmemcmp
105 #else
106 #define MEMCPY(p, t, len) memcpy(p, t, (len) * sizeof(CHAR_T))
107 #define MEMMOVE(p, t, len) memmove(p, t, (len) * sizeof(CHAR_T))
108 #define MEMCMP(p, t, len) memcmp(p, t, (len) * sizeof(CHAR_T))
109 #endif
110
111 #define SIZE(w) (sizeof(w) / sizeof(*w))
112
113 /*
114 * Locale insensitive character category detection.
115 */
116
117 static __inline int
isatoz(CHAR_T c)118 isatoz(CHAR_T c)
119 {
120 return 'a' <= c && c <= 'z';
121 }
122
123 static __inline int
isAtoZ(CHAR_T c)124 isAtoZ(CHAR_T c)
125 {
126 return 'A' <= c && c <= 'Z';
127 }
128
129 static __inline int
is0to9(CHAR_T c)130 is0to9(CHAR_T c)
131 {
132 return '0' <= c && c <= '9';
133 }
134
135 static __inline int
isazAZ(CHAR_T c)136 isazAZ(CHAR_T c)
137 {
138 return isatoz(c) || isAtoZ(c);
139 }
140
141 static __inline int
is09azAZ(CHAR_T c)142 is09azAZ(CHAR_T c)
143 {
144 return is0to9(c) || isazAZ(c);
145 }
146
147 #endif
148