2 * Copyright (c) 2011 The FreeBSD Foundation
5 * This software was developed by David Chisnall under sponsorship from
6 * the FreeBSD Foundation.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * $FreeBSD: head/include/xlocale/_ctype.h 243032 2012-11-14 17:44:37Z demon $
33 #if (defined(_XLOCALE_WCTYPES) && !defined(_XLOCALE_WCTYPE_H)) || \
34 (!defined(_XLOCALE_WCTYPES) && !defined(_XLOCALE_CTYPE_H))
36 #ifdef _XLOCALE_WCTYPES
37 #define _XLOCALE_WCTYPE_H
39 #define _XLOCALE_CTYPE_H
42 #ifndef _LOCALE_T_DEFINED
43 #define _LOCALE_T_DEFINED
44 typedef struct _xlocale
*locale_t
;
47 #ifndef _XLOCALE_RUN_FUNCTIONS_DEFINED
48 #define _XLOCALE_RUN_FUNCTIONS_DEFINED 1
49 unsigned long ___runetype_l(__ct_rune_t
, locale_t
) __pure
;
50 __ct_rune_t
___tolower_l(__ct_rune_t
, locale_t
) __pure
;
51 __ct_rune_t
___toupper_l(__ct_rune_t
, locale_t
) __pure
;
52 _RuneLocale
*__runes_for_locale(locale_t
, int*);
55 #ifndef _XLOCALE_INLINE
56 #if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__)
57 /* GNU89 inline has nonstandard semantics. */
58 #define _XLOCALE_INLINE extern __inline
60 /* Hack to work around people who define inline away */
62 #define _XLOCALE_INLINE static __inline
64 /* Define with C++ / C99 compatible semantics */
65 #define _XLOCALE_INLINE inline
68 #endif /* _XLOCALE_INLINE */
70 #ifdef _XLOCALE_WCTYPES
72 __maskrune_l(__ct_rune_t __c
, unsigned long __f
, locale_t __loc
);
74 __istype_l(__ct_rune_t __c
, unsigned long __f
, locale_t __loc
);
77 __maskrune_l(__ct_rune_t __c
, unsigned long __f
, locale_t __loc
)
80 _RuneLocale
*runes
= __runes_for_locale(__loc
, &__limit
);
81 return ((__c
< 0 || __c
>= _CACHED_RUNES
) ? ___runetype_l(__c
, __loc
) :
82 runes
->__runetype
[__c
]) & __f
;
86 __istype_l(__ct_rune_t __c
, unsigned long __f
, locale_t __loc
)
88 return (!!__maskrune_l(__c
, __f
, __loc
));
91 #define XLOCALE_ISCTYPE(fname, cat) \
92 _XLOCALE_INLINE int isw##fname##_l(int, locale_t);\
93 _XLOCALE_INLINE int isw##fname##_l(int __c, locale_t __l)\
94 { return __istype_l(__c, cat, __l); }
97 __sbmaskrune_l(__ct_rune_t __c
, unsigned long __f
, locale_t __loc
);
99 __sbistype_l(__ct_rune_t __c
, unsigned long __f
, locale_t __loc
);
102 __sbmaskrune_l(__ct_rune_t __c
, unsigned long __f
, locale_t __loc
)
105 _RuneLocale
*runes
= __runes_for_locale(__loc
, &__limit
);
106 return (__c
< 0 || __c
>= __limit
) ? 0 :
107 runes
->__runetype
[__c
] & __f
;
111 __sbistype_l(__ct_rune_t __c
, unsigned long __f
, locale_t __loc
)
113 return (!!__sbmaskrune_l(__c
, __f
, __loc
));
116 #define XLOCALE_ISCTYPE(__fname, __cat) \
117 _XLOCALE_INLINE int is##__fname##_l(int, locale_t); \
118 _XLOCALE_INLINE int is##__fname##_l(int __c, locale_t __l)\
119 { return __sbistype_l(__c, __cat, __l); }
122 XLOCALE_ISCTYPE(alnum
, _CTYPE_A
|_CTYPE_D
|_CTYPE_N
)
123 XLOCALE_ISCTYPE(alpha
, _CTYPE_A
)
124 XLOCALE_ISCTYPE(blank
, _CTYPE_B
)
125 XLOCALE_ISCTYPE(cntrl
, _CTYPE_C
)
126 XLOCALE_ISCTYPE(digit
, _CTYPE_D
)
127 XLOCALE_ISCTYPE(graph
, _CTYPE_G
)
128 XLOCALE_ISCTYPE(hexnumber
, _CTYPE_X
)
129 XLOCALE_ISCTYPE(ideogram
, _CTYPE_I
)
130 XLOCALE_ISCTYPE(lower
, _CTYPE_L
)
131 XLOCALE_ISCTYPE(number
, _CTYPE_D
|_CTYPE_N
)
132 XLOCALE_ISCTYPE(phonogram
, _CTYPE_Q
)
133 XLOCALE_ISCTYPE(print
, _CTYPE_R
)
134 XLOCALE_ISCTYPE(punct
, _CTYPE_P
)
135 XLOCALE_ISCTYPE(rune
, 0xFFFFFF00L
)
136 XLOCALE_ISCTYPE(space
, _CTYPE_S
)
137 XLOCALE_ISCTYPE(special
, _CTYPE_T
)
138 XLOCALE_ISCTYPE(upper
, _CTYPE_U
)
139 XLOCALE_ISCTYPE(xdigit
, _CTYPE_X
)
140 #undef XLOCALE_ISCTYPE
142 #ifdef _XLOCALE_WCTYPES
143 _XLOCALE_INLINE
int towlower_l(int, locale_t
);
144 _XLOCALE_INLINE
int __wcwidth_l(__ct_rune_t
, locale_t
);
145 _XLOCALE_INLINE
int towupper_l(int, locale_t
);
147 _XLOCALE_INLINE
int towlower_l(int __c
, locale_t __l
)
150 _RuneLocale
*__runes
= __runes_for_locale(__l
, &__limit
);
151 return (__c
< 0 || __c
>= _CACHED_RUNES
) ? ___tolower_l(__c
, __l
) :
152 __runes
->__maplower
[__c
];
154 _XLOCALE_INLINE
int towupper_l(int __c
, locale_t __l
)
157 _RuneLocale
*__runes
= __runes_for_locale(__l
, &__limit
);
158 return (__c
< 0 || __c
>= _CACHED_RUNES
) ? ___toupper_l(__c
, __l
) :
159 __runes
->__mapupper
[__c
];
162 __wcwidth_l(__ct_rune_t _c
, locale_t __l
)
168 _x
= (unsigned int)__maskrune_l(_c
, _CTYPE_SWM
|_CTYPE_R
, __l
);
169 if ((_x
& _CTYPE_SWM
) != 0)
170 return ((_x
& _CTYPE_SWM
) >> _CTYPE_SWS
);
171 return ((_x
& _CTYPE_R
) != 0 ? 1 : -1);
173 int iswctype_l(wint_t __wc
, wctype_t __charclass
, locale_t __l
);
174 wctype_t wctype_l(const char *property
, locale_t __l
);
175 wint_t towctrans_l(wint_t __wc
, wctrans_t desc
, locale_t __l
);
176 wint_t nextwctype_l(wint_t __wc
, wctype_t wct
, locale_t __l
);
177 wctrans_t wctrans_l(const char *__charclass
, locale_t __l
);
178 #undef _XLOCALE_WCTYPES
180 _XLOCALE_INLINE
int digittoint_l(int, locale_t
);
181 _XLOCALE_INLINE
int tolower_l(int, locale_t
);
182 _XLOCALE_INLINE
int toupper_l(int, locale_t
);
184 _XLOCALE_INLINE
int digittoint_l(int __c
, locale_t __l
)
185 { return __sbmaskrune_l((__c
), 0xFF, __l
); }
187 _XLOCALE_INLINE
int tolower_l(int __c
, locale_t __l
)
190 _RuneLocale
*__runes
= __runes_for_locale(__l
, &__limit
);
191 return (__c
< 0 || __c
>= __limit
) ? __c
:
192 __runes
->__maplower
[__c
];
194 _XLOCALE_INLINE
int toupper_l(int __c
, locale_t __l
)
197 _RuneLocale
*__runes
= __runes_for_locale(__l
, &__limit
);
198 return (__c
< 0 || __c
>= __limit
) ? __c
:
199 __runes
->__mapupper
[__c
];
202 #endif /* (defined(_XLOCALE_WCTYPES) && !defined(_XLOCALE_WCTYPE_H)) || \
203 (!defined(_XLOCALE_WCTYPES) && !defined(_XLOCALE_CTYPE_H)) */