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