sh.char.h revision 145479
167754Smsmith/* $Header: /src/pub/tcsh/sh.char.h,v 3.26 2005/03/03 16:49:15 kim Exp $ */ 267754Smsmith/* 367754Smsmith * sh.char.h: Table for spotting special characters quickly 467754Smsmith * Makes for very obscure but efficient coding. 567754Smsmith */ 667754Smsmith/*- 767754Smsmith * Copyright (c) 1980, 1991 The Regents of the University of California. 8217365Sjkim * All rights reserved. 9281075Sdim * 1070243Smsmith * Redistribution and use in source and binary forms, with or without 1167754Smsmith * modification, are permitted provided that the following conditions 12217365Sjkim * are met: 13217365Sjkim * 1. Redistributions of source code must retain the above copyright 14217365Sjkim * notice, this list of conditions and the following disclaimer. 15217365Sjkim * 2. Redistributions in binary form must reproduce the above copyright 16217365Sjkim * notice, this list of conditions and the following disclaimer in the 17217365Sjkim * documentation and/or other materials provided with the distribution. 18217365Sjkim * 3. Neither the name of the University nor the names of its contributors 19217365Sjkim * may be used to endorse or promote products derived from this software 20217365Sjkim * without specific prior written permission. 21217365Sjkim * 22217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23217365Sjkim * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24217365Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25217365Sjkim * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2667754Smsmith * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3067754Smsmith * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31217365Sjkim * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32217365Sjkim * SUCH DAMAGE. 33217365Sjkim */ 34217365Sjkim#ifndef _h_sh_char 35217365Sjkim#define _h_sh_char 36217365Sjkim#if defined(NeXT) && defined(NLS) 37217365Sjkim# include <appkit/NXCType.h> 38217365Sjkim#else 39217365Sjkim# include <ctype.h> 40217365Sjkim# ifdef SHORT_STRINGS 41217365Sjkim# ifdef HAVE_WCTYPE_H 42217365Sjkim# include <wctype.h> 43217365Sjkim# else 4467754Smsmith# include <wchar.h> 45281075Sdim# endif 4667754Smsmith# endif 47193341Sjkim#endif 48193341Sjkim 49193341Sjkimtypedef unsigned char tcshuc; 50193341Sjkim#ifdef _MINIX 5167754Smsmith# undef _SP 5277424Smsmith#endif /* _MINIX */ 5391116Smsmithextern unsigned short _cmap[]; 5467754Smsmith#if defined(DSPMBYTE) 5567754Smsmith# define CHECK_MBYTEVAR STRdspmbyte 5677424Smsmith#endif 5767754Smsmithextern unsigned short _cmap_c[]; 5867754Smsmithextern unsigned short _cmap_mbyte[]; 5967754Smsmithextern short _enable_mbdisp; 6067754Smsmithextern unsigned short _mbmap[]; 6167754Smsmithextern unsigned short _mbmap_euc[]; 6267754Smsmithextern unsigned short _mbmap_sjis[]; 6367754Smsmithextern unsigned short _mbmap_big5[]; 6467754Smsmithextern unsigned short _mbmap_utf8[]; 6567754Smsmith/* VARIABLE Check str */ 6667754Smsmith/* same compiler require #define even not define DSPMBYTE */ 6767754Smsmith#define _MB1 0x0001 6867754Smsmith#define _MB2 0x0002 6967754Smsmith 70213806Sjkim#ifndef NLS 71213806Sjkimextern tcshuc _cmap_lower[], _cmap_upper[]; 72213806Sjkim 73213806Sjkim#endif 74213806Sjkim 75213806Sjkim#define _QF 0x0001 /* '" (Forward quotes) */ 7667754Smsmith#define _QB 0x0002 /* ` (Backquote) */ 7767754Smsmith#define _SP 0x0004 /* space and tab */ 7867754Smsmith#define _NL 0x0008 /* \n */ 7967754Smsmith#define _META 0x0010 /* lex meta characters, sp #'`";&<>()|\t\n */ 8067754Smsmith#define _GLOB 0x0020 /* glob characters, *?{[` */ 8177424Smsmith#define _ESC 0x0040 /* \ */ 8277424Smsmith#define _DOL 0x0080 /* $ */ 8377424Smsmith#define _DIG 0x0100 /* 0-9 */ 8467754Smsmith#define _LET 0x0200 /* a-z, A-Z, _, or locale-specific */ 8567754Smsmith#define _UP 0x0400 /* A-Z, or locale-specific */ 8667754Smsmith#define _DOW 0x0800 /* a-z, or locale-specific */ 8791116Smsmith#define _XD 0x1000 /* 0-9, a-f, A-F */ 8867754Smsmith#define _CMD 0x2000 /* lex end of command chars, ;&(|` */ 8967754Smsmith#define _CTR 0x4000 /* control */ 90167802Sjkim#define _PUN 0x8000 /* punctuation */ 9167754Smsmith 9277424Smsmith#ifdef IS_ASCII 9367754Smsmith# define ASC(ch) ch 9467754Smsmith# define CTL_ESC(ch) ch 9591116Smsmith#else 9667754Smsmith# ifdef _OSD_POSIX 9767754Smsmith/* "BS2000 OSD" is a POSIX on a main frame using a EBCDIC char set */ 9867754Smsmith# include <ascii_ebcdic.h> 9967754Smsmith# else 10091116Smsmith/* "OS/390 USS" is a POSIX on a main frame using an IBM1047 char set */ 10191116Smsmith# endif 10291116Smsmith extern unsigned short _toascii[256]; 10391116Smsmith extern unsigned short _toebcdic[256]; 10491116Smsmith 10567754Smsmith/* mainly for comparisons if (ASC(ch)=='\177')... */ 10667754Smsmith# define ASC(ch) _toascii[(tcshuc)ch] 10767754Smsmith 108200553Sjkim/* Literal escapes ('\010') must be mapped to EBCDIC, 10967754Smsmith * for C-Escapes ('\b'), the compiler already does it. 11067754Smsmith */ 11167754Smsmith# define CTL_ESC(ch) _toebcdic[(tcshuc)ch] 11267754Smsmith#endif /*IS_ASCII*/ 11367754Smsmith 11467754Smsmith#ifdef WIDE_STRINGS 115129684Snjl# define cmap(c, bits) \ 11667754Smsmith (((c) & QUOTE) || (c) >= 0x0080 ? 0 : (_cmap[(tcshuc)ASC(c)] & (bits))) 117129684Snjl#elif defined(SHORT_STRINGS) && defined(KANJI) 118129684Snjl# define cmap(c, bits) \ 11967754Smsmith ((((c) & QUOTE) || ((ASC(c) & 0x80) && adrof(STRnokanji))) ? \ 12067754Smsmith 0 : (_cmap[(tcshuc)ASC(c)] & (bits))) 12167754Smsmith#else /* SHORT_STRINGS && KANJI */ 12267754Smsmith# define cmap(c, bits) \ 123218590Sjkim (((c) & QUOTE) ? 0 : (_cmap[(tcshuc)ASC(c)] & (bits))) 124218590Sjkim#endif /* SHORT_STRINGS && KANJI */ 125218590Sjkim 126218590Sjkim#define isglob(c) cmap(c, _GLOB) 127218590Sjkim#define isspc(c) cmap(c, _SP) 128218590Sjkim#define ismeta(c) cmap(c, _META) 129218590Sjkim#define iscmdmeta(c) cmap(c, _CMD) 130218590Sjkim#ifdef WIDE_STRINGS 131218590Sjkim#define letter(c) (((c) & QUOTE) ? 0 : \ 132218590Sjkim (iswalpha((tcshuc) (c)) || (c) == '_')) 133218590Sjkim#define alnum(c) (((c) & QUOTE) ? 0 : \ 134218590Sjkim (iswalnum((tcshuc) (c)) || (c) == '_')) 135218590Sjkim#else 136218590Sjkim#define letter(c) (((Char)(c) & QUOTE) ? 0 : \ 137218590Sjkim (isalpha((tcshuc) (c)) || (c) == '_')) 138218590Sjkim#define alnum(c) (((Char)(c) & QUOTE) ? 0 : \ 139218590Sjkim (isalnum((tcshuc) (c)) || (c) == '_')) 140218590Sjkim#endif 141218590Sjkim 142218590Sjkim#if defined(DSPMBYTE) 14367754Smsmith# define IsmbyteU(c) (Ismbyte1((Char)(c))||(Ismbyte2((Char)(c))&&((c)&0200))) 144220663Sjkim#endif 145218590Sjkim 146220663Sjkim#ifdef NLS 147220663Sjkim# ifdef WIDE_STRINGS 148218590Sjkim# define Isspace(c) (((c) & QUOTE) ? 0 : iswspace(c)) 149218590Sjkim# define Isdigit(c) (((c) & QUOTE) ? 0 : iswdigit(c)) 150218590Sjkim# define Isalpha(c) (((c) & QUOTE) ? 0 : iswalpha(c)) 151218590Sjkim# define Islower(c) (((c) & QUOTE) ? 0 : iswlower(c)) 152250838Sjkim# define Isupper(c) (((c) & QUOTE) ? 0 : iswupper(c)) 153218590Sjkim# define Tolower(c) (((c) & QUOTE) ? 0 : (wchar_t)towlower(c)) 154218590Sjkim# define Toupper(c) (((c) & QUOTE) ? 0 : (wchar_t)towupper(c)) 155218590Sjkim# define Isxdigit(c) (((c) & QUOTE) ? 0 : iswxdigit(c)) 156220663Sjkim# define Isalnum(c) (((c) & QUOTE) ? 0 : iswalnum(c)) 157218590Sjkim# define Iscntrl(c) (((c) & QUOTE) ? 0 : iswcntrl(c)) 158220663Sjkim# define Isprint(c) (((c) & QUOTE) ? 0 : iswprint(c)) 159220663Sjkim# define Ispunct(c) (((c) & QUOTE) ? 0 : iswpunct(c)) 160220663Sjkim# elif defined (NeXT) 16167754Smsmith# define Isspace(c) (((Char)(c) & QUOTE) ? 0 : NXIsSpace((unsigned) (c))) 16291116Smsmith# define Isdigit(c) (((Char)(c) & QUOTE) ? 0 : NXIsDigit((unsigned) (c))) 16367754Smsmith# define Isalpha(c) (((Char)(c) & QUOTE) ? 0 : NXIsAlpha((unsigned) (c))) 16467754Smsmith# define Islower(c) (((Char)(c) & QUOTE) ? 0 : NXIsLower((unsigned) (c))) 16567754Smsmith# define Isupper(c) (((Char)(c) & QUOTE) ? 0 : NXIsUpper((unsigned) (c))) 166167802Sjkim# define Tolower(c) (((Char)(c) & QUOTE) ? 0 : NXToLower((unsigned) (c))) 16767754Smsmith# define Toupper(c) (((Char)(c) & QUOTE) ? 0 : NXToUpper((unsigned) (c))) 168167802Sjkim# define Isxdigit(c) (((Char)(c) & QUOTE) ? 0 : NXIsXDigit((unsigned) (c))) 16977424Smsmith#if defined(DSPMBYTE) 17067754Smsmith# define IscntrlM(c) (((Char)(c) & QUOTE) ? 0 : NXIsCntrl((unsigned) (c))) 17167754Smsmith# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 17267754Smsmith# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : NXIsPrint((unsigned) (c))) 173117521Snjl# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 174117521Snjl#else 17567754Smsmith# define Isalnum(c) (((Char)(c) & QUOTE) ? 0 : NXIsAlNum((unsigned) (c))) 17667754Smsmith# define Iscntrl(c) (((Char)(c) & QUOTE) ? 0 : NXIsCntrl((unsigned) (c))) 17767754Smsmith# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : NXIsPrint((unsigned) (c))) 17867754Smsmith#endif /* !defined(DSPMBYTE) */ 179117521Snjl# define Ispunct(c) (((Char)(c) & QUOTE) ? 0 : NXIsPunct((unsigned) (c))) 18067754Smsmith# else /* !NeXT */ 18167754Smsmith# ifndef WINNT_NATIVE 18267754Smsmith# define Isspace(c) (((Char)(c) & QUOTE) ? 0 : isspace((tcshuc) (c))) 18367754Smsmith# define Isdigit(c) (((Char)(c) & QUOTE) ? 0 : isdigit((tcshuc) (c))) 18467754Smsmith# define Isalpha(c) (((Char)(c) & QUOTE) ? 0 : isalpha((tcshuc) (c))) 18567754Smsmith# define Islower(c) (((Char)(c) & QUOTE) ? 0 : islower((tcshuc) (c))) 18677424Smsmith# define Isupper(c) (((Char)(c) & QUOTE) ? 0 : isupper((tcshuc) (c))) 18777424Smsmith# define Tolower(c) (((Char)(c) & QUOTE) ? 0 : tolower((tcshuc) (c))) 18867754Smsmith# define Toupper(c) (((Char)(c) & QUOTE) ? 0 : toupper((tcshuc) (c))) 18967754Smsmith# define Isxdigit(c) (((Char)(c) & QUOTE) ? 0 : isxdigit((tcshuc) (c))) 19067754Smsmith# define Isalnum(c) (((Char)(c) & QUOTE) ? 0 : isalnum((tcshuc) (c))) 19167754Smsmith#if defined(DSPMBYTE) 19267754Smsmith# define IscntrlM(c) (((Char)(c) & QUOTE) ? 0 : iscntrl((tcshuc) (c))) 19367754Smsmith# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 19491116Smsmith#else 19567754Smsmith# define Iscntrl(c) (((Char)(c) & QUOTE) ? 0 : iscntrl((tcshuc) (c))) 19667754Smsmith#endif /* !defined(DSPMBYTE) */ 197167802Sjkim# if SOLARIS2 == 24 19867754Smsmith /* 19967754Smsmith * From <casper@fwi.uva.nl> Casper Dik: 20067754Smsmith * In Solaris 2.4, isprint('\t') returns true after setlocal(LC_ALL,""). 20167754Smsmith * This breaks commandline editing when you include tabs. 20291116Smsmith * (This is in the en_US locale). 20367754Smsmith */ 20467754Smsmith#if defined(DSPMBYTE) 20567754Smsmith# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : \ 20667754Smsmith (isprint((tcshuc) (c)) && (c) != '\t')) 20791116Smsmith#else 20891116Smsmith# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : \ 20991116Smsmith (isprint((tcshuc) (c)) && (c) != '\t')) 21091116Smsmith#endif /* !defined(DSPMBYTE) */ 21191116Smsmith# else 21267754Smsmith#if defined(DSPMBYTE) 21367754Smsmith# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : isprint((tcshuc) (c))) 21467754Smsmith#else 215200553Sjkim# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : isprint((tcshuc) (c))) 216167802Sjkim#endif /* !defined(DSPMBYTE) */ 217167802Sjkim# endif /* SOLARIS2 == 24 */ 218167802Sjkim#if defined(DSPMBYTE) 219167802Sjkim# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 220167802Sjkim#endif /* !defined(DSPMBYTE) */ 22167754Smsmith# define Ispunct(c) (((Char)(c) & QUOTE) ? 0 : ispunct((tcshuc) (c))) 22267754Smsmith# else /* WINNT_NATIVE */ 22367754Smsmith# define Isspace(c) (((Char)(c) & QUOTE) ? 0 : isspace( oem_it((tcshuc)(c)))) 22467754Smsmith# define Isdigit(c) (((Char)(c) & QUOTE) ? 0 : isdigit( oem_it((tcshuc)(c)))) 22567754Smsmith# define Isalpha(c) (((Char)(c) & QUOTE) ? 0 : isalpha( oem_it((tcshuc)(c)))) 22667754Smsmith# define Islower(c) (((Char)(c) & QUOTE) ? 0 : islower( oem_it((tcshuc)(c)))) 22767754Smsmith# define Isupper(c) (((Char)(c) & QUOTE) ? 0 : isupper( oem_it((tcshuc)(c)))) 22877424Smsmith# define Tolower(c) (((Char)(c) & QUOTE) ? 0 : tolower( oem_it((tcshuc)(c)))) 22967754Smsmith# define Toupper(c) (((Char)(c) & QUOTE) ? 0 : toupper( oem_it((tcshuc)(c)))) 23067754Smsmith# define Isxdigit(c)(((Char)(c) & QUOTE) ? 0 : isxdigit(oem_it((tcshuc)(c)))) 23167754Smsmith# define Isalnum(c) (((Char)(c) & QUOTE) ? 0 : isalnum( oem_it((tcshuc)(c)))) 23267754Smsmith# define Ispunct(c) (((Char)(c) & QUOTE) ? 0 : ispunct( oem_it((tcshuc)(c)))) 23367754Smsmith#if defined(DSPMBYTE) 23467754Smsmith# define IscntrlM(c) (((Char)(c) & QUOTE) ? 0 : iscntrl( oem_it((tcshuc)(c)))) 235117521Snjl# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 236117521Snjl# define IsprintM(c) (((Char)(c) & QUOTE) ? 0 : isprint( oem_it((tcshuc)(c)))) 237123315Snjl# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 238123315Snjl#else 23967754Smsmith# define Iscntrl(c) (((Char)(c) & QUOTE) ? 0 : iscntrl( oem_it((tcshuc)(c)))) 24067754Smsmith# define Isprint(c) (((Char)(c) & QUOTE) ? 0 : isprint( oem_it((tcshuc)(c)))) 241117521Snjl#endif /* !defined(DSPMBYTE) */ 242117521Snjl# endif /* WINNT_NATIVE */ 243117521Snjl# endif /* !NeXT */ 24467754Smsmith#else /* !NLS */ 245167802Sjkim# define Isspace(c) cmap(c, _SP|_NL) 246167802Sjkim# define Isdigit(c) cmap(c, _DIG) 247167802Sjkim# define Isalpha(c) (cmap(c,_LET) && !(((c) & META) && AsciiOnly)) 248167802Sjkim# define Islower(c) (cmap(c,_DOW) && !(((c) & META) && AsciiOnly)) 249167802Sjkim# define Isupper(c) (cmap(c, _UP) && !(((c) & META) && AsciiOnly)) 250167802Sjkim# define Tolower(c) (_cmap_lower[ASC(c)]) 251167802Sjkim# define Toupper(c) (_cmap_upper[ASC(c)]) 252167802Sjkim# define Isxdigit(c) cmap(c, _XD) 253117521Snjl# define Isalnum(c) (cmap(c, _DIG|_LET) && !(((Char)(c) & META) && AsciiOnly)) 254117521Snjl#if defined(DSPMBYTE) 25582367Smsmith# define IscntrlM(c) (cmap(c,_CTR) && !(((c) & META) && AsciiOnly)) 256193267Sjkim# define Iscntrl(c) ( (IscntrlM(c)) && !(_enable_mbdisp&&(IsmbyteU((c)))) ) 257193267Sjkim# define IsprintM(c) (!cmap(c,_CTR) && !(((c) & META) && AsciiOnly)) 25877424Smsmith# define Isprint(c) ( (IsprintM(c)) || (_enable_mbdisp&&(IsmbyteU((c)))) ) 25967754Smsmith#else 26067754Smsmith# define Iscntrl(c) (cmap(c,_CTR) && !(((c) & META) && AsciiOnly)) 261117521Snjl# define Isprint(c) (!cmap(c,_CTR) && !(((c) & META) && AsciiOnly)) 26267754Smsmith#endif /* !defined(DSPMBYTE) */ 26367754Smsmith# define Ispunct(c) (cmap(c,_PUN) && !(((c) & META) && AsciiOnly)) 26467754Smsmith 26567754Smsmith#endif /* !NLS */ 26667754Smsmith 26767754Smsmith#if defined (SHORT_STRINGS) && defined (NLS) 26885756Smsmith# define Iswcntrl(c) (((c) & QUOTE) ? 0 : iswcntrl(c)) 26967754Smsmith# define Iswprint(c) (((c) & QUOTE) ? 0 : iswprint(c)) 27085756Smsmith#else 27185756Smsmith# define Iswcntrl(c) Iscntrl(c) 27285756Smsmith# define Iswprint(c) Isprint(c) 27367754Smsmith#endif 27499679Siwasaki 27567754Smsmith#if defined(DSPMBYTE) 27667754Smsmith# define Ismbyte1(c) ((_mbmap[(c) & 0377] & _MB1) ? 1 : 0) 277117521Snjl# define Ismbyte2(c) ((_mbmap[(c) & 0377] & _MB2) ? 1 : 0) 278117521Snjl#endif 27967754Smsmith 280117521Snjl#endif /* _h_sh_char */ 28167754Smsmith