
/*!
@auther d金魚
@since 2003/9/13
@note
C language only
*/


#ifndef _dkutilDefinedC__
#define _dkutilDefinedC__


//**********************************************************
//共通の定義
//**********************************************************

///メンバ関数が定義されていない時に返す変数
#define DKINGYO_NOT_MOUNTED -100
///DKINGYO_NOT_MOUNTEDと同じ
#define DKINGYO_NO_DEFINED_FUNCTION DKINGYO_NOT_MOUNTED




//**********************************************************
//識別するための定義
//**********************************************************



enum edkOS{//OSのバージョンを取得するための列挙
	enuWindows3_1 = 1,
	enuWindowsNT3_51,
	enuWindowsNT4_0,
	enuWindows95,
	enuWindows98,
	enuWindows2000,
	enuWindowsMe,
	enuWindowsXP,
	///WindowsXP??のサーバー
	enuWindows_NET,

};


enum edkOSExtension{
	///Windows95 OS R2
	edkOSE_OSR2 = 1,
	///Windows98 SE
	edkOSE_edkSE,
	///WindowsXP HomeEdition
	edkOSE_HomeEditon,
	///WindowsXP Professional Edition または、NT系のProfessional
	edkOSE_Professional,
	///Windows .NETのDataCenter Server
	edkOSE_DataCenter_Server,
	///NT系のAdvanced　鯖
	edkOSE_Advanced_Server,
	edkOSE_Enterprise_Server,
	edkOSE_Web_Server,
	///NT系の普通のサーバー
	edkOSE_Server,

};

///画像ファイルを解析する時に使う＾＾
enum{
	enuDKINGYO_BMPFILEHEADER_ADR = 1,
	enuDKINGYO_BMPCOREHEADER_ADR,
	enuDKINGYO_BMPINFOHEADER_ADR,
	enuDKINGYO_BMPPALLETE_ADR,
	enuDKINGYO_BMPGRAPH_ADR,
	///isBmpFile()でのflagにぶち込む識別子 Bitmapファイルかどうか正確なチェックを行う。
	enuDKINGYO_ISBMPFILE_EXACT_CHECK,
	///isBmpFile()でのflagにぶち込む識別子 偽装ビットマップかどうか調べる。
	enuDKINGYO_ISBMPFILE_CAMOUFLAGE_CHECK,
};



///文字列の長さの識別子。
enum{
	///INT以内の数
	enuSTRLENGTH_INT_DU = 1,//ここは絶対に１ですからね！！いじっちゃダメ！
	///UINT以内の数
	enuSTRLENGTH_UINT_DU,
	///LONGLONG(__int64)以内の数
	enuSTRLENGTH_LONGLONG_DU,
	///ULONGLONG( unsigned __int64)以内の数
	enuSTRLENGTH_ULONGLONG_DU,
	///だヴる(floatなんていらねぇ（爆))以内の数値？
	enuSTRLENGTH_DOUBLE,
};


/*!
正式版で対応するであろうエラーID類(しかし、対応は未定･･･
@note
edkはEnum of D Kingyoの略 (爆)
*/
enum edkResult{
	///ともかく、エラーらしい。
	edk_FAILED = -1,
	///見事　成功！！
	edk_SUCCEEDED = 0,
	///見つからない。
	edk_Not_Found,
	///ファイルが見つからない。
	edk_FileNotFound,
	///選択されなかった。
	edk_Not_Selected,
	///引数に適さない値が入っていた。(引数エラー
	edk_ArgumentException,
	///Parsingできなかった。
	edk_ParsingError,

	/*!
	内部的にエラーが起こった。<br>
	(まだ、その関数を使う準備が出来ていないとか,起こりえないエラーが起こったとか
	*/
	edk_LogicError,
	///バッファをはみ出してしまうので処理を完了できなかった。
	edk_BufferOverFlow,
	///ファイルのシグネチャが合わない
	edk_FileSignatureException,
	///エラーではないが、満足な処理はされなかった。意図とした結果は得られないかもしれない。
	edk_Not_Satisfactory,
	///この関数の処理は定義されていない
	edk_Not_Defined_Function,
};

#define DKUTIL_SUCCEEDED(s) (s==edk_SUCCEEDED)
#define DKUTIL_FAILED(s) (s)//(s != edk_SUCCEEDED)


//**********************************************************
//デフォルト数の設定用定数の定義
//**********************************************************
enum{
	///拡張型引数のバッファの追加サイズを指定する
	enuExtendVaListLength = 256,
	///コンテナ系のテンプレートクラスでどのくらいのサイズ（または数）を確保するかを設定する
	enuDefaultExpandSize = 100,
};

//**********************************************************
//型定義
//**********************************************************

//共通型
typedef void (*VOIDFUNC)(void); 
typedef void (*VOIDARGFUNC)(void *);
typedef void (*VOIDARGFUNCFLAG)(void *,int);

///OggVorbisデコードのコールバック
typedef void (*OGG_CALLBACK_DU)(char *ptr,size_t permit_num,size_t offset);


//CPUClockオブジェクト?型（実はオブジェクトとクラスの違いがわかってない私。

typedef BOOL (*ISTYPE_DU)(void);
typedef void (*NAMETYPE_DU)(char *,size_t);
typedef long (*CPUCLOCK_DU)(void);

typedef struct dCPUInfoObject{
	ISTYPE_DU isMMX;
	ISTYPE_DU isMMX2;
	ISTYPE_DU isSSE;
	ISTYPE_DU isSSE2;
	ISTYPE_DU is3DNOW;
	ISTYPE_DU isE3DNOW;
	ISTYPE_DU isFPU;
	ISTYPE_DU isTSC;
	ISTYPE_DU isCPUID;
	CPUCLOCK_DU GetCPUClock;
	NAMETYPE_DU CopyCPUName;
	NAMETYPE_DU CopyCPUType;
	NAMETYPE_DU CopyCPUInfo;
}DKINGYOUTILITY2_CPU_INFO;



//SingleList Object type
#if 0
///dKingyoSingleList用PUSH
typedef void (*SLIST_PUSH_DU)(size_t,const char *,size_t);
///dKingyoSingleList用POP
typedef void (*SLIST_POP_DU)(size_t,void);
///dKingyoSingleList用iteratorもどき
typedef char *(*SLIST_GET_ITERATOR_DU)(size_t,void);
///iteratorの++もどき^^;
typedef char *(SLIST_NEXT_DU)(size_t,const char *);
#endif
///C言語上でもdKingyoSingleList使えるようにする構造体
typedef struct dSingleListObject{
	size_t handle;
	int (*push_back)(struct dSingleListObject *,const char *,size_t);
	int (*push_front)(struct dSingleListObject *,const char *,size_t);
	int (*pop_front)(struct dSingleListObject *);
	int (*clear)(struct dSingleListObject *);
	char *(*begin)(struct dSingleListObject *);
	char *(*end)(struct dSingleListObject *);
	char *(*next)(struct dSingleListObject *,char *);
	int (*destructor)(struct dSingleListObject *);
	int (*constructor)(struct dSingleListObject *);
	char *(*reference_ptr)(struct dSingleListObject *,char *);
	void (*set_size)(struct dSingleListObject *,size_t );
}DKINGYOUTILITY2_SINGLE_LIST;




///dCSVStructureのunion内に何が入っているかフラグ
enum edkParsedStringType{
	enuDU2CSV_STRING = 1,
	///31byte以上(NULLを入れると32BYTE)のSTRINGならこのフラグ
	enuDU2CSV_STRING_32MORE,
	enuDU2CSV_INT,
	enuDU2CSV_LONGLONG,
	enuDU2CSV_ULONGLONG,
	enuDU2CSV_DOUBLE,
};

///dCSVStructureのpermitsizeのぶち込んでよい空間を指す添え字
#define DCSVSTRUCTURE_PERMITSIZE_OFFSET_EXTENTION_NUM 3
///dCSVStructureのデフォルトのstr[]のサイズ
#define DCSVSTRUCTURE_DEFAULT_STRING_BUFF_SIZE 32
///CSV data of C Language
typedef struct dCSVStructure{
	size_t x,y;
	int datatype;
	union{
		union{
			union{
				char str[DCSVSTRUCTURE_DEFAULT_STRING_BUFF_SIZE];
				size_t permitsize[4];//添え字の３にptrの確保したサイズをぶち込めばいいな！！
			};
			char *ptr;
		};
		int i;
		LONGLONG ll;
		ULONGLONG ull;
		double dbl;
	};
	//size_t access_permit;//本当はstrとptrのunion内に入れたいけど
	//ポインタは48BITとかあるらしいので、外部で我慢。
	void (*constructor)(struct dCSVStructure *,int,size_t);
	void (*destructor)(struct dCSVStructure *);
}DKINGYOUTILITY2_CSV_STRUCTURE;
	

	
	
	

//**********************************************************
//dKingyoUtility2と同じ　マクロとか
//**********************************************************

/// MessageBoxを表示
#define MB(str) MessageBox(NULL,str,"Message",MB_OK)//MessageBox
/// MessageBoxを表示（タイトル指定可能バージョン）
#define MB2(s,title) MessageBox(NULL,s,title,MB_OK);
///OutputDebugStringを使用
#define ODS(str) OutputDebugString(str)//OutputDebugString

///正統派 整数、実数専用スワップ
#define SWAP_NUM(a,b) \
    a = b - a ;\
    b -= a ;\
    a += b 

/*!
@note
//example
UINT get_offset = SM_OFFSET(_WIN32_FIND_DATA *,dwReserved1);
*/
///構造体のオフセットを求める Struct Member Offset
#define SM_OFFSET(p_type,field)     ((unsigned int)&(((p_type)NULL)->field))

///RECT構造体に入れる。
#define SET_RECT(rect, l, t, r, b) \
{\
    rect##.left   = l;\
    rect##.top    = t;\
    rect##.right  = r;\
    rect##.bottom = b;\
}
///CHARの配列を初期化する。
#define NULL_CHAR_ARRAY(s) memset((void *)s,0,sizeof(s))

/*!
* 後ろの方に沢山引数をつけられるようにするva_listの初期化。<br>
* buff = charのバッファ <br>
* buffnum = buffのサイズ(バイト単位)<br>
* origin = 最初の文字列 <br>
* 例：例えば、普通に書くとこんな感じ。<br>
* <PRE>
* void ERROR_BOX(char *str,...){
* 	char s[512];
* 	va_list VaList ;
* 	va_start( VaList , str ) ;
* 	vsprintf( s , str , VaList ) ;
* 	va_end( VaList ) ;
* 	MessageBox(NULL,s,"ERROR_BOX",MB_OK);
* }
* このマクロはこのように使う。
* void ERROR_BOX(char *str,...){<
* 	char s[512];
* 	SET_VA_LIST(s,512,str);
* 	MessageBox(NULL,s,"ERROR_BOX",MB_OK);
* }
* </PRE>
* どうだ！！！これでかなり面倒な文が減った！！<br>
*	@param buff [out] 文字列バッファ
*	@param buffnum [in] バッファのサイズ(バイト単位
*	@param origin [in] 元の文字列
*/
///沢山引数をつける関数のサポート＾＾；
#define SET_VA_LIST(buff,buffnum,origin) \
	va_list VaList;\
	va_start( VaList , origin ) ;\
	if(-1==_vsnprintf( buff ,buffnum, origin , VaList )){\
		buff[buffnum - 1] = '\0';\
	}\
	va_end( VaList ) 

#ifdef __cplusplus
#define DKUTIL_SAFE_REALLOC(b,s) ::realloc(b,s)
#define DKUTIL_SAFE_MALLOC(s) ::malloc(s)
#define DKUTIL_SAFE_FREE(a) if(a){::free(a);a=NULL;}
#else
#define DKUTIL_SAFE_REALLOC(b,s) realloc(b,s)
#define DKUTIL_SAFE_MALLOC(s) malloc(s)
#define DKUTIL_SAFE_FREE(a) if(a){free(a);a=NULL;}
#endif

#define DKUTIL_ARRAY_NUMOF(array) (sizeof(array)/sizeof(array[0]))



#endif // end of include once