
//**************************************************************************
//**
//** token.h
//**
//**************************************************************************

#ifndef __TOKEN_H__
#define __TOKEN_H__

// HEADER FILES ------------------------------------------------------------

#include "common.h"
#include "error.h"

// MACROS ------------------------------------------------------------------

// TYPES -------------------------------------------------------------------

typedef enum
{
	TK_NONE,
	TK_EOF,
	TK_IDENTIFIER,		// VALUE: (char *) tk_String
	TK_STRING,			// VALUE: (char *) tk_String
	TK_NUMBER,			// VALUE: (int) tk_Number
	TK_LINESPECIAL,		// VALUE: (int) tk_LineSpecial
	TK_PLUS,			// '+'
	TK_MINUS,			// '-'
	TK_ASTERISK,		// '*'
	TK_SLASH,			// '/'
	TK_PERCENT,			// '%'
	TK_ASSIGN,			// '='
	TK_ADDASSIGN,		// '+='
	TK_SUBASSIGN,		// '-='
	TK_MULASSIGN,		// '*='
	TK_DIVASSIGN,		// '/='
	TK_MODASSIGN,		// '%='
	TK_INC,				// '++'
	TK_DEC,				// '--'
	TK_EQ,				// '=='
	TK_NE,				// '!='
	TK_LT,				// '<'
	TK_GT,				// '>'
	TK_LE,				// '<='
	TK_GE,				// '>='
	TK_LSHIFT,			// '<<'
	TK_RSHIFT,			// '>>'
	TK_ANDLOGICAL,		// '&&'
	TK_ORLOGICAL,		// '||'
	TK_ANDBITWISE,		// '&'
	TK_ORBITWISE,		// '|'
	TK_EORBITWISE,		// '^'
	TK_TILDE,			// '~'
	TK_LPAREN,			// '('
	TK_RPAREN,			// ')'
	TK_LBRACE,			// '{'
	TK_RBRACE,			// '}'
	TK_LBRACKET,		// '['
	TK_RBRACKET,		// ']'
	TK_COLON,			// ':'
	TK_SEMICOLON,		// ';'
	TK_COMMA,			// ','
	TK_PERIOD,			// '.'
	TK_NOT,				// '!'
	TK_NUMBERSIGN,		// '#'
	TK_CPPCOMMENT,		// '//'
	TK_STARTCOMMENT,	// '/*'
	TK_ENDCOMMENT,		// '*/'
	TK_BREAK,			// 'break'
	TK_CASE,			// 'case'
	TK_CONST,			// 'const'
	TK_CONTINUE,		// 'continue'
	TK_DEFAULT,			// 'default'
	TK_DEFINE,			// 'define'
	TK_DO,				// 'do'
	TK_ELSE,			// 'else'
	TK_FOR,				// 'for'
	TK_GOTO,			// 'goto'
	TK_IF,				// 'if'
	TK_INCLUDE,			// 'include'
	TK_INT,				// 'int'
	TK_OPEN,			// 'open'
	TK_PRINT,			// 'print'
	TK_PRINTBOLD,		// 'printbold'
	TK_HUDMESSAGE,		// 'hudmessage'
	TK_HUDMESSAGEBOLD,	// 'hudmessagebold'
	TK_RESTART,			// 'restart'
	TK_SCRIPT,			// 'script'
	TK_SPECIAL,			// 'special'
	TK_STR,				// 'str'
	TK_SUSPEND,			// 'suspend'
	TK_SWITCH,			// 'switch'
	TK_TERMINATE,		// 'terminate'
	TK_UNTIL,			// 'until'
	TK_VOID,			// 'void'
	TK_WHILE,			// 'while'
	TK_WORLD,			// 'world'
	TK_GLOBAL,			// 'global'
	TK_RESPAWN,			// 'respawn'		[BC]
	TK_DEATH,			// 'death'			[BC]
	TK_ENTER,			// 'enter'			[BC]
	TK_PICKUP,			// 'pickup'			[BC]
	TK_BLUERETURN,		// 'bluereturn'		[BC]
	TK_REDRETURN,		// 'redreturn'		[BC]
	TK_WHITERETURN,		// 'whitereturn'	[BC]
	TK_LOCALIZEDSTRINGS,// 'localizedstrings'
	TK_NOCOMPACT,		// 'nocompact'
	TK_LIGHTNING,		// 'ligtning'
	TK_CREATETRANSLATION,// 'createtranslation'
	TK_FUNCTION,		// 'function'
	TK_RETURN,			// 'return'
	TK_WADAUTHOR,		// 'wadauthor'
	TK_NOWADAUTHOR,		// 'nowadauthor'
	TK_ACSEXECUTEWAIT,	// 'acs_executewait'
	TK_ENCRYPTSTRINGS,	// 'encryptstrings'
	TK_IMPORT,			// 'import'
	TK_LIBRARY,			// 'library'
	TK_LIBDEFINE,		// 'libdefine'
	TK_BOOL,			// 'bool'
	TK_NET,				// 'net'
	TK_DISCONNECT,		// 'disconnect'
	TK_UNLOADING,		// 'unloading'
} tokenType_t;

// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------

void TK_Init(void);
void TK_OpenSource(char *fileName);
void TK_Include(char *fileName);
void TK_Import(char *fileName, enum ImportModes prevMode);
void TK_CloseSource(void);
tokenType_t TK_NextToken(void);
int TK_NextCharacter(void);
boolean TK_NextTokenMustBe(tokenType_t token, error_t error);
boolean TK_TokenMustBe(tokenType_t token, error_t error);
boolean TK_Member(tokenType_t *list);
void TK_Undo(void);
void TK_SkipLine(void);
void TK_SkipPast(tokenType_t token);
void TK_SkipTo(tokenType_t token);

// PUBLIC DATA DECLARATIONS ------------------------------------------------

extern tokenType_t tk_Token;
extern int tk_Line;
extern int tk_Number;
extern char *tk_String;
extern U_BYTE tk_SpecialValue;
extern int tk_SpecialArgCount;
extern char *tk_SourceName;
extern int tk_IncludedLines;
extern boolean forSemicolonHack;
extern char MasterSourceLine[];  // master line - Ty 07jan2000
extern int MasterSourcePos;      // master position - Ty 07jan2000
extern boolean ClearMasterSourceLine; // ready for new line - Ty 07jan2000

#endif
