// ctype
// encode ctype as array 256 of hexval:hex:sep:space:letter
// interface
// isNum, isHex, isSpace, isSep, isLetter

//ctype = array 256

ctype = array
	4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
	2 4 4 1 2 4 4 2 4 4 4 4 2 4 2 4 9 25 41 57 73 89 105 121 137 153 4 2 4 4 4 2
	2 169 185 201 217 233 249 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 4 1 2 169 185 201 217 233 249 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 4 4 2 2
	2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4

to setType a b v | i =
	for i a b ctype[i] = v

// c is an offset 0/10, k 0..9 10..15
to sethex a b c | i k =
	k = c
	for i a b
		if ctype[i] == 1
			ctype[i] = k*16 + 9
		else
			ctype[i] = k*16 + 8
		k = k + 1

to initctype | i =
	// cSpace 1..32, 128..254
	for i 0 255 ctype[i] = 2	// clear all to cSpace
	// cLetter
	setType 48 57 1		// 0..9
	setType 65 90 1		// A..Z
	setType 97 122 1	// a..z
	setType 95 95 1 	// _
	setType 35 35 1		// #
	// cSep
	setType 0 0 4
	setType 33 34 4		// ! "
	setType 37 38 4		// % &
	setType 40 43 4		// ( ) * +
	setType 45 45 4  	// -
	setType 47 47 4  	// /
	setType 58 58 4  	// :
	setType 60 62 4		// < = >
	setType 91 91 4  	// [
	setType 93 94 4		// ] ^
	setType 123 125 4	// { | }
	setType 255 255 4 	// EOF_CHAR
	// cHex
	sethex 48 57 0		// 0..9
	sethex 65 70 10		// A..F
	sethex 97 102 10	// a..f

to gen | i =
	initctype
	for i 0 31
		print ctype[i] space
	nl
	for i 32 63
		print ctype[i] space
	nl
	for i 64 127
		print ctype[i] space
	nl
	for i 128 255
		print ctype[i] space
	nl

: isNum c = (c >= 48) & (c <= 57)	// 0..9
: isHex c = ctype[c] & 8
: isSpace c = ctype[c] & 2
: isSep c = ctype[c] & 4
: isLetter c = ctype[c] & 1

to test | i =
	for i 0 127
		print isNum i
	nl
	for i 0 127
		print isHex i
	nl
	for i 0 127
		print isSpace i
	nl
	for i 0 127
		print isSep i
	nl
	for i 0 127
		print isLetter i
	nl

to main =
//	initctype
	test
//	gen

main


