//***************************************************************************
//
//								ERROR.H
//
//***************************************************************************

#ifndef ABLERR_H
#define	ABLERR_H

//***************************************************************************
namespace ABL
{

#define	MAX_SYNTAX_ERRORS		1 //20
#define	MAXLEN_ERROR_MESSAGE	256

typedef enum {
	ABL_ERR_SYNTAX_NONE,									// 0
	ABL_ERR_SYNTAX_ERROR,
	ABL_ERR_SYNTAX_TOO_MANY_ERRORS,
	ABL_ERR_SYNTAX_SOURCE_FILE_OPEN,
	ABL_ERR_SYNTAX_UNEXPECTED_EOF,
	ABL_ERR_SYNTAX_INVALID_NUMBER,
	ABL_ERR_SYNTAX_INVALID_FRACTION,
	ABL_ERR_SYNTAX_INVALID_EXPONENT,
	ABL_ERR_SYNTAX_TOO_MANY_DIGITS,
	ABL_ERR_SYNTAX_REAL_OUT_OF_RANGE,
	ABL_ERR_SYNTAX_INTEGER_OUT_OF_RANGE,					// 10
	ABL_ERR_SYNTAX_MISSING_RPAREN,
	ABL_ERR_SYNTAX_INVALID_EXPRESSION,
	ABL_ERR_SYNTAX_UNDEFINED_IDENTIFIER,
	ABL_ERR_SYNTAX_REDEFINED_IDENTIFIER,
	ABL_ERR_SYNTAX_UNEXPECTED_TOKEN,
	ABL_ERR_SYNTAX_INCOMPATIBLE_TYPES,
	ABL_ERR_SYNTAX_NESTING_TOO_DEEP,
	ABL_ERR_SYNTAX_CODE_SEGMENT_OVERFLOW,
	ABL_ERR_SYNTAX_MISSING_EQUAL,
	ABL_ERR_SYNTAX_MISSING_SEMICOLON,						// 20
	ABL_ERR_SYNTAX_INVALID_CONSTANT,
	ABL_ERR_SYNTAX_NOT_A_CONSTANT_IDENTIFIER,
	ABL_ERR_SYNTAX_NO_RECORD_TYPES,
	ABL_ERR_SYNTAX_MISSING_COLON,
	ABL_ERR_SYNTAX_NOT_A_TYPE_IDENTIFIER,
	ABL_ERR_SYNTAX_INVALID_TYPE,
	ABL_ERR_SYNTAX_MISSING_END,
	ABL_ERR_SYNTAX_INVALID_IDENTIFIER_USAGE,
	ABL_ERR_SYNTAX_TOO_MANY_SUBSCRIPTS,
	ABL_ERR_SYNTAX_MISSING_RBRACKET,						// 30
	ABL_ERR_SYNTAX_INCOMPATIBLE_ASSIGNMENT,
	ABL_ERR_SYNTAX_MISSING_UNTIL,
	ABL_ERR_SYNTAX_MISSING_THEN,
	ABL_ERR_SYNTAX_INVALID_FOR_CONTROL,
	ABL_ERR_SYNTAX_MISSING_IDENTIFIER,
	ABL_ERR_SYNTAX_MISSING_TO,
	ABL_ERR_SYNTAX_MISSING_PERIOD,
	ABL_ERR_SYNTAX_MISSING_MODULE,
	ABL_ERR_SYNTAX_MISSING_LIBRARY,
	ABL_ERR_SYNTAX_ALREADY_FORWARDED,						// 40
	ABL_ERR_SYNTAX_INVALID_REF_PARAM,
	ABL_ERR_SYNTAX_WRONG_NUMBER_OF_PARAMS,
	ABL_ERR_SYNTAX_MISSING_BEGIN,
	ABL_ERR_SYNTAX_MISSING_END_VAR,
	ABL_ERR_SYNTAX_NO_FUNCTION_NESTING,
	ABL_ERR_SYNTAX_MISSING_CODE,
	ABL_ERR_SYNTAX_MISSING_END_IF,
	ABL_ERR_SYNTAX_MISSING_END_WHILE,
	ABL_ERR_SYNTAX_MISSING_END_FOR,
	ABL_ERR_SYNTAX_MISSING_END_FUNCTION,					// 50
	ABL_ERR_SYNTAX_MISSING_END_MODULE,
	ABL_ERR_SYNTAX_MISSING_END_LIBRARY,
	ABL_ERR_SYNTAX_MISSING_DO,
	ABL_ERR_SYNTAX_INVALID_INDEX_TYPE,
	ABL_ERR_SYNTAX_MISSING_COMMA,
	ABL_ERR_SYNTAX_TOO_MANY_STATIC_VARS,
	ABL_ERR_SYNTAX_MISSING_END_CASE,
	ABL_ERR_SYNTAX_MISSING_END_SWITCH,
	ABL_ERR_SYNTAX_MISSING_CONSTANT,
	ABL_ERR_SYNTAX_BAD_LANGUAGE_DIRECTIVE_USAGE,			// 60
	ABL_ERR_SYNTAX_UNKNOWN_LANGUAGE_DIRECTIVE,
	ABL_ERR_SYNTAX_TOO_MANY_FORMAL_PARAMETERS,
	ABL_ERR_SYNTAX_TOO_MANY_LOCAL_VARIABLES,
	ABL_ERR_SYNTAX_CODE_OUTSIDE_STATE_BLOCK,
	ABL_ERR_SYNTAX_NO_STATE_NESTING,
	ABL_ERR_SYNTAX_STATE_FORWARD,
	ABL_ERR_SYNTAX_MISSING_END_STATE,
	ABL_ERR_SYNTAX_TRANS_TO_NON_STATE,
	ABL_ERR_SYNTAX_TRANS_IN_NONFSM,
	ABL_ERR_SYNTAX_FORWARDED_STATE_NOT_DECLARED,
	NUM_ABL_SYNTAX_ERRORS
} SyntaxErrorType;

typedef enum {
	ABL_ERR_RUNTIME_STACK_OVERFLOW,
	ABL_ERR_RUNTIME_INFINITE_LOOP,
	ABL_ERR_RUNTIME_NESTED_FUNCTION_CALL,
	ABL_ERR_RUNTIME_UNIMPLEMENTED_FEATURE,
	ABL_ERR_RUNTIME_VALUE_OUT_OF_RANGE,
	ABL_ERR_RUNTIME_DIVISION_BY_ZERO,
	ABL_ERR_RUNTIME_INVALID_FUNCTION_ARGUMENT,
	ABL_ERR_RUNTIME_INVALID_CASE_VALUE,
	ABL_ERR_RUNTIME_ABORT,
	NUM_ABL_RUNTIME_ERRORS
} RuntimeErrorType;

//***************************************************************************

void syntaxError (long errCode);
void runtimeError (long errCode);
void ABL_Fatal (long errCode, char* s);
void ABL_Assert (bool test, long errCode, char* s);
char *ABL_runtimeErrorString (char *str,int strlen);


//***************************************************************************
}
#endif

