Google
 

Trailing-Edge - PDP-10 Archives - SRI_NIC_PERM_FS_1_19910112 - kcc-5/kcc/ccchar.h
There are 7 other files named ccchar.h in the archive. Click here to see a list.
/* CCCHAR.H - Character processing facility definitions
 *	Copyright (C) 1985 by Ken Harrenstien, SRI International
 *
 * This is very similar to <ctype.h> but has been duplicated in order to
 * provide more insulation and speed for KCC, as well as allowing for
 * system dependent modifications.  If CHARTABLE is defined,
 * the flag table is included (this is for CCDATA).
 *
 *	These definitions, plus ccdata.c, conform to the description
 * in "C: A Reference Manual" (Harbison & Steele, 1984), section 11.1
 * with the caveat that several facilities evaluate their argument expression
 * more than once.  Therefore, side-effects in arguments should not be used.
 *
 * Portability considerations: the following facilities depend
 * on the runtime character set, but will work for both ASCII and EBCDIC:
 *	isodigit, toint, _toupper, _tolower
 * These are only meaningful when using ASCII:
 *	isascii, toascii
 */

/* Define internal character type flags.  Note value in _ctab is an int,
 * so we can use lots of flags and do fast references.
 */
#define _CT_CTL 01	/* Control char (not printing) */
#define _CT_WSP	02	/* Whitespace */
#define _CT_SP	04	/* Space */
#define _CT_PUN	010	/* Punctuation (non-space, non-alphanumeric) */
#define _CT_N	020	/* Numeric 0-9 */
#define _CT_UA	040	/* Uppercase alpha */
#define _CT_LA	0100	/* Lowercase alpha */
#define _CT_X	0200	/* Hex digit */
#define _CT_NO	0400	/* Octal digit */
#define _CT_US	01000	/* Underscore (for C identifier checking) */
#define _CT_EOL 02000	/* C line break (\n, \r, \f, \v) */
#define _CT_BS	04000	/* Backspace (a C whitespace char) */

/* Facility macros, in alphabetical order */
#define isalnum(c)	((_ctab+1)[c]&(_CT_UA|_CT_LA|_CT_N))
#define isalpha(c)	((_ctab+1)[c]&(_CT_UA|_CT_LA))
#define isascii(i)	(0 <= (i) && (i) < 0200)
#define iscntrl(c)	((_ctab+1)[c]&(_CT_CTL))
#define iscsym(c)	((_ctab+1)[c]&(_CT_UA|_CT_LA|_CT_N|_CT_US))
#define iscsymf(c)	((_ctab+1)[c]&(_CT_UA|_CT_LA|_CT_US))
#define isdigit(c)	((_ctab+1)[c]&(_CT_N))
#define isgraph(c)	((_ctab+1)[c]&(_CT_PUN|_CT_N|_CT_UA|_CT_LA))
#define islower(c)	((_ctab+1)[c]&(_CT_LA))
#define isodigit(c)	((_ctab+1)[c]&(_CT_NO))
#define isprint(c)	((_ctab+1)[c]&(_CT_PUN|_CT_N|_CT_UA|_CT_LA|_CT_SP))
#define ispunct(c)	((_ctab+1)[c]&(_CT_PUN|_CT_SP))
#define isspace(c)	((_ctab+1)[c]&(_CT_WSP))
#define isupper(c)	((_ctab+1)[c]&(_CT_UA))
#define isxdigit(c)	((_ctab+1)[c]&(_CT_N|_CT_X))
#define toascii(i)	((c)&0177)
#define toint(c)	_kc2in(c)
#define tolower(c)	_kc2lo(c)
#define toupper(c)	_kc2up(c)
#define _tolower(c)	((c)+('a'-'A'))
#define _toupper(c)	((c)+('A'-'a'))

/* These functions are peculiar to KCC.
 *	iscwsp - true if char is a C language whitespace char
 *	isceol - true if char is a C language line-break char
 *	setcsym - Set flag to allow char as a C language identifier char
 *	clrcsym - Clear flag to disallow char as a C language identifier char
 *		The latter two are special hacks only for use by CCDECL when
 *		trying to parse "entry" statements.
 */
#define iscwsp(c)	((_ctab+1)[c]&(_CT_WSP|_CT_BS))
#define isceol(c)	((_ctab+1)[c]&(_CT_EOL))
#define setcsym(c)	((_ctab+1)[c] |= (_CT_US))	/* Special hack */
#define clrcsym(c)	((_ctab+1)[c] &= ~(_CT_US))	/* Special hack */
#ifndef CHARTABLE
extern int _ctab[], _kc2in(), _kc2lo(), _kc2up();
#else

int _ctab[] = {
	0,		/* ( -1) EOF */
	_CT_CTL,	/* (  0)  ^@ */
	_CT_CTL,	/* (  1)  ^A */
	_CT_CTL,	/* (  2)  ^B */
	_CT_CTL,	/* (  3)  ^C */
	_CT_CTL,	/* (  4)  ^D */
	_CT_CTL,	/* (  5)  ^E */
	_CT_CTL,	/* (  6)  ^F */
	_CT_CTL,	/* (  7)  ^G */
	_CT_CTL|_CT_BS,			/* ( 10)  ^H BackSpace */
	_CT_CTL|_CT_WSP,		/* ( 11)  ^I Horizontal Tab */
	_CT_CTL|_CT_WSP|_CT_EOL,	/* ( 12)  ^J NewLine */
	_CT_CTL|_CT_WSP|_CT_EOL,	/* ( 13)  ^K Vertical Tab */
	_CT_CTL|_CT_WSP|_CT_EOL,	/* ( 14)  ^L Form Feed */
	_CT_CTL|_CT_WSP|_CT_EOL,	/* ( 15)  ^M Carriage Return */
	_CT_CTL,	/* ( 16)  ^N */
	_CT_CTL,	/* ( 17)  ^O */
	_CT_CTL,	/* ( 20)  ^P */
	_CT_CTL,	/* ( 21)  ^Q */
	_CT_CTL,	/* ( 22)  ^R */
	_CT_CTL,	/* ( 23)  ^S */
	_CT_CTL,	/* ( 24)  ^T */
	_CT_CTL,	/* ( 25)  ^U */
	_CT_CTL,	/* ( 26)  ^V */
	_CT_CTL,	/* ( 27)  ^W */
	_CT_CTL,	/* ( 30)  ^X */
	_CT_CTL,	/* ( 31)  ^Y */
	_CT_CTL,	/* ( 32)  ^Z */
	_CT_CTL,	/* ( 33)  ^[ */
	_CT_CTL,	/* ( 34)  ^\ */
	_CT_CTL,	/* ( 35)  ^] */
	_CT_CTL,	/* ( 36)  ^^ */
	_CT_CTL,	/* ( 37)  ^_ */
	_CT_SP|_CT_WSP,	/* ( 40)     Space */
	_CT_PUN,	/* ( 41)   ! */
	_CT_PUN,	/* ( 42)   " */
	_CT_PUN,	/* ( 43)   # */
	_CT_PUN,	/* ( 44)   $ */
	_CT_PUN,	/* ( 45)   % */
	_CT_PUN,	/* ( 46)   & */
	_CT_PUN,	/* ( 47)   ' */
	_CT_PUN,	/* ( 50)   ( */
	_CT_PUN,	/* ( 51)   ) */
	_CT_PUN,	/* ( 52)   * */
	_CT_PUN,	/* ( 53)   + */
	_CT_PUN,	/* ( 54)   , */
	_CT_PUN,	/* ( 55)   - */
	_CT_PUN,	/* ( 56)   . */
	_CT_PUN,	/* ( 57)   / */
	_CT_N|_CT_X|_CT_NO,	/* ( 60)   0 */
	_CT_N|_CT_X|_CT_NO,	/* ( 61)   1 */
	_CT_N|_CT_X|_CT_NO,	/* ( 62)   2 */
	_CT_N|_CT_X|_CT_NO,	/* ( 63)   3 */
	_CT_N|_CT_X|_CT_NO,	/* ( 64)   4 */
	_CT_N|_CT_X|_CT_NO,	/* ( 65)   5 */
	_CT_N|_CT_X|_CT_NO,	/* ( 66)   6 */
	_CT_N|_CT_X|_CT_NO,	/* ( 67)   7 */
	_CT_N|_CT_X,		/* ( 70)   8 */
	_CT_N|_CT_X,		/* ( 71)   9 */
	_CT_PUN,	/* ( 72)   : */
	_CT_PUN,	/* ( 73)   ; */
	_CT_PUN,	/* ( 74)   < */
	_CT_PUN,	/* ( 75)   = */
	_CT_PUN,	/* ( 76)   > */
	_CT_PUN,	/* ( 77)   ? */
	_CT_PUN,	/* (100)   @ */
	_CT_UA|_CT_X,	/* (101)   A */
	_CT_UA|_CT_X,	/* (102)   B */
	_CT_UA|_CT_X,	/* (103)   C */
	_CT_UA|_CT_X,	/* (104)   D */
	_CT_UA|_CT_X,	/* (105)   E */
	_CT_UA|_CT_X,	/* (106)   F */
	_CT_UA,		/* (107)   G */
	_CT_UA,		/* (110)   H */
	_CT_UA,		/* (111)   I */
	_CT_UA,		/* (112)   J */
	_CT_UA,		/* (113)   K */
	_CT_UA,		/* (114)   L */
	_CT_UA,		/* (115)   M */
	_CT_UA,		/* (116)   N */
	_CT_UA,		/* (117)   O */
	_CT_UA,		/* (120)   P */
	_CT_UA,		/* (121)   Q */
	_CT_UA,		/* (122)   R */
	_CT_UA,		/* (123)   S */
	_CT_UA,		/* (124)   T */
	_CT_UA,		/* (125)   U */
	_CT_UA,		/* (126)   V */
	_CT_UA,		/* (127)   W */
	_CT_UA,		/* (130)   X */
	_CT_UA,		/* (131)   Y */
	_CT_UA,		/* (132)   Z */
	_CT_PUN,	/* (133)   [ */
	_CT_PUN,	/* (134)   \ */
	_CT_PUN,	/* (135)   ] */
	_CT_PUN,	/* (136)   ^ */
	_CT_PUN|_CT_US,	/* (137)   _ */
	_CT_PUN,	/* (140)   ` */
	_CT_LA|_CT_X,	/* (141)   a */
	_CT_LA|_CT_X,	/* (142)   b */
	_CT_LA|_CT_X,	/* (143)   c */
	_CT_LA|_CT_X,	/* (144)   d */
	_CT_LA|_CT_X,	/* (145)   e */
	_CT_LA|_CT_X,	/* (146)   f */
	_CT_LA,		/* (147)   g */
	_CT_LA,		/* (150)   h */
	_CT_LA,		/* (151)   i */
	_CT_LA,		/* (152)   j */
	_CT_LA,		/* (153)   k */
	_CT_LA,		/* (154)   l */
	_CT_LA,		/* (155)   m */
	_CT_LA,		/* (156)   n */
	_CT_LA,		/* (157)   o */
	_CT_LA,		/* (160)   p */
	_CT_LA,		/* (161)   q */
	_CT_LA,		/* (162)   r */
	_CT_LA,		/* (163)   s */
	_CT_LA,		/* (164)   t */
	_CT_LA,		/* (165)   u */
	_CT_LA,		/* (166)   v */
	_CT_LA,		/* (167)   w */
	_CT_LA,		/* (170)   x */
	_CT_LA,		/* (171)   y */
	_CT_LA,		/* (172)   z */
	_CT_PUN,	/* (173)   { */
	_CT_PUN,	/* (174)   | */
	_CT_PUN,	/* (175)   } */
	_CT_PUN,	/* (176)   ~ */
	_CT_CTL,	/* (177) DEL */
};
/* _KC2IN - Implements TOINT(c) facility. */
int _kc2in(), _kc2lo(), _kc2up();
int
_kc2in(c)
char c;
{
    if (isdigit(c)) return c - '0';
    if (isxdigit(c))
	return (isupper(c) ? (c - ('A'-10)) : (c - ('a'-10)));
    return -1;
}

/* _KC2LO - Implements TOLOWER(c) facility */
int
_kc2lo(c)
char c;
{	return (isupper(c) ? _tolower(c) : c);
}

/* _KC2UP - Implements TOUPPER(c) facility */
int
_kc2up(c)
char c;
{	return (islower(c) ? _toupper(c) : c);
}

#endif /* CHARTABLE */