_ctype.h revision 173244
178527Sassar/* 278527Sassar * Copyright (c) 1989, 1993 378527Sassar * The Regents of the University of California. All rights reserved. 478527Sassar * (c) UNIX System Laboratories, Inc. 578527Sassar * All or some portions of this file are derived from material licensed 678527Sassar * to the University of California by American Telephone and Telegraph 778527Sassar * Co. or Unix System Laboratories, Inc. and are reproduced herein with 878527Sassar * the permission of UNIX System Laboratories, Inc. 972445Sassar * 1072445Sassar * This code is derived from software contributed to Berkeley by 1172445Sassar * Paul Borman at Krystal Technologies. 1272445Sassar * 1372445Sassar * Redistribution and use in source and binary forms, with or without 1472445Sassar * modification, are permitted provided that the following conditions 1572445Sassar * are met: 1672445Sassar * 1. Redistributions of source code must retain the above copyright 1772445Sassar * notice, this list of conditions and the following disclaimer. 1872445Sassar * 2. Redistributions in binary form must reproduce the above copyright 1972445Sassar * notice, this list of conditions and the following disclaimer in the 2072445Sassar * documentation and/or other materials provided with the distribution. 2172445Sassar * 3. All advertising materials mentioning features or use of this software 2272445Sassar * must display the following acknowledgement: 2372445Sassar * This product includes software developed by the University of 2472445Sassar * California, Berkeley and its contributors. 2572445Sassar * 4. Neither the name of the University nor the names of its contributors 2672445Sassar * may be used to endorse or promote products derived from this software 2772445Sassar * without specific prior written permission. 2872445Sassar * 2972445Sassar * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 3072445Sassar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 3172445Sassar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 3272445Sassar * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 3372445Sassar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3472445Sassar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3572445Sassar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3672445Sassar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3772445Sassar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3872445Sassar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3972445Sassar * SUCH DAMAGE. 4072445Sassar * 4172445Sassar * From @(#)ctype.h 8.4 (Berkeley) 1/21/94 4272445Sassar * From FreeBSD: src/include/ctype.h,v 1.27 2004/06/23 07:11:39 tjr Exp 4372445Sassar * $FreeBSD: head/include/_ctype.h 173244 2007-11-01 03:18:02Z ache $ 4472445Sassar */ 4572445Sassar 4672445Sassar#ifndef __CTYPE_H_ 4772445Sassar#define __CTYPE_H_ 4872445Sassar 4972445Sassar#include <sys/cdefs.h> 5072445Sassar#include <sys/_types.h> 5172445Sassar 5272445Sassar#define _CTYPE_A 0x00000100L /* Alpha */ 5355682Smarkm#define _CTYPE_C 0x00000200L /* Control */ 5455682Smarkm#define _CTYPE_D 0x00000400L /* Digit */ 5555682Smarkm#define _CTYPE_G 0x00000800L /* Graph */ 5655682Smarkm#define _CTYPE_L 0x00001000L /* Lower */ 5755682Smarkm#define _CTYPE_P 0x00002000L /* Punct */ 5855682Smarkm#define _CTYPE_S 0x00004000L /* Space */ 5955682Smarkm#define _CTYPE_U 0x00008000L /* Upper */ 6055682Smarkm#define _CTYPE_X 0x00010000L /* X digit */ 6155682Smarkm#define _CTYPE_B 0x00020000L /* Blank */ 6255682Smarkm#define _CTYPE_R 0x00040000L /* Print */ 6355682Smarkm#define _CTYPE_I 0x00080000L /* Ideogram */ 6455682Smarkm#define _CTYPE_T 0x00100000L /* Special */ 6555682Smarkm#define _CTYPE_Q 0x00200000L /* Phonogram */ 6655682Smarkm#define _CTYPE_SW0 0x20000000L /* 0 width character */ 6755682Smarkm#define _CTYPE_SW1 0x40000000L /* 1 width character */ 6855682Smarkm#define _CTYPE_SW2 0x80000000L /* 2 width character */ 6955682Smarkm#define _CTYPE_SW3 0xc0000000L /* 3 width character */ 7055682Smarkm#define _CTYPE_SWM 0xe0000000L /* Mask for screen width data */ 7155682Smarkm#define _CTYPE_SWS 30 /* Bits to shift to get width */ 7255682Smarkm 7355682Smarkm/* See comments in <sys/_types.h> about __ct_rune_t. */ 7455682Smarkm__BEGIN_DECLS 7555682Smarkmunsigned long ___runetype(__ct_rune_t) __pure; 7655682Smarkm__ct_rune_t ___tolower(__ct_rune_t) __pure; 7755682Smarkm__ct_rune_t ___toupper(__ct_rune_t) __pure; 7855682Smarkm__END_DECLS 7955682Smarkm 8055682Smarkm/* 8155682Smarkm * _EXTERNALIZE_CTYPE_INLINES_ is defined in locale/nomacros.c to tell us 8255682Smarkm * to generate code for extern versions of all our inline functions. 8355682Smarkm */ 8455682Smarkm#ifdef _EXTERNALIZE_CTYPE_INLINES_ 8555682Smarkm#define _USE_CTYPE_INLINE_ 8655682Smarkm#define static 8755682Smarkm#define __inline 8855682Smarkm#endif 8955682Smarkm 9055682Smarkmextern int __mb_sb_limit; 9155682Smarkm 9255682Smarkm/* 9355682Smarkm * Use inline functions if we are allowed to and the compiler supports them. 9455682Smarkm */ 9555682Smarkm#if !defined(_DONT_USE_CTYPE_INLINE_) && \ 9655682Smarkm (defined(_USE_CTYPE_INLINE_) || defined(__GNUC__) || defined(__cplusplus)) 9755682Smarkm 9855682Smarkm#include <runetype.h> 9955682Smarkm 10055682Smarkmstatic __inline int 10155682Smarkm__maskrune(__ct_rune_t _c, unsigned long _f) 10255682Smarkm{ 10355682Smarkm return ((_c < 0 || _c >= _CACHED_RUNES) ? ___runetype(_c) : 10455682Smarkm _CurrentRuneLocale->__runetype[_c]) & _f; 10555682Smarkm} 10655682Smarkm 10755682Smarkmstatic __inline int 10855682Smarkm__sbmaskrune(__ct_rune_t _c, unsigned long _f) 10955682Smarkm{ 11055682Smarkm return (_c < 0 || _c >= __mb_sb_limit) ? 0 : 11155682Smarkm _CurrentRuneLocale->__runetype[_c] & _f; 11255682Smarkm} 11355682Smarkm 11455682Smarkmstatic __inline int 11555682Smarkm__istype(__ct_rune_t _c, unsigned long _f) 11655682Smarkm{ 11755682Smarkm return (!!__maskrune(_c, _f)); 11855682Smarkm} 11955682Smarkm 12055682Smarkmstatic __inline int 12155682Smarkm__sbistype(__ct_rune_t _c, unsigned long _f) 12255682Smarkm{ 12355682Smarkm return (!!__sbmaskrune(_c, _f)); 12455682Smarkm} 12555682Smarkm 12655682Smarkmstatic __inline int 12755682Smarkm__isctype(__ct_rune_t _c, unsigned long _f) 12855682Smarkm{ 12955682Smarkm return (_c < 0 || _c >= 128) ? 0 : 13055682Smarkm !!(_DefaultRuneLocale.__runetype[_c] & _f); 13155682Smarkm} 13255682Smarkm 13355682Smarkmstatic __inline __ct_rune_t 13455682Smarkm__toupper(__ct_rune_t _c) 13555682Smarkm{ 13655682Smarkm return (_c < 0 || _c >= _CACHED_RUNES) ? ___toupper(_c) : 13755682Smarkm _CurrentRuneLocale->__mapupper[_c]; 13855682Smarkm} 13955682Smarkm 14055682Smarkmstatic __inline __ct_rune_t 14155682Smarkm__sbtoupper(__ct_rune_t _c) 14255682Smarkm{ 14355682Smarkm return (_c < 0 || _c >= __mb_sb_limit) ? _c : 14455682Smarkm _CurrentRuneLocale->__mapupper[_c]; 14555682Smarkm} 14655682Smarkm 14755682Smarkmstatic __inline __ct_rune_t 14855682Smarkm__tolower(__ct_rune_t _c) 14955682Smarkm{ 15055682Smarkm return (_c < 0 || _c >= _CACHED_RUNES) ? ___tolower(_c) : 15155682Smarkm _CurrentRuneLocale->__maplower[_c]; 15255682Smarkm} 15355682Smarkm 15455682Smarkmstatic __inline __ct_rune_t 15555682Smarkm__sbtolower(__ct_rune_t _c) 15655682Smarkm{ 15755682Smarkm return (_c < 0 || _c >= __mb_sb_limit) ? _c : 15855682Smarkm _CurrentRuneLocale->__maplower[_c]; 15955682Smarkm} 16055682Smarkm 16155682Smarkmstatic __inline int 16255682Smarkm__wcwidth(__ct_rune_t _c) 16355682Smarkm{ 16455682Smarkm unsigned int _x; 16555682Smarkm 16655682Smarkm if (_c == 0) 16755682Smarkm return (0); 16855682Smarkm _x = (unsigned int)__maskrune(_c, _CTYPE_SWM|_CTYPE_R); 16955682Smarkm if ((_x & _CTYPE_SWM) != 0) 17055682Smarkm return ((_x & _CTYPE_SWM) >> _CTYPE_SWS); 17155682Smarkm return ((_x & _CTYPE_R) != 0 ? 1 : -1); 17255682Smarkm} 17355682Smarkm 17455682Smarkm#else /* not using inlines */ 17555682Smarkm 17655682Smarkm__BEGIN_DECLS 17755682Smarkmint __maskrune(__ct_rune_t, unsigned long); 17855682Smarkmint __sbmaskrune(__ct_rune_t, unsigned long); 17955682Smarkmint __istype(__ct_rune_t, unsigned long); 18055682Smarkmint __sbistype(__ct_rune_t, unsigned long); 18155682Smarkmint __isctype(__ct_rune_t, unsigned long); 18255682Smarkm__ct_rune_t __toupper(__ct_rune_t); 18355682Smarkm__ct_rune_t __sbtoupper(__ct_rune_t); 18455682Smarkm__ct_rune_t __tolower(__ct_rune_t); 18555682Smarkm__ct_rune_t __sbtolower(__ct_rune_t); 18655682Smarkmint __wcwidth(__ct_rune_t); 18755682Smarkm__END_DECLS 18855682Smarkm#endif /* using inlines */ 18955682Smarkm 19055682Smarkm#endif /* !__CTYPE_H_ */ 19155682Smarkm