1*29374459Sstsp /* $OpenBSD: iswctype.c,v 1.2 2011/04/15 16:11:23 stsp 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 <sys/cdefs.h> 39037bef94Sespie 40037bef94Sespie #include <wchar.h> 41037bef94Sespie #include <wctype.h> 42037bef94Sespie #include <ctype.h> 43037bef94Sespie #include <errno.h> 44037bef94Sespie #include <string.h> 45037bef94Sespie #include "rune.h" 46037bef94Sespie #include "runetype.h" 47037bef94Sespie #include "rune_local.h" 48037bef94Sespie #include "_wctrans_local.h" 49037bef94Sespie 50037bef94Sespie #ifdef lint 51037bef94Sespie #define __inline 52037bef94Sespie #endif 53037bef94Sespie 54037bef94Sespie static __inline _RuneType __runetype_w(wint_t); 55037bef94Sespie static __inline int __isctype_w(wint_t, _RuneType); 56037bef94Sespie static __inline wint_t __toupper_w(wint_t); 57037bef94Sespie static __inline wint_t __tolower_w(wint_t); 58037bef94Sespie 59037bef94Sespie static __inline _RuneType 60037bef94Sespie __runetype_w(wint_t c) 61037bef94Sespie { 62037bef94Sespie _RuneLocale *rl = _CurrentRuneLocale; 63037bef94Sespie 64037bef94Sespie return (_RUNE_ISCACHED(c) ? 65037bef94Sespie rl->rl_runetype[c] : ___runetype_mb(c)); 66037bef94Sespie } 67037bef94Sespie 68037bef94Sespie static __inline int 69037bef94Sespie __isctype_w(wint_t c, _RuneType f) 70037bef94Sespie { 71037bef94Sespie return (!!(__runetype_w(c) & f)); 72037bef94Sespie } 73037bef94Sespie 74037bef94Sespie static __inline wint_t 75037bef94Sespie __toupper_w(wint_t c) 76037bef94Sespie { 77037bef94Sespie return (_towctrans(c, _wctrans_upper(_CurrentRuneLocale))); 78037bef94Sespie } 79037bef94Sespie 80037bef94Sespie static __inline wint_t 81037bef94Sespie __tolower_w(wint_t c) 82037bef94Sespie { 83037bef94Sespie return (_towctrans(c, _wctrans_lower(_CurrentRuneLocale))); 84037bef94Sespie } 85037bef94Sespie 86037bef94Sespie int 87037bef94Sespie iswalnum(wint_t c) 88037bef94Sespie { 89037bef94Sespie return (__isctype_w((c), _CTYPE_A|_CTYPE_D)); 90037bef94Sespie } 91037bef94Sespie 92037bef94Sespie int 93037bef94Sespie iswalpha(wint_t c) 94037bef94Sespie { 95037bef94Sespie return (__isctype_w((c), _CTYPE_A)); 96037bef94Sespie } 97037bef94Sespie 98037bef94Sespie int 99037bef94Sespie iswblank(wint_t c) 100037bef94Sespie { 101037bef94Sespie return (__isctype_w((c), _CTYPE_B)); 102037bef94Sespie } 103037bef94Sespie 104037bef94Sespie int 105037bef94Sespie iswcntrl(wint_t c) 106037bef94Sespie { 107037bef94Sespie return (__isctype_w((c), _CTYPE_C)); 108037bef94Sespie } 109037bef94Sespie 110037bef94Sespie int 111037bef94Sespie iswdigit(wint_t c) 112037bef94Sespie { 113037bef94Sespie return (__isctype_w((c), _CTYPE_D)); 114037bef94Sespie } 115037bef94Sespie 116037bef94Sespie int 117037bef94Sespie iswgraph(wint_t c) 118037bef94Sespie { 119037bef94Sespie return (__isctype_w((c), _CTYPE_G)); 120037bef94Sespie } 121037bef94Sespie 122037bef94Sespie int 123037bef94Sespie iswlower(wint_t c) 124037bef94Sespie { 125037bef94Sespie return (__isctype_w((c), _CTYPE_L)); 126037bef94Sespie } 127037bef94Sespie 128037bef94Sespie int 129037bef94Sespie iswprint(wint_t c) 130037bef94Sespie { 131037bef94Sespie return (__isctype_w((c), _CTYPE_R)); 132037bef94Sespie } 133037bef94Sespie 134037bef94Sespie int 135037bef94Sespie iswpunct(wint_t c) 136037bef94Sespie { 137037bef94Sespie return (__isctype_w((c), _CTYPE_P)); 138037bef94Sespie } 139037bef94Sespie 140037bef94Sespie int 141037bef94Sespie iswspace(wint_t c) 142037bef94Sespie { 143037bef94Sespie return (__isctype_w((c), _CTYPE_S)); 144037bef94Sespie } 145037bef94Sespie 146037bef94Sespie int 147037bef94Sespie iswupper(wint_t c) 148037bef94Sespie { 149037bef94Sespie return (__isctype_w((c), _CTYPE_U)); 150037bef94Sespie } 151037bef94Sespie 152037bef94Sespie int 153037bef94Sespie iswxdigit(wint_t c) 154037bef94Sespie { 155037bef94Sespie return (__isctype_w((c), _CTYPE_X)); 156037bef94Sespie } 157037bef94Sespie 158037bef94Sespie wint_t 159037bef94Sespie towupper(wint_t c) 160037bef94Sespie { 161037bef94Sespie return (__toupper_w(c)); 162037bef94Sespie } 163037bef94Sespie 164037bef94Sespie wint_t 165037bef94Sespie towlower(wint_t c) 166037bef94Sespie { 167037bef94Sespie return (__tolower_w(c)); 168037bef94Sespie } 169037bef94Sespie 170037bef94Sespie int 171037bef94Sespie wcwidth(wchar_t c) 172037bef94Sespie { 173*29374459Sstsp if (__isctype_w((c), _CTYPE_R)) 174037bef94Sespie return (((unsigned)__runetype_w(c) & _CTYPE_SWM) >> _CTYPE_SWS); 175*29374459Sstsp return -1; 176037bef94Sespie } 177037bef94Sespie 178037bef94Sespie wctrans_t 179037bef94Sespie wctrans(const char *charclass) 180037bef94Sespie { 181037bef94Sespie int i; 182037bef94Sespie _RuneLocale *rl = _CurrentRuneLocale; 183037bef94Sespie 184037bef94Sespie if (rl->rl_wctrans[_WCTRANS_INDEX_LOWER].te_name==NULL) 185037bef94Sespie _wctrans_init(rl); 186037bef94Sespie 187037bef94Sespie for (i=0; i<_WCTRANS_NINDEXES; i++) 188037bef94Sespie if (!strcmp(rl->rl_wctrans[i].te_name, charclass)) 189037bef94Sespie return ((wctrans_t)&rl->rl_wctrans[i]); 190037bef94Sespie 191037bef94Sespie return ((wctrans_t)NULL); 192037bef94Sespie } 193037bef94Sespie 194037bef94Sespie wint_t 195037bef94Sespie towctrans(wint_t c, wctrans_t desc) 196037bef94Sespie { 197037bef94Sespie if (desc==NULL) { 198037bef94Sespie errno = EINVAL; 199037bef94Sespie return (c); 200037bef94Sespie } 201037bef94Sespie return (_towctrans(c, (_WCTransEntry *)desc)); 202037bef94Sespie } 203037bef94Sespie 204037bef94Sespie wctype_t 205037bef94Sespie wctype(const char *property) 206037bef94Sespie { 207037bef94Sespie int i; 208037bef94Sespie _RuneLocale *rl = _CurrentRuneLocale; 209037bef94Sespie 210037bef94Sespie for (i=0; i<_WCTYPE_NINDEXES; i++) 211037bef94Sespie if (!strcmp(rl->rl_wctype[i].te_name, property)) 212037bef94Sespie return ((wctype_t)&rl->rl_wctype[i]); 213037bef94Sespie return ((wctype_t)NULL); 214037bef94Sespie } 215037bef94Sespie 216037bef94Sespie int 217037bef94Sespie iswctype(wint_t c, wctype_t charclass) 218037bef94Sespie { 219037bef94Sespie 220037bef94Sespie /* 221037bef94Sespie * SUSv3: If charclass is 0, iswctype() shall return 0. 222037bef94Sespie */ 223037bef94Sespie if (charclass == (wctype_t)0) { 224037bef94Sespie return 0; 225037bef94Sespie } 226037bef94Sespie 227037bef94Sespie return (__isctype_w(c, ((_WCTypeEntry *)charclass)->te_mask)); 228037bef94Sespie } 229