1232633Smp/* $Header: /p/tcsh/cvsroot/tcsh/sh.char.h,v 3.36 2010/05/08 00:36:02 christos Exp $ */ 259243Sobrien/* 359243Sobrien * sh.char.h: Table for spotting special characters quickly 459243Sobrien * Makes for very obscure but efficient coding. 559243Sobrien */ 659243Sobrien/*- 759243Sobrien * Copyright (c) 1980, 1991 The Regents of the University of California. 859243Sobrien * All rights reserved. 959243Sobrien * 1059243Sobrien * Redistribution and use in source and binary forms, with or without 1159243Sobrien * modification, are permitted provided that the following conditions 1259243Sobrien * are met: 1359243Sobrien * 1. Redistributions of source code must retain the above copyright 1459243Sobrien * notice, this list of conditions and the following disclaimer. 1559243Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1659243Sobrien * notice, this list of conditions and the following disclaimer in the 1759243Sobrien * documentation and/or other materials provided with the distribution. 18100616Smp * 3. Neither the name of the University nor the names of its contributors 1959243Sobrien * may be used to endorse or promote products derived from this software 2059243Sobrien * without specific prior written permission. 2159243Sobrien * 2259243Sobrien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2359243Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2459243Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2559243Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2659243Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2759243Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2859243Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2959243Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3059243Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3159243Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3259243Sobrien * SUCH DAMAGE. 3359243Sobrien */ 3459243Sobrien#ifndef _h_sh_char 3559243Sobrien#define _h_sh_char 3659243Sobrien#if defined(NeXT) && defined(NLS) 3759243Sobrien# include <appkit/NXCType.h> 3859243Sobrien#else 3959243Sobrien# include <ctype.h> 40167465Smp# ifdef WIDE_STRINGS 41145479Smp# ifdef HAVE_WCTYPE_H 42145479Smp# include <wctype.h> 43145479Smp# else 44145479Smp# include <wchar.h> 45145479Smp# endif 46145479Smp# endif 4759243Sobrien#endif 4859243Sobrien 4959243Sobrientypedef unsigned char tcshuc; 5059243Sobrien#ifdef _MINIX 5159243Sobrien# undef _SP 5259243Sobrien#endif /* _MINIX */ 5359243Sobrienextern unsigned short _cmap[]; 5459243Sobrien#if defined(DSPMBYTE) 5559243Sobrien# define CHECK_MBYTEVAR STRdspmbyte 5659243Sobrien#endif 5759243Sobrienextern unsigned short _cmap_c[]; 5859243Sobrienextern unsigned short _cmap_mbyte[]; 5959243Sobrienextern short _enable_mbdisp; 6059243Sobrienextern unsigned short _mbmap[]; 6159243Sobrienextern unsigned short _mbmap_euc[]; 6259243Sobrienextern unsigned short _mbmap_sjis[]; 6383098Smpextern unsigned short _mbmap_big5[]; 64100616Smpextern unsigned short _mbmap_utf8[]; 6559243Sobrien/* VARIABLE Check str */ 6659243Sobrien/* same compiler require #define even not define DSPMBYTE */ 67195609Smp#undef _MB1 6859243Sobrien#define _MB1 0x0001 69195609Smp#undef _MB2 7059243Sobrien#define _MB2 0x0002 7159243Sobrien 7259243Sobrien#ifndef NLS 7359243Sobrienextern tcshuc _cmap_lower[], _cmap_upper[]; 7459243Sobrien 7559243Sobrien#endif 7659243Sobrien 77195609Smp#ifndef __QNXNTO__ 78195609Smp#undef _QF 7959243Sobrien#define _QF 0x0001 /* '" (Forward quotes) */ 80195609Smp#undef _QB 8159243Sobrien#define _QB 0x0002 /* ` (Backquote) */ 82195609Smp#undef _SP 8359243Sobrien#define _SP 0x0004 /* space and tab */ 84195609Smp#else 85195609Smp#undef _XD 86195609Smp#define _XD 0x0001 /* As in <ctype.h> */ 87195609Smp#undef _UP 88195609Smp#define _UP 0x0002 /* As in <ctype.h> */ 89195609Smp#undef _SP 90195609Smp#define _SP 0x0004 /* As in <ctype.h> */ 91195609Smp#endif 92195609Smp#undef _NL 9359243Sobrien#define _NL 0x0008 /* \n */ 94195609Smp#undef _META 9559243Sobrien#define _META 0x0010 /* lex meta characters, sp #'`";&<>()|\t\n */ 96195609Smp#undef _GLOB 9759243Sobrien#define _GLOB 0x0020 /* glob characters, *?{[` */ 98195609Smp#undef _ESC 9959243Sobrien#define _ESC 0x0040 /* \ */ 100195609Smp#undef _DOL 10159243Sobrien#define _DOL 0x0080 /* $ */ 102195609Smp#undef _DIG 10359243Sobrien#define _DIG 0x0100 /* 0-9 */ 104195609Smp#undef _LET 105145479Smp#define _LET 0x0200 /* a-z, A-Z, _, or locale-specific */ 106195609Smp#ifndef __QNXNTO__ 107195609Smp#undef _UP 108145479Smp#define _UP 0x0400 /* A-Z, or locale-specific */ 109195609Smp#else 110195609Smp#undef _QF 111195609Smp#define _QF 0x0400 /* '" (Forward quotes) */ 112195609Smp#endif 113195609Smp#undef _DOW 114145479Smp#define _DOW 0x0800 /* a-z, or locale-specific */ 115195609Smp#ifndef __QNXNTO__ 116195609Smp#undef _XD 11759243Sobrien#define _XD 0x1000 /* 0-9, a-f, A-F */ 118195609Smp#else 119195609Smp#undef _QB 120195609Smp#define _QB 0x1000 /* 0-9, a-f, A-F */ 121195609Smp#endif 122195609Smp#undef _CMD 12359243Sobrien#define _CMD 0x2000 /* lex end of command chars, ;&(|` */ 124195609Smp#undef _CTR 12559243Sobrien#define _CTR 0x4000 /* control */ 126195609Smp#undef _PUN 12759243Sobrien#define _PUN 0x8000 /* punctuation */ 12859243Sobrien 129145479Smp#ifdef IS_ASCII 130167465Smp# define ASC(ch) (ch) 131167465Smp# define CTL_ESC(ch) (ch) 132145479Smp#else 133145479Smp# ifdef _OSD_POSIX 13459243Sobrien/* "BS2000 OSD" is a POSIX on a main frame using a EBCDIC char set */ 135145479Smp# include <ascii_ebcdic.h> 136145479Smp# else 13769408Sache/* "OS/390 USS" is a POSIX on a main frame using an IBM1047 char set */ 138145479Smp# endif 139145479Smp extern unsigned short _toascii[256]; 140145479Smp extern unsigned short _toebcdic[256]; 14159243Sobrien 14259243Sobrien/* mainly for comparisons if (ASC(ch)=='\177')... */ 143167465Smp# define ASC(ch) _toascii[(tcshuc)(ch)] 14459243Sobrien 14559243Sobrien/* Literal escapes ('\010') must be mapped to EBCDIC, 14659243Sobrien * for C-Escapes ('\b'), the compiler already does it. 14759243Sobrien */ 148167465Smp# define CTL_ESC(ch) _toebcdic[(tcshuc)(ch)] 149145479Smp#endif /*IS_ASCII*/ 15059243Sobrien 151145479Smp#ifdef WIDE_STRINGS 152145479Smp# define cmap(c, bits) \ 153232633Smp (((c) & QUOTE) || (unsigned int)(c) >= 0x0080 ? 0 : \ 154232633Smp (_cmap[(tcshuc)ASC(c)] & (bits))) 155145479Smp#elif defined(SHORT_STRINGS) && defined(KANJI) 15669408Sache# define cmap(c, bits) \ 157232633Smp ((((c) & QUOTE) || ((tcshuc)(ASC(c) & 0x80) && adrof(STRnokanji))) ? \ 158145479Smp 0 : (_cmap[(tcshuc)ASC(c)] & (bits))) 159145479Smp#else /* SHORT_STRINGS && KANJI */ 160145479Smp# define cmap(c, bits) \ 161232633Smp (((c) & QUOTE) ? 0 : (_cmap[(tcshuc)ASC(c)] & (bits))) 16269408Sache#endif /* SHORT_STRINGS && KANJI */ 16359243Sobrien 164167465Smp#define isglob(c) cmap((c), _GLOB) 165167465Smp#define isspc(c) cmap((c), _SP) 166167465Smp#define ismeta(c) cmap((c), _META) 167167465Smp#define iscmdmeta(c) cmap((c), _CMD) 168145479Smp#ifdef WIDE_STRINGS 169145479Smp#define letter(c) (((c) & QUOTE) ? 0 : \ 170145479Smp (iswalpha((tcshuc) (c)) || (c) == '_')) 171145479Smp#define alnum(c) (((c) & QUOTE) ? 0 : \ 172145479Smp (iswalnum((tcshuc) (c)) || (c) == '_')) 173145479Smp#else 174145479Smp#define letter(c) (((Char)(c) & QUOTE) ? 0 : \ 175195609Smp ((isalpha((tcshuc) (c)) && !(cmap((c), _PUN))) \ 176195609Smp || (c) == '_')) 177145479Smp#define alnum(c) (((Char)(c) & QUOTE) ? 0 : \ 178195609Smp ((isalnum((tcshuc) (c)) && !(cmap((c), _PUN))) \ 179195609Smp || (c) == '_')) 180195609Smp 181145479Smp#endif 18259243Sobrien 18359243Sobrien#if defined(DSPMBYTE) 18459243Sobrien# define IsmbyteU(c) (Ismbyte1((Char)(c))||(Ismbyte2((Char)(c))&&((c)&0200))) 18559243Sobrien#endif 18659243Sobrien 18759243Sobrien#ifdef NLS 188145479Smp# ifdef WIDE_STRINGS 189145479Smp# define Isspace(c) (((c) & QUOTE) ? 0 : iswspace(c)) 190145479Smp# define Isdigit(c) (((c) & QUOTE) ? 0 : iswdigit(c)) 191145479Smp# define Isalpha(c) (((c) & QUOTE) ? 0 : iswalpha(c)) 192145479Smp# define Islower(c) (((c) & QUOTE) ? 0 : iswlower(c)) 193145479Smp# define Isupper(c) (((c) & QUOTE) ? 0 : iswupper(c)) 194145479Smp# define Tolower(c) (((c) & QUOTE) ? 0 : (wchar_t)towlower(c)) 195145479Smp# define Toupper(c) (((c) & QUOTE) ? 0 : (wchar_t)towupper(c)) 196145479Smp# define Isxdigit(c) (((c) & QUOTE) ? 0 : iswxdigit(c)) 197145479Smp# define Isalnum(c) (((c) & QUOTE) ? 0 : iswalnum(c)) 198145479Smp# define Iscntrl(c) (((c) & QUOTE) ? 0 : iswcntrl(c)) 199145479Smp# define Isprint(c) (((c) & QUOTE) ? 0 : iswprint(c)) 200145479Smp# define Ispunct(c) (((c) & QUOTE) ? 0 : iswpunct(c)) 201145479Smp# elif defined (NeXT) 20259243Sobrien# define Isspace(c) (((Char)(c) & QUOTE) ? 0 : NXIsSpace((unsigned) (c))) 20359243Sobrien# define Isdigit(c) (((Char)(c) & QUOTE) ? 0 : NXIsDigit((unsigned) (c))) 20459243Sobrien# define Isalpha(c) (((Char)(c) & QUOTE) ? 0 : NXIsAlpha((unsigned) (c))) 20559243Sobrien# define Islower(c) (((Char)(c) & QUOTE) ? 0 : NXIsLower((unsigned) (c))) 20659243Sobrien# define Isupper(c) (((Char)(c) & QUOTE) ? 0 : NXIsUpper((unsigned) (c))) 20759243Sobrien# define Tolower(c) (((Char)(c) & QUOTE) ? 0 : NXToLower((unsigned) (c))) 20859243Sobrien# define Toupper(c) (((Char)(c) & QUOTE) ? 0 : NXToUpper((unsigned) (c))) 20959243Sobrien# define Isxdigit(c) (((Char)(c) & QUOTE) ? 0 : NXIsXDigit((unsigned) (c))) 21059243Sobrien#if defined(DSPMBYTE) 21159243Sobrien# define IscntrlM(c) (((Char)(c) & QUOTE) ? 0 : NXIsCntrl((unsigned) (c))) 21259243Sobrien# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 21359243Sobrien# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : NXIsPrint((unsigned) (c))) 21459243Sobrien# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 21559243Sobrien#else 21659243Sobrien# define Isalnum(c) (((Char)(c) & QUOTE) ? 0 : NXIsAlNum((unsigned) (c))) 21759243Sobrien# define Iscntrl(c) (((Char)(c) & QUOTE) ? 0 : NXIsCntrl((unsigned) (c))) 21859243Sobrien# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : NXIsPrint((unsigned) (c))) 21959243Sobrien#endif /* !defined(DSPMBYTE) */ 22059243Sobrien# define Ispunct(c) (((Char)(c) & QUOTE) ? 0 : NXIsPunct((unsigned) (c))) 22159243Sobrien# else /* !NeXT */ 22269408Sache# ifndef WINNT_NATIVE 22359243Sobrien# define Isspace(c) (((Char)(c) & QUOTE) ? 0 : isspace((tcshuc) (c))) 22459243Sobrien# define Isdigit(c) (((Char)(c) & QUOTE) ? 0 : isdigit((tcshuc) (c))) 22559243Sobrien# define Isalpha(c) (((Char)(c) & QUOTE) ? 0 : isalpha((tcshuc) (c))) 22659243Sobrien# define Islower(c) (((Char)(c) & QUOTE) ? 0 : islower((tcshuc) (c))) 22759243Sobrien# define Isupper(c) (((Char)(c) & QUOTE) ? 0 : isupper((tcshuc) (c))) 22859243Sobrien# define Tolower(c) (((Char)(c) & QUOTE) ? 0 : tolower((tcshuc) (c))) 22959243Sobrien# define Toupper(c) (((Char)(c) & QUOTE) ? 0 : toupper((tcshuc) (c))) 23059243Sobrien# define Isxdigit(c) (((Char)(c) & QUOTE) ? 0 : isxdigit((tcshuc) (c))) 23159243Sobrien# define Isalnum(c) (((Char)(c) & QUOTE) ? 0 : isalnum((tcshuc) (c))) 23259243Sobrien#if defined(DSPMBYTE) 23359243Sobrien# define IscntrlM(c) (((Char)(c) & QUOTE) ? 0 : iscntrl((tcshuc) (c))) 23459243Sobrien# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 23559243Sobrien#else 23659243Sobrien# define Iscntrl(c) (((Char)(c) & QUOTE) ? 0 : iscntrl((tcshuc) (c))) 23759243Sobrien#endif /* !defined(DSPMBYTE) */ 23859243Sobrien# if SOLARIS2 == 24 23959243Sobrien /* 24059243Sobrien * From <casper@fwi.uva.nl> Casper Dik: 24159243Sobrien * In Solaris 2.4, isprint('\t') returns true after setlocal(LC_ALL,""). 24259243Sobrien * This breaks commandline editing when you include tabs. 24359243Sobrien * (This is in the en_US locale). 24459243Sobrien */ 24559243Sobrien#if defined(DSPMBYTE) 24659243Sobrien# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : \ 24759243Sobrien (isprint((tcshuc) (c)) && (c) != '\t')) 24859243Sobrien#else 24959243Sobrien# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : \ 25059243Sobrien (isprint((tcshuc) (c)) && (c) != '\t')) 25159243Sobrien#endif /* !defined(DSPMBYTE) */ 25259243Sobrien# else 25359243Sobrien#if defined(DSPMBYTE) 25459243Sobrien# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : isprint((tcshuc) (c))) 25559243Sobrien#else 25659243Sobrien# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : isprint((tcshuc) (c))) 25759243Sobrien#endif /* !defined(DSPMBYTE) */ 25859243Sobrien# endif /* SOLARIS2 == 24 */ 25959243Sobrien#if defined(DSPMBYTE) 26059243Sobrien# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 26159243Sobrien#endif /* !defined(DSPMBYTE) */ 26259243Sobrien# define Ispunct(c) (((Char)(c) & QUOTE) ? 0 : ispunct((tcshuc) (c))) 26369408Sache# else /* WINNT_NATIVE */ 26459243Sobrien# define Isspace(c) (((Char)(c) & QUOTE) ? 0 : isspace( oem_it((tcshuc)(c)))) 26559243Sobrien# define Isdigit(c) (((Char)(c) & QUOTE) ? 0 : isdigit( oem_it((tcshuc)(c)))) 26659243Sobrien# define Isalpha(c) (((Char)(c) & QUOTE) ? 0 : isalpha( oem_it((tcshuc)(c)))) 26759243Sobrien# define Islower(c) (((Char)(c) & QUOTE) ? 0 : islower( oem_it((tcshuc)(c)))) 26859243Sobrien# define Isupper(c) (((Char)(c) & QUOTE) ? 0 : isupper( oem_it((tcshuc)(c)))) 26959243Sobrien# define Tolower(c) (((Char)(c) & QUOTE) ? 0 : tolower( oem_it((tcshuc)(c)))) 27059243Sobrien# define Toupper(c) (((Char)(c) & QUOTE) ? 0 : toupper( oem_it((tcshuc)(c)))) 27159243Sobrien# define Isxdigit(c)(((Char)(c) & QUOTE) ? 0 : isxdigit(oem_it((tcshuc)(c)))) 27259243Sobrien# define Isalnum(c) (((Char)(c) & QUOTE) ? 0 : isalnum( oem_it((tcshuc)(c)))) 27359243Sobrien# define Ispunct(c) (((Char)(c) & QUOTE) ? 0 : ispunct( oem_it((tcshuc)(c)))) 27459243Sobrien#if defined(DSPMBYTE) 27559243Sobrien# define IscntrlM(c) (((Char)(c) & QUOTE) ? 0 : iscntrl( oem_it((tcshuc)(c)))) 27659243Sobrien# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 27759243Sobrien# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : isprint( oem_it((tcshuc)(c)))) 27859243Sobrien# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 27959243Sobrien#else 28059243Sobrien# define Iscntrl(c) (((Char)(c) & QUOTE) ? 0 : iscntrl( oem_it((tcshuc)(c)))) 28159243Sobrien# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : isprint( oem_it((tcshuc)(c)))) 28259243Sobrien#endif /* !defined(DSPMBYTE) */ 28369408Sache# endif /* WINNT_NATIVE */ 28459243Sobrien# endif /* !NeXT */ 28559243Sobrien#else /* !NLS */ 286167465Smp# define Isspace(c) cmap((c), _SP|_NL) 287167465Smp# define Isdigit(c) cmap((c), _DIG) 288167465Smp# define Isalpha(c) (cmap((c),_LET) && !(((c) & META) && AsciiOnly)) 289167465Smp# define Islower(c) (cmap((c),_DOW) && !(((c) & META) && AsciiOnly)) 290167465Smp# define Isupper(c) (cmap((c), _UP) && !(((c) & META) && AsciiOnly)) 291145479Smp# define Tolower(c) (_cmap_lower[ASC(c)]) 292145479Smp# define Toupper(c) (_cmap_upper[ASC(c)]) 293167465Smp# define Isxdigit(c) cmap((c), _XD) 294167465Smp# define Isalnum(c) (cmap((c), _DIG|_LET) && !(((Char)(c) & META) && AsciiOnly)) 29559243Sobrien#if defined(DSPMBYTE) 296167465Smp# define IscntrlM(c) (cmap((c),_CTR) && !(((c) & META) && AsciiOnly)) 29759243Sobrien# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 298167465Smp# define IsprintM(c) (!cmap((c),_CTR) && !(((c) & META) && AsciiOnly)) 29959243Sobrien# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 30059243Sobrien#else 301167465Smp# define Iscntrl(c) (cmap((c),_CTR) && !(((c) & META) && AsciiOnly)) 302167465Smp# define Isprint(c) (!cmap((c),_CTR) && !(((c) & META) && AsciiOnly)) 30359243Sobrien#endif /* !defined(DSPMBYTE) */ 304167465Smp# define Ispunct(c) (cmap((c),_PUN) && !(((c) & META) && AsciiOnly)) 30559243Sobrien 30659243Sobrien#endif /* !NLS */ 30759243Sobrien 30859243Sobrien#if defined(DSPMBYTE) 30959243Sobrien# define Ismbyte1(c) ((_mbmap[(c) & 0377] & _MB1) ? 1 : 0) 31059243Sobrien# define Ismbyte2(c) ((_mbmap[(c) & 0377] & _MB2) ? 1 : 0) 31159243Sobrien#endif 31259243Sobrien 31359243Sobrien#endif /* _h_sh_char */ 314