fa3539fd03174cdd8ba2063adeb2875159b9f34f
[gnulib.git] / lib / unictype.in.h
1 /* Unicode character classification and properties.
2    Copyright (C) 2002, 2005-2011 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify it
5    under the terms of the GNU Lesser General Public License as published
6    by the Free Software Foundation; either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 #ifndef _UNICTYPE_H
18 #define _UNICTYPE_H
19
20 #include "unitypes.h"
21
22 /* Get bool.  */
23 #include <stdbool.h>
24
25 /* Get size_t.  */
26 #include <stddef.h>
27
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31
32 /* ========================================================================= */
33
34 /* Field 1 of Unicode Character Database: Character name.
35    See "uniname.h".  */
36
37 /* ========================================================================= */
38
39 /* Field 2 of Unicode Character Database: General category.  */
40
41 /* Data type denoting a General category value.  This is not just a bitmask,
42    but rather a bitmask and a pointer to the lookup table, so that programs
43    that use only the predefined bitmasks (i.e. don't combine bitmasks with &
44    and |) don't have a link-time dependency towards the big general table.  */
45 typedef struct
46 {
47   uint32_t bitmask : 31;
48   /*bool*/ unsigned int generic : 1;
49   union
50   {
51     const void *table;                               /* when generic is 0 */
52     bool (*lookup_fn) (ucs4_t uc, uint32_t bitmask); /* when generic is 1 */
53   } lookup;
54 }
55 uc_general_category_t;
56
57 /* Bits and bit masks denoting General category values.  UnicodeData-3.2.0.html
58    says a 32-bit integer will always suffice to represent them.
59    These bit masks can only be used with the uc_is_general_category_withtable
60    function.  */
61 enum
62 {
63   UC_CATEGORY_MASK_L  = 0x0000001f,
64   UC_CATEGORY_MASK_Lu = 0x00000001,
65   UC_CATEGORY_MASK_Ll = 0x00000002,
66   UC_CATEGORY_MASK_Lt = 0x00000004,
67   UC_CATEGORY_MASK_Lm = 0x00000008,
68   UC_CATEGORY_MASK_Lo = 0x00000010,
69   UC_CATEGORY_MASK_M  = 0x000000e0,
70   UC_CATEGORY_MASK_Mn = 0x00000020,
71   UC_CATEGORY_MASK_Mc = 0x00000040,
72   UC_CATEGORY_MASK_Me = 0x00000080,
73   UC_CATEGORY_MASK_N  = 0x00000700,
74   UC_CATEGORY_MASK_Nd = 0x00000100,
75   UC_CATEGORY_MASK_Nl = 0x00000200,
76   UC_CATEGORY_MASK_No = 0x00000400,
77   UC_CATEGORY_MASK_P  = 0x0003f800,
78   UC_CATEGORY_MASK_Pc = 0x00000800,
79   UC_CATEGORY_MASK_Pd = 0x00001000,
80   UC_CATEGORY_MASK_Ps = 0x00002000,
81   UC_CATEGORY_MASK_Pe = 0x00004000,
82   UC_CATEGORY_MASK_Pi = 0x00008000,
83   UC_CATEGORY_MASK_Pf = 0x00010000,
84   UC_CATEGORY_MASK_Po = 0x00020000,
85   UC_CATEGORY_MASK_S  = 0x003c0000,
86   UC_CATEGORY_MASK_Sm = 0x00040000,
87   UC_CATEGORY_MASK_Sc = 0x00080000,
88   UC_CATEGORY_MASK_Sk = 0x00100000,
89   UC_CATEGORY_MASK_So = 0x00200000,
90   UC_CATEGORY_MASK_Z  = 0x01c00000,
91   UC_CATEGORY_MASK_Zs = 0x00400000,
92   UC_CATEGORY_MASK_Zl = 0x00800000,
93   UC_CATEGORY_MASK_Zp = 0x01000000,
94   UC_CATEGORY_MASK_C  = 0x3e000000,
95   UC_CATEGORY_MASK_Cc = 0x02000000,
96   UC_CATEGORY_MASK_Cf = 0x04000000,
97   UC_CATEGORY_MASK_Cs = 0x08000000,
98   UC_CATEGORY_MASK_Co = 0x10000000,
99   UC_CATEGORY_MASK_Cn = 0x20000000
100 };
101
102 /* Predefined General category values.  */
103 extern const uc_general_category_t UC_CATEGORY_L;
104 extern const uc_general_category_t UC_CATEGORY_Lu;
105 extern const uc_general_category_t UC_CATEGORY_Ll;
106 extern const uc_general_category_t UC_CATEGORY_Lt;
107 extern const uc_general_category_t UC_CATEGORY_Lm;
108 extern const uc_general_category_t UC_CATEGORY_Lo;
109 extern const uc_general_category_t UC_CATEGORY_M;
110 extern const uc_general_category_t UC_CATEGORY_Mn;
111 extern const uc_general_category_t UC_CATEGORY_Mc;
112 extern const uc_general_category_t UC_CATEGORY_Me;
113 extern const uc_general_category_t UC_CATEGORY_N;
114 extern const uc_general_category_t UC_CATEGORY_Nd;
115 extern const uc_general_category_t UC_CATEGORY_Nl;
116 extern const uc_general_category_t UC_CATEGORY_No;
117 extern const uc_general_category_t UC_CATEGORY_P;
118 extern const uc_general_category_t UC_CATEGORY_Pc;
119 extern const uc_general_category_t UC_CATEGORY_Pd;
120 extern const uc_general_category_t UC_CATEGORY_Ps;
121 extern const uc_general_category_t UC_CATEGORY_Pe;
122 extern const uc_general_category_t UC_CATEGORY_Pi;
123 extern const uc_general_category_t UC_CATEGORY_Pf;
124 extern const uc_general_category_t UC_CATEGORY_Po;
125 extern const uc_general_category_t UC_CATEGORY_S;
126 extern const uc_general_category_t UC_CATEGORY_Sm;
127 extern const uc_general_category_t UC_CATEGORY_Sc;
128 extern const uc_general_category_t UC_CATEGORY_Sk;
129 extern const uc_general_category_t UC_CATEGORY_So;
130 extern const uc_general_category_t UC_CATEGORY_Z;
131 extern const uc_general_category_t UC_CATEGORY_Zs;
132 extern const uc_general_category_t UC_CATEGORY_Zl;
133 extern const uc_general_category_t UC_CATEGORY_Zp;
134 extern const uc_general_category_t UC_CATEGORY_C;
135 extern const uc_general_category_t UC_CATEGORY_Cc;
136 extern const uc_general_category_t UC_CATEGORY_Cf;
137 extern const uc_general_category_t UC_CATEGORY_Cs;
138 extern const uc_general_category_t UC_CATEGORY_Co;
139 extern const uc_general_category_t UC_CATEGORY_Cn;
140 /* Non-public.  */
141 extern const uc_general_category_t _UC_CATEGORY_NONE;
142
143 /* Alias names for predefined General category values.  */
144 #define UC_LETTER                    UC_CATEGORY_L
145 #define UC_UPPERCASE_LETTER          UC_CATEGORY_Lu
146 #define UC_LOWERCASE_LETTER          UC_CATEGORY_Ll
147 #define UC_TITLECASE_LETTER          UC_CATEGORY_Lt
148 #define UC_MODIFIER_LETTER           UC_CATEGORY_Lm
149 #define UC_OTHER_LETTER              UC_CATEGORY_Lo
150 #define UC_MARK                      UC_CATEGORY_M
151 #define UC_NON_SPACING_MARK          UC_CATEGORY_Mn
152 #define UC_COMBINING_SPACING_MARK    UC_CATEGORY_Mc
153 #define UC_ENCLOSING_MARK            UC_CATEGORY_Me
154 #define UC_NUMBER                    UC_CATEGORY_N
155 #define UC_DECIMAL_DIGIT_NUMBER      UC_CATEGORY_Nd
156 #define UC_LETTER_NUMBER             UC_CATEGORY_Nl
157 #define UC_OTHER_NUMBER              UC_CATEGORY_No
158 #define UC_PUNCTUATION               UC_CATEGORY_P
159 #define UC_CONNECTOR_PUNCTUATION     UC_CATEGORY_Pc
160 #define UC_DASH_PUNCTUATION          UC_CATEGORY_Pd
161 #define UC_OPEN_PUNCTUATION          UC_CATEGORY_Ps /* a.k.a. UC_START_PUNCTUATION */
162 #define UC_CLOSE_PUNCTUATION         UC_CATEGORY_Pe /* a.k.a. UC_END_PUNCTUATION */
163 #define UC_INITIAL_QUOTE_PUNCTUATION UC_CATEGORY_Pi
164 #define UC_FINAL_QUOTE_PUNCTUATION   UC_CATEGORY_Pf
165 #define UC_OTHER_PUNCTUATION         UC_CATEGORY_Po
166 #define UC_SYMBOL                    UC_CATEGORY_S
167 #define UC_MATH_SYMBOL               UC_CATEGORY_Sm
168 #define UC_CURRENCY_SYMBOL           UC_CATEGORY_Sc
169 #define UC_MODIFIER_SYMBOL           UC_CATEGORY_Sk
170 #define UC_OTHER_SYMBOL              UC_CATEGORY_So
171 #define UC_SEPARATOR                 UC_CATEGORY_Z
172 #define UC_SPACE_SEPARATOR           UC_CATEGORY_Zs
173 #define UC_LINE_SEPARATOR            UC_CATEGORY_Zl
174 #define UC_PARAGRAPH_SEPARATOR       UC_CATEGORY_Zp
175 #define UC_OTHER                     UC_CATEGORY_C
176 #define UC_CONTROL                   UC_CATEGORY_Cc
177 #define UC_FORMAT                    UC_CATEGORY_Cf
178 #define UC_SURROGATE                 UC_CATEGORY_Cs /* all of them are invalid characters */
179 #define UC_PRIVATE_USE               UC_CATEGORY_Co
180 #define UC_UNASSIGNED                UC_CATEGORY_Cn /* some of them are invalid characters */
181
182 /* Return the union of two general categories.
183    This corresponds to the unions of the two sets of characters.  */
184 extern uc_general_category_t
185        uc_general_category_or (uc_general_category_t category1,
186                                uc_general_category_t category2);
187
188 /* Return the intersection of two general categories as bit masks.
189    This *does*not* correspond to the intersection of the two sets of
190    characters.  */
191 extern uc_general_category_t
192        uc_general_category_and (uc_general_category_t category1,
193                                 uc_general_category_t category2);
194
195 /* Return the intersection of a general category with the complement of a
196    second general category, as bit masks.
197    This *does*not* correspond to the intersection with complement, when
198    viewing the categories as sets of characters.  */
199 extern uc_general_category_t
200        uc_general_category_and_not (uc_general_category_t category1,
201                                     uc_general_category_t category2);
202
203 /* Return the name of a general category.  */
204 extern const char *
205        uc_general_category_name (uc_general_category_t category);
206
207 /* Return the general category given by name, e.g. "Lu".  */
208 extern uc_general_category_t
209        uc_general_category_byname (const char *category_name);
210
211 /* Return the general category of a Unicode character.  */
212 extern uc_general_category_t
213        uc_general_category (ucs4_t uc);
214
215 /* Test whether a Unicode character belongs to a given category.
216    The CATEGORY argument can be the combination of several predefined
217    general categories.  */
218 extern bool
219        uc_is_general_category (ucs4_t uc, uc_general_category_t category);
220 /* Likewise.  This function uses a big table comprising all categories.  */
221 extern bool
222        uc_is_general_category_withtable (ucs4_t uc, uint32_t bitmask);
223
224 /* ========================================================================= */
225
226 /* Field 3 of Unicode Character Database: Canonical combining class.  */
227
228 /* The possible results of uc_combining_class (0..255) are described in
229    UCD.html.  The list here is not definitive; more values can be added
230    in future versions.  */
231 enum
232 {
233   UC_CCC_NR   =   0, /* Not Reordered */
234   UC_CCC_OV   =   1, /* Overlay */
235   UC_CCC_NK   =   7, /* Nukta */
236   UC_CCC_KV   =   8, /* Kana Voicing */
237   UC_CCC_VR   =   9, /* Virama */
238   UC_CCC_ATBL = 200, /* Attached Below Left */
239   UC_CCC_ATB  = 202, /* Attached Below */
240   UC_CCC_ATAR = 216, /* Attached Above Right */
241   UC_CCC_BL   = 218, /* Below Left */
242   UC_CCC_B    = 220, /* Below */
243   UC_CCC_BR   = 222, /* Below Right */
244   UC_CCC_L    = 224, /* Left */
245   UC_CCC_R    = 226, /* Right */
246   UC_CCC_AL   = 228, /* Above Left */
247   UC_CCC_A    = 230, /* Above */
248   UC_CCC_AR   = 232, /* Above Right */
249   UC_CCC_DB   = 233, /* Double Below */
250   UC_CCC_DA   = 234, /* Double Above */
251   UC_CCC_IS   = 240  /* Iota Subscript */
252 };
253
254 /* Return the canonical combining class of a Unicode character.  */
255 extern int
256        uc_combining_class (ucs4_t uc);
257
258 /* ========================================================================= */
259
260 /* Field 4 of Unicode Character Database: Bidirectional category.  */
261
262 enum
263 {
264   UC_BIDI_L,   /* Left-to-Right */
265   UC_BIDI_LRE, /* Left-to-Right Embedding */
266   UC_BIDI_LRO, /* Left-to-Right Override */
267   UC_BIDI_R,   /* Right-to-Left */
268   UC_BIDI_AL,  /* Right-to-Left Arabic */
269   UC_BIDI_RLE, /* Right-to-Left Embedding */
270   UC_BIDI_RLO, /* Right-to-Left Override */
271   UC_BIDI_PDF, /* Pop Directional Format */
272   UC_BIDI_EN,  /* European Number */
273   UC_BIDI_ES,  /* European Number Separator */
274   UC_BIDI_ET,  /* European Number Terminator */
275   UC_BIDI_AN,  /* Arabic Number */
276   UC_BIDI_CS,  /* Common Number Separator */
277   UC_BIDI_NSM, /* Non-Spacing Mark */
278   UC_BIDI_BN,  /* Boundary Neutral */
279   UC_BIDI_B,   /* Paragraph Separator */
280   UC_BIDI_S,   /* Segment Separator */
281   UC_BIDI_WS,  /* Whitespace */
282   UC_BIDI_ON   /* Other Neutral */
283 };
284
285 /* Return the name of a bidirectional category.  */
286 extern const char *
287        uc_bidi_category_name (int category);
288
289 /* Return the bidirectional category given by name, e.g. "LRE".  */
290 extern int
291        uc_bidi_category_byname (const char *category_name);
292
293 /* Return the bidirectional category of a Unicode character.  */
294 extern int
295        uc_bidi_category (ucs4_t uc);
296
297 /* Test whether a Unicode character belongs to a given bidirectional
298    category.  */
299 extern bool
300        uc_is_bidi_category (ucs4_t uc, int category);
301
302 /* ========================================================================= */
303
304 /* Field 5 of Unicode Character Database: Character decomposition mapping.
305    See "uninorm.h".  */
306
307 /* ========================================================================= */
308
309 /* Field 6 of Unicode Character Database: Decimal digit value.  */
310
311 /* Return the decimal digit value of a Unicode character.  */
312 extern int
313        uc_decimal_value (ucs4_t uc);
314
315 /* ========================================================================= */
316
317 /* Field 7 of Unicode Character Database: Digit value.  */
318
319 /* Return the digit value of a Unicode character.  */
320 extern int
321        uc_digit_value (ucs4_t uc);
322
323 /* ========================================================================= */
324
325 /* Field 8 of Unicode Character Database: Numeric value.  */
326
327 /* Return the numeric value of a Unicode character.  */
328 typedef struct
329 {
330   int numerator;
331   int denominator;
332 }
333 uc_fraction_t;
334 extern uc_fraction_t
335        uc_numeric_value (ucs4_t uc);
336
337 /* ========================================================================= */
338
339 /* Field 9 of Unicode Character Database: Mirrored.  */
340
341 /* Return the mirrored character of a Unicode character UC in *PUC.  */
342 extern bool
343        uc_mirror_char (ucs4_t uc, ucs4_t *puc);
344
345 /* ========================================================================= */
346
347 /* Field 10 of Unicode Character Database: Unicode 1.0 Name.
348    Not available in this library.  */
349
350 /* ========================================================================= */
351
352 /* Field 11 of Unicode Character Database: ISO 10646 comment.
353    Not available in this library.  */
354
355 /* ========================================================================= */
356
357 /* Field 12, 13, 14 of Unicode Character Database: Uppercase mapping,
358    lowercase mapping, titlecase mapping.  See "unicase.h".  */
359
360 /* ========================================================================= */
361
362 /* Common API for properties.  */
363
364 /* Data type denoting a property.  This is not just a number, but rather a
365    pointer to the test functions, so that programs that use only few of the
366    properties don't have a link-time dependency towards all the tables.  */
367 typedef struct
368 {
369   bool (*test_fn) (ucs4_t uc);
370 }
371 uc_property_t;
372
373 /* Predefined properties.  */
374 /* General.  */
375 extern const uc_property_t UC_PROPERTY_WHITE_SPACE;
376 extern const uc_property_t UC_PROPERTY_ALPHABETIC;
377 extern const uc_property_t UC_PROPERTY_OTHER_ALPHABETIC;
378 extern const uc_property_t UC_PROPERTY_NOT_A_CHARACTER;
379 extern const uc_property_t UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT;
380 extern const uc_property_t UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT;
381 extern const uc_property_t UC_PROPERTY_DEPRECATED;
382 extern const uc_property_t UC_PROPERTY_LOGICAL_ORDER_EXCEPTION;
383 extern const uc_property_t UC_PROPERTY_VARIATION_SELECTOR;
384 extern const uc_property_t UC_PROPERTY_PRIVATE_USE;
385 extern const uc_property_t UC_PROPERTY_UNASSIGNED_CODE_VALUE;
386 /* Case.  */
387 extern const uc_property_t UC_PROPERTY_UPPERCASE;
388 extern const uc_property_t UC_PROPERTY_OTHER_UPPERCASE;
389 extern const uc_property_t UC_PROPERTY_LOWERCASE;
390 extern const uc_property_t UC_PROPERTY_OTHER_LOWERCASE;
391 extern const uc_property_t UC_PROPERTY_TITLECASE;
392 extern const uc_property_t UC_PROPERTY_CASED;
393 extern const uc_property_t UC_PROPERTY_CASE_IGNORABLE;
394 extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_LOWERCASED;
395 extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_UPPERCASED;
396 extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_TITLECASED;
397 extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEFOLDED;
398 extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEMAPPED;
399 extern const uc_property_t UC_PROPERTY_SOFT_DOTTED;
400 /* Identifiers.  */
401 extern const uc_property_t UC_PROPERTY_ID_START;
402 extern const uc_property_t UC_PROPERTY_OTHER_ID_START;
403 extern const uc_property_t UC_PROPERTY_ID_CONTINUE;
404 extern const uc_property_t UC_PROPERTY_OTHER_ID_CONTINUE;
405 extern const uc_property_t UC_PROPERTY_XID_START;
406 extern const uc_property_t UC_PROPERTY_XID_CONTINUE;
407 extern const uc_property_t UC_PROPERTY_PATTERN_WHITE_SPACE;
408 extern const uc_property_t UC_PROPERTY_PATTERN_SYNTAX;
409 /* Shaping and rendering.  */
410 extern const uc_property_t UC_PROPERTY_JOIN_CONTROL;
411 extern const uc_property_t UC_PROPERTY_GRAPHEME_BASE;
412 extern const uc_property_t UC_PROPERTY_GRAPHEME_EXTEND;
413 extern const uc_property_t UC_PROPERTY_OTHER_GRAPHEME_EXTEND;
414 extern const uc_property_t UC_PROPERTY_GRAPHEME_LINK;
415 /* Bidi.  */
416 extern const uc_property_t UC_PROPERTY_BIDI_CONTROL;
417 extern const uc_property_t UC_PROPERTY_BIDI_LEFT_TO_RIGHT;
418 extern const uc_property_t UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT;
419 extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT;
420 extern const uc_property_t UC_PROPERTY_BIDI_EUROPEAN_DIGIT;
421 extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR;
422 extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR;
423 extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_DIGIT;
424 extern const uc_property_t UC_PROPERTY_BIDI_COMMON_SEPARATOR;
425 extern const uc_property_t UC_PROPERTY_BIDI_BLOCK_SEPARATOR;
426 extern const uc_property_t UC_PROPERTY_BIDI_SEGMENT_SEPARATOR;
427 extern const uc_property_t UC_PROPERTY_BIDI_WHITESPACE;
428 extern const uc_property_t UC_PROPERTY_BIDI_NON_SPACING_MARK;
429 extern const uc_property_t UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL;
430 extern const uc_property_t UC_PROPERTY_BIDI_PDF;
431 extern const uc_property_t UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE;
432 extern const uc_property_t UC_PROPERTY_BIDI_OTHER_NEUTRAL;
433 /* Numeric.  */
434 extern const uc_property_t UC_PROPERTY_HEX_DIGIT;
435 extern const uc_property_t UC_PROPERTY_ASCII_HEX_DIGIT;
436 /* CJK.  */
437 extern const uc_property_t UC_PROPERTY_IDEOGRAPHIC;
438 extern const uc_property_t UC_PROPERTY_UNIFIED_IDEOGRAPH;
439 extern const uc_property_t UC_PROPERTY_RADICAL;
440 extern const uc_property_t UC_PROPERTY_IDS_BINARY_OPERATOR;
441 extern const uc_property_t UC_PROPERTY_IDS_TRINARY_OPERATOR;
442 /* Misc.  */
443 extern const uc_property_t UC_PROPERTY_ZERO_WIDTH;
444 extern const uc_property_t UC_PROPERTY_SPACE;
445 extern const uc_property_t UC_PROPERTY_NON_BREAK;
446 extern const uc_property_t UC_PROPERTY_ISO_CONTROL;
447 extern const uc_property_t UC_PROPERTY_FORMAT_CONTROL;
448 extern const uc_property_t UC_PROPERTY_DASH;
449 extern const uc_property_t UC_PROPERTY_HYPHEN;
450 extern const uc_property_t UC_PROPERTY_PUNCTUATION;
451 extern const uc_property_t UC_PROPERTY_LINE_SEPARATOR;
452 extern const uc_property_t UC_PROPERTY_PARAGRAPH_SEPARATOR;
453 extern const uc_property_t UC_PROPERTY_QUOTATION_MARK;
454 extern const uc_property_t UC_PROPERTY_SENTENCE_TERMINAL;
455 extern const uc_property_t UC_PROPERTY_TERMINAL_PUNCTUATION;
456 extern const uc_property_t UC_PROPERTY_CURRENCY_SYMBOL;
457 extern const uc_property_t UC_PROPERTY_MATH;
458 extern const uc_property_t UC_PROPERTY_OTHER_MATH;
459 extern const uc_property_t UC_PROPERTY_PAIRED_PUNCTUATION;
460 extern const uc_property_t UC_PROPERTY_LEFT_OF_PAIR;
461 extern const uc_property_t UC_PROPERTY_COMBINING;
462 extern const uc_property_t UC_PROPERTY_COMPOSITE;
463 extern const uc_property_t UC_PROPERTY_DECIMAL_DIGIT;
464 extern const uc_property_t UC_PROPERTY_NUMERIC;
465 extern const uc_property_t UC_PROPERTY_DIACRITIC;
466 extern const uc_property_t UC_PROPERTY_EXTENDER;
467 extern const uc_property_t UC_PROPERTY_IGNORABLE_CONTROL;
468
469 /* Return the property given by name, e.g. "White space".  */
470 extern uc_property_t
471        uc_property_byname (const char *property_name);
472
473 /* Test whether a property is valid.  */
474 #define uc_property_is_valid(property) ((property).test_fn != NULL)
475
476 /* Test whether a Unicode character has a given property.  */
477 extern bool
478        uc_is_property (ucs4_t uc, uc_property_t property);
479 extern bool uc_is_property_white_space (ucs4_t uc);
480 extern bool uc_is_property_alphabetic (ucs4_t uc);
481 extern bool uc_is_property_other_alphabetic (ucs4_t uc);
482 extern bool uc_is_property_not_a_character (ucs4_t uc);
483 extern bool uc_is_property_default_ignorable_code_point (ucs4_t uc);
484 extern bool uc_is_property_other_default_ignorable_code_point (ucs4_t uc);
485 extern bool uc_is_property_deprecated (ucs4_t uc);
486 extern bool uc_is_property_logical_order_exception (ucs4_t uc);
487 extern bool uc_is_property_variation_selector (ucs4_t uc);
488 extern bool uc_is_property_private_use (ucs4_t uc);
489 extern bool uc_is_property_unassigned_code_value (ucs4_t uc);
490 extern bool uc_is_property_uppercase (ucs4_t uc);
491 extern bool uc_is_property_other_uppercase (ucs4_t uc);
492 extern bool uc_is_property_lowercase (ucs4_t uc);
493 extern bool uc_is_property_other_lowercase (ucs4_t uc);
494 extern bool uc_is_property_titlecase (ucs4_t uc);
495 extern bool uc_is_property_cased (ucs4_t uc);
496 extern bool uc_is_property_case_ignorable (ucs4_t uc);
497 extern bool uc_is_property_changes_when_lowercased (ucs4_t uc);
498 extern bool uc_is_property_changes_when_uppercased (ucs4_t uc);
499 extern bool uc_is_property_changes_when_titlecased (ucs4_t uc);
500 extern bool uc_is_property_changes_when_casefolded (ucs4_t uc);
501 extern bool uc_is_property_changes_when_casemapped (ucs4_t uc);
502 extern bool uc_is_property_soft_dotted (ucs4_t uc);
503 extern bool uc_is_property_id_start (ucs4_t uc);
504 extern bool uc_is_property_other_id_start (ucs4_t uc);
505 extern bool uc_is_property_id_continue (ucs4_t uc);
506 extern bool uc_is_property_other_id_continue (ucs4_t uc);
507 extern bool uc_is_property_xid_start (ucs4_t uc);
508 extern bool uc_is_property_xid_continue (ucs4_t uc);
509 extern bool uc_is_property_pattern_white_space (ucs4_t uc);
510 extern bool uc_is_property_pattern_syntax (ucs4_t uc);
511 extern bool uc_is_property_join_control (ucs4_t uc);
512 extern bool uc_is_property_grapheme_base (ucs4_t uc);
513 extern bool uc_is_property_grapheme_extend (ucs4_t uc);
514 extern bool uc_is_property_other_grapheme_extend (ucs4_t uc);
515 extern bool uc_is_property_grapheme_link (ucs4_t uc);
516 extern bool uc_is_property_bidi_control (ucs4_t uc);
517 extern bool uc_is_property_bidi_left_to_right (ucs4_t uc);
518 extern bool uc_is_property_bidi_hebrew_right_to_left (ucs4_t uc);
519 extern bool uc_is_property_bidi_arabic_right_to_left (ucs4_t uc);
520 extern bool uc_is_property_bidi_european_digit (ucs4_t uc);
521 extern bool uc_is_property_bidi_eur_num_separator (ucs4_t uc);
522 extern bool uc_is_property_bidi_eur_num_terminator (ucs4_t uc);
523 extern bool uc_is_property_bidi_arabic_digit (ucs4_t uc);
524 extern bool uc_is_property_bidi_common_separator (ucs4_t uc);
525 extern bool uc_is_property_bidi_block_separator (ucs4_t uc);
526 extern bool uc_is_property_bidi_segment_separator (ucs4_t uc);
527 extern bool uc_is_property_bidi_whitespace (ucs4_t uc);
528 extern bool uc_is_property_bidi_non_spacing_mark (ucs4_t uc);
529 extern bool uc_is_property_bidi_boundary_neutral (ucs4_t uc);
530 extern bool uc_is_property_bidi_pdf (ucs4_t uc);
531 extern bool uc_is_property_bidi_embedding_or_override (ucs4_t uc);
532 extern bool uc_is_property_bidi_other_neutral (ucs4_t uc);
533 extern bool uc_is_property_hex_digit (ucs4_t uc);
534 extern bool uc_is_property_ascii_hex_digit (ucs4_t uc);
535 extern bool uc_is_property_ideographic (ucs4_t uc);
536 extern bool uc_is_property_unified_ideograph (ucs4_t uc);
537 extern bool uc_is_property_radical (ucs4_t uc);
538 extern bool uc_is_property_ids_binary_operator (ucs4_t uc);
539 extern bool uc_is_property_ids_trinary_operator (ucs4_t uc);
540 extern bool uc_is_property_zero_width (ucs4_t uc);
541 extern bool uc_is_property_space (ucs4_t uc);
542 extern bool uc_is_property_non_break (ucs4_t uc);
543 extern bool uc_is_property_iso_control (ucs4_t uc);
544 extern bool uc_is_property_format_control (ucs4_t uc);
545 extern bool uc_is_property_dash (ucs4_t uc);
546 extern bool uc_is_property_hyphen (ucs4_t uc);
547 extern bool uc_is_property_punctuation (ucs4_t uc);
548 extern bool uc_is_property_line_separator (ucs4_t uc);
549 extern bool uc_is_property_paragraph_separator (ucs4_t uc);
550 extern bool uc_is_property_quotation_mark (ucs4_t uc);
551 extern bool uc_is_property_sentence_terminal (ucs4_t uc);
552 extern bool uc_is_property_terminal_punctuation (ucs4_t uc);
553 extern bool uc_is_property_currency_symbol (ucs4_t uc);
554 extern bool uc_is_property_math (ucs4_t uc);
555 extern bool uc_is_property_other_math (ucs4_t uc);
556 extern bool uc_is_property_paired_punctuation (ucs4_t uc);
557 extern bool uc_is_property_left_of_pair (ucs4_t uc);
558 extern bool uc_is_property_combining (ucs4_t uc);
559 extern bool uc_is_property_composite (ucs4_t uc);
560 extern bool uc_is_property_decimal_digit (ucs4_t uc);
561 extern bool uc_is_property_numeric (ucs4_t uc);
562 extern bool uc_is_property_diacritic (ucs4_t uc);
563 extern bool uc_is_property_extender (ucs4_t uc);
564 extern bool uc_is_property_ignorable_control (ucs4_t uc);
565
566 /* ========================================================================= */
567
568 /* Subdivision of the Unicode characters into scripts.  */
569
570 typedef struct
571 {
572   unsigned int code : 21;
573   unsigned int start : 1;
574   unsigned int end : 1;
575 }
576 uc_interval_t;
577 typedef struct
578 {
579   unsigned int nintervals;
580   const uc_interval_t *intervals;
581   const char *name;
582 }
583 uc_script_t;
584
585 /* Return the script of a Unicode character.  */
586 extern const uc_script_t *
587        uc_script (ucs4_t uc);
588
589 /* Return the script given by name, e.g. "HAN".  */
590 extern const uc_script_t *
591        uc_script_byname (const char *script_name);
592
593 /* Test whether a Unicode character belongs to a given script.  */
594 extern bool
595        uc_is_script (ucs4_t uc, const uc_script_t *script);
596
597 /* Get the list of all scripts.  */
598 extern void
599        uc_all_scripts (const uc_script_t **scripts, size_t *count);
600
601 /* ========================================================================= */
602
603 /* Subdivision of the Unicode character range into blocks.  */
604
605 typedef struct
606 {
607   ucs4_t start;
608   ucs4_t end;
609   const char *name;
610 }
611 uc_block_t;
612
613 /* Return the block a character belongs to.  */
614 extern const uc_block_t *
615        uc_block (ucs4_t uc);
616
617 /* Test whether a Unicode character belongs to a given block.  */
618 extern bool
619        uc_is_block (ucs4_t uc, const uc_block_t *block);
620
621 /* Get the list of all blocks.  */
622 extern void
623        uc_all_blocks (const uc_block_t **blocks, size_t *count);
624
625 /* ========================================================================= */
626
627 /* Properties taken from language standards.  */
628
629 /* Test whether a Unicode character is considered whitespace in ISO C 99.  */
630 extern bool
631        uc_is_c_whitespace (ucs4_t uc);
632
633 /* Test whether a Unicode character is considered whitespace in Java.  */
634 extern bool
635        uc_is_java_whitespace (ucs4_t uc);
636
637 enum
638 {
639   UC_IDENTIFIER_START,    /* valid as first or subsequent character */
640   UC_IDENTIFIER_VALID,    /* valid as subsequent character only */
641   UC_IDENTIFIER_INVALID,  /* not valid */
642   UC_IDENTIFIER_IGNORABLE /* ignorable (Java only) */
643 };
644
645 /* Return the categorization of a Unicode character w.r.t. the ISO C 99
646    identifier syntax.  */
647 extern int
648        uc_c_ident_category (ucs4_t uc);
649
650 /* Return the categorization of a Unicode character w.r.t. the Java
651    identifier syntax.  */
652 extern int
653        uc_java_ident_category (ucs4_t uc);
654
655 /* ========================================================================= */
656
657 /* Like ISO C <ctype.h> and <wctype.h>.  These functions are deprecated,
658    because this set of functions was designed with ASCII in mind and cannot
659    reflect the more diverse reality of the Unicode character set.  But they
660    can be a quick-and-dirty porting aid when migrating from wchar_t APIs
661    to Unicode strings.  */
662
663 /* Test for any character for which 'uc_is_alpha' or 'uc_is_digit' is true.  */
664 extern bool
665        uc_is_alnum (ucs4_t uc);
666
667 /* Test for any character for which 'uc_is_upper' or 'uc_is_lower' is true,
668    or any character that is one of a locale-specific set of characters for
669    which none of 'uc_is_cntrl', 'uc_is_digit', 'uc_is_punct', or 'uc_is_space'
670    is true.  */
671 extern bool
672        uc_is_alpha (ucs4_t uc);
673
674 /* Test for any control character.  */
675 extern bool
676        uc_is_cntrl (ucs4_t uc);
677
678 /* Test for any character that corresponds to a decimal-digit character.  */
679 extern bool
680        uc_is_digit (ucs4_t uc);
681
682 /* Test for any character for which 'uc_is_print' is true and 'uc_is_space'
683    is false.  */
684 extern bool
685        uc_is_graph (ucs4_t uc);
686
687 /* Test for any character that corresponds to a lowercase letter or is one
688    of a locale-specific set of characters for which none of 'uc_is_cntrl',
689    'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true.  */
690 extern bool
691        uc_is_lower (ucs4_t uc);
692
693 /* Test for any printing character.  */
694 extern bool
695        uc_is_print (ucs4_t uc);
696
697 /* Test for any printing character that is one of a locale-specific set of
698    characters for which neither 'uc_is_space' nor 'uc_is_alnum' is true.  */
699 extern bool
700        uc_is_punct (ucs4_t uc);
701
702 /* Test for any character that corresponds to a locale-specific set of
703    characters for which none of 'uc_is_alnum', 'uc_is_graph', or 'uc_is_punct'
704    is true.  */
705 extern bool
706        uc_is_space (ucs4_t uc);
707
708 /* Test for any character that corresponds to an uppercase letter or is one
709    of a locale-specific set of character for which none of 'uc_is_cntrl',
710    'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true.  */
711 extern bool
712        uc_is_upper (ucs4_t uc);
713
714 /* Test for any character that corresponds to a hexadecimal-digit
715    character.  */
716 extern bool
717        uc_is_xdigit (ucs4_t uc);
718
719 /* GNU extension. */
720 /* Test for any character that corresponds to a standard blank character or
721    a locale-specific set of characters for which 'uc_is_alnum' is false.  */
722 extern bool
723        uc_is_blank (ucs4_t uc);
724
725 /* ========================================================================= */
726
727 #ifdef __cplusplus
728 }
729 #endif
730
731 #endif /* _UNICTYPE_H */