
/*!
@auther d金魚
@since 2003/07/02

@note
参考サイト,文献
<ul>
<li>
水無瀬 優 氏の
<a href="http://www.hidecnet.ne.jp/~sinzan/">
水無瀬の部屋
</a>-> Programming Tips
<li>山田 巧 氏の
<a href="http://homepage2.nifty.com/natupaji/DxLib/">DxLib</a>
</ul>

*/
#ifndef __DKINGYO_UTIL_CLASS__
#define __DKINGYO_UTIL_CLASS__

#include "dKingyoMacro.h"
#include "dkutilDefined.h"

namespace dkutil{//dKingyoUtilityですよ〜〜！！ Begin dKingyoUtility namespace
//**********************************************************
//なんとなく＾＾；基本形？
//**********************************************************

/*!
@param buff [out] 文字列を格納するバッファ
@param buffsize [in] バッファのサイズ（バイト単位
@param dt [in] ビジュアル化したいビット
*/
///ビットを文字列にしてビジュアル化する。
extern bool BitIsVisualized( char *buff,size_t buffsize,unsigned int dt );

//extern char *BooleanToCharSeq(bool set);


//**********************************************************
//ErrorLogを吐く
//**********************************************************


/*
struct dMB{

	UINT mType;
	HWND mWnd;
	char mTitle[64];

	dMB() : mType(MB_OK),mWnd(NULL){
		strcpy(mTitle,"Message");
	}
	//virtual ~dMB(){}
	///MB_OKとかのタイプを設定する
	void SetType(UINT uType){
		mType = uType;
	}
	///必要であればWindowのハンドルを設定する。(ダイアログのWindowハンドルとか)
	void SetWindowHandle(HWND hWnd){
		mWnd = hWnd;
	}
	///これが実態･･･
	int operator ()(const char *str, ...)const{
		char s[1024]="";
		SET_VA_LIST(s,sizeof(s),str);
		return ::MessageBox(mWnd,s,mTitle,mType);
		//MessageBoxExでもいいかも！？
	}
};*/







///引数拡張OKバージョンメッセージボックス
///メッセージボックスを表示します。@param str[in] メッセージボックスに表示する文字列
extern void ERROR_BOX(char *str,...);


/*!
@param hWnd[in] Windowのハンドル
@param dwStyle[in] Windowのスタイル？
@param [in] *str,...	: 描画する文字列（printfと同じ書式
*/
///	ウィンドウに文字列を描画します。
extern int OutputWindowString( HWND hWnd,DWORD dwStyle,char *str,... );


/*!
@param filename[in] ファイルの名前
@param plusbytesize[in] strの文字列の不足分バッファサイズ 200くらいが望ましい？
@param [in] *str,...	: 描画する文字列（printfと同じ書式
*/
///	長い文字列(文章)をファイルに出力します
extern int dSentenceOut(char *filename,size_t plusbytesize,char *str,...);


//**********************************************************
//システム情報等取得系
//**********************************************************

/*!
クリップボードのテキストをパクル<br>
たまにうまくクリップボードを開けないときがあるので何度か試すように。<br>
また、pstrMemoryのポインタはGlobalAllocで確保したものにすること。<br>
@param pstrMemory[out] メモリバッファ
@param size [in] メモリバッファサイズ
*/ 
///クリップボードのテキストをゲットする
extern bool GetClipboardText(char *pstrMemory,DWORD size);
/*!
現在時刻を得ます
@param buff[out] 文字列バッファを指定します
@param buffsize[in] バッファサイズを入れます
@param Sysflag[in] trueだとシステムタイム(確か世界標準時)を取得します。<br>
falseだとローカルタイム(日本の場合は日本の標準時)を取得します。
<font color=red>注意：</font><br>
Windowsの設定により、ローカルタイムは変化するようです。<br>
例えば、日本語版Windowsを使っていても、
スペインの標準時にWindowsを設定していたらそれがバッファ内に反映されると思います。<br>
(テストしていないのでまったく分かりません)<br>
*/
///現在時刻の文字列を得ます
void GetCharOfTimeUpToMinute(char *buff,size_t buffsize,bool Sysflag);
///日本語版Windowsに標準装備のメモ帳のF5キーを押すと出力される現在の時間を出力します。
///後はGetCharOfTimeUpToMinuteの引数と同じです。
void GetCharOfMemoPadTypeTime(char *buff,size_t buffsize);
///システムタイムを詳細まで文字列にします。引数についてはGetCharOfMemoPadTypeTimeを見てください
void GetCharOfSystemTimeAll(char *buff,size_t buffsize);
///ローカルタイム(日本語版Windowsの場合は日本の標準時)を文字列にして詳細にわたって表示します。
///文字列内も曜日は日本語なので注意してください。引数についてはGetCharOfMemoPadTypeTimeを見てください。
void GetCharOfLocalTimeAllJapanese(char *buff,size_t buffsize);

///CurrentDirectory(この関数を呼び出しているソフトのパス)を得る。 @return カレントディレクトリの文字列
//char *dGetCurrentDirectory(void);





//Win32API用
/*!
Win32APIのファイル系関数を使ってセーブ、ロードを行う。
@param filename[in] ファイルネーム 例："sample.txt" 等
@param filedata[in] ファイルのデータ
@param size[in] ファイルのデータのサイズ(バイト単位)
@return 0以外だったらエラー
*/ 
extern int SaveWin32APIFile(const char *filename,const void *filedata,size_t size);
/*!
@param filename[in] ファイルネーム 例："sample.txt" 等
@param filedata[in] ファイルのデータ
@param size[in] ファイルのデータのサイズ(バイト単位)
@return 実際に読み込んだファイルサイズ
*/
extern DWORD LoadWin32APIFile(const char *filename,void *Buffer,size_t size=0);

extern int LoadWin32APIFile_Proto(const char *filename,void *Buff,size_t BuffSize,
																	DWORD *GetReadSize);


//extern ULONGLONG LoadWin32APIFile_Ultra(


//レジストリ系
extern bool dSaveRegData(LPCTSTR lpSubKey,LPCTSTR lpValueName,
				 DWORD dwType,CONST BYTE *lpData,	DWORD cbData);
extern bool dGetRegData(LPCTSTR lpSubKey,LPTSTR lpValueName,LPDWORD lpType,
				LPBYTE lpData,LPDWORD lpcbData);
extern bool dDeleteValueRegData(LPCTSTR lpSubKey,LPTSTR lpValueName);
extern bool dDeleteRegData(LPCTSTR lpSubKey);

///Ｒｅｔｕｒｎするだけの関数。空関数
extern void Return();







//**********************************************************
//以下はhttp://www.hidecnet.ne.jp/~sinzan/index.htmの
//水無瀬の部屋から頂いたものです。
//使用方法は水無瀬の部屋のサンプルを見てみると良いでしょう。
//**********************************************************

/*!
 文字列 str の str[nPos] について、<br>
 @return
   ０ …… １バイト文字<br>
   １ …… ２バイト文字の一部（第１バイト）<br>
   ２ …… ２バイト文字の一部（第２バイト）<br>
<br>

シフトＪＩＳ文字列の判定をします。
*/
//extern int isJMS( const char *str, int nPos );




//extern char *GetFileExtension( const char *PathName );


/// va から size バイトの内容と、vb から size バイトの内容を交換する。
extern void memswap( void *va, void *vb, size_t size );


/// 大きさ size の要素 num 個からなる配列 array の要素を
/// 逆順に並べ替える。
extern void memreverse( void *array, size_t num, size_t size );

/// 大きさ size の要素 num 個からなる配列 array の要素を
/// 右方向に要素 shift 個分だけ回転移動する。
extern void memrrotate( void *array, size_t shift, size_t num, size_t size );


/// 大きさ size の要素 num 個からなる配列 array の要素を
/// 左方向に要素 shift 個分だけ回転移動する。
extern void memlrotate( void *array, size_t shift, size_t num, size_t size );


/// 閏年(leap year)かどうかを確かめる。
/// @return 閏年であれば真(TRUE、さもなくば偽(FALSE)を返す
extern DINLINE int IsLeapYear( int Year );


/*! 有効な日付かどうかを確かめる。<br>
  1 <= 月 <= 12<br>
  1 <= 日 <= その月の最終日<br>
 で有効<br>
*/	
///@return  有効な日付であれば真、さもなくば偽を返す
extern DINLINE int IsGoodDate( int Year, int Month, int Day );


/// 指定された月の最終日を返す
///@return 入力された月が不正（１月〜12月の範囲外）であれば０を返す
extern DINLINE int DaysInMonth( int nYear, int nMonth );


/// グレゴリウス歴(Gregorian calendar)の範囲内かどうかを確かめる。
/// @return 1582年10月15日以降であれば真、さもなくば偽を返す
extern DINLINE int IsGregory( int Year, int Month, int Day );


///@return 引数に０がある場合は０を返す。
/// 最大公約数（Greatest Common Divisor）を返す。
extern int gcd( int m, int n );

///@return 引数に０がある場合は０を返す。
/// 最小公倍数（Least Common Multiple）を返す。
extern int lcm( int m, int n );




} //end of dkutil namespace



#endif