#ifndef lint
static char rcsidasscanl[] = "$Header:asscanl.h 12.0$";
#endif
/* $Source: /ibm/acis/usr/src/bin/as_ca/RCS/asscanl.h,v $ */
/*
 *	Copyright (c) 1982 Regents of the University of California
 *	@(#)asscanl.h 4.5 6/30/83
 */
/*
 *	This file contains definitions local to the files implementing
 *	the character scanner and the token buffer managers.
 *	It is not intended to be shared with any other parts of the
 *	assembler.
 *	The file ``asscan.h'' is shared with other parts of the assembler
 */
#include <stdio.h>
#include "as.h"
#include "asscan.h"

#define EOFCHAR	(-1)
/*
 *	The table of possible uses for each character to test set inclusion.
 */
#define	HEXFLAG		01		/* 'x' or 'X' */
#define	HEXLDIGIT	02		/* 'a' .. 'f' */
#define	HEXUDIGIT	04		/* 'A' .. 'F' */
#define	ALPHA		010		/* 'A' .. 'Z', 'a' .. 'z', '_'*/
#define	DIGIT		020		/* '0' .. '9' */
#define	FLOATEXP	040		/* 'd' 'e' 'D' 'E' 'h' 'H' */
#define	SIGN		0100		/* '+' .. '-'*/
#define	REGDIGIT	0200		/* '0' .. '5' */
#define	SZSPECBEGIN	0400		/* 'b', 'B', 'l', 'L', 'w', 'W' */
#define	POINT		01000		/* '.' */
#define	SPACE		02000		/* '\t' or ' ' */
#define	BSESCAPE	04000		/* abfnrtv 		NOT USED */
#define	STRESCAPE	010000		/* '"', '\\', '\n' 	NOT USED */
#define	OCTDIGIT	020000		/* '0' .. '7' */
#define	FLOATFLAG	040000		/* 'd', 'D', 'f', 'F' */

#define	INCHARSET(val, kind) (charsets[val] & (kind) )
/*
 *	We use our own version of getchar/ungetc to get
 *	some speed improvement
 */
extern	char	*Ginbufptr;
extern	int	Ginbufcnt;
#define	REGTOMEMBUF	Ginbufptr = inbufptr, Ginbufcnt = inbufcnt
#define	MEMTOREGBUF	inbufptr = Ginbufptr, inbufcnt = Ginbufcnt
#undef getchar
#ifdef ibm032
#define	getchar() \
	(inbufcnt-- > 0 ? (*inbufptr++) : \
		(fillinbuffer(), \
		MEMTOREGBUF, \
		((inbufptr[-1]+1 & 0xff) - 1) 	/* map 255 to -1 */ \
		) \
	)
#else
#define	getchar() \
	(inbufcnt-- > 0 ? (*inbufptr++) : \
		(fillinbuffer(), \
		MEMTOREGBUF, \
		inbufptr[-1]))
#endif
#undef ungetc
#define ungetc(ch) \
	(++inbufcnt, *--inbufptr = ch)

/*
 *	Variables and definitions to manage the token buffering.
 *	We scan (lexically analyze) a large number of tokens, and
 *	then parse all of the tokens in the scan buffer.
 *	This reduces procedure call overhead when the parser
 *	demands a token, allows for an efficient reread during
 *	the second pass, and confuses the line number reporting
 *	for errors encountered in the scanner and in the parser.
 */
#define TOKDALLOP	8
struct	tokbufdesc *bufstart;	/*where the buffer list begins*/
struct	tokbufdesc *buftail;	/*last one on the list*/
struct	tokbufdesc *emptybuf;	/*the one being filled*/
/*
 *	If we are using VM, during the second pass we reclaim the used
 *	token buffers for saving the relocation information
 */
struct	tokbufdesc *tok_free;	/* free pool */
struct	tokbufdesc *tok_temp;	/* temporary for doing list manipulation */
/*
 *	Other token buffer managers
 */
int	bufno;			/*which buffer number: 0,1 for tmp file*/
struct 	tokbufdesc tokbuf[2];	/*our initial increment of buffers*/
ptrall	tokptr;			/*where the current token comes from*/
ptrall	tokub;			/*the last token in the current token buffer*/
/*
 *	as does not use fread and fwrite for the token buffering.
 *	The token buffers are integrals of BUFSIZ
 *	at all times, so we use direct read and write.
 *	fread and fwrite in stdio are HORRENDOUSLY inefficient,
 *	as they use putchar for each character, nested two deep in loops.
 */
#define writeTEST(pointer, size, nelements, ioptr) \
	write(ioptr->_file, pointer, nelements * size) != nelements * size

#define readTEST(pointer, size, nelements, ioptr) \
	read(ioptr->_file, pointer, nelements * size) != nelements * size

#define bskiplg(from, length) { \
	lgtype *at = (lgtype*)from; \
	\
	*at = length; \
	from += sizeof(lgtype) + length; \
	}

#define bskipfromto(from, to) { \
	lgtype *at = (lgtype *)from; \
	\
	*at = to - from - sizeof(lgtype); \
	from += sizeof(lgtype) + to - from; \
	}

#define eatskiplg(from) \
	from += sizeof(lgtype) + *(lgtype *)from

#ifdef DEBUG
	ptrall	firsttoken;
#endif DEBUG

/*
 *	The following three variables are the slots for global
 *	communication with the parser.
 *	They are the semantic values associated with a particular token.
 *	The token itself is the return value from yylex()
 */
int	yylval;			/* normal semantic value */
Bignum	yybignum;		/* a big number */
struct	Opcode	yyopcode;	/* a structure opcode */

int	newfflag;
char	*newfname;
int	scanlineno;		/*the scanner's linenumber*/

/*
 *	Definitions for sets of characters
 */
readonly short charsets[];
readonly short type[];
readonly char  eschars[];
