//--------------------------------------------------------------------------------------
//
// X-BASIC'
// 	エラー定義(共通)
//
//--------------------------------------------------------------------------------------

#ifndef	__XB_ERROR__
#define __XB_ERROR__	1

#include "XBdefines.h"

//--------------------------------------------------------------------------------------

#ifdef FROM_ERR_C	// Cソース生成時
#define	EXTERNe	// EXTERNe宣言を消し、実体確保する
#else			// ヘッダー生成時
#define	EXTERNe	extern
#endif

//-------------------------------------------------------------------

typedef enum {
// デバッグ用特殊コード
	ERR_SKIP	=-1,

// 正常終了
	ERR_NONE	=0,							// 正常終了

// 発生位置が特定できないエラー/ソース外で発生するエラー
	ERR_NO_ENDENUM2,						// endenumがない
	ERR_NO_ENDFUNC2,						// endfunc がない
	ERR_NON_CLOSE_NEST2,					// ネスト構造が閉じてない
	
#if 1	// v3.2で移動
	// ↑これ以下は発生場所が特定できないエラー
	//--------------------------------
	ERR_NO_SYSTEM,	// 区分け用コード(これ自体は発生しない)
#endif

// 内部エラー系
	ERR_SYSTEM,								// システムエラー
	ERR_ILLEGAL_PARAM_IN_EXTERNAL_FUNCTION,	// 外部関数ファイルのパラメータテーブルがおかしい
	ERR_NO_WORKAREA,						// ワークエリアを確保出来ない
	ERR_INTERNALCODE_AREA_OVERFLOW,			// 中間コード領域を拡大できない
	ERR_VARIABLE_AREA_OVERFLOW,				// 変数領域を拡大できない
	ERR_NESTWORK_OVERFLOW,					// ネストワークがオーバーフローした

#if 0	// v3.2で移動
	// ↑これ以下は発生場所が特定できないエラー
	//--------------------------------
	ERR_NO_SYSTEM,	// 区分け用コード(これ自体は発生しない)
	//--------------------------------
	// ↓これ以上は発生場所が特定できる(かも知れない)エラー
#endif
	
// 主に実行時エラー
	ERR_ZERO_DIVIDE,						// 0除算
	ERR_CANT_USE_AT_FLOAT,					// floatでは使えない演算子
	ERR_USE_ONLY_ADD_WITH_STRING,			// 文字列は足し算しか出来ない
	ERR_MISMATCH_FORMULA_TYPE,				// 式の型が異なる
	ERR_ILLEGAL_DEFINE_ARRAY,				// 配列宣言異常
	ERR_ARRAY_COUNT_TOO_LARGE,				// 配列の要素数が大きすぎる(1次元)
	ERR_ARRAY_DIMENSION_TOO_LARGE,			// 配列の次元数が多すぎる
	ERR_ARRAY_COUNT_MINUS,					// 配列の要素数が負数
	ERR_TOO_LONG_STRING,					// 最大文字列長を超えている
	ERR_ILLEGAL_STRING_POINT,				// 文字列内位置指定がおかしい
	ERR_PARAM_ILLEGAL_IN_FUNCTION,			// 関数に異常な引数あり
	ERR_PARAM_IN_EXTERNAL_FUNCTION,			// 外部関数のパラメーターリストがおかしい
	ERR_IN_EXTERNAL_FUNCTION,				// 外部関数内エラー
	ERR_TOO_MUCH_VARIABLES,					// 変数または配列が多すぎる（宣言個数）
	ERR_RECURSIVE_CALL_OVER,				// 再帰呼び出しの段数が深すぎる

// 以下主にコンパイル時エラー
	// 文法エラー
	ERR_NON_SUPPORT_STATEMENT,				// 未サポート構文
	ERR_SYNTAX,								// 文法エラー
	ERR_SYNTAX_EXIT,						// exit文エラー
	ERR_SYNTAX_FOR,							// for文エラー
	ERR_SYNTAX_FUNC,						// func文エラー
	ERR_SYNTAX_IF,							// if文エラー
	ERR_SYNTAX_INPUT,						// input/linput文エラー
	ERR_SYNTAX_RETURN,						// return文エラー
	ERR_SYNTAX_LABEL,						// label文エラー
	ERR_SYNTAX_USING,						// using 文後に ; がない / usingフォーマットエラー
	ERR_SYNTAX_ARRAY,						// 配列が)で閉じてない
	ERR_TOO_MUTCH_LINES,					// 行数が多すぎる
	// パラメーターエラー
	ERR_NOT_ENOUGHT_PARAM_IN_STATEMENT,		// ステートメントのパラメータ数が少ない
	ERR_ILLEGAL_USING_FORMAT,				// using フォーマット異常
	// 制御構文系
	ERR_NO_FOR_WITH_NEXT,					// next に対応する for がない
	ERR_THEN_ELSE_WITH_NO_IF,				// if のない then/else
	ERR_ENDWHILE_WITH_NO_WHILE,				// endwhile に対応する while がない
	ERR_UNTIL_WITH_NO_REPEAT,				// until に対応する repeat がない
	ERR_NEED_SWITCH_CASE_DEFAULT_ENDSWITCH,	// case, default, endswitch には switch が必要
	ERR_CASE_AFTER_DEFAULT,					// default の後に case は置かない方がいい
	ERR_DEFAULT_AFTER_DEFAULT,				// default が2つ以上ある
	ERR_NEED_CASE,							// switch には 最低1つの case が必要
	ERR_CONTINUE_IN_SWITCH,					// switch 中に continue がある
	ERR_BREAK_TOO_MUCH,						// １つのswitch中のbreakが多すぎる
	ERR_NON_CLOSE_NEST,						// ネスト構造が閉じてない
	ERR_CANT_BREAK_CONTINUE_NO_NEST,		// ネスト構造無しに break, continue は出来ない
	ERR_FUNC_WITHOUT_END,					// end がないのに funcがあった
	// 関数系
	ERR_DOUBLE_FUNCTION,					// 関数名二重宣言
	ERR_TOO_MUTCH_FUNC_PARAM,				// 関数の引数が多い
	ERR_NOT_ENOUGH_FUNC_PARAM,				// 関数の引数が足りない
	ERR_CANT_USE_ARRAY_AT_PARAM,			// 引数に配列は使えない
	ERR_MISMATCH_ARRAY_DIMENSION_AT_PARAM,	// 引数の配列の次元が合わない
	ERR_MISMATCH_ARRAY_COUNT_AT_PARAM,		// 関数の引数の配列の要素数が合わない
	ERR_NO_ENDFUNC,							// endfunc がない
	ERR_NO_FUNC_TO_ENDFUNC_OR_RETURN,		// endfunc または return に対応する func がない
	ERR_VOID_HAS_NO_RETURN_VALUE,			// void型の関数には返り値はない
	ERR_RETURN_NON_INT,						// リターン値はint型以外なのに指定がない
	ERR_GOTO_OUTOF_FUNC,					// goto で関数ブロックの外に飛ぶ
	ERR_ILLEGAL_GOTO,						// goto 異常
	ERR_TOO_MUCH_FUNC,						// func文が多すぎる
	// 式系
	ERR_MISMATCH_VARIABLE_TYPE,				// 変数の型が異なる
	ERR_SYNTAX_FORMULA,						// 式異常
	ERR_ILLEGAL_NUM,						// 数値として異常
	ERR_TOO_MUCH_STRING_VARIABLE,			// 文字列変数が多すぎる
	ERR_STRING_OFFSET_OUTOF_LENGTH,			// 変更対象文字列長を超えている
	ERR_DISABLE_ASSIGN_SYSTEMVAR,			// システム変数には代入出来ない
	ERR_TOO_MUCH_NAMES,						// 名前が多すぎる
	// 宣言系
	ERR_UNDEFINED_VARIABLE,					// 未宣言変数
	ERR_AUTO_DEFINE_INT,					// 未宣言変数を int型で自動登録(警告)
	ERR_DOUBLE_VARIABLE,					// 変数二重宣言
	ERR_DEFINE_VARIABLE,					// 変数宣言がおかしい
	ERR_DEFINE_VARIABLE_SAME_AS_STATEMENT,	// ステートメントと同名変数である
	ERR_DEFINE_VARIABLE_SAME_AS_FUNCTION,	// 変数が関数と同名である
	ERR_DEFINE_VARIABLE_SAME_AS_ENUM,		// enum定数と同名である
	ERR_DOUBLE_LABEL,						// ラベル名二重宣言
	ERR_NO_TYPE,							// 型が指定されていない
	// 配列系
	ERR_UNDEFINED_FUNC_OR_ARRAY,			// 未宣言関数/配列
	ERR_ARRAY_DEFINE_WITH_NO_DIM,			// dim 無しで配列宣言した
	ERR_ARRAY_COUNT_TOO_MUCH,				// 配列の要素数指定が多い
	ERR_ARRAY_COUNT_NOT_ENOUGHT,			// 配列の要素数指定が足りない
	ERR_NEED_CONSTANT_ARRAY_COUNT,			// 配列の要素数指定は定数のみ
	ERR_NO_DEFINE_ARRAY_COUNT,				// 配列に要素数指定がない
	ERR_TOO_MUCH_ARRAY_COUNT,				// 配列の総要素数が多すぎる
	ERR_TOO_MUCH_ARRAY_DIMENSION,			// 最大次元数を超えている
	ERR_CANT_USE_GLOBAL_EXTARRAY,			// グローバルで可変長配列は使えない
	// 定数処理
	ERR_ENUM_FORMAT,						// enum〜endenumの書式がおかしい
	ERR_DEFINE_ENUM_SAME_AS_STATEMENT,		// ステートメントと同名の定数名がある
	ERR_DEFINE_ENUM_SAME_AS_FUNCTION,		// 関数名と同名の定数名がある
	ERR_ENUM_DOUBLE_DEFINE,					// 定数名の重複定義
	ERR_NO_ENDENUM,							// endenumがない
	ERR_NO_ENUM_TO_ENDENUM,					// endenum に対応する enum がない
} XB_ERRORNO;

EXTERNe	XB_ERRORNO	errorNo;	//	エラー番号（プログラム内部用）

//-------------------------------------------------------------------

typedef enum {	// 警告用
	// 正常終了
	WARN_NONE	=0,					// 正常終了
	//
	WARN_INPUT_TYPE_ILLEGAL	,		// 入力型が異なります
	WARN_ILLEGAL_NUMBER_FORMAT		// 数値指定が間違っています
} XB_WARNNO;

//-------------------------------------------------------------------

#endif
