xref: /openbsd/lib/libc/locale/iswctype.c (revision 3a628b46)
1*3a628b46Sschwarze /*	$OpenBSD: iswctype.c,v 1.7 2017/09/05 03:16:13 schwarze Exp $ */
2037bef94Sespie /*	$NetBSD: iswctype.c,v 1.15 2005/02/09 21:35:46 kleink Exp $	*/
3037bef94Sespie 
4037bef94Sespie /*
5037bef94Sespie  * Copyright (c) 1989 The Regents of the University of California.
6037bef94Sespie  * All rights reserved.
7037bef94Sespie  * (c) UNIX System Laboratories, Inc.
8037bef94Sespie  * All or some portions of this file are derived from material licensed
9037bef94Sespie  * to the University of California by American Telephone and Telegraph
10037bef94Sespie  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
11037bef94Sespie  * the permission of UNIX System Laboratories, Inc.
12037bef94Sespie  *
13037bef94Sespie  * Redistribution and use in source and binary forms, with or without
14037bef94Sespie  * modification, are permitted provided that the following conditions
15037bef94Sespie  * are met:
16037bef94Sespie  * 1. Redistributions of source code must retain the above copyright
17037bef94Sespie  *    notice, this list of conditions and the following disclaimer.
18037bef94Sespie  * 2. Redistributions in binary form must reproduce the above copyright
19037bef94Sespie  *    notice, this list of conditions and the following disclaimer in the
20037bef94Sespie  *    documentation and/or other materials provided with the distribution.
21037bef94Sespie  * 3. Neither the name of the University nor the names of its contributors
22037bef94Sespie  *    may be used to endorse or promote products derived from this software
23037bef94Sespie  *    without specific prior written permission.
24037bef94Sespie  *
25037bef94Sespie  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26037bef94Sespie  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27037bef94Sespie  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28037bef94Sespie  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29037bef94Sespie  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30037bef94Sespie  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31037bef94Sespie  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32037bef94Sespie  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33037bef94Sespie  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34037bef94Sespie  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35037bef94Sespie  * SUCH DAMAGE.
36037bef94Sespie  */
37037bef94Sespie 
38037bef94Sespie #include <wchar.h>
39037bef94Sespie #include <wctype.h>
40037bef94Sespie #include <ctype.h>
41037bef94Sespie #include <errno.h>
42037bef94Sespie #include <string.h>
43037bef94Sespie #include "rune.h"
44037bef94Sespie #include "runetype.h"
45037bef94Sespie #include "rune_local.h"
46037bef94Sespie #include "_wctrans_local.h"
47037bef94Sespie 
48eb78bd26Sguenther static inline _RuneType __runetype_w(wint_t);
49eb78bd26Sguenther static inline int __isctype_w(wint_t, _RuneType);
50eb78bd26Sguenther static inline wint_t __toupper_w(wint_t);
51eb78bd26Sguenther static inline wint_t __tolower_w(wint_t);
52037bef94Sespie 
53eb78bd26Sguenther static inline _RuneType
54037bef94Sespie __runetype_w(wint_t c)
55037bef94Sespie {
56*3a628b46Sschwarze 	_RuneLocale *rl = _CurrentRuneLocale();
57037bef94Sespie 
58037bef94Sespie 	return (_RUNE_ISCACHED(c) ?
59*3a628b46Sschwarze 		rl->rl_runetype[c] : ___runetype_mb(c, rl));
60037bef94Sespie }
61037bef94Sespie 
62eb78bd26Sguenther static inline int
63037bef94Sespie __isctype_w(wint_t c, _RuneType f)
64037bef94Sespie {
65037bef94Sespie 	return (!!(__runetype_w(c) & f));
66037bef94Sespie }
67037bef94Sespie 
68eb78bd26Sguenther static inline wint_t
69037bef94Sespie __toupper_w(wint_t c)
70037bef94Sespie {
71*3a628b46Sschwarze 	return (_towctrans(c, _wctrans_upper(_CurrentRuneLocale())));
72037bef94Sespie }
73037bef94Sespie 
74eb78bd26Sguenther static inline wint_t
75037bef94Sespie __tolower_w(wint_t c)
76037bef94Sespie {
77*3a628b46Sschwarze 	return (_towctrans(c, _wctrans_lower(_CurrentRuneLocale())));
78037bef94Sespie }
79037bef94Sespie 
80037bef94Sespie int
81037bef94Sespie iswalnum(wint_t c)
82037bef94Sespie {
83037bef94Sespie 	return (__isctype_w((c), _CTYPE_A|_CTYPE_D));
84037bef94Sespie }
85037bef94Sespie 
86037bef94Sespie int
87037bef94Sespie iswalpha(wint_t c)
88037bef94Sespie {
89037bef94Sespie 	return (__isctype_w((c), _CTYPE_A));
90037bef94Sespie }
91037bef94Sespie 
92037bef94Sespie int
93037bef94Sespie iswblank(wint_t c)
94037bef94Sespie {
95037bef94Sespie 	return (__isctype_w((c), _CTYPE_B));
96037bef94Sespie }
97037bef94Sespie 
98037bef94Sespie int
99037bef94Sespie iswcntrl(wint_t c)
100037bef94Sespie {
101037bef94Sespie 	return (__isctype_w((c), _CTYPE_C));
102037bef94Sespie }
103037bef94Sespie 
104037bef94Sespie int
105037bef94Sespie iswdigit(wint_t c)
106037bef94Sespie {
107037bef94Sespie 	return (__isctype_w((c), _CTYPE_D));
108037bef94Sespie }
109037bef94Sespie 
110037bef94Sespie int
111037bef94Sespie iswgraph(wint_t c)
112037bef94Sespie {
113037bef94Sespie 	return (__isctype_w((c), _CTYPE_G));
114037bef94Sespie }
115037bef94Sespie 
116037bef94Sespie int
117037bef94Sespie iswlower(wint_t c)
118037bef94Sespie {
119037bef94Sespie 	return (__isctype_w((c), _CTYPE_L));
120037bef94Sespie }
121037bef94Sespie 
122037bef94Sespie int
123037bef94Sespie iswprint(wint_t c)
124037bef94Sespie {
125037bef94Sespie 	return (__isctype_w((c), _CTYPE_R));
126037bef94Sespie }
127037bef94Sespie 
128037bef94Sespie int
129037bef94Sespie iswpunct(wint_t c)
130037bef94Sespie {
131037bef94Sespie 	return (__isctype_w((c), _CTYPE_P));
132037bef94Sespie }
133037bef94Sespie 
134037bef94Sespie int
135037bef94Sespie iswspace(wint_t c)
136037bef94Sespie {
137037bef94Sespie 	return (__isctype_w((c), _CTYPE_S));
138037bef94Sespie }
139eb78bd26Sguenther DEF_STRONG(iswspace);
140037bef94Sespie 
141037bef94Sespie int
142037bef94Sespie iswupper(wint_t c)
143037bef94Sespie {
144037bef94Sespie 	return (__isctype_w((c), _CTYPE_U));
145037bef94Sespie }
146eb78bd26Sguenther DEF_STRONG(iswupper);
147037bef94Sespie 
148037bef94Sespie int
149037bef94Sespie iswxdigit(wint_t c)
150037bef94Sespie {
151037bef94Sespie 	return (__isctype_w((c), _CTYPE_X));
152037bef94Sespie }
153037bef94Sespie 
154037bef94Sespie wint_t
155037bef94Sespie towupper(wint_t c)
156037bef94Sespie {
157037bef94Sespie 	return (__toupper_w(c));
158037bef94Sespie }
159037bef94Sespie 
160037bef94Sespie wint_t
161037bef94Sespie towlower(wint_t c)
162037bef94Sespie {
163037bef94Sespie 	return (__tolower_w(c));
164037bef94Sespie }
165eb78bd26Sguenther DEF_STRONG(towlower);
166037bef94Sespie 
167037bef94Sespie int
168037bef94Sespie wcwidth(wchar_t c)
169037bef94Sespie {
17029374459Sstsp 	if (__isctype_w((c), _CTYPE_R))
171037bef94Sespie 		return (((unsigned)__runetype_w(c) & _CTYPE_SWM) >> _CTYPE_SWS);
17229374459Sstsp 	return -1;
173037bef94Sespie }
17438a75b98Sguenther DEF_WEAK(wcwidth);
175037bef94Sespie 
176037bef94Sespie wctrans_t
177037bef94Sespie wctrans(const char *charclass)
178037bef94Sespie {
179037bef94Sespie 	int i;
180*3a628b46Sschwarze 	_RuneLocale *rl = _CurrentRuneLocale();
181037bef94Sespie 
182037bef94Sespie 	if (rl->rl_wctrans[_WCTRANS_INDEX_LOWER].te_name==NULL)
183037bef94Sespie 		_wctrans_init(rl);
184037bef94Sespie 
185037bef94Sespie 	for (i=0; i<_WCTRANS_NINDEXES; i++)
186037bef94Sespie 		if (!strcmp(rl->rl_wctrans[i].te_name, charclass))
187037bef94Sespie 			return ((wctrans_t)&rl->rl_wctrans[i]);
188037bef94Sespie 
189037bef94Sespie 	return ((wctrans_t)NULL);
190037bef94Sespie }
191037bef94Sespie 
192037bef94Sespie wint_t
193037bef94Sespie towctrans(wint_t c, wctrans_t desc)
194037bef94Sespie {
195037bef94Sespie 	if (desc==NULL) {
196037bef94Sespie 		errno = EINVAL;
197037bef94Sespie 		return (c);
198037bef94Sespie 	}
199037bef94Sespie 	return (_towctrans(c, (_WCTransEntry *)desc));
200037bef94Sespie }
201*3a628b46Sschwarze DEF_STRONG(towctrans);
202037bef94Sespie 
203037bef94Sespie wctype_t
204037bef94Sespie wctype(const char *property)
205037bef94Sespie {
206037bef94Sespie 	int i;
207*3a628b46Sschwarze 	_RuneLocale *rl = _CurrentRuneLocale();
208037bef94Sespie 
209037bef94Sespie 	for (i=0; i<_WCTYPE_NINDEXES; i++)
210037bef94Sespie 		if (!strcmp(rl->rl_wctype[i].te_name, property))
211037bef94Sespie 			return ((wctype_t)&rl->rl_wctype[i]);
212037bef94Sespie 	return ((wctype_t)NULL);
213037bef94Sespie }
214037bef94Sespie 
215037bef94Sespie int
216037bef94Sespie iswctype(wint_t c, wctype_t charclass)
217037bef94Sespie {
218037bef94Sespie 
219037bef94Sespie 	/*
220037bef94Sespie 	 * SUSv3: If charclass is 0, iswctype() shall return 0.
221037bef94Sespie 	 */
222037bef94Sespie 	if (charclass == (wctype_t)0) {
223037bef94Sespie 		return 0;
224037bef94Sespie 	}
225037bef94Sespie 
226037bef94Sespie 	return (__isctype_w(c, ((_WCTypeEntry *)charclass)->te_mask));
227037bef94Sespie }
228