159243Sobrien/* 259243Sobrien * sh.char.h: Table for spotting special characters quickly 359243Sobrien * Makes for very obscure but efficient coding. 459243Sobrien */ 559243Sobrien/*- 659243Sobrien * Copyright (c) 1980, 1991 The Regents of the University of California. 759243Sobrien * All rights reserved. 859243Sobrien * 959243Sobrien * Redistribution and use in source and binary forms, with or without 1059243Sobrien * modification, are permitted provided that the following conditions 1159243Sobrien * are met: 1259243Sobrien * 1. Redistributions of source code must retain the above copyright 1359243Sobrien * notice, this list of conditions and the following disclaimer. 1459243Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1559243Sobrien * notice, this list of conditions and the following disclaimer in the 1659243Sobrien * documentation and/or other materials provided with the distribution. 17100616Smp * 3. Neither the name of the University nor the names of its contributors 1859243Sobrien * may be used to endorse or promote products derived from this software 1959243Sobrien * without specific prior written permission. 2059243Sobrien * 2159243Sobrien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2259243Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2359243Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2459243Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2559243Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2659243Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2759243Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2859243Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2959243Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3059243Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3159243Sobrien * SUCH DAMAGE. 3259243Sobrien */ 3359243Sobrien#ifndef _h_sh_char 3459243Sobrien#define _h_sh_char 3559243Sobrien#if defined(NeXT) && defined(NLS) 3659243Sobrien# include <appkit/NXCType.h> 3759243Sobrien#else 3859243Sobrien# include <ctype.h> 39167465Smp# ifdef WIDE_STRINGS 40145479Smp# ifdef HAVE_WCTYPE_H 41145479Smp# include <wctype.h> 42145479Smp# else 43145479Smp# include <wchar.h> 44145479Smp# endif 45145479Smp# endif 4659243Sobrien#endif 4759243Sobrien 4859243Sobrientypedef unsigned char tcshuc; 4959243Sobrien#ifdef _MINIX 5059243Sobrien# undef _SP 5159243Sobrien#endif /* _MINIX */ 5259243Sobrienextern unsigned short _cmap[]; 5359243Sobrien#if defined(DSPMBYTE) 5459243Sobrien# define CHECK_MBYTEVAR STRdspmbyte 5559243Sobrien#endif 5659243Sobrienextern unsigned short _cmap_c[]; 5759243Sobrienextern unsigned short _cmap_mbyte[]; 5859243Sobrienextern short _enable_mbdisp; 5959243Sobrienextern unsigned short _mbmap[]; 6059243Sobrienextern unsigned short _mbmap_euc[]; 6159243Sobrienextern unsigned short _mbmap_sjis[]; 6283098Smpextern unsigned short _mbmap_big5[]; 63100616Smpextern unsigned short _mbmap_utf8[]; 6459243Sobrien/* VARIABLE Check str */ 6559243Sobrien/* same compiler require #define even not define DSPMBYTE */ 66195609Smp#undef _MB1 6759243Sobrien#define _MB1 0x0001 68195609Smp#undef _MB2 6959243Sobrien#define _MB2 0x0002 7059243Sobrien 7159243Sobrien#ifndef NLS 7259243Sobrienextern tcshuc _cmap_lower[], _cmap_upper[]; 7359243Sobrien 7459243Sobrien#endif 7559243Sobrien 76195609Smp#ifndef __QNXNTO__ 77195609Smp#undef _QF 7859243Sobrien#define _QF 0x0001 /* '" (Forward quotes) */ 79195609Smp#undef _QB 8059243Sobrien#define _QB 0x0002 /* ` (Backquote) */ 81195609Smp#undef _SP 8259243Sobrien#define _SP 0x0004 /* space and tab */ 83195609Smp#else 84195609Smp#undef _XD 85195609Smp#define _XD 0x0001 /* As in <ctype.h> */ 86195609Smp#undef _UP 87195609Smp#define _UP 0x0002 /* As in <ctype.h> */ 88195609Smp#undef _SP 89195609Smp#define _SP 0x0004 /* As in <ctype.h> */ 90195609Smp#endif 91195609Smp#undef _NL 9259243Sobrien#define _NL 0x0008 /* \n */ 93195609Smp#undef _META 9459243Sobrien#define _META 0x0010 /* lex meta characters, sp #'`";&<>()|\t\n */ 95195609Smp#undef _GLOB 9659243Sobrien#define _GLOB 0x0020 /* glob characters, *?{[` */ 97195609Smp#undef _ESC 9859243Sobrien#define _ESC 0x0040 /* \ */ 99195609Smp#undef _DOL 10059243Sobrien#define _DOL 0x0080 /* $ */ 101195609Smp#undef _DIG 10259243Sobrien#define _DIG 0x0100 /* 0-9 */ 103195609Smp#undef _LET 104145479Smp#define _LET 0x0200 /* a-z, A-Z, _, or locale-specific */ 105195609Smp#ifndef __QNXNTO__ 106195609Smp#undef _UP 107145479Smp#define _UP 0x0400 /* A-Z, or locale-specific */ 108195609Smp#else 109195609Smp#undef _QF 110195609Smp#define _QF 0x0400 /* '" (Forward quotes) */ 111195609Smp#endif 112195609Smp#undef _DOW 113145479Smp#define _DOW 0x0800 /* a-z, or locale-specific */ 114195609Smp#ifndef __QNXNTO__ 115195609Smp#undef _XD 11659243Sobrien#define _XD 0x1000 /* 0-9, a-f, A-F */ 117195609Smp#else 118195609Smp#undef _QB 119195609Smp#define _QB 0x1000 /* 0-9, a-f, A-F */ 120195609Smp#endif 121195609Smp#undef _CMD 12259243Sobrien#define _CMD 0x2000 /* lex end of command chars, ;&(|` */ 123195609Smp#undef _CTR 12459243Sobrien#define _CTR 0x4000 /* control */ 125195609Smp#undef _PUN 12659243Sobrien#define _PUN 0x8000 /* punctuation */ 12759243Sobrien 128145479Smp#ifdef IS_ASCII 129167465Smp# define ASC(ch) (ch) 130167465Smp# define CTL_ESC(ch) (ch) 131145479Smp#else 132145479Smp# ifdef _OSD_POSIX 13359243Sobrien/* "BS2000 OSD" is a POSIX on a main frame using a EBCDIC char set */ 134145479Smp# include <ascii_ebcdic.h> 135145479Smp# else 13669408Sache/* "OS/390 USS" is a POSIX on a main frame using an IBM1047 char set */ 137145479Smp# endif 138145479Smp extern unsigned short _toascii[256]; 139145479Smp extern unsigned short _toebcdic[256]; 14059243Sobrien 14159243Sobrien/* mainly for comparisons if (ASC(ch)=='\177')... */ 142167465Smp# define ASC(ch) _toascii[(tcshuc)(ch)] 14359243Sobrien 14459243Sobrien/* Literal escapes ('\010') must be mapped to EBCDIC, 14559243Sobrien * for C-Escapes ('\b'), the compiler already does it. 14659243Sobrien */ 147167465Smp# define CTL_ESC(ch) _toebcdic[(tcshuc)(ch)] 148145479Smp#endif /*IS_ASCII*/ 14959243Sobrien 150145479Smp#ifdef WIDE_STRINGS 151145479Smp# define cmap(c, bits) \ 152231990Smp (((c) & QUOTE) || (unsigned int)(c) >= 0x0080 ? 0 : \ 153231990Smp (_cmap[(tcshuc)ASC(c)] & (bits))) 154145479Smp#elif defined(SHORT_STRINGS) && defined(KANJI) 15569408Sache# define cmap(c, bits) \ 156231990Smp ((((c) & QUOTE) || ((tcshuc)(ASC(c) & 0x80) && adrof(STRnokanji))) ? \ 157145479Smp 0 : (_cmap[(tcshuc)ASC(c)] & (bits))) 158145479Smp#else /* SHORT_STRINGS && KANJI */ 159145479Smp# define cmap(c, bits) \ 160231990Smp (((c) & QUOTE) ? 0 : (_cmap[(tcshuc)ASC(c)] & (bits))) 16169408Sache#endif /* SHORT_STRINGS && KANJI */ 16259243Sobrien 163167465Smp#define isglob(c) cmap((c), _GLOB) 164167465Smp#define isspc(c) cmap((c), _SP) 165167465Smp#define ismeta(c) cmap((c), _META) 166167465Smp#define iscmdmeta(c) cmap((c), _CMD) 167145479Smp#ifdef WIDE_STRINGS 168145479Smp#define letter(c) (((c) & QUOTE) ? 0 : \ 169316957Sdchagin (iswalpha((c)) || (c) == '_')) 170145479Smp#define alnum(c) (((c) & QUOTE) ? 0 : \ 171316957Sdchagin (iswalnum((c)) || (c) == '_')) 172145479Smp#else 173145479Smp#define letter(c) (((Char)(c) & QUOTE) ? 0 : \ 174316957Sdchagin ((isalpha((c)) && !(cmap((c), _PUN))) \ 175195609Smp || (c) == '_')) 176145479Smp#define alnum(c) (((Char)(c) & QUOTE) ? 0 : \ 177316957Sdchagin ((isalnum((c)) && !(cmap((c), _PUN))) \ 178195609Smp || (c) == '_')) 179195609Smp 180145479Smp#endif 18159243Sobrien 18259243Sobrien#if defined(DSPMBYTE) 18359243Sobrien# define IsmbyteU(c) (Ismbyte1((Char)(c))||(Ismbyte2((Char)(c))&&((c)&0200))) 18459243Sobrien#endif 18559243Sobrien 18659243Sobrien#ifdef NLS 187145479Smp# ifdef WIDE_STRINGS 188145479Smp# define Isspace(c) (((c) & QUOTE) ? 0 : iswspace(c)) 189145479Smp# define Isdigit(c) (((c) & QUOTE) ? 0 : iswdigit(c)) 190145479Smp# define Isalpha(c) (((c) & QUOTE) ? 0 : iswalpha(c)) 191145479Smp# define Islower(c) (((c) & QUOTE) ? 0 : iswlower(c)) 192145479Smp# define Isupper(c) (((c) & QUOTE) ? 0 : iswupper(c)) 193145479Smp# define Tolower(c) (((c) & QUOTE) ? 0 : (wchar_t)towlower(c)) 194145479Smp# define Toupper(c) (((c) & QUOTE) ? 0 : (wchar_t)towupper(c)) 195145479Smp# define Isxdigit(c) (((c) & QUOTE) ? 0 : iswxdigit(c)) 196145479Smp# define Isalnum(c) (((c) & QUOTE) ? 0 : iswalnum(c)) 197145479Smp# define Iscntrl(c) (((c) & QUOTE) ? 0 : iswcntrl(c)) 198145479Smp# define Isprint(c) (((c) & QUOTE) ? 0 : iswprint(c)) 199145479Smp# define Ispunct(c) (((c) & QUOTE) ? 0 : iswpunct(c)) 200145479Smp# elif defined (NeXT) 20159243Sobrien# define Isspace(c) (((Char)(c) & QUOTE) ? 0 : NXIsSpace((unsigned) (c))) 20259243Sobrien# define Isdigit(c) (((Char)(c) & QUOTE) ? 0 : NXIsDigit((unsigned) (c))) 20359243Sobrien# define Isalpha(c) (((Char)(c) & QUOTE) ? 0 : NXIsAlpha((unsigned) (c))) 20459243Sobrien# define Islower(c) (((Char)(c) & QUOTE) ? 0 : NXIsLower((unsigned) (c))) 20559243Sobrien# define Isupper(c) (((Char)(c) & QUOTE) ? 0 : NXIsUpper((unsigned) (c))) 20659243Sobrien# define Tolower(c) (((Char)(c) & QUOTE) ? 0 : NXToLower((unsigned) (c))) 20759243Sobrien# define Toupper(c) (((Char)(c) & QUOTE) ? 0 : NXToUpper((unsigned) (c))) 20859243Sobrien# define Isxdigit(c) (((Char)(c) & QUOTE) ? 0 : NXIsXDigit((unsigned) (c))) 20959243Sobrien#if defined(DSPMBYTE) 21059243Sobrien# define IscntrlM(c) (((Char)(c) & QUOTE) ? 0 : NXIsCntrl((unsigned) (c))) 21159243Sobrien# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 21259243Sobrien# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : NXIsPrint((unsigned) (c))) 21359243Sobrien# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 21459243Sobrien#else 21559243Sobrien# define Isalnum(c) (((Char)(c) & QUOTE) ? 0 : NXIsAlNum((unsigned) (c))) 21659243Sobrien# define Iscntrl(c) (((Char)(c) & QUOTE) ? 0 : NXIsCntrl((unsigned) (c))) 21759243Sobrien# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : NXIsPrint((unsigned) (c))) 21859243Sobrien#endif /* !defined(DSPMBYTE) */ 21959243Sobrien# define Ispunct(c) (((Char)(c) & QUOTE) ? 0 : NXIsPunct((unsigned) (c))) 22059243Sobrien# else /* !NeXT */ 22169408Sache# ifndef WINNT_NATIVE 22259243Sobrien# define Isspace(c) (((Char)(c) & QUOTE) ? 0 : isspace((tcshuc) (c))) 22359243Sobrien# define Isdigit(c) (((Char)(c) & QUOTE) ? 0 : isdigit((tcshuc) (c))) 22459243Sobrien# define Isalpha(c) (((Char)(c) & QUOTE) ? 0 : isalpha((tcshuc) (c))) 22559243Sobrien# define Islower(c) (((Char)(c) & QUOTE) ? 0 : islower((tcshuc) (c))) 22659243Sobrien# define Isupper(c) (((Char)(c) & QUOTE) ? 0 : isupper((tcshuc) (c))) 22759243Sobrien# define Tolower(c) (((Char)(c) & QUOTE) ? 0 : tolower((tcshuc) (c))) 22859243Sobrien# define Toupper(c) (((Char)(c) & QUOTE) ? 0 : toupper((tcshuc) (c))) 22959243Sobrien# define Isxdigit(c) (((Char)(c) & QUOTE) ? 0 : isxdigit((tcshuc) (c))) 23059243Sobrien# define Isalnum(c) (((Char)(c) & QUOTE) ? 0 : isalnum((tcshuc) (c))) 23159243Sobrien#if defined(DSPMBYTE) 23259243Sobrien# define IscntrlM(c) (((Char)(c) & QUOTE) ? 0 : iscntrl((tcshuc) (c))) 23359243Sobrien# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 23459243Sobrien#else 23559243Sobrien# define Iscntrl(c) (((Char)(c) & QUOTE) ? 0 : iscntrl((tcshuc) (c))) 23659243Sobrien#endif /* !defined(DSPMBYTE) */ 23759243Sobrien# if SOLARIS2 == 24 23859243Sobrien /* 23959243Sobrien * From <casper@fwi.uva.nl> Casper Dik: 24059243Sobrien * In Solaris 2.4, isprint('\t') returns true after setlocal(LC_ALL,""). 24159243Sobrien * This breaks commandline editing when you include tabs. 24259243Sobrien * (This is in the en_US locale). 24359243Sobrien */ 24459243Sobrien#if defined(DSPMBYTE) 24559243Sobrien# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : \ 24659243Sobrien (isprint((tcshuc) (c)) && (c) != '\t')) 24759243Sobrien#else 24859243Sobrien# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : \ 24959243Sobrien (isprint((tcshuc) (c)) && (c) != '\t')) 25059243Sobrien#endif /* !defined(DSPMBYTE) */ 25159243Sobrien# else 25259243Sobrien#if defined(DSPMBYTE) 25359243Sobrien# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : isprint((tcshuc) (c))) 25459243Sobrien#else 25559243Sobrien# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : isprint((tcshuc) (c))) 25659243Sobrien#endif /* !defined(DSPMBYTE) */ 25759243Sobrien# endif /* SOLARIS2 == 24 */ 25859243Sobrien#if defined(DSPMBYTE) 25959243Sobrien# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 26059243Sobrien#endif /* !defined(DSPMBYTE) */ 26159243Sobrien# define Ispunct(c) (((Char)(c) & QUOTE) ? 0 : ispunct((tcshuc) (c))) 26269408Sache# else /* WINNT_NATIVE */ 26359243Sobrien# define Isspace(c) (((Char)(c) & QUOTE) ? 0 : isspace( oem_it((tcshuc)(c)))) 26459243Sobrien# define Isdigit(c) (((Char)(c) & QUOTE) ? 0 : isdigit( oem_it((tcshuc)(c)))) 26559243Sobrien# define Isalpha(c) (((Char)(c) & QUOTE) ? 0 : isalpha( oem_it((tcshuc)(c)))) 26659243Sobrien# define Islower(c) (((Char)(c) & QUOTE) ? 0 : islower( oem_it((tcshuc)(c)))) 26759243Sobrien# define Isupper(c) (((Char)(c) & QUOTE) ? 0 : isupper( oem_it((tcshuc)(c)))) 26859243Sobrien# define Tolower(c) (((Char)(c) & QUOTE) ? 0 : tolower( oem_it((tcshuc)(c)))) 26959243Sobrien# define Toupper(c) (((Char)(c) & QUOTE) ? 0 : toupper( oem_it((tcshuc)(c)))) 27059243Sobrien# define Isxdigit(c)(((Char)(c) & QUOTE) ? 0 : isxdigit(oem_it((tcshuc)(c)))) 27159243Sobrien# define Isalnum(c) (((Char)(c) & QUOTE) ? 0 : isalnum( oem_it((tcshuc)(c)))) 27259243Sobrien# define Ispunct(c) (((Char)(c) & QUOTE) ? 0 : ispunct( oem_it((tcshuc)(c)))) 27359243Sobrien#if defined(DSPMBYTE) 27459243Sobrien# define IscntrlM(c) (((Char)(c) & QUOTE) ? 0 : iscntrl( oem_it((tcshuc)(c)))) 27559243Sobrien# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 27659243Sobrien# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : isprint( oem_it((tcshuc)(c)))) 27759243Sobrien# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 27859243Sobrien#else 27959243Sobrien# define Iscntrl(c) (((Char)(c) & QUOTE) ? 0 : iscntrl( oem_it((tcshuc)(c)))) 28059243Sobrien# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : isprint( oem_it((tcshuc)(c)))) 28159243Sobrien#endif /* !defined(DSPMBYTE) */ 28269408Sache# endif /* WINNT_NATIVE */ 28359243Sobrien# endif /* !NeXT */ 28459243Sobrien#else /* !NLS */ 285167465Smp# define Isspace(c) cmap((c), _SP|_NL) 286167465Smp# define Isdigit(c) cmap((c), _DIG) 287167465Smp# define Isalpha(c) (cmap((c),_LET) && !(((c) & META) && AsciiOnly)) 288167465Smp# define Islower(c) (cmap((c),_DOW) && !(((c) & META) && AsciiOnly)) 289167465Smp# define Isupper(c) (cmap((c), _UP) && !(((c) & META) && AsciiOnly)) 290145479Smp# define Tolower(c) (_cmap_lower[ASC(c)]) 291145479Smp# define Toupper(c) (_cmap_upper[ASC(c)]) 292167465Smp# define Isxdigit(c) cmap((c), _XD) 293167465Smp# define Isalnum(c) (cmap((c), _DIG|_LET) && !(((Char)(c) & META) && AsciiOnly)) 29459243Sobrien#if defined(DSPMBYTE) 295167465Smp# define IscntrlM(c) (cmap((c),_CTR) && !(((c) & META) && AsciiOnly)) 29659243Sobrien# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 297167465Smp# define IsprintM(c) (!cmap((c),_CTR) && !(((c) & META) && AsciiOnly)) 29859243Sobrien# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 29959243Sobrien#else 300167465Smp# define Iscntrl(c) (cmap((c),_CTR) && !(((c) & META) && AsciiOnly)) 301167465Smp# define Isprint(c) (!cmap((c),_CTR) && !(((c) & META) && AsciiOnly)) 30259243Sobrien#endif /* !defined(DSPMBYTE) */ 303167465Smp# define Ispunct(c) (cmap((c),_PUN) && !(((c) & META) && AsciiOnly)) 30459243Sobrien 30559243Sobrien#endif /* !NLS */ 30659243Sobrien 30759243Sobrien#if defined(DSPMBYTE) 30859243Sobrien# define Ismbyte1(c) ((_mbmap[(c) & 0377] & _MB1) ? 1 : 0) 30959243Sobrien# define Ismbyte2(c) ((_mbmap[(c) & 0377] & _MB2) ? 1 : 0) 31059243Sobrien#endif 31159243Sobrien 31259243Sobrien#endif /* _h_sh_char */ 313