File: /usr/include/ctype.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       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: #ifndef    _CTYPE_H_
      67: #define _CTYPE_H_
      68: 
      69: #include <sys/cdefs.h>
      70: #include <runetype.h>
      71: 
      72: #define    _CTYPE_A    0x00000100L        /* Alpha */
      73: #define    _CTYPE_C    0x00000200L        /* Control */
      74: #define    _CTYPE_D    0x00000400L        /* Digit */
      75: #define    _CTYPE_G    0x00000800L        /* Graph */
      76: #define    _CTYPE_L    0x00001000L        /* Lower */
      77: #define    _CTYPE_P    0x00002000L        /* Punct */
      78: #define    _CTYPE_S    0x00004000L        /* Space */
      79: #define    _CTYPE_U    0x00008000L        /* Upper */
      80: #define    _CTYPE_X    0x00010000L        /* X digit */
      81: #define    _CTYPE_B    0x00020000L        /* Blank */
      82: #define    _CTYPE_R    0x00040000L        /* Print */
      83: #define    _CTYPE_I    0x00080000L        /* Ideogram */
      84: #define    _CTYPE_T    0x00100000L        /* Special */
      85: #define    _CTYPE_Q    0x00200000L        /* Phonogram */
      86: #define    _CTYPE_SW0    0x20000000L        /* 0 width character */
      87: #define    _CTYPE_SW1    0x40000000L        /* 1 width character */
      88: #define    _CTYPE_SW2    0x80000000L        /* 2 width character */
      89: #define    _CTYPE_SW3    0xc0000000L        /* 3 width character */
      90: #define    _CTYPE_SWM    0xe0000000L        /* Mask for screen width data */
      91: #define    _CTYPE_SWS    30            /* Bits to shift to get width */
      92: 
      93: #ifdef _NONSTD_SOURCE
      94: /*
      95:  * Backward compatibility
      96:  */
      97: #define    _A        _CTYPE_A        /* Alpha */
      98: #define    _C        _CTYPE_C        /* Control */
      99: #define    _D        _CTYPE_D        /* Digit */
     100: #define    _G        _CTYPE_G        /* Graph */
     101: #define    _L        _CTYPE_L        /* Lower */
     102: #define    _P        _CTYPE_P        /* Punct */
     103: #define    _S        _CTYPE_S        /* Space */
     104: #define    _U        _CTYPE_U        /* Upper */
     105: #define    _X        _CTYPE_X        /* X digit */
     106: #define    _B        _CTYPE_B        /* Blank */
     107: #define    _R        _CTYPE_R        /* Print */
     108: #define    _I        _CTYPE_I        /* Ideogram */
     109: #define    _T        _CTYPE_T        /* Special */
     110: #define    _Q        _CTYPE_Q        /* Phonogram */
     111: #define    _SW0        _CTYPE_SW0        /* 0 width character */
     112: #define    _SW1        _CTYPE_SW1        /* 1 width character */
     113: #define    _SW2        _CTYPE_SW2        /* 2 width character */
     114: #define    _SW3        _CTYPE_SW3        /* 3 width character */
     115: #endif /* _NONSTD_SOURCE */
     116: 
     117: #define __DARWIN_CTYPE_inline        __header_inline
     118: 
     119: #define __DARWIN_CTYPE_TOP_inline    __header_inline
     120: 
     121: /*
     122:  * Use inline functions if we are allowed to and the compiler supports them.
     123:  */
     124: #if !defined(_DONT_USE_CTYPE_INLINE_) && \
     125:     (defined(_USE_CTYPE_INLINE_) || defined(__GNUC__) || defined(__cplusplus))
     126: 
     127: /* See comments in <machine/_type.h> about __darwin_ct_rune_t. */
     128: __BEGIN_DECLS
     129: unsigned long        ___runetype(__darwin_ct_rune_t);
     130: __darwin_ct_rune_t    ___tolower(__darwin_ct_rune_t);
     131: __darwin_ct_rune_t    ___toupper(__darwin_ct_rune_t);
     132: __END_DECLS
     133: 
     134: __DARWIN_CTYPE_TOP_inline int
     135: isascii(int _c)
     136: {
     137:     return ((_c & ~0x7F) == 0);
     138: }
     139: 
     140: #ifdef USE_ASCII
     141: __DARWIN_CTYPE_inline int
     142: __maskrune(__darwin_ct_rune_t _c, unsigned long _f)
     143: {
     144:     return (int)_DefaultRuneLocale.__runetype[_c & 0xff] & (__uint32_t)_f;
     145: }
     146: #else /* !USE_ASCII */
     147: __BEGIN_DECLS
     148: int                 __maskrune(__darwin_ct_rune_t, unsigned long);
     149: __END_DECLS
     150: #endif /* USE_ASCII */
     151: 
     152: __DARWIN_CTYPE_inline int
     153: __istype(__darwin_ct_rune_t _c, unsigned long _f)
     154: {
     155: #ifdef USE_ASCII
     156:     return !!(__maskrune(_c, _f));
     157: #else /* USE_ASCII */
     158:     return (isascii(_c) ? !!(_DefaultRuneLocale.__runetype[_c] & _f)
     159:         : !!__maskrune(_c, _f));
     160: #endif /* USE_ASCII */
     161: }
     162: 
     163: __DARWIN_CTYPE_inline __darwin_ct_rune_t
     164: __isctype(__darwin_ct_rune_t _c, unsigned long _f)
     165: {
     166: #ifdef USE_ASCII
     167:     return !!(__maskrune(_c, _f));
     168: #else /* USE_ASCII */
     169:     return (_c < 0 || _c >= _CACHED_RUNES) ? 0 :
     170:         !!(_DefaultRuneLocale.__runetype[_c] & _f);
     171: #endif /* USE_ASCII */
     172: }
     173: 
     174: #ifdef USE_ASCII
     175: __DARWIN_CTYPE_inline __darwin_ct_rune_t
     176: __toupper(__darwin_ct_rune_t _c)
     177: {
     178:     return _DefaultRuneLocale.__mapupper[_c & 0xff];
     179: }
     180: 
     181: __DARWIN_CTYPE_inline __darwin_ct_rune_t
     182: __tolower(__darwin_ct_rune_t _c)
     183: {
     184:     return _DefaultRuneLocale.__maplower[_c & 0xff];
     185: }
     186: #else /* !USE_ASCII */
     187: __BEGIN_DECLS
     188: __darwin_ct_rune_t    __toupper(__darwin_ct_rune_t);
     189: __darwin_ct_rune_t    __tolower(__darwin_ct_rune_t);
     190: __END_DECLS
     191: #endif /* USE_ASCII */
     192: 
     193: __DARWIN_CTYPE_inline int
     194: __wcwidth(__darwin_ct_rune_t _c)
     195: {
     196:     unsigned int _x;
     197: 
     198:     if (_c == 0)
     199:         return (0);
     200:     _x = (unsigned int)__maskrune(_c, _CTYPE_SWM|_CTYPE_R);
     201:     if ((_x & _CTYPE_SWM) != 0)
     202:         return ((_x & _CTYPE_SWM) >> _CTYPE_SWS);
     203:     return ((_x & _CTYPE_R) != 0 ? 1 : -1);
     204: }
     205: 
     206: #ifndef _EXTERNALIZE_CTYPE_INLINES_
     207: 
     208: #define    _tolower(c)    __tolower(c)
     209: #define    _toupper(c)    __toupper(c)
     210: 
     211: __DARWIN_CTYPE_TOP_inline int
     212: isalnum(int _c)
     213: {
     214:     return (__istype(_c, _CTYPE_A|_CTYPE_D));
     215: }
     216: 
     217: __DARWIN_CTYPE_TOP_inline int
     218: isalpha(int _c)
     219: {
     220:     return (__istype(_c, _CTYPE_A));
     221: }
     222: 
     223: __DARWIN_CTYPE_TOP_inline int
     224: isblank(int _c)
     225: {
     226:     return (__istype(_c, _CTYPE_B));
     227: }
     228: 
     229: __DARWIN_CTYPE_TOP_inline int
     230: iscntrl(int _c)
     231: {
     232:     return (__istype(_c, _CTYPE_C));
     233: }
     234: 
     235: /* ANSI -- locale independent */
     236: __DARWIN_CTYPE_TOP_inline int
     237: isdigit(int _c)
     238: {
     239:     return (__isctype(_c, _CTYPE_D));
     240: }
     241: 
     242: __DARWIN_CTYPE_TOP_inline int
     243: isgraph(int _c)
     244: {
     245:     return (__istype(_c, _CTYPE_G));
     246: }
     247: 
     248: __DARWIN_CTYPE_TOP_inline int
     249: islower(int _c)
     250: {
     251:     return (__istype(_c, _CTYPE_L));
     252: }
     253: 
     254: __DARWIN_CTYPE_TOP_inline int
     255: isprint(int _c)
     256: {
     257:     return (__istype(_c, _CTYPE_R));
     258: }
     259: 
     260: __DARWIN_CTYPE_TOP_inline int
     261: ispunct(int _c)
     262: {
     263:     return (__istype(_c, _CTYPE_P));
     264: }
     265: 
     266: __DARWIN_CTYPE_TOP_inline int
     267: isspace(int _c)
     268: {
     269:     return (__istype(_c, _CTYPE_S));
     270: }
     271: 
     272: __DARWIN_CTYPE_TOP_inline int
     273: isupper(int _c)
     274: {
     275:     return (__istype(_c, _CTYPE_U));
     276: }
     277: 
     278: /* ANSI -- locale independent */
     279: __DARWIN_CTYPE_TOP_inline int
     280: isxdigit(int _c)
     281: {
     282:     return (__isctype(_c, _CTYPE_X));
     283: }
     284: 
     285: __DARWIN_CTYPE_TOP_inline int
     286: toascii(int _c)
     287: {
     288:     return (_c & 0x7F);
     289: }
     290: 
     291: __DARWIN_CTYPE_TOP_inline int
     292: tolower(int _c)
     293: {
     294:         return (__tolower(_c));
     295: }
     296: 
     297: __DARWIN_CTYPE_TOP_inline int
     298: toupper(int _c)
     299: {
     300:         return (__toupper(_c));
     301: }
     302: 
     303: #if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE))
     304: __DARWIN_CTYPE_TOP_inline int
     305: digittoint(int _c)
     306: {
     307:     return (__maskrune(_c, 0x0F));
     308: }
     309: 
     310: __DARWIN_CTYPE_TOP_inline int
     311: ishexnumber(int _c)
     312: {
     313:     return (__istype(_c, _CTYPE_X));
     314: }
     315: 
     316: __DARWIN_CTYPE_TOP_inline int
     317: isideogram(int _c)
     318: {
     319:     return (__istype(_c, _CTYPE_I));
     320: }
     321: 
     322: __DARWIN_CTYPE_TOP_inline int
     323: isnumber(int _c)
     324: {
     325:     return (__istype(_c, _CTYPE_D));
     326: }
     327: 
     328: __DARWIN_CTYPE_TOP_inline int
     329: isphonogram(int _c)
     330: {
     331:     return (__istype(_c, _CTYPE_Q));
     332: }
     333: 
     334: __DARWIN_CTYPE_TOP_inline int
     335: isrune(int _c)
     336: {
     337:     return (__istype(_c, 0xFFFFFFF0L));
     338: }
     339: 
     340: __DARWIN_CTYPE_TOP_inline int
     341: isspecial(int _c)
     342: {
     343:     return (__istype(_c, _CTYPE_T));
     344: }
     345: #endif /* !_ANSI_SOURCE && (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
     346: #endif /* _EXTERNALIZE_CTYPE_INLINES_ */
     347: 
     348: #else /* not using inlines */
     349: 
     350: __BEGIN_DECLS
     351: int     isalnum(int);
     352: int     isalpha(int);
     353: int     isblank(int);
     354: int     iscntrl(int);
     355: int     isdigit(int);
     356: int     isgraph(int);
     357: int     islower(int);
     358: int     isprint(int);
     359: int     ispunct(int);
     360: int     isspace(int);
     361: int     isupper(int);
     362: int     isxdigit(int);
     363: int     tolower(int);
     364: int     toupper(int);
     365: int     isascii(int);
     366: int     toascii(int);
     367: 
     368: #if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE))
     369: int     _tolower(int);
     370: int     _toupper(int);
     371: int     digittoint(int);
     372: int     ishexnumber(int);
     373: int     isideogram(int);
     374: int     isnumber(int);
     375: int     isphonogram(int);
     376: int     isrune(int);
     377: int     isspecial(int);
     378: #endif
     379: __END_DECLS
     380: 
     381: #endif /* using inlines */
     382: 
     383: #ifdef _USE_EXTENDED_LOCALES_
     384: #include <xlocale/_ctype.h>
     385: #endif /* _USE_EXTENDED_LOCALES_ */
     386: 
     387: #endif /* !_CTYPE_H_ */
     388: