1/* 2 * Copyright (c) 2000, 2005, 2008 Apple Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23/* 24 * Copyright (c) 1989, 1993 25 * The Regents of the University of California. All rights reserved. 26 * (c) UNIX System Laboratories, Inc. 27 * All or some portions of this file are derived from material licensed 28 * to the University of California by American Telephone and Telegraph 29 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 30 * the permission of UNIX System Laboratories, Inc. 31 * 32 * This code is derived from software contributed to Berkeley by 33 * Paul Borman at Krystal Technologies. 34 * 35 * Redistribution and use in source and binary forms, with or without 36 * modification, are permitted provided that the following conditions 37 * are met: 38 * 1. Redistributions of source code must retain the above copyright 39 * notice, this list of conditions and the following disclaimer. 40 * 2. Redistributions in binary form must reproduce the above copyright 41 * notice, this list of conditions and the following disclaimer in the 42 * documentation and/or other materials provided with the distribution. 43 * 3. All advertising materials mentioning features or use of this software 44 * must display the following acknowledgement: 45 * This product includes software developed by the University of 46 * California, Berkeley and its contributors. 47 * 4. Neither the name of the University nor the names of its contributors 48 * may be used to endorse or promote products derived from this software 49 * without specific prior written permission. 50 * 51 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 52 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 53 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 54 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 55 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 56 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 57 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 58 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 59 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 60 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 61 * SUCH DAMAGE. 62 * 63 * @(#)ctype.h 8.4 (Berkeley) 1/21/94 64 */ 65 66//Begin-Libc 67#include "xlocale_private.h" 68//End-Libc 69#ifndef _CTYPE_H_ 70#define _CTYPE_H_ 71 72#include <sys/cdefs.h> 73#include <runetype.h> 74 75#define _CTYPE_A 0x00000100L /* Alpha */ 76#define _CTYPE_C 0x00000200L /* Control */ 77#define _CTYPE_D 0x00000400L /* Digit */ 78#define _CTYPE_G 0x00000800L /* Graph */ 79#define _CTYPE_L 0x00001000L /* Lower */ 80#define _CTYPE_P 0x00002000L /* Punct */ 81#define _CTYPE_S 0x00004000L /* Space */ 82#define _CTYPE_U 0x00008000L /* Upper */ 83#define _CTYPE_X 0x00010000L /* X digit */ 84#define _CTYPE_B 0x00020000L /* Blank */ 85#define _CTYPE_R 0x00040000L /* Print */ 86#define _CTYPE_I 0x00080000L /* Ideogram */ 87#define _CTYPE_T 0x00100000L /* Special */ 88#define _CTYPE_Q 0x00200000L /* Phonogram */ 89#define _CTYPE_SW0 0x20000000L /* 0 width character */ 90#define _CTYPE_SW1 0x40000000L /* 1 width character */ 91#define _CTYPE_SW2 0x80000000L /* 2 width character */ 92#define _CTYPE_SW3 0xc0000000L /* 3 width character */ 93#define _CTYPE_SWM 0xe0000000L /* Mask for screen width data */ 94#define _CTYPE_SWS 30 /* Bits to shift to get width */ 95 96#ifdef _NONSTD_SOURCE 97/* 98 * Backward compatibility 99 */ 100#define _A _CTYPE_A /* Alpha */ 101#define _C _CTYPE_C /* Control */ 102#define _D _CTYPE_D /* Digit */ 103#define _G _CTYPE_G /* Graph */ 104#define _L _CTYPE_L /* Lower */ 105#define _P _CTYPE_P /* Punct */ 106#define _S _CTYPE_S /* Space */ 107#define _U _CTYPE_U /* Upper */ 108#define _X _CTYPE_X /* X digit */ 109#define _B _CTYPE_B /* Blank */ 110#define _R _CTYPE_R /* Print */ 111#define _I _CTYPE_I /* Ideogram */ 112#define _T _CTYPE_T /* Special */ 113#define _Q _CTYPE_Q /* Phonogram */ 114#define _SW0 _CTYPE_SW0 /* 0 width character */ 115#define _SW1 _CTYPE_SW1 /* 1 width character */ 116#define _SW2 _CTYPE_SW2 /* 2 width character */ 117#define _SW3 _CTYPE_SW3 /* 3 width character */ 118#endif /* _NONSTD_SOURCE */ 119 120//Begin-Libc 121/* 122 * _EXTERNALIZE_CTYPE_INLINES_ is defined in locale/nomacros.c to tell us 123 * to generate code for extern versions of all intermediate inline functions. 124 */ 125#ifdef _EXTERNALIZE_CTYPE_INLINES_ 126#define _USE_CTYPE_INLINE_ 127#define __DARWIN_CTYPE_inline 128#else /* !_EXTERNALIZE_CTYPE_INLINES_ */ 129//End-Libc 130#define __DARWIN_CTYPE_inline __header_inline 131//Begin-Libc 132#endif /* !_EXTERNALIZE_CTYPE_INLINES_ */ 133//End-Libc 134 135//Begin-Libc 136/* 137 * _EXTERNALIZE_CTYPE_INLINES_TOP_ is defined in locale/isctype.c to tell us 138 * to generate code for extern versions of all top-level inline functions. 139 */ 140#ifdef _EXTERNALIZE_CTYPE_INLINES_TOP_ 141#define _USE_CTYPE_INLINE_ 142#define __DARWIN_CTYPE_TOP_inline 143#else /* !_EXTERNALIZE_CTYPE_INLINES_TOP_ */ 144//End-Libc 145#define __DARWIN_CTYPE_TOP_inline __header_inline 146//Begin-Libc 147#endif /* _EXTERNALIZE_CTYPE_INLINES_TOP_ */ 148//End-Libc 149 150/* 151 * Use inline functions if we are allowed to and the compiler supports them. 152 */ 153#if !defined(_DONT_USE_CTYPE_INLINE_) && \ 154 (defined(_USE_CTYPE_INLINE_) || defined(__GNUC__) || defined(__cplusplus)) 155 156/* See comments in <machine/_type.h> about __darwin_ct_rune_t. */ 157__BEGIN_DECLS 158unsigned long ___runetype(__darwin_ct_rune_t); 159__darwin_ct_rune_t ___tolower(__darwin_ct_rune_t); 160__darwin_ct_rune_t ___toupper(__darwin_ct_rune_t); 161__END_DECLS 162 163__DARWIN_CTYPE_TOP_inline int 164isascii(int _c) 165{ 166 return ((_c & ~0x7F) == 0); 167} 168 169#ifdef USE_ASCII 170__DARWIN_CTYPE_inline int 171__maskrune(__darwin_ct_rune_t _c, unsigned long _f) 172{ 173 return _DefaultRuneLocale.__runetype[_c & 0xff] & _f; 174} 175//Begin-Libc 176#elif defined(__LIBC__) 177__DARWIN_CTYPE_inline int 178__maskrune(__darwin_ct_rune_t _c, unsigned long _f) 179{ 180 return ((_c < 0 || _c >= _CACHED_RUNES) ? ___runetype(_c) : 181 __current_locale()->__lc_ctype->_CurrentRuneLocale.__runetype[_c]) & _f; 182} 183//End-Libc 184#else /* !USE_ASCII */ 185__BEGIN_DECLS 186int __maskrune(__darwin_ct_rune_t, unsigned long); 187__END_DECLS 188#endif /* USE_ASCII */ 189 190__DARWIN_CTYPE_inline int 191__istype(__darwin_ct_rune_t _c, unsigned long _f) 192{ 193#ifdef USE_ASCII 194 return !!(__maskrune(_c, _f)); 195#else /* USE_ASCII */ 196 return (isascii(_c) ? !!(_DefaultRuneLocale.__runetype[_c] & _f) 197 : !!__maskrune(_c, _f)); 198#endif /* USE_ASCII */ 199} 200 201__DARWIN_CTYPE_inline __darwin_ct_rune_t 202__isctype(__darwin_ct_rune_t _c, unsigned long _f) 203{ 204#ifdef USE_ASCII 205 return !!(__maskrune(_c, _f)); 206#else /* USE_ASCII */ 207 return (_c < 0 || _c >= _CACHED_RUNES) ? 0 : 208 !!(_DefaultRuneLocale.__runetype[_c] & _f); 209#endif /* USE_ASCII */ 210} 211 212#ifdef USE_ASCII 213__DARWIN_CTYPE_inline __darwin_ct_rune_t 214__toupper(__darwin_ct_rune_t _c) 215{ 216 return _DefaultRuneLocale.__mapupper[_c & 0xff]; 217} 218 219__DARWIN_CTYPE_inline __darwin_ct_rune_t 220__tolower(__darwin_ct_rune_t _c) 221{ 222 return _DefaultRuneLocale.__maplower[_c & 0xff]; 223} 224//Begin-Libc 225#elif defined(__LIBC__) 226/* 227 * We can't do what we do for __toupper_l() (check for ASCII first, then call 228 * ___toupper_l() otherwise) because versions of ___toupper() before Tiger 229 * assume c >= _CACHED_RUNES. So we are stuck making __toupper() a routine 230 * to hide the extended locale details, outside of Libc. 231 */ 232__DARWIN_CTYPE_inline __darwin_ct_rune_t 233__toupper(__darwin_ct_rune_t _c) 234{ 235 return (_c < 0 || _c >= _CACHED_RUNES) ? ___toupper(_c) : 236 __current_locale()->__lc_ctype->_CurrentRuneLocale.__mapupper[_c]; 237} 238 239__DARWIN_CTYPE_inline __darwin_ct_rune_t 240__tolower(__darwin_ct_rune_t _c) 241{ 242 return (_c < 0 || _c >= _CACHED_RUNES) ? ___tolower(_c) : 243 __current_locale()->__lc_ctype->_CurrentRuneLocale.__maplower[_c]; 244} 245//End-Libc 246#else /* !USE_ASCII */ 247__BEGIN_DECLS 248__darwin_ct_rune_t __toupper(__darwin_ct_rune_t); 249__darwin_ct_rune_t __tolower(__darwin_ct_rune_t); 250__END_DECLS 251#endif /* USE_ASCII */ 252 253__DARWIN_CTYPE_inline int 254__wcwidth(__darwin_ct_rune_t _c) 255{ 256 unsigned int _x; 257 258 if (_c == 0) 259 return (0); 260 _x = (unsigned int)__maskrune(_c, _CTYPE_SWM|_CTYPE_R); 261 if ((_x & _CTYPE_SWM) != 0) 262 return ((_x & _CTYPE_SWM) >> _CTYPE_SWS); 263 return ((_x & _CTYPE_R) != 0 ? 1 : -1); 264} 265 266#ifndef _EXTERNALIZE_CTYPE_INLINES_ 267 268#define _tolower(c) __tolower(c) 269#define _toupper(c) __toupper(c) 270 271__DARWIN_CTYPE_TOP_inline int 272isalnum(int _c) 273{ 274 return (__istype(_c, _CTYPE_A|_CTYPE_D)); 275} 276 277__DARWIN_CTYPE_TOP_inline int 278isalpha(int _c) 279{ 280 return (__istype(_c, _CTYPE_A)); 281} 282 283__DARWIN_CTYPE_TOP_inline int 284isblank(int _c) 285{ 286 return (__istype(_c, _CTYPE_B)); 287} 288 289__DARWIN_CTYPE_TOP_inline int 290iscntrl(int _c) 291{ 292 return (__istype(_c, _CTYPE_C)); 293} 294 295/* ANSI -- locale independent */ 296__DARWIN_CTYPE_TOP_inline int 297isdigit(int _c) 298{ 299 return (__isctype(_c, _CTYPE_D)); 300} 301 302__DARWIN_CTYPE_TOP_inline int 303isgraph(int _c) 304{ 305 return (__istype(_c, _CTYPE_G)); 306} 307 308__DARWIN_CTYPE_TOP_inline int 309islower(int _c) 310{ 311 return (__istype(_c, _CTYPE_L)); 312} 313 314__DARWIN_CTYPE_TOP_inline int 315isprint(int _c) 316{ 317 return (__istype(_c, _CTYPE_R)); 318} 319 320__DARWIN_CTYPE_TOP_inline int 321ispunct(int _c) 322{ 323 return (__istype(_c, _CTYPE_P)); 324} 325 326__DARWIN_CTYPE_TOP_inline int 327isspace(int _c) 328{ 329 return (__istype(_c, _CTYPE_S)); 330} 331 332__DARWIN_CTYPE_TOP_inline int 333isupper(int _c) 334{ 335 return (__istype(_c, _CTYPE_U)); 336} 337 338/* ANSI -- locale independent */ 339__DARWIN_CTYPE_TOP_inline int 340isxdigit(int _c) 341{ 342 return (__isctype(_c, _CTYPE_X)); 343} 344 345__DARWIN_CTYPE_TOP_inline int 346toascii(int _c) 347{ 348 return (_c & 0x7F); 349} 350 351__DARWIN_CTYPE_TOP_inline int 352tolower(int _c) 353{ 354 return (__tolower(_c)); 355} 356 357__DARWIN_CTYPE_TOP_inline int 358toupper(int _c) 359{ 360 return (__toupper(_c)); 361} 362 363#if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) 364__DARWIN_CTYPE_TOP_inline int 365digittoint(int _c) 366{ 367 return (__maskrune(_c, 0x0F)); 368} 369 370__DARWIN_CTYPE_TOP_inline int 371ishexnumber(int _c) 372{ 373 return (__istype(_c, _CTYPE_X)); 374} 375 376__DARWIN_CTYPE_TOP_inline int 377isideogram(int _c) 378{ 379 return (__istype(_c, _CTYPE_I)); 380} 381 382__DARWIN_CTYPE_TOP_inline int 383isnumber(int _c) 384{ 385 return (__istype(_c, _CTYPE_D)); 386} 387 388__DARWIN_CTYPE_TOP_inline int 389isphonogram(int _c) 390{ 391 return (__istype(_c, _CTYPE_Q)); 392} 393 394__DARWIN_CTYPE_TOP_inline int 395isrune(int _c) 396{ 397 return (__istype(_c, 0xFFFFFFF0L)); 398} 399 400__DARWIN_CTYPE_TOP_inline int 401isspecial(int _c) 402{ 403 return (__istype(_c, _CTYPE_T)); 404} 405#endif /* !_ANSI_SOURCE && (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 406#endif /* _EXTERNALIZE_CTYPE_INLINES_ */ 407 408#else /* not using inlines */ 409 410__BEGIN_DECLS 411int isalnum(int); 412int isalpha(int); 413int isblank(int); 414int iscntrl(int); 415int isdigit(int); 416int isgraph(int); 417int islower(int); 418int isprint(int); 419int ispunct(int); 420int isspace(int); 421int isupper(int); 422int isxdigit(int); 423int tolower(int); 424int toupper(int); 425int isascii(int); 426int toascii(int); 427 428#if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) 429int _tolower(int); 430int _toupper(int); 431int digittoint(int); 432int ishexnumber(int); 433int isideogram(int); 434int isnumber(int); 435int isphonogram(int); 436int isrune(int); 437int isspecial(int); 438#endif 439__END_DECLS 440 441#endif /* using inlines */ 442 443#ifdef _USE_EXTENDED_LOCALES_ 444#include <xlocale/_ctype.h> 445#endif /* _USE_EXTENDED_LOCALES_ */ 446 447#endif /* !_CTYPE_H_ */ 448