This source file includes following definitions.
- mb_width_aux
- mb_copy
- is_basic
- is_basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144 #ifndef _MBCHAR_H
145 #define _MBCHAR_H 1
146
147 #include <stdbool.h>
148 #include <string.h>
149 #include <wchar.h>
150 #include <wctype.h>
151
152 #ifndef _GL_INLINE_HEADER_BEGIN
153 #error "Please include config.h first."
154 #endif
155 _GL_INLINE_HEADER_BEGIN
156 #ifndef MBCHAR_INLINE
157 # define MBCHAR_INLINE _GL_INLINE
158 #endif
159
160 #define MBCHAR_BUF_SIZE 24
161
162 struct mbchar
163 {
164 const char *ptr;
165 size_t bytes;
166 bool wc_valid;
167 wchar_t wc;
168 char buf[MBCHAR_BUF_SIZE];
169 };
170
171
172
173
174 typedef struct mbchar mbchar_t;
175
176
177 #define mb_ptr(mbc) ((mbc).ptr)
178 #define mb_len(mbc) ((mbc).bytes)
179
180
181 #define mb_iseq(mbc, sc) ((mbc).wc_valid && (mbc).wc == (sc))
182 #define mb_isnul(mbc) ((mbc).wc_valid && (mbc).wc == 0)
183 #define mb_cmp(mbc1, mbc2) \
184 ((mbc1).wc_valid \
185 ? ((mbc2).wc_valid \
186 ? (int) (mbc1).wc - (int) (mbc2).wc \
187 : -1) \
188 : ((mbc2).wc_valid \
189 ? 1 \
190 : (mbc1).bytes == (mbc2).bytes \
191 ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \
192 : (mbc1).bytes < (mbc2).bytes \
193 ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
194 : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
195 #define mb_casecmp(mbc1, mbc2) \
196 ((mbc1).wc_valid \
197 ? ((mbc2).wc_valid \
198 ? (int) towlower ((mbc1).wc) - (int) towlower ((mbc2).wc) \
199 : -1) \
200 : ((mbc2).wc_valid \
201 ? 1 \
202 : (mbc1).bytes == (mbc2).bytes \
203 ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \
204 : (mbc1).bytes < (mbc2).bytes \
205 ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
206 : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
207 #define mb_equal(mbc1, mbc2) \
208 ((mbc1).wc_valid && (mbc2).wc_valid \
209 ? (mbc1).wc == (mbc2).wc \
210 : (mbc1).bytes == (mbc2).bytes \
211 && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
212 #define mb_caseequal(mbc1, mbc2) \
213 ((mbc1).wc_valid && (mbc2).wc_valid \
214 ? towlower ((mbc1).wc) == towlower ((mbc2).wc) \
215 : (mbc1).bytes == (mbc2).bytes \
216 && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
217
218
219 #define mb_isascii(mbc) \
220 ((mbc).wc_valid && (mbc).wc >= 0 && (mbc).wc <= 127)
221 #define mb_isalnum(mbc) ((mbc).wc_valid && iswalnum ((mbc).wc))
222 #define mb_isalpha(mbc) ((mbc).wc_valid && iswalpha ((mbc).wc))
223 #define mb_isblank(mbc) ((mbc).wc_valid && iswblank ((mbc).wc))
224 #define mb_iscntrl(mbc) ((mbc).wc_valid && iswcntrl ((mbc).wc))
225 #define mb_isdigit(mbc) ((mbc).wc_valid && iswdigit ((mbc).wc))
226 #define mb_isgraph(mbc) ((mbc).wc_valid && iswgraph ((mbc).wc))
227 #define mb_islower(mbc) ((mbc).wc_valid && iswlower ((mbc).wc))
228 #define mb_isprint(mbc) ((mbc).wc_valid && iswprint ((mbc).wc))
229 #define mb_ispunct(mbc) ((mbc).wc_valid && iswpunct ((mbc).wc))
230 #define mb_isspace(mbc) ((mbc).wc_valid && iswspace ((mbc).wc))
231 #define mb_isupper(mbc) ((mbc).wc_valid && iswupper ((mbc).wc))
232 #define mb_isxdigit(mbc) ((mbc).wc_valid && iswxdigit ((mbc).wc))
233
234
235
236
237 #define MB_UNPRINTABLE_WIDTH 1
238
239 MBCHAR_INLINE int
240 mb_width_aux (wint_t wc)
241 {
242 int w = wcwidth (wc);
243
244
245 return (w >= 0 ? w : iswcntrl (wc) ? 0 : MB_UNPRINTABLE_WIDTH);
246 }
247
248 #define mb_width(mbc) \
249 ((mbc).wc_valid ? mb_width_aux ((mbc).wc) : MB_UNPRINTABLE_WIDTH)
250
251
252 #define mb_putc(mbc, stream) fwrite ((mbc).ptr, 1, (mbc).bytes, (stream))
253
254
255 #define mb_setascii(mbc, sc) \
256 ((mbc)->ptr = (mbc)->buf, (mbc)->bytes = 1, (mbc)->wc_valid = 1, \
257 (mbc)->wc = (mbc)->buf[0] = (sc))
258
259
260 MBCHAR_INLINE void
261 mb_copy (mbchar_t *new_mbc, const mbchar_t *old_mbc)
262 {
263 if (old_mbc->ptr == &old_mbc->buf[0])
264 {
265 memcpy (&new_mbc->buf[0], &old_mbc->buf[0], old_mbc->bytes);
266 new_mbc->ptr = &new_mbc->buf[0];
267 }
268 else
269 new_mbc->ptr = old_mbc->ptr;
270 new_mbc->bytes = old_mbc->bytes;
271 if ((new_mbc->wc_valid = old_mbc->wc_valid))
272 new_mbc->wc = old_mbc->wc;
273 }
274
275
276
277
278
279
280 #if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
281 && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
282 && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
283 && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
284 && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
285 && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
286 && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
287 && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
288 && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
289 && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
290 && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
291 && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
292 && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
293 && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
294 && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
295 && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
296 && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
297 && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
298 && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
299 && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
300 && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
301 && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
302 && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
303
304 # define IS_BASIC_ASCII 1
305
306 extern const unsigned int is_basic_table[];
307
308 MBCHAR_INLINE bool
309 is_basic (char c)
310 {
311 return (is_basic_table [(unsigned char) c >> 5] >> ((unsigned char) c & 31))
312 & 1;
313 }
314
315 #else
316
317 MBCHAR_INLINE bool
318 is_basic (char c)
319 {
320 switch (c)
321 {
322 case '\t': case '\v': case '\f':
323 case ' ': case '!': case '"': case '#': case '%':
324 case '&': case '\'': case '(': case ')': case '*':
325 case '+': case ',': case '-': case '.': case '/':
326 case '0': case '1': case '2': case '3': case '4':
327 case '5': case '6': case '7': case '8': case '9':
328 case ':': case ';': case '<': case '=': case '>':
329 case '?':
330 case 'A': case 'B': case 'C': case 'D': case 'E':
331 case 'F': case 'G': case 'H': case 'I': case 'J':
332 case 'K': case 'L': case 'M': case 'N': case 'O':
333 case 'P': case 'Q': case 'R': case 'S': case 'T':
334 case 'U': case 'V': case 'W': case 'X': case 'Y':
335 case 'Z':
336 case '[': case '\\': case ']': case '^': case '_':
337 case 'a': case 'b': case 'c': case 'd': case 'e':
338 case 'f': case 'g': case 'h': case 'i': case 'j':
339 case 'k': case 'l': case 'm': case 'n': case 'o':
340 case 'p': case 'q': case 'r': case 's': case 't':
341 case 'u': case 'v': case 'w': case 'x': case 'y':
342 case 'z': case '{': case '|': case '}': case '~':
343 return 1;
344 default:
345 return 0;
346 }
347 }
348
349 #endif
350
351 _GL_INLINE_HEADER_END
352
353 #endif