1 /* $MirOS: src/lib/libc/include/mir18n.h,v 1.18 2008/11/30 13:08:49 tg Exp $ */
2 
3 #ifndef _LIBC_MIR18N_H
4 #define _LIBC_MIR18N_H
5 
6 #if !defined(WCHAR_MAX)
7 #error Include <wchar.h> first
8 #elif WCHAR_MAX != 0xFFFD
9 #error This code assumes that wchar_t is UCS-2HE
10 #endif
11 
12 #ifdef mir18n_attributes
13 /* from Bruno Haible's libutf8 */
14 
15 /* How the 12 character attributes are encoded in 8 bits: Every attribute is
16    represented by an "include bitmask" and an "exclude bitmask".
17     Attribute	bit/formula		comment
18      upper	upper && !lower		implies towlower(x) != x == towupper(x)
19      lower	!upper && lower		implies towlower(x) == x != towupper(x)
20      title	upper && lower		implies towlower(x) != x != towupper(x)
21      alpha	bit			superset of upper || lower
22      digit	xdigit && !alpha	'0'..'9' and more
23      xdigit	bit			'0'..'9','a'..'f','A'..'F' and more
24      space	bit			' ', '\f', '\n', '\r', '\t', '\v'
25      print	bit
26      graph	print && !space
27      blank	bit			' ', '\t'
28      cntrl	bit			0x00..0x1F,0x7F
29      punct	print && !(alpha || xdigit || space)
30      alnum	alpha || xdigit
31 */
32 
33 #define iswmask(number,incl,excl)  ((incl) | ((excl) << 8) | ((number) << 16))
34 #define wmask_incl(mask)	(mask) & 0xFF
35 #define wmask_excl(mask)	((mask) >> 8) & 0xFF
36 #define wmask_number(mask)	((mask) >> 16)
37 
38 #define upper	  1
39 #define lower	  2
40 #define alpha	  4
41 #define digit	  0
42 #define xdigit	  8
43 #define space	 16
44 #define print	 32
45 #define graph	  0
46 #define blank	 64
47 #define cntrl	128
48 #define punct	  0
49 #define alnum	  0
50 
51 /* XXX these are copied in src/include/ctype.h */
52 #define wctype_alnum  iswmask(11, alpha|xdigit, 0)
53 #define wctype_alpha  iswmask(2, alpha, 0)
54 #define wctype_blank  iswmask(8, blank, 0)
55 #define wctype_cntrl  iswmask(9, cntrl, 0)
56 #define wctype_digit  iswmask(3, xdigit, alpha)
57 #define wctype_graph  iswmask(7, print, space)
58 #define wctype_lower  iswmask(1, lower, upper)
59 #define wctype_print  iswmask(6, print, 0)
60 #define wctype_punct  iswmask(10, print, alpha|xdigit|space)
61 #define wctype_space  iswmask(5, space, 0)
62 #define wctype_title  iswmask(12, upper|lower, 0)
63 #define wctype_upper  iswmask(0, upper, lower)
64 #define wctype_xdigit iswmask(4, xdigit, 0)
65 
66 #define attribute_table mir18n_attribute_table
67 __BEGIN_DECLS
68 extern const unsigned char * const attribute_table[0x100];
69 __END_DECLS
70 #endif
71 
72 #ifdef mir18n_caseconv
73 /* namespace definitions for the UCD tables */
74 #define nop_page	mir18n_attribute_nop_page
75 #define tolower_table	mir18n_caseconv_tolower
76 #define totitle_table	mir18n_caseconv_totitle
77 #define toupper_table	mir18n_caseconv_toupper
78 
79 __BEGIN_DECLS
80 extern const uint16_t nop_page[256];
81 __END_DECLS
82 #endif
83 
84 #endif
85