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