///////////////////////////////////////////////////////////////////////////
// KeywordList_cbl.h
// COBOLのキーワードのリストを保持するクラス
///////////////////////////////////////////////////////////////////////////

#if !defined( KEYWORDLIST_CBL_H_INCLUDED_ )
#define KEYWORDLIST_CBL_H_INCLUDED_

#include <vector>
#include <string>
#include <algorithm>

namespace NLangExt {

namespace NLangExt_cbl {

// キーワードのリストを管理する
class CKeywordList_cbl
{
public:
	CKeywordList_cbl()
	{
		// キーワードと候補配列のテンプレートを用意する
		const wchar_t *Keywords[] = {
			L"ACCEPT",
			L"ACCESS",
			L"ACTIVE-CLASS",
			L"ADD",
			L"ADDRESS",
			L"ADVANCING",
			L"AFTER",
			L"ALIGNED",
			L"ALL",
			L"ALLOCATE",
			L"ALPHABET",
			L"ALPHABETIC",
			L"ALPHABETIC-LOWER",
			L"ALPHABETIC-UPPER",
			L"ALPHANUMERIC",
			L"ALPHANUMERIC-EDITED",
			L"ALSO",
			L"ALTER",
			L"ALTERNATE",
			L"AND",
			L"ANY",
			L"ANYCASE",
			L"APPLY",
			L"ARE",
			L"AREA",
			L"AREAS",
			L"AS",
			L"ASCENDING",
			L"ASSIGN",
			L"AT",
			L"AUTHOR",
			L"AUTOMATIC",
			L"B-AND",
			L"B-NOT",
			L"B-OR",
			L"B-XOR",
			L"BASED",
			L"BASIS",
			L"BEFORE",
			L"BEGINNING",
			L"BINARY",
			L"BINARY-CHAR",
			L"BINARY-DOUBLE",
			L"BINARY-LONG",
			L"BINARY-SHORT",
			L"BIT",
			L"BLANK",
			L"BLOCK",
			L"BOOLEAN",
			L"BOTTOM",
			L"BY",
			L"CALL",
			L"CANCEL",
			L"CBL",
			L"CD",
			L"CF",
			L"CH",
			L"CHARACTER",
			L"CHARACTERS",
			L"CLASS",
			L"CLASS-ID",
			L"CLOCK-UNITS",
			L"CLOSE",
			L"COBOL",
			L"CODE",
			L"CODE-SET",
			L"COL",
			L"COLLATING",
			L"COLS",
			L"COLUMN",
			L"COLUMNS",
			L"COM-REG",
			L"COMMA",
			L"COMMON",
			L"COMMUNICATION",
			L"COMP",
			L"COMP-1",
			L"COMP-2",
			L"COMP-3",
			L"COMP-4",
			L"COMP-5",
			L"COMPUTATIONAL",
			L"COMPUTATIONAL-1",
			L"COMPUTATIONAL-2",
			L"COMPUTATIONAL-3",
			L"COMPUTATIONAL-4",
			L"COMPUTATIONAL-5",
			L"COMPUTE",
			L"CONDITION",
			L"CONFIGURATION",
			L"CONSTANT",
			L"CONTAINS",
			L"CONTENT",
			L"CONTINUE",
			L"CONTROL",
			L"CONTROLS",
			L"CONVERTING",
			L"COPY",
			L"CORR",
			L"CORRESPONDING",
			L"COUNT",
			L"CRT",
			L"CURRENCY",
			L"CURSOR",
			L"DATA",
			L"DATA-POINTER",
			L"DATE",
			L"DATE-COMPILED",
			L"DATE-WRITTEN",
			L"DAY",
			L"DAY-OF-WEEK",
			L"DBCS",
			L"DE",
			L"DEBUG-CONTENTS",
			L"DEBUG-ITEM",
			L"DEBUG-LINE",
			L"DEBUG-NAME",
			L"DEBUG-SUB-1",
			L"DEBUG-SUB-2",
			L"DEBUG-SUB-3",
			L"DEBUGGING",
			L"DECIMAL-POINT",
			L"DECLARATIVES",
			L"DEFAULT",
			L"DELETE",
			L"DELIMITED",
			L"DELIMITER",
			L"DEPENDING",
			L"DESCENDING",
			L"DESTINATION",
			L"DETAIL",
			L"DISABLE",
			L"DISPLAY",
			L"DISPLAY-1",
			L"DIVIDE",
			L"DIVISION",
			L"DOWN",
			L"DUPLICATES",
			L"DYNAMIC",
			L"EC",
			L"EGCS",
			L"EGI",
			L"EJECT",
			L"ELSE",
			L"EMI",
			L"ENABLE",
			L"END",
			L"END-ACCEPT",
			L"END-ADD",
			L"END-CALL",
			L"END-COMPUTE",
			L"END-DELETE",
			L"END-DISPLAY",
			L"END-DIVIDE",
			L"END-EVALUATE",
			L"END-EXEC",
			L"END-IF",
			L"END-INVOKE",
			L"END-MULTIPLY",
			L"END-OF-PAGE",
			L"END-PERFORM",
			L"END-READ",
			L"END-RECEIVE",
			L"END-RETURN",
			L"END-REWRITE",
			L"END-SEARCH",
			L"END-START",
			L"END-STRING",
			L"END-SUBTRACT",
			L"END-UNSTRING",
			L"END-WRITE",
			L"END-XML",
			L"ENDING",
			L"ENTER",
			L"ENTRY",
			L"ENVIRONMENT",
			L"EO",
			L"EOP",
			L"EQUAL",
			L"ERROR",
			L"ESI",
			L"EVALUATE",
			L"EVERY",
			L"EXCEPTION",
			L"EXCEPTION-OBJECT",
			L"EXEC",
			L"EXECUTE",
			L"EXIT",
			L"EXTEND",
			L"EXTERNAL",
			L"FACTORY",
			L"FALSE",
			L"FD",
			L"FILE",
			L"FILE-CONTROL",
			L"FILLER",
			L"FINAL",
			L"FIRST",
			L"FLOAT-EXTENDED",
			L"FLOAT-LONG",
			L"FLOAT-SHORT",
			L"FOOTING",
			L"FOR",
			L"FORMAT",
			L"FREE",
			L"FROM",
			L"FUNCTION",
			L"FUNCTION-ID",
			L"FUNCTION-POINTER",
			L"GENERATE",
			L"GET",
			L"GIVING",
			L"GLOBAL",
			L"GO",
			L"GOBACK",
			L"GREATER",
			L"GROUP",
			L"GROUP-USAGE",
			L"HEADING",
			L"HIGH-VALUE",
			L"HIGH-VALUES",
			L"I-O",
			L"I-O-CONTROL",
			L"ID",
			L"IDENTIFICATION",
			L"IF",
			L"IN",
			L"INDEX",
			L"INDEXED",
			L"INDICATE",
			L"INHERITS",
			L"INITIAL",
			L"INITIALIZE",
			L"INITIATE",
			L"INPUT",
			L"INPUT-OUTPUT",
			L"INSERT",
			L"INSPECT",
			L"INSTALLATION",
			L"INTERFACE",
			L"INTERFACE-ID",
			L"INTO",
			L"INVALID",
			L"INVOKE",
			L"IS",
			L"JNIENVPTR",
			L"JUST",
			L"JUSTIFIED",
			L"KANJI",
			L"KEY",
			L"LABEL",
			L"LAST",
			L"LEADING",
			L"LEFT",
			L"LENGTH",
			L"LESS",
			L"LIMIT",
			L"LIMITS",
			L"LINAGE",
			L"LINAGE-COUNTER",
			L"LINE",
			L"LINE-COUNTER",
			L"LINES",
			L"LINKAGE",
			L"LOCAL-STORAGE",
			L"LOCALE",
			L"LOCK",
			L"LOW-VALUE",
			L"LOW-VALUES",
			L"MEMORY",
			L"MERGE",
			L"MESSAGE",
			L"METHOD",
			L"METHOD-ID",
			L"MINUS",
			L"MODE",
			L"MODULES",
			L"MORE-LABELS",
			L"MOVE",
			L"MULTIPLE",
			L"MULTIPLY",
			L"NATIONAL",
			L"NATIONAL-EDITED",
			L"NATIVE",
			L"NEGATIVE",
			L"NESTED",
			L"NEXT",
			L"NO",
			L"NOT",
			L"NULL",
			L"NULLS",
			L"NUMBER",
			L"NUMBER",
			L"NUMERIC-EDITED",
			L"OBJECT",
			L"OBJECT-COMPUTER",
			L"OBJECT-REFERENCE",
			L"OCCURS",
			L"OF",
			L"OFF",
			L"OMITTED",
			L"ON",
			L"OPEN",
			L"OPTIONAL",
			L"OPTIONS",
			L"OR",
			L"ORDER",
			L"ORGANIZATION",
			L"OTHER",
			L"OUTPUT",
			L"OVERFLOW",
			L"OVERRIDE",
			L"PACKED-DECIMAL",
			L"PADDING",
			L"PAGE",
			L"PAGE-COUNTER",
			L"PASSWORD",
			L"PERFORM",
			L"PF",
			L"PH",
			L"PIC",
			L"PICTURE",
			L"PLUS",
			L"POINTER",
			L"POSITION",
			L"POSITIVE",
			L"PRESENT",
			L"PREVIOUS",
			L"PRINTING",
			L"PROCEDURE",
			L"PROCEDURE-POINTER",
			L"PROCEDURES",
			L"PROCEED",
			L"PROCESSING",
			L"PROGRAM",
			L"PROGRAM-ID",
			L"PROGRAM-POINTER",
			L"PROPERTY",
			L"PROTOTYPE",
			L"PURGE",
			L"QUEUE",
			L"QUOTE",
			L"QUOTES",
			L"RAISE",
			L"RAISING",
			L"RANDOM",
			L"RD",
			L"READ",
			L"READY",
			L"RECEIVE",
			L"RECORD",
			L"RECORDING",
			L"RECORDS",
			L"RECURSIVE",
			L"REDEFINES",
			L"REEL",
			L"REFERENCE",
			L"REFERENCES",
			L"RELATIVE",
			L"RELEASE",
			L"RELOAD",
			L"REMAINDER",
			L"REMOVAL",
			L"RENAMES",
			L"REPLACE",
			L"REPLACING",
			L"REPORT",
			L"REPORTING",
			L"REPORTS",
			L"REPOSITORY",
			L"RERUN",
			L"RESERVE",
			L"RESET",
			L"RESUME",
			L"RETRY",
			L"RETURN",
			L"RETURN-CODE",
			L"RETURNING",
			L"REVERSED",
			L"REWIND",
			L"REWRITE",
			L"RF",
			L"RH",
			L"RIGHT",
			L"ROUNDED",
			L"RUN",
			L"SAME",
			L"SCREEN",
			L"SD",
			L"SEARCH",
			L"SECTION",
			L"SECURITY",
			L"SEGMENT",
			L"SEGMENT-LIMIT",
			L"SELECT",
			L"SELF",
			L"SEND",
			L"SENTENCE",
			L"SEPARATE",
			L"SEQUENCE",
			L"SEQUENTIAL",
			L"SERVICE",
			L"SET",
			L"SHARING",
			L"SHIFT-IN",
			L"SHIFT-OUT",
			L"SIGN",
			L"SIZE",
			L"SKIP1",
			L"SKIP2",
			L"SKIP3",
			L"SORT",
			L"SORT-CONTROL",
			L"SORT-CORE-SIZE",
			L"SORT-FILE-SIZE",
			L"SORT-MERGE",
			L"SORT-MESSAGE",
			L"SORT-MODE-SIZE",
			L"SORT-RETURN",
			L"SOURCE",
			L"SOURCE-COMPUTER",
			L"SOURCES",
			L"SPACE",
			L"SPACES",
			L"SPECIAL-NAMES",
			L"SQL",
			L"STANDARD",
			L"STANDARD-1",
			L"STANDARD-2",
			L"START",
			L"STATUS",
			L"STOP",
			L"STRING",
			L"SUB-QUEUE-1",
			L"SUB-QUEUE-2",
			L"SUB-QUEUE-3",
			L"SUBTRACT",
			L"SUM",
			L"SUPER",
			L"SUPPRESS",
			L"SYMBOLIC",
			L"SYNC",
			L"SYNCHRONIZED",
			L"SYSTEM-DEFAULT",
			L"TABLE",
			L"TALLY",
			L"TALLYING",
			L"TAPE",
			L"TERMINAL",
			L"TERMINATE",
			L"TEST",
			L"TEXT",
			L"THAN",
			L"THEN",
			L"THROUGH",
			L"THRU",
			L"TIME",
			L"TIMES",
			L"TITLE",
			L"TO",
			L"TOP",
			L"TRACE",
			L"TRAILING",
			L"TRUE",
			L"TYPE",
			L"TYPEDEF",
			L"UNIT",
			L"UNIVERSAL",
			L"UNLOCK",
			L"UNSTRING",
			L"UNTIL",
			L"UP",
			L"UPON",
			L"USAGE",
			L"USE",
			L"USER-DEFAULT",
			L"USING",
			L"VAL-STATUS",
			L"VALID",
			L"VALIDATE",
			L"VALIDATE-STATUS",
			L"VALUE",
			L"VALUES",
			L"VARYING",
			L"WHEN",
			L"WHEN-COMPILED",
			L"WITH",
			L"WORDS",
			L"WORKING-STORAGE",
			L"WRITE",
			L"WRITE-ONLY",
			L"XML",
			L"XML-CODE",
			L"XML-EVENT",
			L"XML-NTEXT",
			L"XML-TEXT",
			L"ZERO",
			L"ZEROES",
			L"ZEROS"
		};
		static const int KeywordCnt = sizeof( Keywords ) / sizeof( Keywords[0] );
		int i;

		if ( !vKeyword.empty() ) return ;

		// キーワードの配列に格納
		for ( i = 0; i < KeywordCnt; i++ )
			vKeyword.push_back( std::wstring( Keywords[i] ) );

		// アルファベット順に並び替える
		std::sort( vKeyword.begin(), vKeyword.end() );
	}

	// キーワードの配列を取得する
	const std::vector< std::wstring >& GetKeywordList() const
	{
		return vKeyword;
	};
protected:

	std::vector< std::wstring > vKeyword;	// キーワード
};


} // namespace NLangExt_cbl

} // namespace NLangExt

#endif // KEYWORDLIST_CBL_H_INCLUDED_

