// old ctype in token-s.txt

to initlex =
	cLetter = array 8		// bitvec 256 bits
	cSpace = array 8
	cSep = array 8
	cHex = array 8
	hexval = array 60

	inbuf = array 1000		// input line buffer
	tok = 0					// current token
	tokvalue = 0			// token value
	tokstring = array 256	// token string

	// column stack for block indentation
	tokcol = 0				// current token column
	colstk = array maxcol	// column stack

// use bitvector for char type

// set bitvector to 1
to setbitvec bitv c | a =
	a = bitv[ c / 32 ] | (1 << (c % 32))
	bitv[ c / 32 ] = a

// test bitvector
to is1 bitv c =
	bitv[ c / 32 ] & (1 << ( c % 32))

to setbits bitv a b | i =
	for i a b setbitvec bitv i

to initctype | i =
	for i 0 7			// clear bitvec
		cLetter[i] = 0
		cSpace[i] = 0
		cSep[i] = 0
		cHex[i] = 0

	setbits cLetter 48 57	// 0..9
	setbits cLetter 65 90	// A..Z
	setbits cLetter 97 122	// a..z
	setbitvec cLetter 95 	// _
	setbitvec cLetter 35	// #

	setbits cSpace 1 32		// blank
	setbits cSpace 128 254

	setbitvec cSep 0
	setbits cSep 33 34		// ! "
	setbits cSep 37 38		// % &
	setbits cSep 40 43		// ( ) * +
	setbitvec cSep 45  		// -
	setbitvec cSep 47  		// /
	setbitvec cSep 58  		// :
	setbits cSep 60 62		// < = >
	setbitvec cSep 91  		// [
	setbits cSep 93 94		// ] ^
	setbits cSep 123 125	// { | }
	setbitvec cSep 255 		// EOF_CHAR

	setbits cHex 48 57		// 0..9
	setbits cHex 65 70		// A..F
	setbits cHex 97 102		// a..f

	// hex value  array hexval[60]
	// char  '0'..'9' 'A'..'F' 'a..'f'
	// ascii  48..57  65..70   97..102
	// index  0..9    17..22   49..54
	// value  0..9    10..15   10..15

	for i 0 9 hexval[i] = i
	for i 17 22 hexval[i] = i-7
	for i 49 54 hexval[i] = i-39

: isNum c =	(c >= 48) & (c <= 57)	// 0..9
: isHex c =	is1 cHex c
: isSpace c = is1 cSpace c
: isSep c = is1 cSep c
: isLetter c = is1 cLetter c

// convert hex to int, similar to aatoi above
to ahtoi ar start len | i c v h =
	h = 0
	v = 0
	for i start start+len-1
		c = ar[i]
		if ! isHex c
			seterror "invalid hex number"
		v = hexval[c-48]	// c is valid to use hexval[.]
		if (i == start) & (v > 7)
			h = v - 16		// sign extension
		else
			h = h*16 + v
	h
