/*/////////////////////////////////////////////////////////////////////////////
// confman 設定情報入出力ライブラリ
// confman.h confmanインタフェース定義
// ver. 2.0.0 2003/10/03 nedit版作成
*/

#ifndef CONFMAN_H_INCLUDED_
#define CONFMAN_H_INCLUDED_

#ifdef _MSC_VER
/* ＶＣ＋＋の場合以下の一文をつけないとうるさい */
#pragma warning(disable:4786)
#pragma warning(disable:4503)
#endif

/* ＤＬＬにする場合は下の一行を有効にする */
//#define MAKE_DLL

#if defined( _WIN32 ) && defined( MAKE_DLL )
#define CF_API __declspec( dllexport )
#else
#define CF_API
#endif

/* Ｃ＋＋対策 */
#ifdef __cplusplus
extern "C" {
#endif

/* ULONGの定義 */
#ifndef ULONG
#define ULONG unsigned long
#endif

/* 真偽値の定義 */
typedef enum tagCF_BOOL {
	CF_FALSE = 0,
	CF_TRUE = 1
} CF_BOOL;

/* CONFMAN型の定義 */
typedef struct tagConf {
	void *pConf;	/* CConfImpクラス */
	void *smb;	/* map< wstring, ULONG > */
}* CONFMAN;


/* エラー番号定義 */
/* エラーなし */
#define CF_NOERROR		0x00000000

/* 構築・設定・ファイル入出力に関するエラー */
#define CF_CANTOPENFILE		0x00100000	/* ファイルが開けない */
#define CF_CANTCLOSEFILE	0x00100001	/* ファイルが閉じられない */
#define CF_READERROR		0x00100002	/* 読み込み時にエラー */
#define CF_WRITEERROR		0x00100003	/* 書き込み時にエラー */
#define CF_INVALIDCDSET		0x00100004	/* 認識されない文字コードセット */

/* 検索・追加・削除に関するエラー */
#define CF_NOSECTION		0x00200000	/* セクションが見つからない */
#define CF_NOKEY		0x00200001	/* キーが見つからない */
#define CF_FINDSECTION		0x00200002	/* セクションがあった */
#define CF_FINDKEY		0x00200003	/* キーがあった */
#define CF_BUFOVER		0x00200004	/* バッファオーバー */

/* ファイル読み込みに関するエラー */
#define CF_CANTFINDSECTION	0x00300000	/* セクションが無いままファイルが終了した */
#define CF_SECTIONNAMEERROR	0x00300001	/* セクション名にエラーがある（閉じ中括弧がない） */
#define CF_BREAKLINE_EOF	0x00300002	/* キー・値行が破棄された（ファイル終端） */
#define CF_BREAKLINE_RTN	0x00300003	/* 同上（改行） */
#define CF_BREAKLINE_ETC	0x00300004	/* 同上（その他） */

/* 拡張エラー */
#define ECF_UNUSESYMBOL		0x10000000	/* シンボルが使用されていない */
#define ECF_NOSYMBOL		0x10000001	/* シンボル名が見つからない */


/* インタフェース定義 */

/* CONFMANを生成 */
CF_API CONFMAN confman_CreateConf( const char *FileName );

/* 読み込み指示 */
CF_API CF_BOOL confman_Open( CONFMAN p );

/* 入力 */
CF_API CF_BOOL confman_GetString( CONFMAN p, const wchar_t *SectionName, const wchar_t *KeyName, wchar_t *buf, int length );

/* 出力 */
CF_API CF_BOOL confman_SetString( CONFMAN p, const wchar_t *SectionName, const wchar_t *KeyName, const wchar_t *value );

/* ファイルを閉じる */
CF_API CF_BOOL confman_Close( CONFMAN p );

/* 更新フラグを取得 */
CF_API CF_BOOL confman_GetModify( CONFMAN p );

/* 更新フラグを変更 */
CF_API void confman_SetModify( CONFMAN p, CF_BOOL b );

/* セクション名のリストを取得 */
CF_API CF_BOOL confman_GetSectionList( CONFMAN p, wchar_t *buf, int Length );

/* キー名のリストを取得 */
CF_API CF_BOOL confman_GetKeyList( CONFMAN p, const wchar_t *SectionName, wchar_t *buf, int Length );

/* セクションの追加 */
CF_API CF_BOOL confman_AddSection( CONFMAN p, const wchar_t *SectionName );

/* キーの追加 */
CF_API CF_BOOL confman_AddKey( CONFMAN p, const wchar_t *SectionName, const wchar_t *KeyName, const wchar_t *Value );

/* セクションを削除 */
CF_API CF_BOOL confman_RemoveSection( CONFMAN p, const wchar_t *SectionName );

/* キーの削除 */
CF_API CF_BOOL confman_RemoveKey( CONFMAN p, const wchar_t *SectionName, const wchar_t *KeyName );

/* エラー値の取得 */
CF_API unsigned long confman_GetLastError( CONFMAN p );

/* エラー値のクリア */
CF_API void confman_ClearLastError( CONFMAN p );

/* 拡張機能 */
/* シンボル機能 */
CF_API CF_BOOL exconf_AddSymbol( CONFMAN p, const wchar_t *symbol, ULONG val );
CF_API ULONG exconf_GetSymbol( CONFMAN p, const wchar_t *SectionName, const wchar_t *KeyName );
CF_API void exconf_ReleaseSymbol( CONFMAN p );
CF_API ULONG exconf_StrToVal( CONFMAN p, const wchar_t *Symbol );

/* 数値で入力 */
CF_API CF_BOOL exconf_GetInt( CONFMAN p, const wchar_t *SectionName, const wchar_t *KeyName, int *c );

/* セクション名リストに関する拡張 */
CF_API void* exconf_CreateInternalSectionList( CONFMAN p, int *Length );

/* キー名リストに関する拡張 */
CF_API void* exconf_CreateInternalKeyList( CONFMAN p, const wchar_t *SectionName, int *Length );

/* 内部キー名およびセクション名を取得 */
CF_API void exconf_GetInternalList( void *h, wchar_t *buf, int Length );

/* 内部で保持している値のアドレスを取得 */
CF_API const wchar_t* exconf_GetConstStr( CONFMAN p, const wchar_t *SectionName, const wchar_t *KeyName );


/* NULLで区切られた文字列のリストにおいて
   ポインタを次の文字列の先頭にセットする */
#define CF_SKIPPTR( x ) while( *((x)++) != NULL );

/* Ｃ＋＋対策終端 */
#ifdef __cplusplus
}
#endif


#endif /* CONFMAN_INCLUDED_ */
