1*38a75b98Sguenther /* $OpenBSD: iswctype.c,v 1.5 2015/09/12 16:23:14 guenther 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 48037bef94Sespie static __inline _RuneType __runetype_w(wint_t); 49037bef94Sespie static __inline int __isctype_w(wint_t, _RuneType); 50037bef94Sespie static __inline wint_t __toupper_w(wint_t); 51037bef94Sespie static __inline wint_t __tolower_w(wint_t); 52037bef94Sespie 53037bef94Sespie static __inline _RuneType 54037bef94Sespie __runetype_w(wint_t c) 55037bef94Sespie { 56037bef94Sespie _RuneLocale *rl = _CurrentRuneLocale; 57037bef94Sespie 58037bef94Sespie return (_RUNE_ISCACHED(c) ? 59037bef94Sespie rl->rl_runetype[c] : ___runetype_mb(c)); 60037bef94Sespie } 61037bef94Sespie 62037bef94Sespie static __inline int 63037bef94Sespie __isctype_w(wint_t c, _RuneType f) 64037bef94Sespie { 65037bef94Sespie return (!!(__runetype_w(c) & f)); 66037bef94Sespie } 67037bef94Sespie 68037bef94Sespie static __inline wint_t 69037bef94Sespie __toupper_w(wint_t c) 70037bef94Sespie { 71037bef94Sespie return (_towctrans(c, _wctrans_upper(_CurrentRuneLocale))); 72037bef94Sespie } 73037bef94Sespie 74037bef94Sespie static __inline wint_t 75037bef94Sespie __tolower_w(wint_t c) 76037bef94Sespie { 77037bef94Sespie 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 } 139037bef94Sespie 140037bef94Sespie int 141037bef94Sespie iswupper(wint_t c) 142037bef94Sespie { 143037bef94Sespie return (__isctype_w((c), _CTYPE_U)); 144037bef94Sespie } 145037bef94Sespie 146037bef94Sespie int 147037bef94Sespie iswxdigit(wint_t c) 148037bef94Sespie { 149037bef94Sespie return (__isctype_w((c), _CTYPE_X)); 150037bef94Sespie } 151037bef94Sespie 152037bef94Sespie wint_t 153037bef94Sespie towupper(wint_t c) 154037bef94Sespie { 155037bef94Sespie return (__toupper_w(c)); 156037bef94Sespie } 157037bef94Sespie 158037bef94Sespie wint_t 159037bef94Sespie towlower(wint_t c) 160037bef94Sespie { 161037bef94Sespie return (__tolower_w(c)); 162037bef94Sespie } 163037bef94Sespie 164037bef94Sespie int 165037bef94Sespie wcwidth(wchar_t c) 166037bef94Sespie { 16729374459Sstsp if (__isctype_w((c), _CTYPE_R)) 168037bef94Sespie return (((unsigned)__runetype_w(c) & _CTYPE_SWM) >> _CTYPE_SWS); 16929374459Sstsp return -1; 170037bef94Sespie } 171*38a75b98Sguenther DEF_WEAK(wcwidth); 172037bef94Sespie 173037bef94Sespie wctrans_t 174037bef94Sespie wctrans(const char *charclass) 175037bef94Sespie { 176037bef94Sespie int i; 177037bef94Sespie _RuneLocale *rl = _CurrentRuneLocale; 178037bef94Sespie 179037bef94Sespie if (rl->rl_wctrans[_WCTRANS_INDEX_LOWER].te_name==NULL) 180037bef94Sespie _wctrans_init(rl); 181037bef94Sespie 182037bef94Sespie for (i=0; i<_WCTRANS_NINDEXES; i++) 183037bef94Sespie if (!strcmp(rl->rl_wctrans[i].te_name, charclass)) 184037bef94Sespie return ((wctrans_t)&rl->rl_wctrans[i]); 185037bef94Sespie 186037bef94Sespie return ((wctrans_t)NULL); 187037bef94Sespie } 188037bef94Sespie 189037bef94Sespie wint_t 190037bef94Sespie towctrans(wint_t c, wctrans_t desc) 191037bef94Sespie { 192037bef94Sespie if (desc==NULL) { 193037bef94Sespie errno = EINVAL; 194037bef94Sespie return (c); 195037bef94Sespie } 196037bef94Sespie return (_towctrans(c, (_WCTransEntry *)desc)); 197037bef94Sespie } 198037bef94Sespie 199037bef94Sespie wctype_t 200037bef94Sespie wctype(const char *property) 201037bef94Sespie { 202037bef94Sespie int i; 203037bef94Sespie _RuneLocale *rl = _CurrentRuneLocale; 204037bef94Sespie 205037bef94Sespie for (i=0; i<_WCTYPE_NINDEXES; i++) 206037bef94Sespie if (!strcmp(rl->rl_wctype[i].te_name, property)) 207037bef94Sespie return ((wctype_t)&rl->rl_wctype[i]); 208037bef94Sespie return ((wctype_t)NULL); 209037bef94Sespie } 210037bef94Sespie 211037bef94Sespie int 212037bef94Sespie iswctype(wint_t c, wctype_t charclass) 213037bef94Sespie { 214037bef94Sespie 215037bef94Sespie /* 216037bef94Sespie * SUSv3: If charclass is 0, iswctype() shall return 0. 217037bef94Sespie */ 218037bef94Sespie if (charclass == (wctype_t)0) { 219037bef94Sespie return 0; 220037bef94Sespie } 221037bef94Sespie 222037bef94Sespie return (__isctype_w(c, ((_WCTypeEntry *)charclass)->te_mask)); 223037bef94Sespie } 224