typedef struct {
	string       fname;
	unsigned int line_num;
	string       line;
} RSCLINES;

enum {
	LR_OK,											// エラーなし
	LR_BADPARAM,									// 不正なパラメータ（内部エラー）
	LR_NOFILE,										// ファイルが見つからない
	LR_CANNOTOPEN,									// ファイルを開けない
	LR_TOOLARGE,									// ファイルが大きすぎる
	LR_BADFILE,										// ファイルの形式が不正
	LR_NOPP,										// 定義部の終端(%%)がみつからない
	LR_OUT_OF_MEMORY,								// メモリが足りない
	LR_OUT_OF_RANGE,								// 添字指定不良（内部エラー）
	LR_NOITEM,										// 定義部の項目がみつからない
	LR_TEXT_NOT_CLOSED,								// 文字列が閉じていない
	LR_BLOCK_NOT_CLOSED,							// ブロック( {...} )が閉じていない
	LR_WRONG_BLOCK_OPEN,							// ブロックの開始( { )の位置が不正
	LR_WRONG_BLOCK_CLOSE,							// ブロックの終了( } )の位置が不正
	LR_NO_BLOCK_OPEN,								// ブロックの開始( { )が必要なのに無い
	LR_NO_BLOCK_CLOSE,								// ブロックの終了( } )が必要なのに無い
	LR_OLLABEL,										// ラベルが重複している
	LR_WRONG_BREAK,									// breakの出現箇所が不正
	LR_WRONG_CONTINUE,								// continueの出現箇所が不正
	LR_ERROR,										// その他のエラー
	LR_ERROR_STR,									// その他のエラー(str_erに情報を記述)
	LR_USER_ERROR									// ユーザ定義のエラー。呼出側が自由に使用できる
};

enum {
	LR_SI_LOAD,										// searchItemの初回呼出は必ずこれ
	LR_SI_ITEM,
	LR_SI_INFORMATION,
	LR_SI_ICON,
	LR_SI_HELP,
	LR_SI_CONTEXTID,
	LR_SI_AUTHOR,
	LR_SI_URL,
	LR_SI_CATEGORY,
	LR_SI_TRY,
	LR_SI_MUSTDEFVAR,
	LR_SI_INCLUDE,
};

class LOAD_RSC {
public:
	vector<char> nsrc;								// 生ソース
	list<RSCLINES> vrl;								// 解析後ソースコード

	LOAD_RSC() :									// コンストラクタ
		pre_errcode(LR_OK), n_i(0), done_LR_SI_LOAD(false) {}
	int         source_load(const char *rsc);					// ソースの読み込み
	const char *searchItem(int iLoadItem, const char *pszDefault,
		                   int iIncNo, int &iErrorCode);		// 定義部の読み込み
	int         pre_interprete(void);							// プリインタラプト
	void        errmes(HWND hWnd) const;						// エラーメッセージの出力
	list<RSCLINES>::const_iterator GoTo(const char *szLabel) const;	// GoTo '(ラベルが見つからない場合は終端が返る)

private:
	string       rscfname;							// ファイル名
	int          pre_errcode;						// 直前のエラーコード
	string       str_er;							// エラーを文字列で補足できた場合に、文字列を格納する
	list<RSCLINES>::iterator pre_errline;			// 直前のエラーの行を示すイテレータ
	string	strItem;
	string	strInformation;
	string  strIcon;
	string	strHelp;
	string	strConTextId;
	string	strAuthor;
	string	strUrl;
	string	strCategory;
	string	strTry;
	string	strMustDefVar;
	vector<string>	vstrInclude;
	int          n_i;								// 行単位の内部通番
	vector<string>  looplabel;						// break,continueのためのスタック
	bool    done_LR_SI_LOAD;						// LR_SI_LOAD付きでsearchItemが呼ばれたか?

	char *regka(char *line);
	int analyze_blocks(list<RSCLINES>::iterator &vrli);
	int skip_until_blockclose(list<RSCLINES>::iterator &vrli);
	void prewrite(void);
};
