//********************************************************************************************
/**
 * @file		tools.h
 * @brief		Programable Application TOols Library ヘッダー.
 *
 *	利用アプリ側で winmm.lib をリンク.
 *
 *	他アプリケーションにライブラリを提供する場合
 *		_bat\combineInc.bat を実行. stools.h が出力されるので*.libと一緒に提供する.
 *		または利用側に同じフォルダ構成のヘッダー群を提供しても良い. その場合は 下記 _STOOLS_H を自分で有効にするか、または
 *		stools.h を使用するプロジェクト側で メニュー->プロジェクト->プロパティ -> 構成プロパティ->C/C++->プリプロセッサの定義 に _STOOLS_H を追加しても良い.
 *
 *	DEBUG_TRACE を define 定義する事で DEBUG_〜 のデバッグ出力が有効になります
 *		通常 _DEBUG で有効,
 *	
 * @author		N.Takeda
 * @date		1998/01/07
 * @date		2011/07/31(日) 23:10:09	N.Takeda	stools調整
 */
//********************************************************************************************

#ifndef _TOOLS_H_ /* 重複定義防止 */
#define _TOOLS_H_ /* 重複定義防止マクロ */


#if	defined( _DEBUG )
# define	DEBUG_TRACE	//有効にする事で DEBUG_〜 のデバッグ出力が有効になります
# define	T_DEBUG
#elif defined( NDEBUG ) || defined( _RELEASE )
# define	T_RELEASE
#elif defined( _MASTER )
# define	T_MASTER
#endif


/// プラットフォーム定義.
//vvvvvvvv CombineInclude platform.h
//********************************************************************************************
/**
 * @file		platform.h
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2012/02/27(月) 18:24:34
 */
//********************************************************************************************

#ifndef	_PLATFORM_H_	// 重複定義防止
#define	_PLATFORM_H_	// 重複定義防止マクロ

/// プラットフォーム定義.
#if (defined( WIN32) && !defined(PLATFORM_WIN32))
# define	PLATFORM_WIN32
#elif (defined( SN_TARGET_PSP_PRX) && !defined(PLATFORM_PSP))
# define	PLATFORM_PSP
#elif (defined( SN_TARGET_PSP2) && !defined(PLATFORM_PSP2))
# define	PLATFORM_PSP2
#endif

#endif // _PLATFORM_H_ 重複定義防止
//^^^^^^^^ CombineInclude platform.h

/// コンパイラの警告 (レベル 1) C4351 の解除. コンストラクタの初期化子で配列を初期化した時.
#pragma warning(disable:4351)


/**
 WIN32固有の設定.
 */
#if defined( PLATFORM_WIN32 )
# define	WINDOWS_USE_COMMCTRL				///< コモンコントロールを使う 有効にする時は利用アプリ側で comctl32.lib をリンク.
# define	StreamOutTypeSJIS					///< 有効にすると 〜_stream系はS-JISに変換してから出力するようになる(_UNICODE時).
#endif


#ifndef	_STOOLS_H
#define	_STOOLS_H					///< 有効にすると stools.h モード. 自動書き換えされる為、間のtab数を変えない事.
#endif

//#define	USE_OLD_PATOL


//======================================================================================
// 基本ライブラリ
//======================================================================================

//#include <winnls32.h>	//一時停止　必要になったらまた有効にして取り外しできる仕様にする事
/// ■基本.
//vvvvvvvv CombineInclude types.h
//********************************************************************************************
/**
 * @file		types.h
 * @brief		要約説明
 *
 *	このファイルの詳細説明
 *
 * @author		N.Takeda
 * @date		2010/10/08(金) 19:15:32
 */
//********************************************************************************************

#ifndef _TYPES_H__
#define _TYPES_H__


typedef	char				Char;
typedef	unsigned char		UChar;

typedef	char				Int8;
typedef	unsigned char		UInt8;
typedef	short				Int16;
typedef	unsigned short		UInt16;
typedef	int					Int32;
typedef	unsigned int		UInt32;

#if defined( PLATFORM_WIN32 )
	typedef	__int64				Int64;
	typedef	unsigned __int64	UInt64;
	typedef	long				Int128;		///< 予約.
	typedef	unsigned long		UInt128;	///< 予約.

	typedef	BOOL				Bool;		///< bool値.

#elif defined( PLATFORM_PSP ) || defined( PLATFORM_PSP2 )
	typedef	int					Int64;
	typedef	unsigned int		UInt64;
	typedef	long				Int128;		///< 予約.
	typedef	unsigned long		UInt128;	///< 予約.

	typedef	bool				Bool;		///< bool値.
	#define	TRUE				true
	#define	FALSE				false
	#define	TEXT(_sString)		_sString

//	#define	ERROR				(-1)		///< ファイル関連のエラーコード。廃止の方向で
//	typedef	void*				LPVOID;		///< 

	#define	lstrcpy				strcpy
	#define	lstrcat				strcat
	#define	lstrlen				strlen
	#define	lstrcmp				strcmp

#endif


/*
ポインタを整数にキャストまたはその逆を行うときは次の型を使用する。

    IntPtr      ポインタと同サイズの符号付き整数
    UIntPtr     ポインタと同サイズの符号なし整数
*/


typedef	float				Float32;	///< 単精度(32bit)浮動小数.
typedef	double				Float64;	///< 倍精度(64bit)浮動小数.



#if defined( PLATFORM_WIN32 )
/**
 文字列関連はwindows API準拠.
 
 char		byteバッファ
 TCHAR
 LPTSTR
 LPCTSTR
 */
/// 文字列長.
#define		T_MAXDRIVE	_MAX_DRIVE
#define		T_MAXPATH	_MAX_PATH
#define		T_MAXDIR	_MAX_DIR
#define		T_MAXNAME	_MAX_FNAME
#define		T_MAXEXT	_MAX_EXT

#elif defined( PLATFORM_PSP ) || defined( PLATFORM_PSP2 )

typedef	char				TCHAR;		///< 文字.
typedef	char*				LPTSTR;		///< 文字列.
typedef	const char*			LPCTSTR;	///< const文字列.

typedef	short				WCHAR;		///< 文字.
typedef	short*				LPWSTR;		///< 文字列.
typedef	const short*		LPCWSTR;	///< const文字列.

/// 文字列長.
#define		T_MAXDRIVE	(256)
#define		T_MAXPATH	(256)
#define		T_MAXDIR	(256)
#define		T_MAXNAME	(256)
#define		T_MAXEXT	(256)

#endif


#endif	// _TYPES_H__
//^^^^^^^^ CombineInclude types.h
//vvvvvvvv CombineInclude memory\tnew.h
//********************************************************************************************
/**
 * @file		tnew.h
 * @brief		メモリアロケータ乗っ取り.
	
	tools をリンクしたものは基本 tnew でメモリを確保.
	EnMEM には未対応 2012/10/19現在

__DATE__		現在のソース ファイルのコンパイル日。この日付は Mmm dd yyyy の形式の文字列リテラルです
__FILE__		現在のソース ファイルの名前。__FILE__ は二重引用符で囲まれた文字列に展開されます
__FUNCTION__	個々の関数内のみで有効であり、その関数に含まれる非装飾名 (文字列) を戻します
				/EP (#line ディレクティブなしの stdout への前処理) または /P (ファイルへの前処理) コンパイラ オプションを使用する場合、__FUNCTION__ は展開されません。
__LINE__		現在のソース ファイル内の行番号。この行番号は 10 進整定数です。これは #line ディレクティブを使用して変更することができます
__STDC__		ANSI C 標準に完全に準拠していることを示します。
				/Za、/Ze (言語拡張機能の無効化) コンパイラ オプションを指定していて、C++ コードはコンパイルしない場合にのみ、整定数 1 として定義されます。それ以外の場合は定義されません。 
__TIME__		現在のソース ファイルの最新のコンパイル時刻。この時刻は hh:mm:ss の形式の文字列リテラルです
__TIMESTAMP__	現在のソース ファイルの最新の変更日時。Ddd Mmm Date hh:mm:ss yyyy (Ddd は曜日の省略形、Date は 1 〜 31 の整数) の形式の文字列リテラルとして表されます

 * 
 * @author		N.Takeda
 * @date		2011/01/26(水) 22:02:04
 */
//********************************************************************************************

#ifndef	__tnew_h__	// 重複定義防止
#define	__tnew_h__	// 重複定義防止マクロ


#define	USE_MEMORY_OPERATE			///< operator new/delete乗っ取り有効定義.


#ifdef	USE_MEMORY_OPERATE
//********************************************************************************************
/**
 * operator new/delete乗っ取り.
 */
//********************************************************************************************


enum EnMEM
{
	eMEM_common,					///< 共通.
	eMEM_admin = -1,				///< メモリマネージャーシステム用. アプリ側からは使用禁止.
	eMEM_nothing = eMEM_common,		///< 未設定項目. とりあえず移植などして「まだ正式に分類していないもの」に使う.
};



#ifdef	_MASTER

void	*operator new(		size_t size,	const EnMEM _eAllocator );
void	*operator new[](	size_t size,	const EnMEM _eAllocator );
void	operator delete(	void* pv,		const EnMEM _eAllocator );
void	operator delete[](	void* pv,		const EnMEM _eAllocator );

/// 代替newマクロ.
# define	tnew( _eAllocator )		new( _eAllocator )

#define	GetAllocSize()	(-1)

#else	// _MASTER

void	*operator new(		size_t size,	const EnMEM _eAllocator, const char* const _pFile, const int _iLine, const char* const _pFunc );
void	*operator new[](	size_t size,	const EnMEM _eAllocator, const char* const _pFile, const int _iLine, const char* const _pFunc );
void	operator delete(	void* pv,		const EnMEM _eAllocator, const char* const _pFile, const int _iLine, const char* const _pFunc );
void	operator delete[](	void* pv,		const EnMEM _eAllocator, const char* const _pFile, const int _iLine, const char* const _pFunc );

/// 代替newマクロ.
# define	tnew( _eAllocator )		new( _eAllocator, __FILE__, __LINE__, __FUNCTION__)

int	GetAllocSize();

#endif	// _MASTER

/// 代替deleteマクロ. 配列に使えない上にデストラクタも呼ばれない.
#define	tdelete(pp)	operator delete (pp, __FILE__, __LINE__, __FUNCTION__)


#if 0	//プロトタイプ宣言は不要みたい
void	*operator new( size_t size );
void	operator delete( void* pv );
void	*operator new[]( size_t size );
void	operator delete[]( void* pv );
#endif


#else	// USE_MEMORY_OPERATE
//********************************************************************************************
/**
 * operator new/delete切り離し時.
 */
//********************************************************************************************

#define	tnew( _eAllocator )		new


#endif	// USE_MEMORY_OPERATE


#endif // __tnew_h__
//^^^^^^^^ CombineInclude memory\tnew.h

/// ■システム関連.
/// windows固有
#if defined( PLATFORM_WIN32 )
//vvvvvvvv CombineInclude system\win32\assert.h
//********************************************************************************************
/**
 * @file		assert.h
 * @brief		要約説明
 *
 *	このファイルの詳細説明
 *
 * @author		N.Takeda
 * @date		2009/08/04(火) 15:06:40
 */
//********************************************************************************************

#ifndef __ASSERT_H__
#define __ASSERT_H__

#include <assert.h>
//vvvvvvvv CombineInclude ..\..\types.h
//	already Included. types.h
//^^^^^^^^ CombineInclude ..\..\types.h


#ifdef	T_DEBUG

#define		ASSERT_STRING_LENGTH		(256)	///< assertメッセージ最大長.

//{if ( (val) == 0 ){static dl_int32	__this_assertion_enable = 1;if ( __this_assertion_enable != 0 ) {	__this_assertion_enable = Debug_Assert((val), __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__);if (!__this_assertion_enable) Debug_RegistAssertFlag(&__this_assertion_enable);}}

# define	T_ASSERT( _formula )					{t_Assert(  (Bool)(_formula), #_formula, __FILE__, __LINE__, __FUNCTION__, NULL );assert( _formula );}
# define	T_ASSERTC( _formula, _pFormat, ... )	{t_Assertc( (Bool)(_formula), #_formula, __FILE__, __LINE__, __FUNCTION__, _pFormat, __VA_ARGS__ );assert( _formula );}

void	t_Assert(  Bool _formula, const char *_sMethod, const char *_sFName, int _iLine, const char *_sFunc, LPCTSTR _sExpr );
void	t_Assertc( Bool _formula, const char *_sMethod, const char *_sFName, int _iLine, const char *_sFunc, LPCTSTR _pFormat, ... );

#else

# define	T_ASSERT( _formula )					__noop
# define	T_ASSERTC( _formula, _pFormat, ... )	__noop

#endif

#endif	// __ASSERT_H__
//^^^^^^^^ CombineInclude system\win32\assert.h
//vvvvvvvv CombineInclude system\win32\system.h
//********************************************************************************************
/**
 * @file		system.h
 * @brief		要約説明
 *
 *	このファイルの詳細説明
 *
 * @author		N.Takeda
 * @date		2009/08/20(木) 20:21:55
 */
//********************************************************************************************

#ifndef		_SYSTEM_H_
#define		_SYSTEM_H_

class MENU_HandleManager;					///< ウィンドウ情報に組み込むための宣言


//	データ長調整用
//typedef	long		dword;


/// ウィンドウタイプ
enum EnWindowType
{
	enWindowTypeStandard,					///< 最小化、最大化、ウィンドウサイズ可変枠
	enWindowTypeOrthodox,					///< Standard からサイズ変更を除いたもの
	enWindowTypeMax,
};

/**
	ウィンドウ情報構造体
 */
struct WINDOW_INFO
{
	LPCTSTR			m_pWndName;				///< ウィンドウの名前
	LPCTSTR			m_pWndTitle;			///< ウィンドウタイトルバーの文字
	HWND			m_hWnd;					///< ウィンドウハンドル
	HINSTANCE		m_hInst;				///< アプリケーションのインスタンス
	
	UInt32			m_uWndStyle;			///< ウィンドウスタイル
	LPCTSTR			m_pWndMenu;				///< メニューのリソース名
	Int32			m_iCmdShow;				///< ウィンドウ表示状態(タイプによって初期表示状態が決定される場合、_Createでしか使わないはず)
	Int32			m_iX;					///< ウィンドゥ表示位置x
	Int32			m_iY;					///< ウィンドゥ表示位置y xがデフォルトの場合は無視される
	Int32			m_iWidth;				///< ウィンドゥ幅
	Int32			m_iHight;				///< ウィンドゥ高さ
	RECT			m_cRec;					///< 実際のウィンドウサイズ (バー、メニュー含む)
	
	HBRUSH			m_hBrush;				///< ウィンドウ作成時に使用されるブラシ
	EnWindowType	m_eType;				///< ウィンドウタイプ PATOL で定められた雛形
	HMENU			m_hMenu;				///< メニューハンドル.
	Bool			m_bMenu;				///< メニューを持つ時 TRUE
	Bool			m_bMenuUpdate;			///< メニュー更新フラグ
	
	HICON			m_hIcon;				///< アイコンID
	HICON			m_hSIcon;				///< 小アイコンID
	
	Bool			m_bScreenChange;		///< 画面モード切替有効か.
	Bool			m_bFullScreen;			///< フルスクリーンか.
	
#ifdef	WINDOWS_USE_COMMCTRL
	HWND			m_hStatus;				///< ステータスバー
#endif
	
	WNDPROC			m_WndProc;				///< ウィンドウプロシージャ
	MENU_HandleManager	*m_pMenuHdMgr;		///< 


	WINDOW_INFO()
	 : m_pWndName( NULL )
	 , m_pWndTitle( NULL )
	 , m_hWnd( NULL )
#ifdef	WINDOWS_USE_COMMCTRL
	 , m_hStatus( NULL )
#endif
	 , m_hInst( 0 )
	 , m_pMenuHdMgr( NULL )
	 , m_bScreenChange( FALSE )
	 , m_bFullScreen( FALSE )
	{
		
	}
};

//********************************************************************************************
/**
 * @class		CWINDOW_NoMultiExec
 * @brief		
 * @author		N.Takeda
 * @date		2009/07/31(金) 20:41:54
 */
//********************************************************************************************
class	CWINDOW_NoMultiExec
{

	HANDLE		m_hMutex;
	HWND		m_hWnd;
	Bool		m_bIs;

public:
	Bool		Is(){	return m_bIs;	}
	
	HWND		GetAtherWnd(){	return m_hWnd;	}
	
	Bool		AnotherClose()
	{
		if( m_hWnd == NULL )	return TRUE;
		SendMessage( m_hWnd, WM_CLOSE, 0, 0 );
		if( !IsWindowEnabled( m_hWnd ) )	m_hWnd = NULL;
		
		return (m_hWnd == NULL);
	}
	
	void		AnotherActive()
	{
		if( IsWindowEnabled( m_hWnd ) )
			SetForegroundWindow( m_hWnd );
	}
	
	CWINDOW_NoMultiExec( LPCTSTR _pName )
	 : m_bIs( FALSE )
	 , m_hMutex( NULL )
	 , m_hWnd( NULL )
	{
		m_hMutex = CreateMutex ( NULL, FALSE, _pName );
		if( GetLastError ( ) == ERROR_ALREADY_EXISTS )
		{
			CloseHandle ( m_hMutex );
		}
		m_bIs = TRUE;
		m_hWnd = FindWindow( _pName, NULL );
	}

	~CWINDOW_NoMultiExec()
	{
		CloseHandle ( m_hMutex );
	}
};




WINDOW_INFO	WINDOW_SetStdInfo( LPCTSTR _pWndName, LPCTSTR _pTitle, const EnWindowType _eType, WNDPROC _pWndProc, const HINSTANCE _hInstance, const Int32 _iW = CW_USEDEFAULT, const Int32 _iH = CW_USEDEFAULT );

HWND	WINDOW_Create( WINDOW_INFO &_cWinfo, const Int32 _iCmdShow = -1 );

void	WINDOW_Destroy( WINDOW_INFO &_cWinfo );

void	WINDOW_Update( WINDOW_INFO &_cWinfo, const Int32 _iCmdShow = -1 );

void	WINDOW_SetSize( WINDOW_INFO &_cWinfo, const UInt32 _uW = 0, const UInt32 _uH = 0 );

void	WINDOW_SetMenu( WINDOW_INFO &_cWinfo, LPCTSTR _sMenu );

void	WINDOW_SetBackColor( WINDOW_INFO &_cWinfo, const Int32 _iCol );

Bool	WINDOW_Clear( WINDOW_INFO &_cWinfo );

#ifdef	WINDOWS_USE_COMMCTRL
Bool	WINDOW_STATUS_create( WINDOW_INFO &_cWinfo, const int *_Widths, const UINT32 _iID = 0 );

Bool	WINDOW_STATUS_text( WINDOW_INFO &_cWinfo, LPCTSTR _pString, const Int32 _iID = 0 );
#endif


/*----------------------------------------------------------
		親ウインドウの画面サイズを求める。

Bool	WINDOW_displaySize( POINT *poScreenSize );

  引数
		POINT	結果が入る構造体
  戻り値
  		この関数には戻り値はありません。
----------------------------------------------------------*/
void	WINDOW_displaySize( POINT *poScreenSize );


//	２重起動のチェック
Bool	WINDOW_doubleExec(LPCTSTR m_pszExeName);



/// 搭載メモリの容量を取得(byte).
UInt64	GetMem();
/// 空きメモリの取得(byte).
UInt64	GetFreeMem();

#ifdef	DEBUG_TRACE
	void	DEBUG_LastError( LPTSTR _pBuff = NULL );
	void	WINDOW_GetMsgString( UINT _uMsg, LPTSTR _sString, const Int32 _iStringSize, Bool _bType = FALSE );
#endif	// DEBUG_TRACE



/// 日付情報.
typedef struct _T_TIME
{
	UInt16	m_uYear;
	UInt8	m_uMonth;
	UInt8	m_uDayOfWeek;

	UInt8	m_uDay;
	UInt8	m_uHour;
	UInt8	m_uMinute;
	UInt8	m_uSecond;
} T_TIME;

/// 時間の取得.
T_TIME	GetTime();

/// 曜日IDから曜日の文字を得る.
Char*	GetWeekStr( const UInt8 _uDayOfWeek, const Bool _bType = FALSE );


#endif	_SYSTEM_H_
//^^^^^^^^ CombineInclude system\win32\system.h
//vvvvvvvv CombineInclude system\win32\menu.h
//********************************************************************************************
/**
 * @file		menu.h
 * @brief		要約説明
 *
 *	このファイルの詳細説明
 *
 * @author		N.Takeda
 * @date		2009/07/27(月) 18:36:33
 */
//********************************************************************************************

#ifndef		_MENU_H_
#define		_MENU_H_


/// ルートのID
#define		MENU_ID_ROOT		(0)


/// 指定した位置にメニューを挿入
void	WINDOW_MENU_insert( WINDOW_INFO &_cWin, const UInt32 _uID, LPTSTR _pStr, const UInt32 _uAddID, const UInt32 _uInsPos = (UInt32)-1 );
/// 指定したIDの手前にメニューを挿入
void	WINDOW_MENU_insertID( WINDOW_INFO &_cWin, const UInt32 _uID, LPTSTR _pStr, const UInt32 _uAddID, const UInt32 _uInsID );
/// メニューを削除(下階層も全て削除される)
void	WINDOW_MENU_del( WINDOW_INFO &_cWin, const UInt32 _uID );

void	WINDOW_MENU_clear( WINDOW_INFO &_cWin );

/// メニューを破棄 ウィンドウサイズを戻すような処理はない(WINDOW_Destroyから呼ばれている)
void	WINDOW_MENU_Destroy( WINDOW_INFO &_cWinfo );

/// メニューのチェックマークをON/OFF
Bool	WINDOW_MENU_check( WINDOW_INFO &_cWin, const UInt32 _uID, const Int32 _bFlag = -1 );

/// 指定したIDにリストされている子の数を得る.
Int32	WINDOW_MENU_GetEntry( WINDOW_INFO &_cWin, const UInt32 _uID );

Bool	WINDOW_MENU_GetString( WINDOW_INFO &_cWin, const UInt32 _uID, LPTSTR _pPtr, const Int32 _iBuffSize );


/**
	通常は外部からは使わないもの.
*/
/// WINDOW_MENU_GetSub関数
HMENU	WINDOW_MENU_GetSub( WINDOW_INFO &_cWin, HMENU _hParentMenu, UInt32 _uID );

/// WINDOW_MENU_changeSub関数
HMENU	WINDOW_MENU_changeSub( WINDOW_INFO &_cWin, UInt32 _uAddID );

#endif	//	_MENU_H_
//^^^^^^^^ CombineInclude system\win32\menu.h				///< system.h の後で
//vvvvvvvv CombineInclude system\win32\profile.h
//********************************************************************************************
/**
 * @file		profile.h
 * @brief		プライベートプロファイルを簡単に利用するライブラリ
 *
 *	このファイルの詳細説明
 *
 * @author		N.Takeda
 * @date		2009/08/20(木) 20:38:11
 */
//********************************************************************************************

#ifndef		_PROFILE_H_
#define		_PROFILE_H_



/// 実行アプリケーションと同フォルダにあるiniファイルから数値を取得
Int32	PROFILE_GetInt( LPCTSTR _sSec, LPCTSTR _sKey, const Int32 _iDefaule = -1 );

/// 実行アプリケーションと同フォルダにあるiniファイルに数値をセット
void	PROFILE_SetInt( LPCTSTR _sSec, LPCTSTR _sKey, const Int32 _iVal );

/// 実行アプリケーションと同フォルダにあるiniファイルから文字列を取得
Int32	PROFILE_GetString( LPCTSTR _sSec, LPCTSTR _sKey, LPTSTR _pString, const Int32 _iLength, LPCTSTR _pDefault = NULL );

/// 実行アプリケーションと同フォルダにあるiniファイルに文字列をセット
void	PROFILE_SetString( LPCTSTR _sSec, LPCTSTR _sKey, LPCTSTR _pString );


/// 実行アプリケーションと同フォルダにあるiniファイルから数値を取得
Int32	PROFILE_GetInt( LPCTSTR _pPath, LPCTSTR _sSec, LPCTSTR _sKey, const Int32 _iDefaule = -1 );

/// 実行アプリケーションと同フォルダにあるiniファイルに数値をセット
void	PROFILE_SetInt( LPCTSTR _pPath, LPCTSTR _sSec, LPCTSTR _sKey, const Int32 _iVal );

/// 実行アプリケーションと同フォルダにあるiniファイルから文字列を取得
Int32	PROFILE_GetString( LPCTSTR _pPath, LPCTSTR _sSec, LPCTSTR _sKey, LPTSTR _pString, const Int32 _iLength, LPCTSTR _pDefault = NULL );

/// 実行アプリケーションと同フォルダにあるiniファイルに文字列をセット
void	PROFILE_SetString( LPCTSTR _pPath, LPCTSTR _sSec, LPCTSTR _sKey, LPCTSTR _pString );


#endif	//	_PROFILE_H_
//^^^^^^^^ CombineInclude system\win32\profile.h
//vvvvvvvv CombineInclude system\win32\clip.h
#ifndef CLIP_header /* 重複定義防止 */
#define CLIP_header /* 重複定義防止マクロ */



/*----------------------------------------------------------
	クリップボートより文字列を受け取る

LPSTR	CLIP_stringCut(HWND hWnd);

　引数
	HWND		クリップボードをいて関連付けたいウィンドウのハンドルを指定します。NULL を指定すると、現在のタスクがクリップボードを開きます
　戻り値
	LPTSTR		受け取った文字列を示すポインタ(NULLが終端)
----------------------------------------------------------*/
LPSTR	CLIP_stringCut( HWND _hWnd = NULL );


/*----------------------------------------------------------
	クリップボートに対し、文字列を書き込む

int		CLIP_stringPaste(HWND hWnd,LPCTSTR str,int length);

　引数
	HWND		ウィンドウハンドル
	LPSTR		文字列
	int			文字列長
　戻り値
	int			正常終了した場合、書き込んだ文字数、それ以外は０を返す
----------------------------------------------------------*/
Int32	CLIP_stringPaste( char *str, Int32 _iLength, HWND _hWnd = NULL );


#endif /* CLIP_header */
//^^^^^^^^ CombineInclude system\win32\clip.h
//vvvvvvvv CombineInclude system\win32\help.h
//********************************************************************************************
/**
 * @file		help.h
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 */
//********************************************************************************************

#ifndef	_HELP_H_	// 重複定義防止
#define	_HELP_H_	// 重複定義防止マクロ

/*----------------------------------------------------------
		ヘルプを開く

Bool	HELP_open( HWND hWnd, const char* path );

　引数
	HWND	ウィンドウハンドル
	const char* ヘルプファイルのバス
  戻り値
	Bool	TRUE:正常終了　FALSE:実行できず
----------------------------------------------------------*/
Bool	HELP_open( HWND hWnd, LPCTSTR path );


/*----------------------------------------------------------
		ヘルプを閉じる

Bool	HELP_close( HWND hWnd, const char* path );

　引数
	HWND	ウィンドウハンドル
	const char* ヘルプファイルのバス
  戻り値
	Bool	TRUE:正常終了　FALSE:実行できず
----------------------------------------------------------*/
Bool	HELP_close( HWND hWnd, LPCTSTR path );


struct	FILESELECT
{
	HWND	hWnd;
	
	LPTSTR	szTitle;
	LPTSTR	szFullPathName;
	LPTSTR	DefFilename;
	LPTSTR	szFilter;
};


Bool	FILE_GetOpenFile(FILESELECT fs);
/*	備考
　コモンダイアログボックス、オープンファイルを呼び出す。

　呼び出し手続きを簡潔にするため必要最低限の情報を構造体化したもの。

	エラーの詳細は CommDlgExtendedError(); で得ることができる。

*/

Bool	FILE_GetSaveFile(FILESELECT fs);
/*	備考
　コモンダイアログボックス、オープンファイルを呼び出す。

　呼び出し手続きを簡潔にするため必要最低限の情報を構造体化したもの。

	エラーの詳細は CommDlgExtendedError(); で得ることができる。

*/


Bool	FILE_GetOpenFileEZ(HWND hWnd,LPTSTR Buff);
/*	備考
　コモンダイアログボックス、オープンファイルを呼び出す。
親ウィンドウハンドルを渡すだけで、ファイル名のポインタを返す。

　ツールやデバッグ等で、簡潔に呼び出したい場合に使用する。

	エラーの詳細は CommDlgExtendedError(); で得ることができる。

*/

Bool	FILE_GetSaveFileEZ(HWND hWnd,LPTSTR Buff);
/*	備考
　コモンダイアログボックス、オープンファイルを呼び出す。
親ウィンドウハンドルを渡すだけで、ファイル名のポインタを返す。

　ツールやデバッグ等で、簡潔に呼び出したい場合に使用する。

	エラーの詳細は CommDlgExtendedError(); で得ることができる。

*/


#endif // _HELP_H_ 重複定義防止
//^^^^^^^^ CombineInclude system\win32\help.h
//vvvvvvvv CombineInclude system\win32\mouse.h
//********************************************************************************************
/**
 * @file		mouse.h
 * @brief		マウス関連
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 */
//********************************************************************************************

#ifndef	_MOUSE_H_	// 重複定義防止
#define	_MOUSE_H_	// 重複定義防止マクロ


/*----------------------------------------------------------
//		マウスカーソルの表示

備考	現在のカウント数に関係なく表示カウント0の状態にする
----------------------------------------------------------*/
void	MOUSE_show();

/*----------------------------------------------------------
//		マウスカーソルの非表示

備考	現在のカウント数に関係なく表示カウント-1の状態にする
----------------------------------------------------------*/
void	MOUSE_hide();


#endif // _MOUSE_H_ 重複定義防止
//^^^^^^^^ CombineInclude system\win32\mouse.h
//vvvvvvvv CombineInclude files\files.h
//********************************************************************************************
/**
 * @file		files.h.
 * @brief		ファイル処理.
 *
 *	このファイルの詳細説明.
 *
 * @author		N.Takeda
 */
//********************************************************************************************

#ifndef _INCLUDE_FILES_H_ /* 重複定義防止 */
#define _INCLUDE_FILES_H_ /* 重複定義防止マクロ */

#include <stdio.h>


#define FILESTREAM_LENGTH		(1024)


/// エラー値.
enum
{
	enFILE_ERROR = -1,
};

/// ファイルハンドル定義.
#if defined( PLATFORM_WIN32 )

	typedef	HANDLE		FHND;
	#define	FILE_ERROR	reinterpret_cast<FHND>(enFILE_ERROR)

#elif defined( PLATFORM_PSP ) || defined( PLATFORM_PSP2 )

	typedef	SceUID		FHND;
	#define	FILE_ERROR	enFILE_ERROR
	
	#define	FILE_ATTRIBUTE_DIRECTORY	1
	#define	FILE_ATTRIBUTE_ARCHIVE		2
	#define	FILE_ATTRIBUTE_SYSTEM		4
	#define	FILE_ATTRIBUTE_HIDDEN		8
	#define	FILE_ATTRIBUTE_READONLY		16

#else
	typedef	void*		FHND;
#endif



/// ファイルシーク方法.
enum EnFILE_SEEK
{
#if defined( PLATFORM_WIN32 )
	enFILE_BEGIN	= FILE_BEGIN,	///< 頭から
	enFILE_CURRENT	= FILE_CURRENT,	///< 現在位置から
	enFILE_END		= FILE_END,		///< 終端から
#else
	enFILE_BEGIN	= SCE_SEEK_SET,	///< 頭から
	enFILE_CURRENT	= SCE_SEEK_CUR,	///< 現在位置から
	enFILE_END		= SCE_SEEK_END,	///< 終端から
#endif
};


//		ファイル検索構造体
struct	FIND_DATA
{
	UInt32	dwFileAttributes;
	UInt32	nFileSize;
	TCHAR	cFileName[ 256 ];
};


/// 日付情報.
#if defined( PLATFORM_WIN32 )
typedef T_TIME	T_FILETIME;
#else
typedef struct _T_FILETIME
{
	UInt16	m_uYear;
	UInt8	m_uMonth;
	UInt8	m_uDayOfWeek;

	UInt8	m_uDay;
	UInt8	m_uHour;
	UInt8	m_uMinute;
	UInt8	m_uSecond;
} T_FILETIME;
#endif


/// ファイルをオープン.
FHND	FILE_open( LPCTSTR  Filename, const Bool _bNew = FALSE );

//	ファイルをオープン(互換用)
FHND	FILE_openNew( LPCTSTR  Filename );

/// ファイルを新規作成.
FHND	FILE_create( LPCTSTR  Filename );

/// ファイルをクローズ.
Bool	FILE_close( FHND fd );

/// ファイルからデータを読み出す.
Bool	FILE_read( FHND _hd, void *_lpBuffer, UInt32 _lBytes, UInt32* _lReadBytes );

/// ファイルにデータを書き出す.
Bool	FILE_write( FHND _hd, void *_lpBuffer, UInt32 _lBytes, UInt32* _lWriteBytes );

/// ファイルポインタを移動.
UInt32	FILE_seek( FHND _fd, UInt32 _uLength, EnFILE_SEEK _eMoveMethod );

/// ファイルが存在するかを得る.
Bool	FILE_Exist( LPCTSTR _sFilename );

/// ファイルサイズを取得.
UInt32	FILE_GetSize( LPCTSTR  _sFilename );
#define	FILE_GetFileSize	FILE_GetSize	///< 互換

/// ファイルを削除する.
Bool	FILE_delete( LPCTSTR  _szName );

/// ファイル検索( First ).
Bool	FILE_finefirst( LPCTSTR  Path, FHND *hd, FIND_DATA *Ff );

/// ファイル検索( Next ).
Bool	FILE_finenext( FHND hd, FIND_DATA *Ff );

/// ファイル検索( Close ).
Bool	FILE_fineclose( FHND hd );

/// ディレクトリを作る.
Bool	FILE_CreateDirectory( LPCTSTR  szPathName );

/// ディレクトリを削除します.
Bool 	FILE_RemoveDirectory( LPCTSTR  lpszDir );


/// カレントディレクトリを移動
Bool	FILE_SetCurrentDirectory( LPCTSTR  szPathName );

/// カレントディレクトリを取得
UInt32	FILE_GetCurrentDirectory( LPTSTR  _pBuff, const UInt32 _iSize = 0 );

/// モジュール(実行プログラム)のあるパスを得る
UInt32	FILE_GetModuleDirectory( LPTSTR _pBuff, const UInt32 _iSize = 0 );

/// ファイル名変更
Bool	FILE_rename( LPCTSTR _lpExistingFileName, LPCTSTR _lpNewFileName );


//	以下の関数は上記の関数を使用した共通ルーチン

/// 指定のファイルをバッファに読み込む.
UInt32	FILE_TargetRead( LPCTSTR _szFileName, void* _lpBuffer );
UInt32	FILE_TextRead( LPCTSTR _pName, LPTSTR _lpBuffer, UInt32 _iBuffSize = 0 );


/*----------------------------------------------------------
	指定のファイルをバッファより書き出す

Bool	FILE_TargetWrite(LPCTSTR  szFileName,void* lpBuffer,UInt32 Size);

　引数
	LPCTSTR 	ファイル名
	void*		データを格納したバッファ
	UInt32		データ長
　戻り値
	Bool		TRUE:成功　FALSE 失敗
----------------------------------------------------------*/
Bool	FILE_TargetWrite( LPCTSTR  szFileName, void* lpBuffer, UInt32 Size );

Bool	FILE_TextWrite( LPCTSTR _szFileName, LPCTSTR _lpBuffer, Bool _bType = FALSE );


Bool	FILE_TargetWriteMerge( LPCTSTR  szFileName, void* lpBuffer, UInt32 Size );
Bool	FILE_TextWriteMerge( LPCTSTR _szFileName,  LPCTSTR _lpBuffer, Bool _bType = FALSE );



/*----------------------------------------------------------
	ファイルをコピー

UInt32	FILE_copy( LPCTSTR  szSIFileName, LPCTSTR  szDIFileName );

　引数
	LPCTSTR 		コピー元ファイル名
	LPCTSTR 		コピー先ファイル名
　戻り値
	UInt32		ファイルサイズ
----------------------------------------------------------*/
UInt32	FILE_copy( LPCTSTR  szSIFileName, LPCTSTR  szDIFileName );
/*	備考

	コピー元のファイルが 0ﾊﾞｲﾄ の場合でもコピーされる
	(コピー先は 0ﾊﾞｲﾄ でクローズされる)

*/

UInt32	FILE_copyATR( LPCTSTR  szSIFileName, LPCTSTR  szFileName, UInt32 atr );
UInt32	FILE_copyS( LPCTSTR  szSIFileName, LPCTSTR  szFileName, UInt32 atr );


/// ファイルに日付をセット.
Bool	FILE_SetTime( LPCTSTR _sFileName, T_FILETIME const *_pFTime );
/// ファイルの日付を取得.
Bool	FILE_GetTime( LPCTSTR _sFileName, T_FILETIME *_pFTime );

/// ファイルの属性を取得.
Int32	FILE_GetAttributes( LPCTSTR _szFileName );

/// ファイルの属性をセット.
void	FILE_SetAttrbites( LPCTSTR  szSIFileName, LPCTSTR  szFileName, UInt32 atr );


/*----------------------------------------------------------
	階層ディレクトリを作る

Bool	FILE_MakeDirectory( char* lpDi );

　引数
	char*			フルパスファイル名
　戻り値
	Bool			TRUE:成功　FALSE 失敗
----------------------------------------------------------*/
Bool	FILE_MakeDirectory( LPCTSTR lpDi );
/*	備考
	指定した階層までのディレクトリを作成
	
	例
		現在のディレクトリ
			C:\test
	
	FILE_MakeDirectory( "C:\\test\\sample\\123\\program.exe" );
	
		作成されたディレクトリ
			C:\test\sample\123\
	
	ファイル名まで指定されていても無視される
*/


/*----------------------------------------------------------
	指定したディレクトリとファイルを消去します。

Bool	FILE_deleteDIR( LPCTSTR  szPathSi );

　引数
	LPCTSTR  	消去したいディレクトリ名（絶対パスで指定して下さい）
　戻り値
	Bool		TRUE:成功　FALSE 失敗
----------------------------------------------------------*/
Bool	FILE_deleteDIR( LPCTSTR  szPathSi );


/*--------------------------------------------------------------------------
	ドライブからファイルを検索

Bool	FILE_search( char* lpRef, char* lpFindFile, char* lpGetPath );

引数
		char*	検索ディレクトリ文字列
				"\"「カレントディレクトリ」
				"*"「すべてのドライブ」
		char*	検索したいファイル名。
		char*	見つかったディレクトリが格納される。（戻り用）

戻り値
		TRUE:見つかった FALSE:見つからなかった
--------------------------------------------------------------------------*/
Bool	FILE_search( char* lpRef, char* lpFindFile, char* lpGetPath );


/*--------------------------------------------------------------------------
	ドライブのタイプを調べる

int		FILE_getdrive(char cDrive);

引数
	char	ドライブの文字 （'a'、'b'とか）

戻り値
	int		0	ドライブの種類が判断できません。
			1	ルート ディレクトリが存在しません。
			2	ドライブからディスクを抜くことができます。
			3	ドライブからディスクを抜くことができません。
			4	ドライブはリモート (ネットワーク) です。
			5	ドライブはCD-ROMドライブです。
			6	ドライブはRAMディスクです。
--------------------------------------------------------------------------*/
int		FILE_getdrive( char cDrive );


#if 0
/*--------------------------------------------------------------------------
	ディスクドライブにディスクが入っていなくても、エラーダイアログを
	表示させない。

void	FILE_int24(int sw);

引数
		int		0:OFF	1:ON

戻り値
		void
--------------------------------------------------------------------------*/
void	FILE_int24( int sw );
#endif




Bool	FILE_stream( LPCTSTR  szName, LPCTSTR  str );
Bool	FILE_printf( LPCTSTR szName, LPCTSTR format,... );


void	FILE_split( LPCTSTR _szPath, LPTSTR _pDrive, LPTSTR _pDir, LPTSTR _pFile, LPTSTR _pExt );
void	FILE_merge( LPTSTR _szPath, LPCTSTR _pDrive, LPCTSTR _pDir, LPCTSTR _pFile, LPCTSTR _pExt, const Int32 _iPathSize = T_MAXPATH );



/// ファイルが更新されているかチェック
Bool	FILE_CheckUpdate( LPCTSTR _sFileName1, LPCTSTR _sFileName2 );

#endif	// _INCLUDE_FILES_H_
//^^^^^^^^ CombineInclude files\files.h
#ifdef	_STOOLS_H
//vvvvvvvv CombineInclude files\xcopy.h
//********************************************************************************************
/**
 * @file		xcopy.h
 * @brief		ファイル／ディレクトリ リスト管理.
 *
 *	ファイル名を指定することで該当するファイルを検索してリストする
 *	サブディレクトリを検索、ワイルドカードを含むファイル名を指定する事が可能
 *	インデックスから得たパス、ファイル名を取得できる
 *	
 *	内部ではパス、ファイル名とを別でリストして、ファイル名情報にパスインデックスを含んでいる
 *
	スタンダードな用法
	{
		FILE_XCOPY		cXcopy;
		
		cXcopy.SetSearchSubDir( TRUE );
		cXcopy.AddXcopy( "*.txt" );
		
		printf("entry: %d\r\n", cXcopy.GetEntry() );
		
		for(Int32 ii=0 ; ii<(Int32)cXcopy.GetEntry() ; ii++)
			printf("	%s\r\n", cXcopy.GetPathFileName( ii ) );
	}
 
 * @date		2008/06/07
 * @author		N.Takeda
 */
//********************************************************************************************

#ifndef _INCLUDE_XCOPY_H_ /* 重複定義防止 */
#define _INCLUDE_XCOPY_H_ /* 重複定義防止マクロ */

#include <stdio.h>
#include <string>
#include <vector>


/// UNICODE に対応したが未テスト 2008/11/07
#ifndef	__XSTRING__
	#ifdef	_UNICODE
		typedef	std::wstring	xstring;
	#else
		typedef	std::string		xstring;
	#endif
	#define	__XSTRING__
#endif


/**
	ファイル情報構造体.
*/
struct	FILE_INFO
{
	xstring		sName;			///< ファイル名(パスは含まない).
	Int32		iPathIdx;		///< パステーブルのインデックス.
};


typedef	std::vector< FILE_INFO >	LFileInfo;
typedef	std::vector< xstring >		VPaths;


//------------------------------------------------------------------
/**
	ファイル／ディレクトリリスト管理クラス.
*/
//------------------------------------------------------------------
class	FILE_XCOPY
{
public:
	FILE_XCOPY();
	~FILE_XCOPY();
	
	/// リストをクリア.
	void	Clear();
	/// リストから要素を削除.
	Bool	Delete( const UInt32 _iIdx );
	Bool	Delete( const LFileInfo::iterator _ite );
	/// リストから指定拡張子を削除.
	Int32	DeleteOnExt( LPCTSTR _pExt, Bool _bRevFlag );
	
	/// リスト数を取得.
	UInt32	GetEntry() const
	{
		return (UInt32)m_lFiles.size();
	}
	
	
	/// パス+ファイル名を取得.
	xstring	GetStringPathFileName( const UInt32 _iIdx );
	/// ファイル名を取得.
	xstring	GetStringFileName( const UInt32 _iIdx );
	xstring	GetStringFileName( const LFileInfo::iterator _ite );
	/// 拡張子を取得.
	xstring	GetStringFileExt( const UInt32 _iIdx );
	xstring	GetStringFileExt( const LFileInfo::iterator _ite );
	
	/// パスを取得.
	xstring	GetStringPath( const UInt32 _iIdx );
	
	
	/// char*を返すための互換用
	/// パス+ファイル名を取得.
	inline	LPCTSTR	GetPathFileName( const UInt32 _iIdx ){
		lstrcpy( m_sWork, GetStringPathFileName( _iIdx ).c_str() );
		return m_sWork;
	}
	/// ファイル名を取得.
	inline	LPCTSTR	GetFileName( const UInt32 _iIdx ){
		lstrcpy( m_sWork, GetStringFileName( _iIdx ).c_str() );
		return m_sWork;
	}
	inline	LPCTSTR	GetFileName( const LFileInfo::iterator _ite ){
		lstrcpy( m_sWork, GetStringFileName( _ite ).c_str() );
		return m_sWork;
	}
	/// 拡張子を取得.
	inline	LPCTSTR	GetFileExt( const UInt32 _iIdx ){
		lstrcpy( m_sWork, GetStringFileExt( _iIdx ).c_str() );
		return m_sWork;
	}
	inline	LPCTSTR	GetFileExt( const LFileInfo::iterator _ite ){
		lstrcpy( m_sWork, GetStringFileExt( _ite ).c_str() );
		return m_sWork;
	}

	/// パスを取得.
	inline	LPCTSTR	GetPath( const UInt32 _iIdx ){
		lstrcpy( m_sWork, GetStringPath( _iIdx ).c_str() );
		return m_sWork;
	}
	
	
	/// サブフォルダ検索フラグをセット.
	void	SetSearchSubDir( Bool _bFlag ){	m_bSearchSubDir = _bFlag;	}
	/// サブフォルダ検索フラグを取得.
	Bool	GetSearchSubDir() const{		return m_bSearchSubDir;		}
	
	/// ディレクトリ構成を取得(追加).
	Bool	AddXcopy( LPCTSTR _pFileName );
	
	/// 更新用関数セット.
	void	SetUpdateFunc( Bool (*_pFunc)( void* ), void *_pParam, const Int32 _iCount );
	
private:
	/// ファイル／ディレクトリリストを取得.
	void	getDirctoryTree( LPCTSTR _pPath, Bool _bSubDir );
	
	/// ファイル構成を作るため元のディレクトリを検索サブ関数.
	void	subCheckDir( LPCTSTR _pPath, FIND_DATA _Find_Data, Bool _bSubDir );
	Bool	subCheckFile( LPCTSTR _pPath, FIND_DATA _Find_Data );
	
	/// パステーブルからバスのインデックスを取得.
	UInt64	getPathIdx( LPCTSTR _pPath );
	
	
	
	/// パステーブル.
	VPaths		m_sPaths;
	/// ファイルテーブル.
	LFileInfo	m_lFiles;
	
	/// サブフォルダ検索フラグ.
	Bool		m_bSearchSubDir;
	
	/// char*を返すための互換用
	TCHAR		m_sWork[1024];
	
	/**
	 * 更新処理.
	 *	検索したフォルダのファイルが多すぎる時、検索終了まで処理が返ってこないのでその間の画面更新処理等に利用.
	 */
	Bool		(*m_pFunc)( void *_pParam );		///< 更新関数ポインタ.
	void		*m_pParam;							///< パラメータ.
	Int32		m_iCallCount;						///< 呼び出し間隔カウンタ.
	Int32		m_iCallMax;							///< 呼び出し間隔(ファイルを1つ発見する処理が1カウント).
	
};


#endif	// _INCLUDE_XCOPY_H_
//^^^^^^^^ CombineInclude files\xcopy.h
#endif
#elif defined( PLATFORM_PSP )
//vvvvvvvv CombineInclude system\psp\assert.h
//	already Included. assert.h
//^^^^^^^^ CombineInclude system\psp\assert.h
//vvvvvvvv CombineInclude files\files.h
//	already Included. files.h
//^^^^^^^^ CombineInclude files\files.h
#elif defined( PLATFORM_PSP2 )
//vvvvvvvv CombineInclude system\psp2\assert.h
//	already Included. assert.h
//^^^^^^^^ CombineInclude system\psp2\assert.h
//vvvvvvvv CombineInclude files\files.h
//	already Included. files.h
//^^^^^^^^ CombineInclude files\files.h
#endif	// PLATFORM_



//vvvvvvvv CombineInclude memory\memory.h
//********************************************************************************************
/**
 * @file		memory.h
 * @brief		メモリ関連
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2010/12/20(月) 17:50:54
 */
//********************************************************************************************

#ifndef	_MEMORY_H_	// 重複定義防止
#define	_MEMORY_H_	// 重複定義防止マクロ


#if 1	// 旧バージョン互換用.
/*----------------------------------------------------------
	指定したサイズのメモリを確保、構造体に情報を返す

Bool	MEM_alloc(char **mem,UINT Attr,UInt32 Size);

　引数
	char**		メモリ構造体を示すポインタ
	UINT		メモリ属性
	UInt32		確保するメモリサイズ
　戻り値
	Bool		TRUE:成功　FALSE 失敗
----------------------------------------------------------*/
Bool	MEM_alloc(char **ptr,UInt32 size);
Bool	MEM_alloc(long **ptr,UInt32 size);
Bool	MEM_alloc(short **ptr,UInt32 size);
Bool	MEM_alloc(UInt16 **ptr,UInt32 size);
Bool	MEM_alloc(UInt32 **ptr,UInt32 size);


/*----------------------------------------------------------
	確保したメモリ領域を開放　互換性のために置いている、通常はMEM_del()マクロを使う

Bool	MEM_free(char **mem);

　引数
	char**		メモリ構造体を示すポインタ
　戻り値
	Bool		TRUE:成功　FALSE 失敗
----------------------------------------------------------*/
Bool	MEM_free(char **ptr);
Bool	MEM_free(short **ptr);
Bool	MEM_free(UInt16 **ptr);
Bool	MEM_free(long **ptr);
Bool	MEM_free(UInt32 **ptr);

#define	mem_del(p)	del_alloc(p)	///< 旧書式互換用.
#endif


#define	mem_alloc(type,ptr,size)	\
		del_alloc(ptr);\
		ptr = tnew(eMEM_nothing) type[ size ];

#define	mem_calloc(type,ptr,size)	mem_alloc(type,ptr,size);BUF_zero( ptr, size )

#define	del_alloc(p)	{if((p)!=NULL){delete [] (p);(p)=NULL;}}

//ダミー追加
#define	mem_new(type,ptr)	\
		del_new(ptr);\
		ptr = tnew(eMEM_nothing) type;
//		memset((char*)ptr,0,size*sizeof(type) );

#define	del_new(p)	{if((p)!=NULL){delete (p);(p)=NULL;}}



/*----------------------------------------------------------
	メモリを確保し、指定ファイルを読み込む
----------------------------------------------------------*/
UInt32	MEM_TargetRead( char **_ppData, LPCTSTR _pRoot, LPCTSTR _pName = NULL );
UInt32	MEM_TargetRead( char **ptr, LPCTSTR name, UInt32 len);
UInt32	MEM_TargetRead( char **ptr, LPCTSTR name, UInt32 offset, UInt32 len );

UInt32	MEM_TargetRead2( char **_pPtr, LPCTSTR _pName, const Int32 _iMul );
UInt32	MEM_TextRead( TCHAR **_pPtr, LPCTSTR _pName );
UInt32	MEM_TextRead2( TCHAR **_pPtr, LPCTSTR _pName, const Int32 _iMul );


/// 配列のクリア.
#ifdef T_DEBUG
# define	_zero(_Reg)				{T_ASSERT(4<sizeof(_Reg));BUF_zero( _Reg, sizeof(_Reg) );}	///< 誤ってアドレスを渡した時に分かるようにASSERT.
#else
# define	_zero(_Reg)				BUF_zero( _Reg, sizeof(_Reg) )
#endif	// T_DEBUG

/// 構造体のクリア.
#define	_stZero(_iType,_Reg)	BUF_zero( _Reg, sizeof(_iType) )


/// メモリ空間を 0 で埋める.
void	BUF_zero( void *_pMem, UInt32 _uLength );

/// メモリ空間のコピー.
void	BUF_copy( void *_memD, const void *_memS, UInt32 _uLength );

/// メモリ空間の移動.
void	BUF_move( void *_memD, const void *_memS, UInt32 _uLength );


#if 0//old ver
#ifdef _STRING_H_
/// 文字列の長さに合わせてメモリを確保しコピーする
Int32	MEM_STRING_cpy( LPTSTR *_pMem, LPCTSTR _pString );
#endif
#endif



/// ビット操作タイプ.
enum EnBitCtrl
{
	enBitCtrlRead = -1,
	enBitCtrlSet0,
	enBitCtrlSet1,
};


/// 32bitバッファデータのビット操作
Int32	bitcontrol32( UInt32 *_pBuff, const Int32 _iMax, const Int32 _iNum, const EnBitCtrl _iMode );
/// 16bitバッファデータのビット操作
Int32	bitcontrol16( UInt16 *_pBuff, const Int32 _iMax, const Int32 _iNum, const EnBitCtrl _iMode );
/// 8bitバッファデータのビット操作
Int32	bitcontrol8(  UInt8  *_pBuff, const Int32 _iMax, const Int32 _iNum, const EnBitCtrl _iMode );





#endif // _MEMORY_H_ 重複定義防止
//^^^^^^^^ CombineInclude memory\memory.h

//vvvvvvvv CombineInclude string\string.h
//********************************************************************************************
/**
 * @file		string.h
 * @brief		要約説明
 *
 *	このファイルの詳細説明
 *
 * @author		N.Takeda
 * @date		2009/06/30(火) 14:50:06
 */
//********************************************************************************************

#ifndef __STRING_H__ /* 重複定義防止 */
#define __STRING_H__ /* 重複定義防止マクロ */

//vvvvvvvv CombineInclude ..\types.h
//	already Included. types.h
//^^^^^^^^ CombineInclude ..\types.h
//vvvvvvvv CombineInclude toSjis.h
#ifndef	_TOSJIS_H_
#define	_TOSJIS_H_

#if defined( PLATFORM_WIN32 )
//********************************************************************************************
/**
 * @brief		ちゃちゃっとSJISを得るクラス.
 *				CTOSJIS	cJis;				//宣言して
 *				cJis.From(L"あいうえお");	//でOK。戻り値はSJIS
 *				strlen( cJis.Get() );		//以降はget()で得られる
 *
 *				または
 *
 *				CTOSJIS	cJis(L"あいうえお");	//宣言
 *				strlen( cJis.Get() );			//以降はget()で得られる
 *
 * @date		2008/10/21(火) 17:00:23
 * @author		N.Takeda
 */
//********************************************************************************************
class CTOSJIS
{
private:
	/// 変換後文字列保管用.
	char*	m_sString;
	
public:
	char* From( LPCWSTR sUniStr )
	{
		if( m_sString != NULL)	delete [] m_sString;
		
		/// サイズを求め(\0を含んでいる).
		const Int32 nSize = WideCharToMultiByte( CP_ACP, 0, sUniStr, -1, NULL, 0, NULL, NULL );
		
		/// 領域確保.
		m_sString = tnew(eMEM_nothing) char[ nSize ];
		
		/// 変換.
		WideCharToMultiByte( CP_ACP, 0, sUniStr, -1, m_sString, nSize, NULL, NULL );
		m_sString[ nSize-1 ] = 0;
		
		return m_sString;
	}
	char* Get(){	return m_sString;	}
	
	CTOSJIS()
	: m_sString( NULL )
	{}
	CTOSJIS( LPCWSTR sUniStr )
	: m_sString( NULL )
	{
		if( sUniStr )	From( sUniStr );
	}
	~CTOSJIS()
	{
		if( m_sString != NULL )	delete [] m_sString;
	}
};
#else

class CTOSJIS
{
private:
public:
	char* From( LPCWSTR )
	{
		return NULL;
	}
	char* Get(){	return NULL;	}
	
	CTOSJIS()
	{}
	CTOSJIS( LPCWSTR  )
	{
	}
	~CTOSJIS()
	{
	}
};

#endif

#endif	// _TOSJIS_H_
//^^^^^^^^ CombineInclude toSjis.h
//vvvvvvvv CombineInclude toUTF16.h
#ifndef	_TOUTF16_H_
#define	_TOUTF16_H_

#if defined( PLATFORM_WIN32 )
//********************************************************************************************
/**
 * @brief		ちゃちゃっとUTF16を得るクラス.
 *
 *				CTOUTF16	cUtf;			//宣言して
 *				cUtf.From("あいうえお");	//でOK。戻り値はUTF16
 *				strlen( cUtf.Get() );		//以降はget()で得られる
 *
 *				または
 *
 *				CTOUTF16	cUtf("あいうえお");	//宣言
 *				strlen( cUtf.Get() );			//以降はget()で得られる
 *
 * @date		2008/10/21(火) 17:00:23
 * @author		N.Takeda
 */
//********************************************************************************************
class CTOUTF16
{
private:
	/// 変換後文字列保管用.
	WCHAR*	m_sString;
	
public:
	WCHAR* From( const char *_sSjisStr )
	{
		if( m_sString != NULL)	delete [] m_sString;
		
		/// サイズを求め.
		const Int32 nSize = MultiByteToWideChar( CP_ACP, 0, _sSjisStr, -1, NULL, 0 );
		
		/// 領域確保.
		m_sString = tnew(eMEM_nothing) WCHAR[ nSize+1 ];
		
		/// 変換.
		MultiByteToWideChar( CP_ACP, 0, _sSjisStr, -1, m_sString, nSize );
		m_sString[ nSize ] = 0;	///< ★★ここも-1の必要があるかもしれないが未検証
		
		return m_sString;
	}
	WCHAR* Get(){	return m_sString;	}
	
	CTOUTF16()
	: m_sString( NULL )
	{}
	CTOUTF16( const char *_sSjisStr )
	: m_sString( NULL )
	{
		if( _sSjisStr )	From( _sSjisStr );
	}
	~CTOUTF16()
	{
		if( m_sString != NULL )	delete [] m_sString;
	}
};
#else

class CTOUTF16
{
private:
public:
	WCHAR* From( const char * )
	{
		return NULL;
	}
	WCHAR* Get(){	return NULL;	}
	
	CTOUTF16()
	{}
	CTOUTF16( const char * )
	{
	}
	~CTOUTF16()
	{
	}
};

#endif

#endif	// _TOUTF16_H_
//^^^^^^^^ CombineInclude toUTF16.h

#if !defined( _UNICODE ) && defined( PLATFORM_WIN32 )
#include <mbctype.h>
#include <mbstring.h>
#endif

/// 単語判定時、境界となる文字リストのデフォルト値(\0は指定してなくても判定される、下行は分かりやすくするために記述してある)
#define		DEFAULT_BORDERCHAR	TEXT(" \t\r\n\0")


//======================================================================================
//		ストリング関連
//======================================================================================

/// 文字列コピー関数.
Bool	STRING_cpy( LPTSTR _sBuffD, LPCTSTR _sBuffS, const Int32 _iLength = 0 );

/// 文字列追加関数.
Bool	STRING_cat( LPTSTR _sBuffD, LPCTSTR _sBuffS, const Int32 _iLength = 0 );

/// 文字列照会関数.
Int32	STRING_cmp( LPCTSTR _sStr1, LPCTSTR _sStr2 );
/// 文字列照会関数(大小文字区別しないver).
Int32	STRING_cmpi( LPCTSTR _sStr1, LPCTSTR _sStr2 );
#define	STRING_cmp2	STRING_cmpi	//互換用

/// _pStr 内で _cChr が最初に出現する位置を返す
LPTSTR	STRING_chr( LPCTSTR _pStr, const TCHAR _cChr );
/// _pStr 内で _cChr が最後に出現する位置を返す
LPTSTR	STRING_rchr( LPCTSTR _pStr, const TCHAR _cChr );
/// _pStr 内で _cChr が最初に出現する位置を返す(大文字小文字を区別しない)
LPTSTR	STRING_chri( LPCTSTR _pStr, const TCHAR _cChar );


/// 文字列の長さを返す.
Int32	STRING_len( LPCTSTR _sStr );

Bool	STRING_IsValue( LPCTSTR _sStr, const Bool _bUseSpace = FALSE );

/// バッファと文字列を照合.
Bool	STRING_buffcmp( LPCTSTR _sStr1, LPCTSTR _sStr2, LPCTSTR _pCharList = DEFAULT_BORDERCHAR );
/// バッファと文字列を照合(大小文字区別しないver).
Bool	STRING_buffcmpi( LPCTSTR _sStr1, LPCTSTR _sStr2, LPCTSTR _pCharList = DEFAULT_BORDERCHAR );
#define	STRING_buffcmp2	STRING_buffcmpi	//互換用

/// バッファ上の単語の長さを得る.
Int32	STRING_bufflen( LPCTSTR _pBuff, LPCTSTR _pCharList = NULL );

//********************************************************************************************
/**
 * @brief		末尾に \ がなければ追加する
 * @author		N.Takeda
 * @date		2009/06/30(火) 18:56:41
 *
 * @param[in,out]	LPTSTR	_sStr	文字列
 *
 * @return		なし (none)
 */
//********************************************************************************************
inline	void	catyen( LPTSTR _sStr )
{
	if( 0 < STRING_len( _sStr ) && _sStr[ STRING_len( _sStr ) - 1 ] != '\\' )	STRING_cat( _sStr, TEXT("\\") );
}

//********************************************************************************************
/**
 * @brief		末尾の \ を削除する
 * @author		N.Takeda
 * @date		2009/06/30(火) 18:58:05
 *
 * @param[in,out]	LPTSTR	_sStr	文字列
 *
 * @return		なし (none)
 */
//********************************************************************************************
inline	void	cutyen( LPTSTR _sStr )
{
	if( 0 < STRING_len( _sStr ) && _sStr[ STRING_len( _sStr )-1 ] == '\\' )	_sStr[ STRING_len( _sStr ) - 1 ] = '\0';
}


//********************************************************************************************
/**
 * @brief		末尾に改行がなければ追加する(改行は\n)
 * @author		N.Takeda
 * @date		2009/08/10(月) 22:47:29
 * @date		2011/12/01(木) 14:00:25	N.Takeda	\rも追加してみたが未検証
 *
 * @param[in,out]	LPTSTR		_sStr	文字列
 * @param[in]		const Bool	_bUseD	true の時、0x0d を付加する.
 *
 * @return		なし (none)
 */
//********************************************************************************************
inline	void	catret( LPTSTR _sStr, const Bool _bUseD = FALSE )
{
	if( 0 < STRING_len( _sStr ) && _sStr[ STRING_len( _sStr ) - 1 ] != '\n' )
	{
		if( _bUseD )	STRING_cat( _sStr, TEXT("\r") );
		STRING_cat( _sStr, TEXT("\n") );
	}
}

//********************************************************************************************
/**
 * @brief		末尾の改行を削除する(改行は\n)
 * @author		N.Takeda
 * @date		2009/08/10(月) 22:47:19
 * @date		2010/03/24(水) 14:08:59	N.Takeda	\rも追加してみたが未検証
 *
 * @param[in,out]	LPTSTR	_sStr	文字列
 *
 * @return		なし (none)
 */
//********************************************************************************************
inline	void	cutret( LPTSTR _sStr )
{
	if( 0 < STRING_len( _sStr ) )
	{
		if( _sStr[ STRING_len( _sStr )-1 ] == '\n' )	_sStr[ STRING_len( _sStr )-1 ] = '\0';
		if( _sStr[ STRING_len( _sStr )-1 ] == '\r' )	_sStr[ STRING_len( _sStr )-1 ] = '\0';
	}
}


/// バッファから文字列を検索
LPTSTR	STRING_str( LPCTSTR _sBuff, LPCTSTR _sStr, const Int32 _iLength = 0, LPCTSTR _pCharList = NULL );
LPTSTR	STRING_str2( LPCTSTR _sBuff, LPCTSTR _sStr, const Int32 _iLength = 0, LPCTSTR _pCharList = NULL );


/// 指定した文字がリスト文字列内に存在するか調べる
Int32	STRING_CheckChar( const TCHAR _cChar, LPCTSTR _sCharList );
/// 指定した文字がリスト文字列内に存在するか調べる(成否返しVer)
inline	Bool	string_CheckChar( const TCHAR _cChar, LPCTSTR _pCharList );


/// ポインタ位置の単語の先頭へ移動
LPTSTR	STRING_word( LPCTSTR _pBuff, LPCTSTR _pBuffMin, LPCTSTR _pCharList = DEFAULT_BORDERCHAR );

/// １つ前の単語へポインタを移動
LPTSTR	STRING_backWord( LPCTSTR _pBuff, LPCTSTR _pBuffMin, LPCTSTR _pCharList = DEFAULT_BORDERCHAR );

/// 次の単語へポインタを移動
LPTSTR	STRING_nextWord( LPCTSTR _pBuff, LPCTSTR _pCharList = DEFAULT_BORDERCHAR );

/// スペース、タブでなくなるまでポインタを進める(改行は見ない)
LPTSTR	STRING_skipSpace( LPCTSTR _pBuff, const Int32 _iLength = 0 );

/// 指定文字が見つかるまでポインタを進める
LPTSTR	STRING_searchChar( LPCTSTR _pBuff, const TCHAR _cCh, const Int32 _iLength = 0 );

#if 0
/// バッファから単語を切り出す
Int32	STRING_getWord( LPCTSTR _pBuff, LPTSTR _pWork, LPCTSTR _pCharList = DEFAULT_BORDERCHAR );
#endif
/// バッファから単語を切り出す
Int32	STRING_getWord( LPCTSTR _pBuff, LPTSTR _pWork, const Int32 _iWorkLength = 0/*省略廃止予定*/, LPCTSTR _pCharList = DEFAULT_BORDERCHAR );

/// 指定ポインタ位置の行を切り出す(改行含まない)
Int32	STRING_getLine( LPCTSTR _pBuff, LPCTSTR _pBuffMin = NULL, LPTSTR _pWork = NULL );


/// 文字列を英大文字にする
LPTSTR	STRING_ToBig( LPTSTR _pString );

/// 文字列を英小文字にする
LPTSTR	STRING_ToSmall( LPTSTR _pString );


//********************************************************************************************
/**
 * @brief		アルファベット大文字なら小文字に変換
 * @author		N.Takeda
 * @date		2009/08/26(水) 18:29:20
 *
 * @param[in]	const TCHAR	_ch	文字
 *
 * @return		TCHAR	変換後の文字
 */
//********************************************************************************************
inline	TCHAR	_KMOJI( const TCHAR _ch )
{
	return ( _ch >= 'A' && _ch <= 'Z' ) ? _ch + ('a'-'A') : _ch;
}
//********************************************************************************************
/**
 * @brief		アルファベット小文字なら大文字に変換
 * @author		N.Takeda
 * @date		2009/08/26(水) 18:29:18
 *
 * @param[in]	const TCHAR	_ch	文字
 *
 * @return		TCHAR	変換後の文字
 */
//********************************************************************************************
inline	TCHAR	_OMOJI( const TCHAR _ch )
{
	return ( _ch >= 'a' && _ch <= 'z' ) ? _ch - ('a'-'A') : _ch;
}


//********************************************************************************************
/**
 * @brief		指定ポインタの文字が半角カナかどうかを得る
 * @author		N.Takeda
 * @date		2009/08/17(月) 20:15:43
 *
 * @param[in]	TCHAR	_cMoji	
 *
* @return		Bool	TRUE:成 / FALSE:否
 */
//********************************************************************************************
inline	Bool	STRING_IsKana( TCHAR _cMoji )
{
#if !defined( _UNICODE ) && defined( PLATFORM_WIN32 )
	return ( _ismbbkana(_cMoji) != 0 );
#else
	return ( _cMoji >= 0xff61 && _cMoji <= 0xff9f );
#endif
}

//********************************************************************************************
/**
 * @brief		文字が全角(マルチバイト)かどうかを得る(先頭バイトのみの判定)
 * @author		N.Takeda
 * @date		2009/08/17(月) 17:24:20
 *
 * @param[in]	TCHAR	_cMoji	ポインタ
 *
* @return		Bool	TRUE:成 / FALSE:否
 */
//********************************************************************************************
inline	Bool	STRING_IsMultiByte( TCHAR _cMoji )
{
#if !defined( _UNICODE ) && defined( PLATFORM_WIN32 )
	return ( _ismbblead(_cMoji) != 0 );
#else
	return ( _cMoji > 0x7d && _cMoji != 0x203e && _cMoji < 0xff61 );
#endif
}

//********************************************************************************************
/**
 * @brief		指定ポインタの文字が全角(マルチバイト)かどうかを得る
 * @author		N.Takeda
 * @date		2011/03/30(水) 11:48:55
 *
 * @param[in]	LPCTSTR	_pMoji	ポインタ.
 *
* @return		Bool	TRUE:成 / FALSE:否
 */
//********************************************************************************************
inline	Bool	STRING_IsMultiByte( LPCTSTR _pMoji )
{
#if !defined( _UNICODE ) && defined( PLATFORM_WIN32 )
	return ( _ismbblead(*_pMoji) != 0 && _ismbbtrail(*(_pMoji+1)) );
#else
	return ( *_pMoji > 0x7d && *_pMoji != 0x203e && *_pMoji < 0xff61 );	//★★UNICODE時の後続バイトは未判定
#endif
}

//********************************************************************************************
/**
 * @brief		マルチバイトの長さを得る(unicodeで1、それ以外で2を返す)
 *				主にマルチバイト、unicode互換のコードを書くのに使う
 * @author		N.Takeda
 * @date		2009/08/17(月) 17:36:00
 *
 * @param[in]	LPCTSTR	_pPtr	ポインタ
 *
 * @return		Int32	
 */
//********************************************************************************************
inline	Int32	STRING_GetMultiByte()
{
#ifndef	_UNICODE
	return 2;
#else
	return 1;
#endif
}

inline	Bool	STRING_IsCgGraph( TCHAR _cMoji )
{
#if !defined( _UNICODE ) && defined( PLATFORM_WIN32 )
	return (_ismbcgraph(_cMoji) != 0 );	///< 半角アルファベット文字
#else
	return (_cMoji > 0x20 && _cMoji <= 0x7d );
#endif
}

/// 文字列を数値に変換する("0x"を１６進数と判断)
Int32	STRING_atoi( LPCTSTR _pStr );

/// 文字列を浮動小数点数値に変換する
Float32	STRING_atof( LPCTSTR _pStr );

///	数値を文字列に変換する.
void	STRING_itoa( LPTSTR _pStr, Int32 _iValue, Int32 _iBuffSize = 32 );

///	浮動小数点変数を文字列に変換する.
void	STRING_ftoa( LPTSTR _pStr, Float32 _fValue, Int32 _iBuffSize = 32 );


/// STRING_dirctoryUp関数
Bool	STRING_dirctoryUp( LPTSTR _pWork );

/// パス指定文字列内に含まれる ".." を整理
Int32	STRING_TidyDirctory( LPTSTR path );

/// printf関数.
Int32	STRING_printf( LPTSTR _pBuff, const Int32 _iBuffSize, LPCTSTR _pFormat, ... );


//********************************************************************************************
/**
	@brief		連続した数値を配列に格納.
				"123,456,789" の文字列が _pVals[0] = 123, _pVals[1] = 456, _pVals[2] = 789 と格納される.
 * @author		N.Takeda
 * @date		2012/04/25(水) 21:31:34
 *
 * @param[in]		LPCTSTR		_pBuff		バッファ.
 * @param[in]		const Int32	_iLength	長さ.
 * @param[in,out]	TREG*		_pVals		受け取りポインタ.
 * @param[in]		const Int32	_iSize		サイズ.
 *
 * @return		Int32	格納した個数
 */
//********************************************************************************************
template<typename TREG> Int32	STRING_ToNumArray( LPCTSTR _pBuff, const Int32 _iLength, TREG *_pVals, const Int32 _iSize )
{
	const Int32	iTempMax = 8;	//!< 数値の最大桁数.
	Int32		ii = 0, jj = 0, iEntry = 0;
	TCHAR		*pValPtr = const_cast<LPTSTR>(_pBuff);
	TCHAR		sWork[ iTempMax ];
	Bool		bFloat = FALSE;
	
	memset( (char*)_pVals, 0, _iSize * sizeof(TREG) );
	while( '\0' != *(pValPtr + ii)  )
	{
		jj = 0;
		bFloat = FALSE;
		while( ',' != *(pValPtr + ii) && '\0' != *(pValPtr + ii)  )
		{
			if( ' ' < *(pValPtr + ii) )
			{
				sWork[ jj++ ] = *(pValPtr + ii);
				if( '.' == *(pValPtr + ii) )	bFloat = TRUE;
			}
			ii++;
			T_ASSERTC( iTempMax > jj, TEXT("桁オーバー") );
			T_ASSERTC( _iLength > ii, TEXT("領域オーバー") );
		}
		sWork[ jj ] = 0;
		if( ',' == *(pValPtr + ii) )	ii++;
		
		if( bFloat )
		{
			_pVals[ iEntry ] = static_cast<TREG>(STRING_atof( sWork ));
		}else{
			_pVals[ iEntry ] = static_cast<TREG>(STRING_atoi( sWork ));
		}
		iEntry++;
		
		T_ASSERTC( iEntry < _iSize, TEXT("サイズオーバー") );
	}
	return iEntry;
}


//! 文字列CRC計算.
UInt32	STRING_crc32( LPCTSTR _pSrc, Int32 _iSize = 0 );
//UInt32	STRING_crc32( LPCTSTR _pSrc );
UInt32	STRING_SafeCRC32( LPCTSTR _pSrc, Int32 _iGroup = 0 );


#if 0
/*----------------------------------------------------------
	バッファと文字列を照合(終端を確認している)

Bool	STRING_cmp(char *Sbuff,char *string);

　引数
	const char*		
	const char*		
　戻り値
	Bool		
----------------------------------------------------------*/
Bool	STRING_cmp(char *Sbuff,char *string);



/*----------------------------------------------------------
	バッファと文字列を照合()

Bool	STRING_str(char *Sbuff,char *string);

　引数
	const char*		
	const char*		
　戻り値
	Bool		
----------------------------------------------------------*/
Bool	STRING_str(LPTSTR Sbuff,LPTSTR string);



/*----------------------------------------------------------
	バッファと文字列を照合(双方終端を確認している)

char	*STRING_search(char *Sbuff,char *string,UInt32 *Length);

　引数
	const char*		
	const char*		
　戻り値
	Bool		
----------------------------------------------------------*/
//char	*STRING_search(char *Sbuff,char *string,UInt32 *Length);



/*----------------------------------------------------------
	バッファ内から文字列を検索

char	*STRING_search(char *Sbuff,char *string,UInt32 *Length);

　引数
	const char*		検索バッファを格納したポインタ
	const char*		検索する文字列
	UInt32*		検索する領域の長さ
　戻り値
	const char*		発見したバッファのポインタ
----------------------------------------------------------*/
LPTSTR	STRING_search(char *Sbuff,char *string,UInt32 *Length);
/*	備考
Lengthには発見したポインタからデータエンドまでの長さが返る

検索文字が見つからなかった場合はNULLを返す
*/



/*----------------------------------------------------------
	バッファ内から文字列を検索  文字列内部は無視する

char	*STRING_searchCOM(char *Sbuff,char *string,UInt32 *Length,char COM);

　引数
	const char*		検索バッファを格納したポインタ
	const char*		検索する文字列
	UInt32*		検索する長さ
	char		
　戻り値
	const char*		発見したバッファのポインタ
----------------------------------------------------------*/
char	*STRING_searchCOM(char *Sbuff,char *string,UInt32 *Length,char COM);
/*	備考
Lengthには発見したポインタからデータエンドまでの長さが返る

検索文字が見つからなかった場合はNULLを返す
*/



/*----------------------------------------------------------
	バッファから文字列を切り出す
		空白を含むコントロールコードを単語の終端とみなす

Int32		STRING_getword(unsigned char *Buffer,char* str);

　引数
	const char*		
	char*		
　戻り値
	移動した Buffer ポインタ数
----------------------------------------------------------*/
Int32		STRING_getword(unsigned char *Buffer,char* str);



/*----------------------------------------------------------
	バッファから文字列を切り出す
		空白を含むコントロールコード、カンマ、コロンを単語の終端とみなす

Int32		STRING_getwordSec(unsigned char *Buffer,char* str,unsigned char *ch,char defstr);

　引数
	const char*		
	char*		
	char*		
　戻り値
	移動した Buffer ポインタ数(文字列長でないことに注意)
----------------------------------------------------------*/
Int32		STRING_getwordSec(unsigned char *Buffer,char* str,unsigned char *ch,char defstr);



/*----------------------------------------------------------
	バッファポインタを文字が見つかるまで進める

char*	STRING_nextchar(unsigned char *Buffer,UInt32 *line);

　引数
	char*		
	UInt32*		
　戻り値
	char*		
----------------------------------------------------------*/
char*	STRING_nextchar(unsigned char *Buffer,UInt32 *line);
/*	備考
line にはスキップ中に発見したリターンコードの数が返る
*/



/*----------------------------------------------------------
	現在位置の単語の次の単語を探す(カンマを区切りと判断する)

char*	STRING_skipwordSec(unsigned char *Buffer,UInt32 *line);

　引数
	char*		
	UInt32*		
　戻り値
	char*		
----------------------------------------------------------*/
char*	STRING_skipwordSec(unsigned char *Buffer,UInt32 *line);
/*	備考
　戻り値には終端である,を飛ばした部分からが返る

*/


/*----------------------------------------------------------
	現在位置の単語の次の単語を探す

char*	STRING_skipword(unsigned char *Buffer,UInt32 *line);

　引数
	char*		
	UInt32*		
　戻り値
	char*		
----------------------------------------------------------*/
char*	STRING_skipword(unsigned char *Buffer,UInt32 *line);


/*----------------------------------------------------------
	パラメータを調べます

Bool STRING_checkparam( const char* cmdline, char n);

　引数
	const char*		検査する文字列
	char		パラメータ文字　大文字小文字を区別
　戻り値
	Bool		TRUE:文字があります。　FALSE:文字がありません。
----------------------------------------------------------*/
Bool STRING_checkparam( const char* cmdline, char n);


/*----------------------------------------------------------
	パラメータ文字を取得

char	*STRING_getparam(char* cmdline,char n,char *string);

　引数
	const char*		検査する文字列
	char		パラメータ文字　大文字小文字を区別　0でコマンドなし文字を得る
	char*		パラメータ文字を受け取るポインタ
　戻り値
	char*		ポインタの続き 最後まで検索した場合は NULL が返る
----------------------------------------------------------*/
char*	STRING_getparam(char* cmdline,char n,char *string);


char	*STRING_BigToSmall( char *lpCheckStr );
char	*STRING_SmallToBig( char *lpCheckStr );


/*----------------------------------------------------------
		現在のアドレスの文字列が全角１バイト目か、全角２バイト目か、
		半角か？調べる関数。

Int32		STRING_DoubleMoji( unsigned char* Text, Int32 nPtr );

　引数
	unsigned char*		文字列ポインタ
  戻り値
		0:	半角
		1:	全角１バイト目
		2:	全角２バイト目
----------------------------------------------------------*/
Int32		STRING_DoubleMoji( unsigned char *lpStr);
Int32		STRING_DoubleMoji(const unsigned char *lpStr,Int32 adr);

Bool	STIRNG_ismbcdigit(Int32 c);


void	STRING_insert(Int32 ptr,char* lpStr,Int32 length,char *string,Int32 strlen);

/*------------------------------------------------------
		ポインタの示すデータが全角かどうか調べる

Bool	STRING_multiple(char *ptr);

　引数
	char*		文字列ポインタ
  戻り値
	Bool		1:全角　0:それ以外
------------------------------------------------------*/
Bool	STRING_multiple(char *ptr);


void	string_using0(Int32 us,char *str,Int32 value);
#endif

#ifndef _UNICODE

#define MOJI_KIND_JIS	0
#define MOJI_KIND_EUC	1

//		ShiftJIS を JIS または EUC に変換
Int32	STRING_SjisTo(unsigned long code,Int32 kind);

Int32		STRING_middle(char *string,char *str);
Int32		STRING_middle2(char *string,char *str);
Int32		STRING_middle( char *string,char st );
#endif




#endif	//__STRING_H__
//^^^^^^^^ CombineInclude string\string.h
//vvvvvvvv CombineInclude string\Probuff.h
//********************************************************************************************
/**
 * @file		Probuff.h
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2010/10/21(木) 18:14:12
 */
//********************************************************************************************

#ifndef	___INCLUDE_MHI_System_privatePROBUFF__H___	// 重複定義防止
#define	___INCLUDE_MHI_System_privatePROBUFF__H___	// 重複定義防止マクロ


#if 1//ndef _MASTER

/// セクションが存在するかどうかを得る.
Bool	PROBUFF_IsSection( const TCHAR *const _pBuff, const Int32 _iBuffLength, const TCHAR *const _pSec );
LPTSTR	PROBUFF_GetSection( const TCHAR *const _pBuff, const Int32 _iBuffLength, const TCHAR *const _pSec, Int32 *_pSecLength = NULL );

/// 設定ファイルから文字列を取得.
Int32	PROBUFF_GetString( LPCTSTR _pBuff, const Int32 _iLength, const TCHAR *const _pSec, const TCHAR *const _pKey, TCHAR *_pString, const Int32 _iStringLength, const TCHAR *const _pDefStr = NULL );
/// 設定ファイルから数値を取得(１６進数表記対応).
Int32	PROBUFF_GetInt( LPCTSTR _pBuff, const Int32 _iLength, const TCHAR *const _pSec, const TCHAR *const _pKey, const Int32 _iDefVal = 0 );
/// 設定ファイルから数値を取得.
Float32	PROBUFF_GetFloat( LPCTSTR _pBuff, const Int32 _iLength, const TCHAR *const _pSec, const TCHAR *const _pKey, const Float32 _fDefVal = 0.f );

/**************************************************************************//**
	@brief		連続した数値を配列に格納.
				"123,456,789" の文字列が _pVals[0] = 123, _pVals[1] = 456, _pVals[2] = 789 と格納される.
	@author		N.Takeda
	@date		2010/10/22(金) 14:11:16

	@param[in]		const TCHAR *const	_pSec	セクション名.
	@param[in]		const TCHAR *const	_pKey	キー名.
	@param[out]		TREG*				_pVals	受け取りポインタ.
	@param[in]		const Int32			_iSize	サイズ.

	@return		Int32	格納した個数
*//***************************************************************************/
template<typename TREG> Int32	PROBUFF_ToNumArray( LPCTSTR _pBuff, const Int32 _iLength, const TCHAR *const _pSec, const TCHAR *const _pKey, TREG *_pVals, const Int32 _iSize )
{
	const Int32	iTempMax = 8;	//!< 数値の最大桁数.
	Int32		ii = 0, jj = 0, iEntry = 0;
	TCHAR		*pValPtr = NULL, *pSecTop = NULL;
	TCHAR		sWork[ iTempMax ];
	TCHAR		sTemp[ 256 ];
	Bool		bFloat = FALSE;
	
	
	Int32	iStrLength = 0;
	iStrLength = PROBUFF_GetString( _pBuff, _iLength, _pSec, _pKey, sTemp, 256, NULL );
	if( 0 >= iStrLength )	return 0;
	
	pValPtr = sTemp;
	
	memset( (char*)_pVals, 0, _iSize * sizeof(TREG) );
	while( '\0' != *(pValPtr + ii)  )
	{
		jj = 0;
		bFloat = FALSE;
		while( ',' != *(pValPtr + ii) && '\0' != *(pValPtr + ii)  )
		{
			if( ' ' < *(pValPtr + ii) )
			{
				sWork[ jj++ ] = *(pValPtr + ii);
				if( '.' == *(pValPtr + ii) )	bFloat = TRUE;
			}
			ii++;
			T_ASSERTC( iTempMax > jj, TEXT("桁オーバー") );
			T_ASSERTC( 256 > ii, TEXT("領域オーバー") );
		}
		sWork[ jj ] = 0;
		if( ',' == *(pValPtr + ii) )	ii++;
		
		if( bFloat )
		{
			_pVals[ iEntry ] = static_cast<TREG>(STRING_atof( sWork ));
		}else{
			_pVals[ iEntry ] = static_cast<TREG>(STRING_atoi( sWork ));
		}
		iEntry++;
		
		T_ASSERTC( iEntry < _iSize, TEXT("サイズオーバー") );
	}
	return iEntry;
}


#else	//_MASTER

//! 設定ファイルから文字列を取得.
inline	Int32	PROBUFF_GetString( TCHAR *_pString, const Int32 _iStringLength, const TCHAR *const , const TCHAR *const , const TCHAR *const _pDefStr = NULL )
{
	strncpy( _pString, _pDefStr, _iStringLength-1 );
	return strlen( _pDefStr );
}

//! 設定ファイルから数値を取得(１６進数表記対応).
#define	PROBUFF_GetInt( _pSec, _pKey, _iDefVal )								( _fDefVal )
//! 設定ファイルから数値を取得.
#define	PROBUFF_GetFloat( _pSec, _pKey, _fDefVal )								( _fDefVal )

#endif	//_MASTER


#endif // ___INCLUDE_MHI_System_privatePROBUFF__H___ 重複定義防止

//^^^^^^^^ CombineInclude string\Probuff.h
//vvvvvvvv CombineInclude cul.h


/**************************************************************************//**
	@brief		値の減算.
	@author		N.Takeda
	@date		2010/10/19(火) 21:14:13

	@param[in,out]	T&				_Reg	変数.
	@param[in]		const T			_Val	減算値.
	@param[in]		const T _Min	_Min	最小値(省略すると0).

	@return		値の変化があった時 true
*//***************************************************************************/
template <class T>	T ValSub( T &_Reg, const T _Val, const T _Min = 0 )
{
	const	T	orgReg = _Reg;
	if( _Reg > _Min ){
		_Reg -= _Val;
		if( _Reg < _Min )	_Reg = _Min;
	}
	return (orgReg != _Reg);
}


/**************************************************************************//**
	@brief		値の加算.
	@author		N.Takeda
	@date		2010/10/19(火) 21:14:09

	@param[in,out]	T&		_Reg	変数.
	@param[in]		const T	_Val	加算値.
	@param[in]		const T	_Max	最大値.

	@return		値の変化があった時 true
*//***************************************************************************/
template <class T>	T ValAdd( T &_Reg, const T _Val, const T _Max )
{
	const	T	orgReg = _Reg;
	if( _Reg < _Max ){
		_Reg += _Val;
		if( _Reg >_Max )	_Reg = _Max;
	}
	return (orgReg != _Reg);
}

//^^^^^^^^ CombineInclude cul.h
//vvvvvvvv CombineInclude general\singleton.h
//********************************************************************************************
/**
 * @file		singleton.h
 * @brief		シングルトンクラス
		これを継承したクラスのインスタンスが、プログラム全体でただ１つしか存在しないことを保証し、
		そのインスタンスへの唯一のアクセス経路を提供する.
 * 
 * @author		N.Takeda
 * @date		2012/01/23(月) 12:01:35
 */
//********************************************************************************************

#ifndef	_SINGLETON_H_	// 重複定義防止
#define	_SINGLETON_H_	// 重複定義防止マクロ





#if 0
template<typename T> class Singleton
{
private:
	static T* s_pInstance;

public:
	/// -- 静的な取得関数。
	static T* GetInstance( )
	{
		if( s_pInstance == NULL )
		{
			s_pInstance = new T();
		}
		return s_pInstance;
	}

	static void DeleteInstance( );
	{
		delete s_pInstance;
	}

protected:
	Singleton()
	{
		/// -- NULL でない偽のアドレスを T と TSingleton<T> のポインタにキャストし、その差を取得します
		/// -- 多重継承を使用しない限り、iOffset は 0 です
		//
		static int iOffset 
				= ( reinterpret_cast<int>( reinterpret_cast<T*>(1) )
				-   reinterpret_cast<int>( reinterpret_cast<TSingleton*>(1) ) );

		/// -- this から T のアドレスを計算して s_pInstance を初期化します
		//
		s_pInstance = reinterpret_cast<T*>( reinterpret_cast<int>(this) + iOffset );
	}
	~Singleton()
	{
		s_pInstance = NULL;
	}
};
#endif





//********************************************************************************************
/**
 * @class		Singleton

	class CMyClass : public Singleton<CMyClass>
	のように継承させる

 * @brief		シングルトンクラス.
 * @author		N.Takeda
 * @date		2012/01/23(月) 12:02:53
 */
//********************************************************************************************
template<typename T> class Singleton
{
public:
	/// 唯一のアクセス経路
	static T	*GetInstance()
	{
		static T	instance;	///< 唯一のインスタンス
		return &instance;
	}
};





#if 0

//#define	NO_COPY

//********************************************************************************************
/**
 * @class		Singleton
 * @brief		シングルトンクラス.
 * @author		N.Takeda
 * @date		2012/01/23(月) 12:02:53
 */
//********************************************************************************************
class Singleton
{
public:
	/// 唯一のアクセス経路
	static Singleton	*GetInstance()
	{
		static Singleton	instance;	///< 唯一のインスタンス
		return &instance;
	}
	
protected:
	/// 生成やコピーを禁止する
	Singleton(){}
	Singleton( const Singleton& rhs );
#ifdef NO_COPY
	Singleton& operator=( const Singleton& rhs );
#endif
};


//********************************************************************************************
/**
 * @class		SingletonD
 * @brief		生成、破棄を任意に行うシングルトンクラス.
 * @author		N.Takeda
 * @date		2012/01/24(火) 16:07:52
 */
//********************************************************************************************
class SingletonD
{
	static SingletonD	*m_pInstance;	///< 唯一のインスタンス
public:
	/// 唯一のアクセス経路
	static SingletonD	*GetInstance()
	{
		if( !m_pInstance )	return CreateInstance();
		return m_pInstance;
	}
	/// 生成.
	static SingletonD	*CreateInstance()
	{
		T_ASSERT( !m_pInstance );
		m_pInstance = new SingletonD();
		return m_pInstance;
	}
	
	/// 破棄.
	static void	*DeleteInstance()
	{
		T_ASSERT( NULL != m_pInstance );
		if( m_pInstance )
		{
			delete m_pInstance;
			m_pInstance = NULL;
		}
	}
	
protected:
	/// 生成やコピーを禁止する
	SingletonD(){}
	SingletonD( const SingletonD& rhs );
#ifdef NO_COPY
	SingletonD& operator=( const SingletonD& rhs );
#endif
};
#endif


#endif // _SINGLETON_H_ 重複定義防止
//^^^^^^^^ CombineInclude general\singleton.h
//vvvvvvvv CombineInclude general\math.h
//********************************************************************************************
/**
 * @file		math.h
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2012/01/17(火) 11:55:13
 */
//********************************************************************************************

#ifndef	_MATH_H_	// 重複定義防止
#define	_MATH_H_	// 重複定義防止マクロ

//vvvvvvvv CombineInclude ..\types.h
//	already Included. types.h
//^^^^^^^^ CombineInclude ..\types.h

//********************************************************************************************
/**
 * @class		math
 * @brief		
 * @author		N.Takeda
 * @date		2012/01/17(火) 11:59:27
 */
//********************************************************************************************
class math
{
public:
	static	Float32	PI;
	static	Float32	PI2;
	static	Float32	PIh;
	
	static	Float32	ToDeg( const Float32 _fRadAngle ){	return _fRadAngle * 180.f / PI;	}
	static	Float32	ToRad( const Float32 _fDegAngle ){	return _fDegAngle * PI / 180.f;	}

	static	Float32	sin( const Float32 _fValue );
	static	Float32	cos( const Float32 _fValue );
	static	Float32	asin( const Float32 _fValue );
	static	Float32	acos( const Float32 _fValue );
	static	Float32	tan( const Float32 _fValue );
	static	Float32	atan( const Float32 _fValue );
	
	static	Float32	sqrt( const Float32 _fValue );
	static	Float32	pow( const Float32 _fValue, const Float32 _fPow );
	static	UInt32	pow( const UInt32 _fValue, const UInt32 _fPow );

	static	Float32	abs( const Float32 _fValue );
	static	Int32	abs( const Int32 _iValue );

	static	Float32	DiffAngle( Float32 &_fRadA, Float32 &_fRadB );
	
};

#endif // _MATH_H_ 重複定義防止

//^^^^^^^^ CombineInclude general\math.h

#ifdef	_STOOLS_H
//vvvvvvvv CombineInclude graphics\graphics.h
//********************************************************************************************
/**
 * @file		graphics.h
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2012/01/25(水) 21:22:13
 */
//********************************************************************************************

#ifndef	_GRAPHICS_GRAPHICS_H_	// 重複定義防止
#define	_GRAPHICS_GRAPHICS_H_	// 重複定義防止マクロ

//vvvvvvvv CombineInclude common.h
//	not found. graphics\common.h
//^^^^^^^^ CombineInclude common.h


//#define	DIRECTX_VER	(9)	///< DirectXバージョン.


#if defined( PLATFORM_WIN32 )
#if (DIRECTX_VER == 8)
# include <d3dx8math.h>
#elif (DIRECTX_VER == 9)
# include <d3dx9math.h>
#endif
#endif

//vvvvvvvv CombineInclude ..\general\vector.h
//********************************************************************************************
/**
 * @file		vector.h
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2012/08/06(月) 16:42:15
 */
//********************************************************************************************

#ifndef	_GENERAL_VECTOR_H_	// 重複定義防止
#define	_GENERAL_VECTOR_H_	// 重複定義防止マクロ

/**
 * @note	N.Takeda
 * Vector関連.
 */
#define OBJPOS_DIRECTACCESS

/// 2軸vector.
#define	objPos	Vector2
//vvvvvvvv CombineInclude objPos.h
//********************************************************************************************
/**
 * @file		objPos.h
 * @brief		軸管理クラス.
	
		位置、ベクトル、２軸、３軸の汎用.
 * 
 * @author		N.Takeda
 * @date		2012/01/12(木) 14:32:09
 */
//********************************************************************************************

// 重複定義防止はしない


#ifndef	DEFAULT_W
# define	DEFAULT_W	(1.f)
#endif

#ifdef OBJPOS_USE_Z
# define	PARAMROT	objPos
#else
# define	PARAMROT	Float32
#endif


#define		VEC_ZERO	objPos(0,0)


/// DirToRot  平面(_xx,-_zz) 6時=0度、反時計回り(-PI〜PI)
#define	_DIRTOROT( _xx, _zz )	\
		if( _zz == 0.f )	fAngle = ( _xx > 0.f ) ? math::PIh : -math::PIh;\
		else{\
			if( _xx == 0.f )	fAngle = ( _zz > 0.f ) ? 0.f : math::PI;\
			else{\
				fAngle = math::atan( _xx / _zz );\
				if( _zz < 0.f )	fAngle += ( _xx > 0.f ) ? math::PI : -math::PI;\
			}}
//		if( fAngle > math::PI )	fAngle -= math::PI2

#if 0	//12時=0度、時計回りver
#define	_DIRTOROT( _xx, _zz )	\
		if( _zz == 0.f )	fAngle = ( _xx > 0.f ) ? math::PI * .5f : math::PI * 1.5f;\
		else{\
			if( _xx == 0.f )	fAngle = ( _zz > 0.f ) ? math::PI : 0.f;\
			else{\
				fAngle = math::atan( _xx / _zz );\
				if( _zz > 0.f )	fAngle = math::PI - fAngle;\
				else{\
					if( _xx > 0.f )	fAngle *= -1.f;\
					else			fAngle = (math::PI * 2.f) - fAngle;\
				}\
			}\
		}\
		if( fAngle > math::PI )	fAngle -= 2.f * math::PI
#endif


class objPos;

//********************************************************************************************
/**
 * @class		objPos
 * @brief		位置、ベクトル情報.
 *				コメントの座標系は左手座標系(xを平面横(正が右)、zを平面縦(正が上)、yを高さ(正が上)と見立てたものです).
 * @author		N.Takeda
 * @date		2012/01/10(火) 11:27:23
 */
//********************************************************************************************
class objPos
{

public:
	/// ------- setters ---------
#ifdef OBJPOS_USE_Z
	void	SetZ( const Float32 _z ){	z = _z;	}
#endif
	void	SetY( const Float32 _y ){	y = _y;	}
	void	SetX( const Float32 _x ){	x = _x;	}
	
	/// ------- getters ---------
#ifdef OBJPOS_USE_Z
	Float32	GetZ() const {	return z;	}
#endif
	Float32	GetY() const {	return y;	}
	Float32	GetX() const {	return x;	}


#ifndef OBJPOS_DIRECTACCESS
private:
#endif
	Float32		x;
	Float32		y;
#ifdef OBJPOS_USE_Z
	Float32		z;
	Float32		w;
#endif

public:
	//********************************************************************************************
	/**
	 * @brief		コンストラクタ.
	 * @author		N.Takeda
	 * @date		2012/01/17(火) 10:28:46
	 */
	//********************************************************************************************
	objPos()
	 : x( 0.f )
	 , y( 0.f )
#ifdef OBJPOS_USE_Z
	 , z( 0.f )
	 , w( DEFAULT_W )
#endif
	{}
	//********************************************************************************************
	/**
	 * @brief		コンストラクタ.
	 * @author		N.Takeda
	 * @date		2012/01/17(火) 10:28:41
	 *
	 * @param[in]	const Float32	_x	.
	 * @param[in]	const Float32	_y	.
	 * @param[in]	const Float32	_z	(省略すると0.f).
	 */
	//********************************************************************************************
	objPos( const Float32 _x, const Float32 _y, const Float32 _z = 0.f )
	 : x( _x )
	 , y( _y )
#ifdef OBJPOS_USE_Z
	 , z( _z )
	 , w( DEFAULT_W )
#endif
	{}
	
	
	//********************************************************************************************
	/**
	 * @brief		方向ベクトルを角に変換(Vec2の時、Y軸に角がセットされる).
	 * @author		N.Takeda
	 * @date		2012/01/17(火) 10:21:08
	 *
	 * @return		objPos/Float32	ラジアン角.
	 */
	//********************************************************************************************
	objPos	DirToRot()
	{
		if( *this == 0.f )	return VEC_ZERO;
		
		Float32		fAngle;
		objPos		cRot;
		
#ifdef OBJPOS_USE_Z
		objPos		tmp;
#if defined( PLATFORM_WIN32 )
		D3DXMATRIX	matrix;
		
		_DIRTOROT( x, z );
		cRot.SetY( fAngle );
		
		D3DXVec4Transform( (D3DXVECTOR4*)&tmp, (D3DXVECTOR4*)this, D3DXMatrixRotationY( &matrix, -fAngle ) );
#endif
		_DIRTOROT( -tmp.GetY(), tmp.GetZ() );
		cRot.SetX( fAngle );
		
		cRot.SetZ( 0.f );
#else
		_DIRTOROT( x, y );
		cRot.SetY( fAngle );
		
		cRot.SetX( 0.f );
#endif
	//	*this = cRot;
		return cRot;
	}
#if 0
	Vector3 rot;
	if (AQL_FLOAT_IS_ZERO(getZ())) {
		rot.setY( (getX() > 0.f)? math::PI * 0.5f : -math::PI * 0.5f );
	} else {
		rot.setY( atan2(getX(), getZ()) );
	}
	Matrix4 matrix = Matrix4::create::rotationY(-rot.getY());
	Vector3 tmp = this->getTransform(matrix);
	if (AQL_FLOAT_IS_ZERO(tmp.getZ())) {
		rot.setX( -((tmp.getY() > 0.f)? math::PI * 0.5f : -math::PI * 0.5f));
	} else {
		rot.setX( -atan2(tmp.getY(), tmp.getZ()));
	}
	rot.setZ(0.f);
	*this = rot;
#endif
	
	//********************************************************************************************
	/**
	 * @brief		角度から指定距離のベクトルに変換(Vec2の時、Y軸に角をセットする).
	 * @author		N.Takeda
	 * @date		2012/02/01(水) 13:29:45
	 *
	 * @param[in]	const Float32	_fLength	長さ.
	 *
	 * @return		objPos	
	 */
	//********************************************************************************************
	objPos	RotToDir( const Float32 _fLength = 1.f )
	{
#ifdef OBJPOS_USE_Z
		objPos		cDir( 0.f, 0.f, _fLength );
#if defined( PLATFORM_WIN32 )
		D3DXMATRIX	matrix;
		
		D3DXVec4Transform( (D3DXVECTOR4*)&cDir, (D3DXVECTOR4*)&cDir, D3DXMatrixRotationX( &matrix, x ) );
		D3DXVec4Transform( (D3DXVECTOR4*)&cDir, (D3DXVECTOR4*)&cDir, D3DXMatrixRotationY( &matrix, y ) );
#endif
		*this = cDir;
		return cDir;
#else
		objPos		cDir( math::sin( y ) * _fLength, math::cos( y ) * _fLength );
		return cDir;
#endif
	}
	
	//********************************************************************************************
	/**
	 * @brief		相対角度に変換(2つの角を足して2で割ると中間値になるようにする).
	 				各角に対してDiffAngleをかける. 自身と指定した角が修正される.
	 * @author		N.Takeda
	 * @date		2011/12/13(火) 17:54:33
	 *
	 * @param[in,out]	aql::Vector3&	_cRadB	角.
	 */
	//********************************************************************************************
	void	RelativeAngle( objPos &_cRadB )
	{
		Float32	fVal;
		
		fVal = _cRadB.GetX();
		math::DiffAngle( x, fVal );
		_cRadB.SetX( fVal );
		
		fVal = _cRadB.GetY();
		math::DiffAngle( y, fVal );
		_cRadB.SetY( fVal );
#ifdef OBJPOS_USE_Z
		fVal = _cRadB.GetZ();
		math::DiffAngle( z, fVal );
		_cRadB.SetZ( fVal );
#endif
	}
	
	//********************************************************************************************
	/**
	 * @brief		指定位置からの方向ベクトルを得る.
	 * @author		N.Takeda
	 * @date		2012/02/01(水) 15:35:33
	 *
	 * @param[in]	const objPos&	_cPos	位置.
	 *
	 * @return		objPos	
	 */
	//********************************************************************************************
	objPos	GetDirection( const objPos &_cPos ) const
	{
		return *this - _cPos;
	}
	
	//********************************************************************************************
	/**
	 * @brief		指定ポイントを中心として回転させる.
	 * @author		N.Takeda
	 * @date		2012/01/16(月) 13:18:20
	 *
	 * @param[in]	const objPos&	_cPos	位置.
	 * @param[in]	const objPos	_cPos	原点(省略するとobjPos(0,0)).
	 *
	 * @return		なし (none)
	 */
	//********************************************************************************************
	void	Rotation( const objPos &_cRot, const objPos _cPos = objPos(0,0) )
	{
		objPos	cDir = GetDirection( _cPos );
		Float32	fLength = cDir.Length();
		objPos	cRot = cDir.DirToRot() + _cRot;
		*this = cRot.RotToDir( fLength );
	}
	
	//********************************************************************************************
	/**
	 * @brief		現在位置から移動先位置へ指定距離だけ近づける(通り過ぎない).
	 * @author		N.Takeda
	 * @date		2012/02/01(水) 15:58:08
	 *
	 * @param[in]	const objPos&	_cPos		移動先位置.
	 * @param[in]	const Float32	_fLangth	移動距離(省略すると1.f).
	 *
	 * @return		Bool	位置が同一になったら true.
	 */
	//********************************************************************************************
	Bool	Near( const objPos &_cPos, const Float32 _fLangth = 1.f )
	{
		objPos	cOrgDir = _cPos.GetDirection( *this );
		objPos	cDir = cOrgDir.DirToRot().RotToDir( _fLangth );	///< 距離のみ変更.
		
		/// 追い越し補正.
		if( math::abs(cDir.GetX()) > math::abs(cOrgDir.GetX()) )	cDir.SetX( cOrgDir.GetX() );
		if( math::abs(cDir.GetY()) > math::abs(cOrgDir.GetY()) )	cDir.SetY( cOrgDir.GetY() );
#ifdef OBJPOS_USE_Z
		if( math::abs(cDir.GetZ()) > math::abs(cOrgDir.GetZ()) )	cDir.SetZ( cOrgDir.GetZ() );
#endif
		*this += cDir;
		return (*this == cDir);
	}
	
	//********************************************************************************************
	/**
	 * @brief		現在角から指定角へ指定角だけ近づける(行き過ぎない).
	 * @author		N.Takeda
	 * @date		2012/02/07(火) 21:08:12
	 *
	 * @param[in]	const objPos&		_cRot	指定角.
	 * @param[in]	const Float32		_fAng	ラジアン角(省略すると1度).
	 *
	 * @return		Bool	角が同一になったら true.
	 */
	//********************************************************************************************
	Bool	Turn( const objPos &_cRot, const Float32 _fAng = math::ToRad(1) )
	{
		Float32		rot, fSa, fAng = _fAng;
		
		rot = _cRot.GetY();
		fSa = math::DiffAngle( rot, y );
		if( fAng > math::abs(fSa) )	fAng = math::abs(fSa);
		y += (0.f < fSa) ? fAng : -fAng;
		
#ifdef OBJPOS_USE_Z
		rot = _cRot.GetX();
		fSa = math::DiffAngle( rot, x );
		if( fAng > math::abs(fSa) )	fAng = math::abs(fSa);
		x += (0.f < fSa) ? fAng : -fAng;
#endif
		
		return (*this == _cRot);
	}
	
	/// 指定位置情報と自身との距離を得る.
	Float32	Length( const objPos &_cPos = objPos(0,0) ) const
	{
		objPos	cDir = GetDirection( _cPos );
		Float32	rr = math::sqrt( cDir.x * cDir.x + cDir.y * cDir.y );
#ifdef OBJPOS_USE_Z
		return math::sqrt( rr * rr + cDir.z * cDir.z );
#else
		return rr;
#endif
	}
	
	
	/// クリア.
	void	Clear()
	{
#ifdef OBJPOS_USE_Z
		w = DEFAULT_W;
		z = 
#endif
		x = y = 0.f;
	}
	
	/// オペレーター群.
	const objPos	operator+( const objPos &_pos ) const
	{
		objPos	cRes;
		cRes.x = x + _pos.x;
		cRes.y = y + _pos.y;
#ifdef OBJPOS_USE_Z
		cRes.z = z + _pos.z;
#endif
		return cRes;
	}
	const objPos	operator+=( const objPos &_pos )
	{
		x += _pos.x;
		y += _pos.y;
#ifdef OBJPOS_USE_Z
		z += _pos.z;
#endif
		return *this;
	}
	const objPos	operator-( const objPos &_pos ) const
	{
		objPos	cRes;
		cRes.x = x - _pos.x;
		cRes.y = y - _pos.y;
#ifdef OBJPOS_USE_Z
		cRes.z = z - _pos.z;
#endif
		return cRes;
	}
	const objPos	operator-=( const objPos &_pos )
	{
		x -= _pos.x;
		y -= _pos.y;
#ifdef OBJPOS_USE_Z
		z -= _pos.z;
#endif
		return *this;
	}
	const objPos	operator*( const objPos &_pos ) const
	{
		objPos	cRes;
		cRes.x = x * _pos.x;
		cRes.y = y * _pos.y;
#ifdef OBJPOS_USE_Z
		cRes.z = z * _pos.z;
#endif
		return cRes;
	}
	const objPos	operator*=( const objPos &_pos )
	{
		x *= _pos.x;
		y *= _pos.y;
#ifdef OBJPOS_USE_Z
		z *= _pos.z;
#endif
		return *this;
	}
	const objPos	operator/( const objPos &_pos ) const
	{
		objPos	cRes;
		cRes.x = x / _pos.x;
		cRes.y = y / _pos.y;
#ifdef OBJPOS_USE_Z
		cRes.z = z / _pos.z;
#endif
		return cRes;
	}
	const objPos	operator/=( const objPos &_pos )
	{
		x /= _pos.x;
		y /= _pos.y;
#ifdef OBJPOS_USE_Z
		z /= _pos.z;
#endif
		return *this;
	}
	
	/// 比較  if ( a == b ).
	bool	operator ==( const objPos &_pos )
	{
#ifdef OBJPOS_USE_Z
		return ( x == _pos.x && y == _pos.y && z == _pos.z );
#else
		return ( x == _pos.x && y == _pos.y );
#endif
	}
	/// 比較  if ( a != b ).
	bool	operator !=( const objPos &_pos )
	{
#ifdef OBJPOS_USE_Z
		return ( x != _pos.x || y != _pos.y || z != _pos.z );
#else
		return ( x != _pos.x || y != _pos.y );
#endif
	}
	
	/// 比較  if ( a == b ).
	bool	operator ==( const Float32 _fParam )
	{
#ifdef OBJPOS_USE_Z
		return ( x == _fParam && y == _fParam && z == _fParam );
#else
		return ( x == _fParam && y == _fParam );
#endif
	}
	/// 比較  if ( a != b ).
	bool	operator !=( const Float32 _fParam )
	{
#ifdef OBJPOS_USE_Z
		return ( x != _fParam || y != _fParam || z != _fParam );
#else
		return ( x != _fParam || y != _fParam );
#endif
	}
	
	
	/// 特殊.
#ifdef OBJPOS_USE_Z
	/// (x,z)をVector2にセットして返す.
	Vector2	Get2()
	{
		Vector2	cVec2( x, z );
		return cVec2;
	}
#endif
	
};

#undef	_DIRTOROT
#undef	PARAMROT
#undef	DEFAULT_W

//^^^^^^^^ CombineInclude objPos.h
#undef	objPos

#ifdef DIRECTX_VER
/// 3軸vector.
#define	objPos	Vector3
#define	OBJPOS_USE_Z
//vvvvvvvv CombineInclude objPos.h
//********************************************************************************************
/**
 * @file		objPos.h
 * @brief		軸管理クラス.
	
		位置、ベクトル、２軸、３軸の汎用.
 * 
 * @author		N.Takeda
 * @date		2012/01/12(木) 14:32:09
 */
//********************************************************************************************

// 重複定義防止はしない


#ifndef	DEFAULT_W
# define	DEFAULT_W	(1.f)
#endif

#ifdef OBJPOS_USE_Z
# define	PARAMROT	objPos
#else
# define	PARAMROT	Float32
#endif


#define		VEC_ZERO	objPos(0,0)


/// DirToRot  平面(_xx,-_zz) 6時=0度、反時計回り(-PI〜PI)
#define	_DIRTOROT( _xx, _zz )	\
		if( _zz == 0.f )	fAngle = ( _xx > 0.f ) ? math::PIh : -math::PIh;\
		else{\
			if( _xx == 0.f )	fAngle = ( _zz > 0.f ) ? 0.f : math::PI;\
			else{\
				fAngle = math::atan( _xx / _zz );\
				if( _zz < 0.f )	fAngle += ( _xx > 0.f ) ? math::PI : -math::PI;\
			}}
//		if( fAngle > math::PI )	fAngle -= math::PI2

#if 0	//12時=0度、時計回りver
#define	_DIRTOROT( _xx, _zz )	\
		if( _zz == 0.f )	fAngle = ( _xx > 0.f ) ? math::PI * .5f : math::PI * 1.5f;\
		else{\
			if( _xx == 0.f )	fAngle = ( _zz > 0.f ) ? math::PI : 0.f;\
			else{\
				fAngle = math::atan( _xx / _zz );\
				if( _zz > 0.f )	fAngle = math::PI - fAngle;\
				else{\
					if( _xx > 0.f )	fAngle *= -1.f;\
					else			fAngle = (math::PI * 2.f) - fAngle;\
				}\
			}\
		}\
		if( fAngle > math::PI )	fAngle -= 2.f * math::PI
#endif


class objPos;

//********************************************************************************************
/**
 * @class		objPos
 * @brief		位置、ベクトル情報.
 *				コメントの座標系は左手座標系(xを平面横(正が右)、zを平面縦(正が上)、yを高さ(正が上)と見立てたものです).
 * @author		N.Takeda
 * @date		2012/01/10(火) 11:27:23
 */
//********************************************************************************************
class objPos
{

public:
	/// ------- setters ---------
#ifdef OBJPOS_USE_Z
	void	SetZ( const Float32 _z ){	z = _z;	}
#endif
	void	SetY( const Float32 _y ){	y = _y;	}
	void	SetX( const Float32 _x ){	x = _x;	}
	
	/// ------- getters ---------
#ifdef OBJPOS_USE_Z
	Float32	GetZ() const {	return z;	}
#endif
	Float32	GetY() const {	return y;	}
	Float32	GetX() const {	return x;	}


#ifndef OBJPOS_DIRECTACCESS
private:
#endif
	Float32		x;
	Float32		y;
#ifdef OBJPOS_USE_Z
	Float32		z;
	Float32		w;
#endif

public:
	//********************************************************************************************
	/**
	 * @brief		コンストラクタ.
	 * @author		N.Takeda
	 * @date		2012/01/17(火) 10:28:46
	 */
	//********************************************************************************************
	objPos()
	 : x( 0.f )
	 , y( 0.f )
#ifdef OBJPOS_USE_Z
	 , z( 0.f )
	 , w( DEFAULT_W )
#endif
	{}
	//********************************************************************************************
	/**
	 * @brief		コンストラクタ.
	 * @author		N.Takeda
	 * @date		2012/01/17(火) 10:28:41
	 *
	 * @param[in]	const Float32	_x	.
	 * @param[in]	const Float32	_y	.
	 * @param[in]	const Float32	_z	(省略すると0.f).
	 */
	//********************************************************************************************
	objPos( const Float32 _x, const Float32 _y, const Float32 _z = 0.f )
	 : x( _x )
	 , y( _y )
#ifdef OBJPOS_USE_Z
	 , z( _z )
	 , w( DEFAULT_W )
#endif
	{}
	
	
	//********************************************************************************************
	/**
	 * @brief		方向ベクトルを角に変換(Vec2の時、Y軸に角がセットされる).
	 * @author		N.Takeda
	 * @date		2012/01/17(火) 10:21:08
	 *
	 * @return		objPos/Float32	ラジアン角.
	 */
	//********************************************************************************************
	objPos	DirToRot()
	{
		if( *this == 0.f )	return VEC_ZERO;
		
		Float32		fAngle;
		objPos		cRot;
		
#ifdef OBJPOS_USE_Z
		objPos		tmp;
#if defined( PLATFORM_WIN32 )
		D3DXMATRIX	matrix;
		
		_DIRTOROT( x, z );
		cRot.SetY( fAngle );
		
		D3DXVec4Transform( (D3DXVECTOR4*)&tmp, (D3DXVECTOR4*)this, D3DXMatrixRotationY( &matrix, -fAngle ) );
#endif
		_DIRTOROT( -tmp.GetY(), tmp.GetZ() );
		cRot.SetX( fAngle );
		
		cRot.SetZ( 0.f );
#else
		_DIRTOROT( x, y );
		cRot.SetY( fAngle );
		
		cRot.SetX( 0.f );
#endif
	//	*this = cRot;
		return cRot;
	}
#if 0
	Vector3 rot;
	if (AQL_FLOAT_IS_ZERO(getZ())) {
		rot.setY( (getX() > 0.f)? math::PI * 0.5f : -math::PI * 0.5f );
	} else {
		rot.setY( atan2(getX(), getZ()) );
	}
	Matrix4 matrix = Matrix4::create::rotationY(-rot.getY());
	Vector3 tmp = this->getTransform(matrix);
	if (AQL_FLOAT_IS_ZERO(tmp.getZ())) {
		rot.setX( -((tmp.getY() > 0.f)? math::PI * 0.5f : -math::PI * 0.5f));
	} else {
		rot.setX( -atan2(tmp.getY(), tmp.getZ()));
	}
	rot.setZ(0.f);
	*this = rot;
#endif
	
	//********************************************************************************************
	/**
	 * @brief		角度から指定距離のベクトルに変換(Vec2の時、Y軸に角をセットする).
	 * @author		N.Takeda
	 * @date		2012/02/01(水) 13:29:45
	 *
	 * @param[in]	const Float32	_fLength	長さ.
	 *
	 * @return		objPos	
	 */
	//********************************************************************************************
	objPos	RotToDir( const Float32 _fLength = 1.f )
	{
#ifdef OBJPOS_USE_Z
		objPos		cDir( 0.f, 0.f, _fLength );
#if defined( PLATFORM_WIN32 )
		D3DXMATRIX	matrix;
		
		D3DXVec4Transform( (D3DXVECTOR4*)&cDir, (D3DXVECTOR4*)&cDir, D3DXMatrixRotationX( &matrix, x ) );
		D3DXVec4Transform( (D3DXVECTOR4*)&cDir, (D3DXVECTOR4*)&cDir, D3DXMatrixRotationY( &matrix, y ) );
#endif
		*this = cDir;
		return cDir;
#else
		objPos		cDir( math::sin( y ) * _fLength, math::cos( y ) * _fLength );
		return cDir;
#endif
	}
	
	//********************************************************************************************
	/**
	 * @brief		相対角度に変換(2つの角を足して2で割ると中間値になるようにする).
	 				各角に対してDiffAngleをかける. 自身と指定した角が修正される.
	 * @author		N.Takeda
	 * @date		2011/12/13(火) 17:54:33
	 *
	 * @param[in,out]	aql::Vector3&	_cRadB	角.
	 */
	//********************************************************************************************
	void	RelativeAngle( objPos &_cRadB )
	{
		Float32	fVal;
		
		fVal = _cRadB.GetX();
		math::DiffAngle( x, fVal );
		_cRadB.SetX( fVal );
		
		fVal = _cRadB.GetY();
		math::DiffAngle( y, fVal );
		_cRadB.SetY( fVal );
#ifdef OBJPOS_USE_Z
		fVal = _cRadB.GetZ();
		math::DiffAngle( z, fVal );
		_cRadB.SetZ( fVal );
#endif
	}
	
	//********************************************************************************************
	/**
	 * @brief		指定位置からの方向ベクトルを得る.
	 * @author		N.Takeda
	 * @date		2012/02/01(水) 15:35:33
	 *
	 * @param[in]	const objPos&	_cPos	位置.
	 *
	 * @return		objPos	
	 */
	//********************************************************************************************
	objPos	GetDirection( const objPos &_cPos ) const
	{
		return *this - _cPos;
	}
	
	//********************************************************************************************
	/**
	 * @brief		指定ポイントを中心として回転させる.
	 * @author		N.Takeda
	 * @date		2012/01/16(月) 13:18:20
	 *
	 * @param[in]	const objPos&	_cPos	位置.
	 * @param[in]	const objPos	_cPos	原点(省略するとobjPos(0,0)).
	 *
	 * @return		なし (none)
	 */
	//********************************************************************************************
	void	Rotation( const objPos &_cRot, const objPos _cPos = objPos(0,0) )
	{
		objPos	cDir = GetDirection( _cPos );
		Float32	fLength = cDir.Length();
		objPos	cRot = cDir.DirToRot() + _cRot;
		*this = cRot.RotToDir( fLength );
	}
	
	//********************************************************************************************
	/**
	 * @brief		現在位置から移動先位置へ指定距離だけ近づける(通り過ぎない).
	 * @author		N.Takeda
	 * @date		2012/02/01(水) 15:58:08
	 *
	 * @param[in]	const objPos&	_cPos		移動先位置.
	 * @param[in]	const Float32	_fLangth	移動距離(省略すると1.f).
	 *
	 * @return		Bool	位置が同一になったら true.
	 */
	//********************************************************************************************
	Bool	Near( const objPos &_cPos, const Float32 _fLangth = 1.f )
	{
		objPos	cOrgDir = _cPos.GetDirection( *this );
		objPos	cDir = cOrgDir.DirToRot().RotToDir( _fLangth );	///< 距離のみ変更.
		
		/// 追い越し補正.
		if( math::abs(cDir.GetX()) > math::abs(cOrgDir.GetX()) )	cDir.SetX( cOrgDir.GetX() );
		if( math::abs(cDir.GetY()) > math::abs(cOrgDir.GetY()) )	cDir.SetY( cOrgDir.GetY() );
#ifdef OBJPOS_USE_Z
		if( math::abs(cDir.GetZ()) > math::abs(cOrgDir.GetZ()) )	cDir.SetZ( cOrgDir.GetZ() );
#endif
		*this += cDir;
		return (*this == cDir);
	}
	
	//********************************************************************************************
	/**
	 * @brief		現在角から指定角へ指定角だけ近づける(行き過ぎない).
	 * @author		N.Takeda
	 * @date		2012/02/07(火) 21:08:12
	 *
	 * @param[in]	const objPos&		_cRot	指定角.
	 * @param[in]	const Float32		_fAng	ラジアン角(省略すると1度).
	 *
	 * @return		Bool	角が同一になったら true.
	 */
	//********************************************************************************************
	Bool	Turn( const objPos &_cRot, const Float32 _fAng = math::ToRad(1) )
	{
		Float32		rot, fSa, fAng = _fAng;
		
		rot = _cRot.GetY();
		fSa = math::DiffAngle( rot, y );
		if( fAng > math::abs(fSa) )	fAng = math::abs(fSa);
		y += (0.f < fSa) ? fAng : -fAng;
		
#ifdef OBJPOS_USE_Z
		rot = _cRot.GetX();
		fSa = math::DiffAngle( rot, x );
		if( fAng > math::abs(fSa) )	fAng = math::abs(fSa);
		x += (0.f < fSa) ? fAng : -fAng;
#endif
		
		return (*this == _cRot);
	}
	
	/// 指定位置情報と自身との距離を得る.
	Float32	Length( const objPos &_cPos = objPos(0,0) ) const
	{
		objPos	cDir = GetDirection( _cPos );
		Float32	rr = math::sqrt( cDir.x * cDir.x + cDir.y * cDir.y );
#ifdef OBJPOS_USE_Z
		return math::sqrt( rr * rr + cDir.z * cDir.z );
#else
		return rr;
#endif
	}
	
	
	/// クリア.
	void	Clear()
	{
#ifdef OBJPOS_USE_Z
		w = DEFAULT_W;
		z = 
#endif
		x = y = 0.f;
	}
	
	/// オペレーター群.
	const objPos	operator+( const objPos &_pos ) const
	{
		objPos	cRes;
		cRes.x = x + _pos.x;
		cRes.y = y + _pos.y;
#ifdef OBJPOS_USE_Z
		cRes.z = z + _pos.z;
#endif
		return cRes;
	}
	const objPos	operator+=( const objPos &_pos )
	{
		x += _pos.x;
		y += _pos.y;
#ifdef OBJPOS_USE_Z
		z += _pos.z;
#endif
		return *this;
	}
	const objPos	operator-( const objPos &_pos ) const
	{
		objPos	cRes;
		cRes.x = x - _pos.x;
		cRes.y = y - _pos.y;
#ifdef OBJPOS_USE_Z
		cRes.z = z - _pos.z;
#endif
		return cRes;
	}
	const objPos	operator-=( const objPos &_pos )
	{
		x -= _pos.x;
		y -= _pos.y;
#ifdef OBJPOS_USE_Z
		z -= _pos.z;
#endif
		return *this;
	}
	const objPos	operator*( const objPos &_pos ) const
	{
		objPos	cRes;
		cRes.x = x * _pos.x;
		cRes.y = y * _pos.y;
#ifdef OBJPOS_USE_Z
		cRes.z = z * _pos.z;
#endif
		return cRes;
	}
	const objPos	operator*=( const objPos &_pos )
	{
		x *= _pos.x;
		y *= _pos.y;
#ifdef OBJPOS_USE_Z
		z *= _pos.z;
#endif
		return *this;
	}
	const objPos	operator/( const objPos &_pos ) const
	{
		objPos	cRes;
		cRes.x = x / _pos.x;
		cRes.y = y / _pos.y;
#ifdef OBJPOS_USE_Z
		cRes.z = z / _pos.z;
#endif
		return cRes;
	}
	const objPos	operator/=( const objPos &_pos )
	{
		x /= _pos.x;
		y /= _pos.y;
#ifdef OBJPOS_USE_Z
		z /= _pos.z;
#endif
		return *this;
	}
	
	/// 比較  if ( a == b ).
	bool	operator ==( const objPos &_pos )
	{
#ifdef OBJPOS_USE_Z
		return ( x == _pos.x && y == _pos.y && z == _pos.z );
#else
		return ( x == _pos.x && y == _pos.y );
#endif
	}
	/// 比較  if ( a != b ).
	bool	operator !=( const objPos &_pos )
	{
#ifdef OBJPOS_USE_Z
		return ( x != _pos.x || y != _pos.y || z != _pos.z );
#else
		return ( x != _pos.x || y != _pos.y );
#endif
	}
	
	/// 比較  if ( a == b ).
	bool	operator ==( const Float32 _fParam )
	{
#ifdef OBJPOS_USE_Z
		return ( x == _fParam && y == _fParam && z == _fParam );
#else
		return ( x == _fParam && y == _fParam );
#endif
	}
	/// 比較  if ( a != b ).
	bool	operator !=( const Float32 _fParam )
	{
#ifdef OBJPOS_USE_Z
		return ( x != _fParam || y != _fParam || z != _fParam );
#else
		return ( x != _fParam || y != _fParam );
#endif
	}
	
	
	/// 特殊.
#ifdef OBJPOS_USE_Z
	/// (x,z)をVector2にセットして返す.
	Vector2	Get2()
	{
		Vector2	cVec2( x, z );
		return cVec2;
	}
#endif
	
};

#undef	_DIRTOROT
#undef	PARAMROT
#undef	DEFAULT_W

//^^^^^^^^ CombineInclude objPos.h
#undef	OBJPOS_USE_Z
#undef	objPos
#endif

/// 互換用の生objPos.
//#include "objPos.h"



#endif // _GENERAL_VECTOR_H_ 重複定義防止
//^^^^^^^^ CombineInclude ..\general\vector.h

#if defined( PLATFORM_WIN32 )
//vvvvvvvv CombineInclude win32\graphic.h
//********************************************************************************************
/**
 * @file		graphics.h
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2012/01/23(月) 11:44:43
 */
//********************************************************************************************

#ifndef	_GRAPHICS_WIN32_GRAPHIC_H_	// 重複定義防止
#define	_GRAPHICS_WIN32_GRAPHIC_H_	// 重複定義防止マクロ
#ifdef DIRECTX_VER

//vvvvvvvv CombineInclude common.h
//	not found. graphics\win32\common.h
//^^^^^^^^ CombineInclude common.h


#if (DIRECTX_VER == 8)
# include <d3d8.h>
# include <d3dx8.h>
# include <d3dx8core.h>

# define LPDIRECT3D_			LPDIRECT3D8
# define LPDIRECT3DDEVICE_		LPDIRECT3DDEVICE8
# define LPDIRECT3DTEXTURE_		LPDIRECT3DTEXTURE8

#elif (DIRECTX_VER == 9)
# include <d3d9.h>
# include <d3dx9.h>
# include <d3dx9core.h>
# include <d3dx9math.h>

# define LPDIRECT3D_			LPDIRECT3D9
# define LPDIRECT3DDEVICE_		LPDIRECT3DDEVICE9
# define LPDIRECT3DTEXTURE_		LPDIRECT3DTEXTURE9

#endif


/// デバッグ用テキスト表示の有効設定.
#ifdef T_MASTER
#else	// T_MASTER
# define	USE_DEBUG_TEXTSCREEN										//!< フルスクリーンテスト中で一時停止
#endif	// not T_MASTER


//********************************************************************************************
/**
 * @class		T_COLOR
 * @brief		基本的なカラータイプの定義.
 * @author		N.Takeda
 * @date		2012/01/26(木) 10:22:41
 */
//********************************************************************************************
class T_COLOR
{
	UInt8		m_uB;
	UInt8		m_uG;
	UInt8		m_uR;
	UInt8		m_uA;
//	D3DCOLOR	相当
	
public:
	/// ------- setters ---------
	void	SetB( const UInt8 _uB ){	m_uB = _uB;	}
	void	SetG( const UInt8 _uG ){	m_uG = _uG;	}
	void	SetR( const UInt8 _uR ){	m_uR = _uR;	}
	void	SetA( const UInt8 _uA ){	m_uA = _uA;	}
	void	SetRGBA( const UInt8 _r, const UInt8 _g, const UInt8 _b, const UInt8 _a ){	m_uA = _a;	m_uR = _r;	m_uG = _g;	m_uB = _b;	}
	void	SetRGB( const UInt8 _r, const UInt8 _g, const UInt8 _b ){	m_uR = _r;	m_uG = _g;	m_uB = _b;	}
	/// ------- getters ---------
	UInt8	GetB() const {	return m_uB;	}
	UInt8	GetG() const {	return m_uG;	}
	UInt8	GetR() const {	return m_uR;	}
	UInt8	GetA() const {	return m_uA;	}
	
	T_COLOR( const UInt8 _r, const UInt8 _g, const UInt8 _b, const UInt8 _a )	{	m_uA = _a;	m_uR = _r;	m_uG = _g;	m_uB = _b;	}
	T_COLOR( const UInt8 _r, const UInt8 _g, const UInt8 _b )					{	m_uA = 255;	m_uR = _r;	m_uG = _g;	m_uB = _b;	}
	T_COLOR(){	m_uA = m_uR = m_uG = m_uB = 0;	}
	
	/// プラットフォーム依存の型を取得.
	const D3DCOLOR	GetNative() const {	return *((D3DCOLOR*)this);	}
};


//********************************************************************************************
/**
 * @class		GRAPHICS
 * @brief		
 * @author		N.Takeda
 * @date		2012/01/23(月) 12:00:04
 */
//********************************************************************************************
class GRAPHICS : public Singleton<GRAPHICS>
{
public:
	/// 情報構造体.
	struct SETUP
	{
		WINDOW_INFO		*m_pWinInfo;		///< ウィンドウ情報.
		void			(*m_pDrawFunc)();	///< 描画拡張関数.
		T_COLOR			m_cBackColor;		///< 背景色.
		
		SETUP()
		 : m_pWinInfo( NULL )		///< ウィンドウ情報.
		 , m_pDrawFunc( NULL )
		 , m_cBackColor( 255,255,255 )
		{
			
		}
	};
	
private:
	LPDIRECT3D_				m_pD3D;
	LPDIRECT3DDEVICE_		m_pD3DDevice;
	D3DPRESENT_PARAMETERS	m_d3dppApp;									//!< D3DDeviceの設定(現在)
	
	D3DPRESENT_PARAMETERS	m_d3dppWindow;								//!< D3DDeviceの設定(ウインドウ・モード用)
	D3DPRESENT_PARAMETERS	m_d3dppFull;								//!< D3DDeviceの設定(フルスクリーン・モード用)
	
	Bool					m_bDeviceLost;								//!< デバイスの消失フラグ.
	
	LPD3DXSPRITE			m_pSprite;
	LPD3DXLINE				m_pLine;
	
	SETUP					m_stSetup;
	
#ifdef	USE_DEBUG_TEXTSCREEN
	LPD3DXFONT				m_pDebugFont;
#endif
	
public:
	
	/// ------- setters ---------
	void				SetDeviceLost( const Bool _bDeviceLost ){	m_bDeviceLost = _bDeviceLost;	}
//	void				SetDrawFunc( void (m_pDrawFunc)() _pFunc ){	m_pDrawFunc = _pFunc;	}
	
	/// ------- getters ---------
	Bool				GetDeviceLost() const {	return m_bDeviceLost;	}
#ifdef	USE_DEBUG_TEXTSCREEN
	LPD3DXFONT			GetDebugFont() const {	return m_pDebugFont;	}
#else
	LPD3DXFONT			GetDebugFont() const {	return NULL;	}
#endif
	LPD3DXLINE			&GetLine(){	return m_pLine;	}
	LPD3DXSPRITE		&GetSprite(){	return m_pSprite;	}
	LPDIRECT3DDEVICE_	&GetD3DDevice(){	return m_pD3DDevice;	}
	LPDIRECT3D_			&GetD3D(){	return m_pD3D;	}
	
	D3DPRESENT_PARAMETERS	&GetD3dppApp(){	return m_d3dppApp;	}
	D3DPRESENT_PARAMETERS	&GetD3dppWindow(){	return m_d3dppWindow;	}
	D3DPRESENT_PARAMETERS	&GetD3dppFull(){	return m_d3dppFull;	}
	
	/// 初期化.
	Bool	Init( const SETUP &_stSetup );
#ifdef T_DEBUG
	void	LogDeviceErr( const HRESULT _hr );
#else
	void	LogDeviceErr( const HRESULT ){}
#endif	// T_DEBUG
	
	/// 破棄.
	void	Destroy();
	
	/// 描画.
	Bool	Draw();
	
	//! 画面モードの変更.
	Bool	ChangeDisplayMode();
	//! ウィンドウサイズ変更.
	Bool	ChangeWindowSize( const Int32 _iWidth, const Int32 _iHeight );
	//! ビューポートのセット.
	Bool	SetViewport();
	//! 消失したデバイスの復元処理.
	Bool	RestoreDevice();
	
	
	void	ChangeWindowRestore();
	void	ChangeWindowRelease();
	Int32	m_iReleaseCount;
	
	
	/*!
	 * 主にデバッグ用.
	 */
	/// 線の描画.
	Bool	DrawLine( const Int32 _x1, const Int32 _y1, const Int32 _x2, const Int32 _y2, const T_COLOR &_cCol, const Int32 _iWidth = 0 );
	Bool	DrawLine( const Vector2 _v1, const Vector2 _v2, const T_COLOR &_cCol, const Int32 _iWidth = 0 ){
		return	DrawLine( static_cast<Int32>(_v1.x), static_cast<Int32>(_v1.y), static_cast<Int32>(_v2.x), static_cast<Int32>(_v2.y), _cCol, _iWidth );
	}
	
	/// 四角の描画.
	Bool	DrawBox( const Int32 _x1, const Int32 _y1, const Int32 _x2, const Int32 _y2, const T_COLOR &_cCol, const Int32 _iWidth = 0 );
	Bool	DrawBoxC( const Int32 _x, const Int32 _y, const Int32 _w, const Int32 _h, const T_COLOR &_cCol, const Int32 _iWidth = 0 ){
		return DrawBox( _x-_w/2, _y-_h/2, _x+_w/2, _y+_h/2, _cCol, _iWidth );
	}
	Bool	DrawBox( const Vector2 _v1, const Vector2 _v2, const T_COLOR &_cCol, const Int32 _iWidth = 0 ){
		return DrawBox( static_cast<Int32>(_v1.x), static_cast<Int32>(_v1.y), static_cast<Int32>(_v2.x), static_cast<Int32>(_v2.y), _cCol, _iWidth );
	}
	Bool	DrawBoxC( const Vector2 _v1, const Vector2 _v2, const T_COLOR &_cCol, const Int32 _iWidth = 0 ){
		return DrawBoxC( static_cast<Int32>(_v1.x), static_cast<Int32>(_v1.y), static_cast<Int32>(_v2.x), static_cast<Int32>(_v2.y), _cCol, _iWidth );
	}
	
	/// 塗りつぶし四角の描画.
	Bool	DrawBoxFull( const Int32 _x1, const Int32 _y1, const Int32 _x2, const Int32 _y2, const T_COLOR &_cCol );
	Bool	DrawBoxFullC( const Int32 _x, const Int32 _y, const Int32 _w, const Int32 _h, const T_COLOR &_cCol ){
		return DrawBoxFull( _x-_w/2, _y-_h/2, _x+_w/2, _y+_h/2, _cCol );
	}
	Bool	DrawBoxFull( const Vector2 _v1, const Vector2 _v2, const T_COLOR &_cCol ){
		return DrawBoxFull( static_cast<Int32>(_v1.x), static_cast<Int32>(_v1.y), static_cast<Int32>(_v2.x), static_cast<Int32>(_v2.y), _cCol );
	}
	Bool	DrawBoxFullC( const Vector2 _v1, const Vector2 _v2, const T_COLOR &_cCol ){
		return DrawBoxFullC( static_cast<Int32>(_v1.x), static_cast<Int32>(_v1.y), static_cast<Int32>(_v2.x), static_cast<Int32>(_v2.y), _cCol );
	}
	
	/// 円(楕円)の描画.
	Bool	DrawCircle( const Int32 _x, const Int32 _y, const Float32 _w, const Float32 _h, const Int32 _r, const T_COLOR &_cCol );
	Bool	DrawCircle( const Vector2 _v, const Vector2 _wh, const Int32 _r, const T_COLOR &_cCol ){
		return DrawCircle( static_cast<Int32>(_v.x), static_cast<Int32>(_v.y), _wh.x, _wh.y, _r, _cCol );
	}
	Bool	DrawCircle( const Int32 _x, const Int32 _y, const Int32 _r, const T_COLOR &_cCol ){
		return DrawCircle( _x, _y, 1.f, 1.f, _r, _cCol );
	}
	Bool	DrawCircle( const Vector2 _v, const Int32 _r, const T_COLOR &_cCol ){
		const Vector2 wh( 1.f, 1.f );
		return DrawCircle( _v, wh, _r, _cCol );
	}
	
	/// 塗りつぶし円(楕円)の描画.
	Bool	DrawCircleFull( const Int32 _x, const Int32 _y, const Float32 _w, const Float32 _h, const Int32 _r, const T_COLOR &_cCol );
	Bool	DrawCircleFull( const Vector2 _v, const Vector2 _wh, const Int32 _r, const T_COLOR &_cCol ){
		return DrawCircleFull( static_cast<Int32>(_v.x), static_cast<Int32>(_v.y), _wh.x, _wh.y, _r, _cCol );
	}
	Bool	DrawCircleFull( const Int32 _x, const Int32 _y, const Int32 _r, const T_COLOR &_cCol ){
		return DrawCircleFull( _x, _y, 1.f, 1.f, _r, _cCol );
	}
	Bool	DrawCircleFull( const Vector2 _v, const Int32 _r, const T_COLOR &_cCol ){
		const Vector2 wh( 1.f, 1.f );
		return DrawCircleFull( _v, wh, _r, _cCol );
	}
	
	//! テキスト描画.
	Bool	GRAPHICS::Text( const Int32 _x, const Int32 _y, LPCTSTR _pStr, const T_COLOR &_cCol );
	Bool	GRAPHICS::Text( const Int32 _x, const Int32 _y, LPCTSTR _pStr ){
		const T_COLOR	cCol( 0, 0, 0 );
		return Text( _x, _y, _pStr, cCol );
	}
	
	
	/// コンストラクタ.
	GRAPHICS();
	/// デストラクタ.
	/*virtual*/ ~GRAPHICS();
};



//vvvvvvvv CombineInclude debugScreen.h
//********************************************************************************************
/**
 * @file		debugScreen.h
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2010/10/29(金) 14:57:20
 */
//********************************************************************************************

#ifndef	_GRAPHICS_WIN32_DEBUGSCREEN_H_	// 重複定義防止
#define	_GRAPHICS_WIN32_DEBUGSCREEN_H_	// 重複定義防止マクロ

#ifndef	_MASTER

//vvvvvvvv CombineInclude ..\debugTextBuff.h
//********************************************************************************************
/**
 * @file		debugTextBuff.h
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2012/02/02(木) 15:54:32
 */
//********************************************************************************************

#ifndef	_GRAPHICS_DEBUGTEXTBUFF_H_	// 重複定義防止
#define	_GRAPHICS_DEBUGTEXTBUFF_H_	// 重複定義防止マクロ


//********************************************************************************************
/**
 * @class		CTraceBuffer
 * @brief		ログ表示.
				文字列を送るとバッファに追加され、容量を超えた分は古いものから行単位で削除される.
				仮想関数群を適切なもので上書きして使う.
 * @author		N.Takeda
 * @date		2010/10/29(金) 21:29:23
 */
//********************************************************************************************
class CTraceBuffer
{
	enum{	enBuffMax = 1024 * 8	};	///< 未初期化でTraceが呼ばれた時にこの値でバッファを確保する.
	
	LPTSTR		m_pBuff;				///< 
	UInt32		m_uBuffMax;				///< 
	
	/// 表示関連,
	Int32		m_iScreenX;				///< 画面座標X.
	Int32		m_iScreenY;				///< 画面座標Y.
	Int32		m_iScreenHeight;		///< 高さ(文字数).
	Int32		m_iScreenPosY;			///< 表示開始行.
	Bool		m_bDisp;				///< 描画フラグ.
	
	/**
	 * 仮想関数群.
	 */
private:
	//********************************************************************************************
	/**
	 * @brief		文字描画. 画面に文字を描画する処理で上書きして下さい.
	 * @author		N.Takeda
	 * @date		2010/11/01(月) 11:48:48
	 *
	 * @param[in]	const Int32	_iX		X座標(pixel).
	 * @param[in]	const Int32	_iY		Y座標(pixel).
	 * @param[in]	const Int32	_iCol	色(未使用).
	 * @param[in]	const Char*	_pPtr	文字列ポインタ.
	 *
	 * @return		Bool	TRUE:成 / FALSE:否
	 */
	//********************************************************************************************
	virtual	Bool	screenPrint( const Int32 _iX, const Int32 _iY, const Int32 _iCol, LPCTSTR _pPtr ){	return FALSE;	}


private:
	/// PtrLastの取得
	LPCTSTR	getPtrLast( const Int32 _iLine );

	/// StringLastの取得
	Bool	getStringLast( const Int32 _iLine, LPTSTR _pPtr, const Int32 _iBuffSize = 0 );
	
public:
	/// ------- setters ---------
	inline	void	SetDisp( const Bool _bDisp ){	m_bDisp = _bDisp;	}
	void			SetScreenPosY( const Int32 _iScreenPosY );
	void			SetScreenPos( const Int32 _iScreenX, const Int32 _iScreenY, const Int32 _iScreenHeight ){m_iScreenX = _iScreenX;	m_iScreenY = _iScreenY;	m_iScreenHeight = _iScreenHeight;}
	/// ------- getters ---------
	inline	Bool	GetDisp() const {	return m_bDisp;	}
	Int32			GetScreenPosY() const {	return m_iScreenPosY;	}
	Int32			GetScreenHeight() const {	return m_iScreenHeight;	}
	Int32			GetScreenX() const {	return m_iScreenX;	}
	Int32			GetScreenY() const {	return m_iScreenY;	}
	
	/// 描画関数.
	void	Draw();
	
	/// 登録されている行数を取得.
	Int32	GetLines();
	
	/// 初期化
	void	Init( const UInt32 _iBuffMax );
	
	/// クリア
	void	Clear();
	
	/// Trace関数
	Int32	Trace( LPCTSTR _pString );
	
	
	/// バッファ先頭を取得(デバッグ用)
	LPTSTR	GetPtr(){	return m_pBuff;	}
	
	CTraceBuffer()
	 : m_pBuff( NULL )
	 , m_uBuffMax( 0 )
	 , m_iScreenX( 0 )					///< 画面座標X.
	 , m_iScreenY( 0 )					///< 画面座標Y.
	 , m_iScreenHeight( 10 )			///< 高さ(文字数).
	 , m_iScreenPosY( 0 )				///< 表示開始行.
	 , m_bDisp( TRUE )					///< 描画フラグ.
	{}
	
	~CTraceBuffer()
	{
		del_alloc( m_pBuff );
	}
};




//********************************************************************************************
/**
 * @class		CDaysDrapery
 * @brief		デバッグ用スクリーンクラスの基底.
				リクエストされる位置と文字列をストックしておき、描画処理で一括描画.
				仮想関数群を適切なもので上書きして使う.
 * @author		N.Takeda
 * @date		2010/10/29(金) 15:43:36
 */
//********************************************************************************************
class	CDaysDrapery
{
	/**
	 * 情報構造体( sizeof(StMIJIINFO) == 情報パケット長ではないので注意 ).
	 * 1パケットは m_Ptr を除いた StMIJIINFO サイズに文字列長を加えたもの,
	 */
	struct StMIJIINFO
	{
		Int16	m_iX;				///< X位置.
		Int16	m_iY;				///< Y位置.
		Int8	m_iCol;				///< 色.
		Int8	m_iDataLength;		///< データの長さ(Int32長).
		TCHAR	m_Ptr;				///< ここから m_iDataLength分 文字列が入る(ダミー定義でポインタではないので注意).
	};
	
public:
	/// 描画関数.
	void	Draw();

	/// 文字情報登録(直座標).
	Bool	PosPrint( const Int32 _iX, const Int32 _iY, const Int32 _iCol, LPCTSTR _pPtr );
	/// 文字情報登録(文字座標).
	Bool	LocPrint( const Int32 _iX, const Int32 _iY, const Int32 _iCol, LPCTSTR _pPtr );
#if 0
	/// 文字情報登録(3Dワールド座標).
	Bool	WorldPosPrint( const Vector3& pos, const Int32 _iCol, LPCTSTR _pPtr );
#endif

	/// ------- setters ---------
	inline	void	SetDisp( const Bool _bDisp ){	m_bDisp = _bDisp;	}
	/// ------- getters ---------
	inline	Bool	GetDisp() const {	return m_bDisp;	}
	
	CDaysDrapery( const Int32 _iBuffSize );
	virtual ~CDaysDrapery();
	
	
	/**
	 * 仮想関数群.
	 */
private:
	//********************************************************************************************
	/**
	 * @brief		文字描画. 画面に文字を描画する処理で上書きして下さい.
	 * @author		N.Takeda
	 * @date		2012/02/01(水) 18:22:03
	 *
	 * @param[in]	const Int32	_iX		X座標(pixel).
	 * @param[in]	const Int32	_iY		Y座標(pixel).
	 * @param[in]	const Int32	_iCol	色.
	 * @param[in]	const Char*	_pPtr	文字列ポインタ.
	 *
	 * @return		Bool	TRUE:成 / FALSE:否
	 */
	//********************************************************************************************
	virtual	Bool		screenPrint( const Int32 _iX, const Int32 _iY, const Int32 _iCol, LPCTSTR _pPtr ){	return FALSE;	}


private:
	LPCTSTR		m_pDataBuff;	///< データバッファ.
	LPTSTR		m_pDataPtr;	///< 次データの追加位置ポインタ(バッファの末尾).
	Bool		m_bDisp;		///< 描画フラグ.
	const Int32	m_iBuffSize;	///< バッファのサイズ.
	
	
	/// 登録されている文字列を表示.
	Int32		mojiPrints();
	
	
	/// m_pDataBuff取り扱い群.
	void			bufferClear();
	void			bufferAdd( const Int32 _iLength );
	StMIJIINFO*		bufferGetInfo(){	return reinterpret_cast<StMIJIINFO*>(m_pDataPtr);	}
	LPTSTR			bufferGetPtr(){	return m_pDataPtr;	}
	Bool			IsbufferOver( const Int32 _iLen ){	return( (m_pDataPtr + _iLen) > (m_pDataBuff + m_iBuffSize) );	}
	
};


#endif // _GRAPHICS_DEBUGTEXTBUFF_H_ 重複定義防止
//^^^^^^^^ CombineInclude ..\debugTextBuff.h

//********************************************************************************************
/**
 * @class		CDebugScreen
 * @brief		インスタンス管理、描画処理等の依存処理をラップしたクラス.
				初回使用時にインスタンスを自動作成する.
				
 * @author		N.Takeda
 * @date		2010/10/29(金) 16:23:07
 */
//********************************************************************************************
class	CDebugScreen : private CDaysDrapery, private CTraceBuffer
{
	enum{	enBuffSize = 2 * 640	};	///< 位置情報等を含んだ文字情報をストックするのに十分な容量を指定する(１画面に敷き詰められる量の倍とってみた).
	enum{	enTempBuffSize = 1024	};	///< print時の一時バッファのサイズ.
	
public:
	/// コンストラクタ(デバッグ用).
	CDebugScreen()
	 : CDaysDrapery( enBuffSize )
	{
		/// 初期化
		CTraceBuffer::Init( enBuffSize );
	}
	/// デストラクタ(デバッグ用).
	~CDebugScreen(){}
	
	/// インスタンスの作成(デバッグ用).
	static void CreateInstance()
	{
		if(m_pInstance){
			T_ASSERTC(0, TEXT("singleton の生成が複数試みられました") );
			return;
		}
		mem_new( CDebugScreen, m_pInstance );//CPL_NEW( DEBUGMEM_ALLOCATOR(), CDebugScreen );
	}

	/// インスタンスの削除(デバッグ用).
	static void DeleteInstance()
	{
		if(!m_pInstance){
			T_ASSERTC(0, TEXT("singleton の破棄が複数試みられました") );
			return;
		}
		del_new( m_pInstance );
	}

	/// インスタンス取得.
	static CDebugScreen*	GetInstance() { return m_pInstance; }
	
	//********************************************************************************************
	/**
	 * @brief		Draw関数.
	 * @author		N.Takeda
	 * @date		2010/10/29(金) 20:11:48
	 *
	 * @return		なし (none)
	 */
	//********************************************************************************************
	static void		Draw(){
		if( GetInstance() )
		{
			GetInstance()->CDaysDrapery::Draw();
			GetInstance()->CTraceBuffer::Draw();
		}
	}
	
	static void		SetDisp( const Bool _bDisp ){	if( GetInstance() )	GetInstance()->CDaysDrapery::SetDisp(_bDisp);	}
	static Bool		GetDisp(){	if( GetInstance() ){	return GetInstance()->CDaysDrapery::GetDisp();}else{	return 0;	}	}
	
	static void		SetScreenPosY( const Int32 _ScreenPosY ){	if( GetInstance() )	GetInstance()->CTraceBuffer::SetScreenPosY(_ScreenPosY);	}
	static Int32	GetScreenPosY(){	if( GetInstance() ){	return GetInstance()->CTraceBuffer::GetScreenPosY();}else{	return 0;	}	}
	/// Trace関数
	static void		Trace( LPCTSTR _pStr ){	if( GetInstance() )	GetInstance()->CTraceBuffer::Trace(_pStr);	}
	
	//********************************************************************************************
	/**
	 * @brief		Print関数.
	 * @author		N.Takeda
	 * @date		2010/10/29(金) 20:11:49
	 *
	 * @param[in]	const Int32	_iX			位置X.
	 * @param[in]	const Int32	_iY			位置Y.
	 * @param[in]	const Char*	_pFormat	フォーマット文字列.
	 * @param[in]	可変個の引数
	 *
	 * @return		Bool	TRUE:成 / FALSE:否
	 */
	//********************************************************************************************
	static Bool	Print( const Int32 _iX, const Int32 _iY, LPCTSTR _pFormat, ... )
	{
		TCHAR		sString[ enTempBuffSize ];
		va_list		VaList;

		va_start( VaList, _pFormat );
#if defined( PLATFORM_WIN32 )
		_vstprintf_s
#else
		vsprintf
#endif
		( sString, _pFormat, VaList );
		va_end( VaList );

		if( !GetInstance() )	CreateInstance();
		GetInstance()->PosPrint( _iX, _iY, 0, sString );
		return TRUE;
	}
	
#if 0
	//********************************************************************************************
	/**
	 * @brief		3D座標で文字列描画.
	 * @author		N.Takeda
	 * @date		2012/02/02(木) 16:25:49
	 *
	 * @param[in]	const Vector3&	pos			.
	 * @param[in]	const Char*		_pFormat	フォーマット.
	 * @param[in]	可変個の引数
	 *
	 * @return		Bool	TRUE:成 / FALSE:否
	 */
	//********************************************************************************************
	static Bool	Print3D( const Vector3& pos, const Char* _pFormat, ... )
	{
		Char		aString[ enTempBuffSize ];
		va_list		VaList;

		va_start( VaList, _pFormat );
		vsprintf( aString, _pFormat, VaList );
		va_end( VaList );

		if( !GetInstance() )	CreateInstance();
		return GetInstance()->WorldPosPrint( pos, 0, aString );
	}
#endif
	
private:
	/// 画面に文字を描画する処理の実装部分.
	virtual	Bool	screenPrint( const Int32 _iX, const Int32 _iY, const Int32 _iCol, LPCTSTR _pPtr );
	
	///シングルトンインスタンス
	static	CDebugScreen	*m_pInstance;
	
};

#else

/// MASTER時.

class	CDebugScreen
{
public:
	static Bool	Print( const Int32 , const Int32 , const Char* , ... ){	return FALSE;	}
	
};

#endif	// _MASTER

#endif // _GRAPHICS_WIN32_DEBUGSCREEN_H_ 重複定義防止
//^^^^^^^^ CombineInclude debugScreen.h


#endif
#endif // _GRAPHICS_WIN32_GRAPHIC_H_ 重複定義防止
//^^^^^^^^ CombineInclude win32\graphic.h
#elif defined( PLATFORM_PSP )
//vvvvvvvv CombineInclude PSP\graphic.h
//	already Included. graphic.h
//^^^^^^^^ CombineInclude PSP\graphic.h
#endif

#endif // _GRAPHICS_GRAPHICS_H_ 重複定義防止
//^^^^^^^^ CombineInclude graphics\graphics.h	//!< stools.h にGraphic関連が必要ない場合はこの行を削除してCombineする
//vvvvvvvv CombineInclude string\csv.h
//********************************************************************************************
/**
 * @file		csv.h
 * @brief		要約説明
	
		バッファ内に読み込んである csv データに対して取得を行う.
		csvは','区切り.
 * 
 * @author		N.Takeda
 * @date		2011/12/01(木) 12:23:07
 */
//********************************************************************************************

//! CSVシートから指定セルの文字列を取得.
Int32	CSV_GetCell( LPCTSTR _pBuff, const Int32 _iSize, const Int32 _iR, const Int32 _iC, LPTSTR _pReceiptBuff, const Int32 _iReceiptSize );

/// CSV_GetData関数.
LPTSTR	CSV_GetData( LPCTSTR _pBuff, const Int32 _iSize, const Int32 _iR, const Int32 _iC );

/// カラム文字列取得.
Int32	CSV_GetString( LPCTSTR _pBuff, LPTSTR _pReceiptBuff, const Int32 _iReceiptSize );
//^^^^^^^^ CombineInclude string\csv.h
//vvvvvvvv CombineInclude press\cmp.h
//********************************************************************************************
/*!
 * @file		cmp.h
 * @brief		データ圧縮、解凍　関連
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2013/06/03(月) 16:11:28
 */
//********************************************************************************************

#ifndef	_PRESS_CMP_H_	// 重複定義防止
#define	_PRESS_CMP_H_	// 重複定義防止マクロ

//vvvvvvvv CombineInclude unPress.h
//********************************************************************************************
/*!
 * @file		unPress.h
 * @brief		GDA解凍クラス.
	
		Cps_dec.cpp を C++に書き換え、内部メモリ確保などを最適化したもの.
		内部に展開バッファを持つので全体で１つ作成しておくと良い.
		非同期展開を並列で行う場合はそれぞれに持たせる.
		
		展開速度を最大に設定した時、49Kbのバッファを固定で持つ.
		展開速度を最小に設定した時、18Kbのバッファを固定で持つ.
		非同期展開で速度を必要としない場合は最小のバッファで運用しても良い.
 * 
 * @author		N.Takeda
 * @date		2013/05/31(金) 12:28:49
 */
//********************************************************************************************

#ifndef	_PRESS_UNPRESS_H_	// 重複定義防止
#define	_PRESS_UNPRESS_H_	// 重複定義防止マクロ


#include <setjmp.h> /* jmp_buf,setjmp,longjmp */

//#define UNSOLID_MEMORY	//!< 有効にすると内部でメモリを確保. 足りないと自動的に容量を減らす. 無効だと最大値固定.


//********************************************************************************************
/*!
 * @class		CUnPress
 * @brief		GDA解凍クラス.
 * @author		N.Takeda
 * @date		2013/05/30(木) 20:24:16
 */
//********************************************************************************************
class CUnPress
{
public:
	//! ステータス.
	enum EnState
	{
		enStateStanby,
		enStateUnPress,
		enStateUpdate,
		enStateMax,
	};
private:
	enum{	enPTblSize		= 256	};
	enum{	enCTblSize		= 4096	};
	enum{	enClenSize		= 512	};	//!< 必要なのは 510byte.
	enum{	enPlenSize		= 20	};	//!< 必要なのは 19byte.
	enum{	enWaightSize	= 2038	};
	enum{	enDataBufSize	= 15	};	//!< 10〜15. 大きいほど展開早い. 15の時32Kb. 13の時8Kb. 10の時1Kb. ※現在13以下だと動作しない.
	
	const UInt8	*m_pGdaBuff;
	UInt8		*m_pExpandPtr;
	EnState		m_eState;
	
	
	//! 以下の固定バッファは 計17Kb.
	UInt16		m_uCTable[ enCTblSize ];
	UInt16		m_uPTable[ enPTblSize ];
	UInt16		m_uLeft [ enWaightSize ];
	UInt16		m_uRight[ enWaightSize ];
	UInt8		m_uClen [ enClenSize ];
	UInt8		m_uPlen [ enPlenSize ];
#ifdef UNSOLID_MEMORY
#else
	UInt8		m_uDataBuf[ 1UL << enDataBufSize ];	//!< データバッファ 
#endif
	
	UInt16		m_uMax;
	
	UInt16		m_uUpCnt;
	UInt16		m_uBitBuf2;		//!< ビットバッファ 
	UInt16		m_uBitBuf2S;	//!< ビットバッファ・サイズ 
	UInt16		m_uBlockSize;	//!< ブロック・サイズ
	UInt8		*m_pDataBuf;	//!< データバッファ 

	UInt8		*m_pMemPtr;
	UInt32		m_uMemL;
	UInt32		m_uMemLength;
	Int32		m_uEndFlag; 	//!< 終了フラグ 
	jmp_buf		m_CpsEnv; 		//!< 環境退避変数 



	Int16		m_uBit8; 			//!< １バイト計数(0〜CHAR_BIT) 
	UInt16		m_uBitBuf;		//!< ビットバッファ 
	UInt16		m_uDicsize;		//!< 辞書サイズ 2^dicbit 
	Int16		m_iRemains;		//!< 残り:signedでなければならない
	UInt16		m_uParentN;		//!< 親ノード数 NP  
	UInt16		m_uChildN;			//!< 子ノード数 NC 
	
	
	UInt8	*uncompress_int( Char *_pMem, const UInt32 _uLength );
	void	uncompress_end( void );
	UInt32	uncompress( void _pFnc(void) );
	
	void	huf_decode_int( void );
	void	bitbuf_full( Int16 _iN );
	void	getbit_int( void );	//!< ビット入力初期化関数
	UInt16	getbit( const Int16 _iN );
	void	read_p_len( const Int16 _iNN, const Int16 _iNBit, const Int16 _iIs );
	void	read_c_len( void );
	UInt16	decode_c( void );
	UInt16	decode_p( void );
	void decode_table( Int16 _iNchar, UInt8 _pBitLen[], Int16 _iTableBits, UInt16 _pTable[] );
	
	void	memory_get1( const UInt16 _iN );
	
public:
	//! ------- setters ---------
	//! ------- getters ---------
	EnState	GetState() const {	return m_eState;	}
	
	bool	UnPress( const Char* const _pGdaBuff, const UInt32 _uLength, Char *_pExpandBuff );
	bool	Update();
	
	CUnPress();
};




#endif // _PRESS_UNPRESS_H_ 重複定義防止
//^^^^^^^^ CombineInclude unPress.h

#define	CANZ_NUMID				(UInt32)'ZNAC'			//!< CANZ

//#define	CANZ_CODE_LENGTH		(39)


//! ファイル名格納形式.
enum EnCanzType
{
	enCanzTypeString,
	enCanzTypeIndex,
	enCanzTypeCRC,
	enCanzTypeSerial,
	enCanzTypeMax,
};

//! CANZパックヘッダー構造.
typedef struct
{
	Char			m_sId[ 4 ];					//!< 4    ID "CANZ"
	UInt8			pad01;						//!< 1    ダミーデータ
	UInt8			m_uType;					//!< 1  6 アーカイブタイプ
	UInt16			m_uHeaderSize;				//!< 2    ヘッダーサイズ. ダミーデータ等含む
	UInt16			m_uEntry;					//!< 2 10 エントリ
	UInt8			m_uBPow;					//!< 1    ブロックデータ長(pow)
	UInt8			m_uSPow;					//!< 1 12 サイズデータ(pow)
} CANZ_HEADER;


#if 0
//##############################################
//		ヘッダー構造体　全64byte
//##############################################
#ifndef USE_OLD_PATOL
typedef struct
{
	char			id[3];						// 3	ID
	UInt8			type;						// 1	アーカイブタイプ			0:ファイル名制　1:エントリ制
	unsigned char	code[CANZ_CODE_LENGTH];		//39	ファイル名暗号化コード		文字コードから' 'を引いた値が入る
	UInt8			dmy;						// 1	ダミーデータ
	UInt16			bpow;						// 2	ブロックデータ長(pow)
	UInt16			spow;						// 2	サイズデータpow
	UInt16			entry;						// 2	エントリ
	UInt16			head_size;					// 2	ヘッダーサイズ	UInt32単位 ダミーデータ等含む
	UInt32			dm[4];						// 16	未使用
//	UInt8			length;						// 1	１データのヘッダー長
}CHAIN_INFO_HEADER00;

typedef struct
{
	char			id[3];						// 3	ID
	UInt8			type;						// 1	アーカイブタイプ
	UInt8			bpow;						// 1	ブロックデータ長(pow)
	UInt8			spow;						// 1	サイズデータpow
	UInt16			entry;						// 2	エントリ
}CHAIN_INFO_HEADER01;
#else
/*struct CHAIN_INFO_HEADER00
{
	char			id[3];						// 3	ID
	UInt8			type;						// 1	アーカイブタイプ			0:ファイル名制　1:エントリ制
	unsigned char	code[CANZ_CODE_LENGTH];		//39	ファイル名暗号化コード		文字コードから' 'を引いた値が入る
	UInt8			dmy;						// 1	ダミーデータ
	UInt16			bpow;						// 2	ブロックデータ長(pow)
	UInt16			spow;						// 2	サイズデータpow
	UInt16			entry;						// 2	エントリ
	UInt16			head_size;					// 2	ヘッダーサイズ	UInt32単位 ダミーデータ等含む
	UInt32			dm[4];						// 16	未使用
//	UInt8			length;						// 1	１データのヘッダー長
};

struct CHAIN_INFO_HEADER01
{
	char			id[3];						// 3	ID
	UInt8			type;						// 1	アーカイブタイプ
	UInt8			bpow;						// 1	ブロックデータ長(pow)
	UInt8			spow;						// 1	サイズデータpow
	UInt16			entry;						// 2	エントリ
};*/
#endif
#endif

//##############################################
//		ファイル情報構造体
//##############################################
typedef struct
{
	UInt16			m_uOffset;		//!< データオフセット.
	UInt16			m_uSize;		//!< ファイル長.
} CHAIN_FILEINFO;

#if 0
typedef struct
{
	unsigned char	name[11];		// ファイル名	通常
	UInt8			atr;			// 属性
	UInt16			offset;			// データオフセット
	UInt16			size;			// ファイル長
} CHAIN_INFO_FILES00;


typedef struct
{
	UInt16			offset;			// データオフセット
	UInt16			size;			// ファイル長
} CHAIN_INFO_FILES01;
#endif


typedef struct
{
	UInt32			m_uCrcName;		//!< ファイル名.
	CHAIN_FILEINFO	m_stFilesInfo;
} CHAIN_INFO_FILES_CRC;

typedef struct
{
	UInt32			m_uSize;		//!< ファイル長.
} CHAIN_INFO_FILES_SERIAL;




/*----------------------------------------------------------
----------------------------------------------------------*/
Bool	CANZ_MEM_Open( Char **_ppPtr, LPCTSTR _pName );


/*----------------------------------------------------------
----------------------------------------------------------*/
int		CANZ_getentry(char *name);

Bool	CANZ_getfilename(char *name,char *arc,int index);


UInt32	CANZ_MEM_TargetRead( Char **_ppData, LPCTSTR _pArc, LPCTSTR _pName );
UInt32	CANZ_MEM_Read( Char **_ppData, Char *_pHeaderInfo, LPCTSTR _pName );
UInt32	CANZ_MEM_Expand( Char **_ppData, Char *_pArcBuf, LPCTSTR _pName );


UInt32	CANZ_GetSize( Char *_pArcBuf, const Int32 _iIndex );
UInt32	CANZ_Expand( Char *_pData, Char *_pArcBuf, const Int32 _iIndex );
UInt32	CANZ_Expand( CUnPress *_pUnPress, Char *_pData, Char *_pArcBuf, const Int32 _iIndex );

UInt32	CANZ_GetSize( Char *_pArcBuf, LPCTSTR _pName );
UInt32	CANZ_Expand( Char *_pData, Char *_pArcBuf, LPCTSTR _pName );
UInt32	CANZ_Expand( CUnPress *_pUnPress, Char *_pData, Char *_pArcBuf, LPCTSTR _pName );




/*----------------------------------------------------------
	指定ファイル名のデータをＧＤＡ形式で圧縮

Bool	COMP_GDA1(char *szName,char *path,unsigned long *dget,unsigned long *dput);

　引数
	char*			圧縮するファイルのファイル名
	char*			出力する圧縮ファイル名
	unsigned long*	展開に必要なデータ長が返る
	unsigned long*	圧縮されたデータ長が返る
　戻り値
	Bool			True:成功　False 失敗
----------------------------------------------------------*/
Bool	COMP_GDA1(char *szName,char *path,unsigned long *dget,unsigned long *dput);

/*	備考
	ＧＤＡ１　GDA Ver 1
	
	UInt32
		[IDcode][ORGsize][GDAsize][Code]････････
		IDcode		'G','D','A',1
		ORGsize		展開に必要なデータ長
		GDAsize		圧縮されたデータ長
		Code		圧縮コード、終端コードはなし
*/


/*----------------------------------------------------------
	バッファ内のデータをＧＤＡ形式で圧縮

Bool	COMP_GDA1mem(unsigned char *brgb,unsigned char *buffer,unsigned long *dget,unsigned long *dput);

　引数
	unsigned char*	圧縮するデータバッファ
	unsigned char*	出力するバッファ
	unsigned long*	展開に必要なデータ長が返る	呼び出し時に元データ長
	unsigned long*	圧縮されたデータ長が返る
　戻り値
	Bool			True:成功　False 失敗
----------------------------------------------------------*/
Bool	COMP_GDA1mem( unsigned char *brgb, unsigned char *gbuf, UInt32 *_pDget, UInt32 *_pDput );


/*----------------------------------------------------------
	メモリ上の ＧＤＡ Ver1 データを解凍

DWOD	EXPA_GDA1(char **mem_gda,char **mem_put);

　引数
	char**	ＧＤＡデータの格納されたバッファポインタ
	char**	解凍したデータを格納する char*
　戻り値
	UInt32		解凍されたデータの容量　エラー時:0
----------------------------------------------------------*/
UInt32	EXPA_GDA1(char **mem_gda,char **mem_put);

/*	備考

　展開バッファはこの関数内で確保されるので、事前に確保の必要はない。

*/




/*----------------------------------------------------------
	ファイル名で指定したファイルをＧＤＡに圧縮

Bool	ENCODE_GDA(char *szName,FILE *gda,unsigned long *dget,unsigned long *dput);

　引数
	char*		圧縮するファイルの名前
	FILE*		圧縮データを出力するストリーム
	u_long*		圧縮前のデータ長
	u_long*		圧縮したデータ長
　戻り値
	Bool		True:成功　False 失敗
----------------------------------------------------------*/
Bool	ENCODE_GDA(char *szName,FILE *gda,unsigned long *dget,unsigned long *dput);

/*	備考

*/

Bool	ENCODE_BufferGDA( unsigned char *brgb, unsigned char *gbuf, UInt32 *_pDget, UInt32 *_pDput);



/*----------------------------------------------------------
		メモリ上に格納されたＧＤＡデータを解凍

Bool	DECODE_BufferGDA(unsigned char *gda,unsigned char *put,unsigned long length);

　引数
	unsigned char*	圧縮データの格納されたバッファポインタ
	unsigned char*	展開するバッファのポインタ
　戻り値
	Bool		True:成功　False 失敗
----------------------------------------------------------*/
Bool	DECODE_BufferGDA(unsigned char *gda,unsigned char *put,unsigned long length);

/*	備考
　展開バッファには予め、必要な長さだけ領域を確保しておく必要がある。

*/



/*----------------------------------------------------------
	ストリーム上のＧＤＡデータを解凍

Bool	DECODE_StreamGDA(FILE *gda,unsigned char *put);

　引数
	FILE*		ファイルハンドルポインタ
	unsigned char*	展開するバッファのポインタ
　戻り値
	Bool		True:成功　False 失敗
----------------------------------------------------------*/
Bool	DECODE_StreamGDA(FILE *gda,unsigned char *put);

/*	備考
　展開バッファには予め、必要な長さだけ領域を確保しておく必要がある。

*/

#endif // _PRESS_CMP_H_ 重複定義防止
//^^^^^^^^ CombineInclude press\cmp.h
//vvvvvvvv CombineInclude press\rls.h
//********************************************************************************************
/**
 * @file		RLS.H
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 */
//********************************************************************************************

#ifndef	_RLS_H_	// 重複定義防止
#define	_RLS_H_	// 重複定義防止マクロ


//	press/rls でまだ使用している部分があるのでやむを得ず、できるだけ早く対応したい
#if 0//defined( PLATFORM_WIN32 )
#ifndef	USE_OLD_PATOL
	struct MEMBUFF{
		HANDLE	hBuf;		//	ハンドル
		LPVOID	lpBuf;		//	メモリポインタ
		UINT	fuFlags;	//	オブジェクト割り当て属性
		BOOL	used;		//	メモリ確保すると TRUEに
	};
	inline	BOOL	MEM_free(MEMBUFF *mem){
			
			if(mem->used == FALSE)	return FALSE;
			
			GlobalUnlock(mem->hBuf);
			if(GlobalFree(mem->hBuf) != NULL)	return FALSE;
			
			mem->used = FALSE;
			
			return TRUE;
	}
	inline	BOOL	MEM_alloc(MEMBUFF *mem,UINT Attr,DWORD Size){
			
			if(mem->used != FALSE)	MEM_free(mem);
			
			if(Size < 256)	Size = 256;
			mem->hBuf = GlobalAlloc( Attr, Size);
			if ( mem->hBuf == NULL )	return FALSE;				// メモリーが足りません
			mem->lpBuf = GlobalLock( mem->hBuf );
			if ( mem->lpBuf == NULL )	return FALSE;				// メモリーが足りません
			
			mem->fuFlags = Attr;
			mem->used = TRUE;
			
			return TRUE;
	}


/*----------------------------------------------------------
	オフセット UInt16 型 圧縮ルーチン

int		RLS_encodeWORD( MEMBUFF memSi, MEMBUFF *memDi, UInt32 *size, int Direct, UInt32 SiSize );

  引数
	MEMBUFF		圧縮元メモリ構造体
	MEMBUFF *	圧縮後メモリ構造体
	UInt32 *		サイズを格納
	int			0 :オフセット
				1 :ダイレクト
	UInt32		圧縮元サイズ

	●非圧縮にする方法
	UInt32 *size の 呼びもとで この変数に 0 を格納した状態で、この関数にポインタを渡す。

  戻り値	正常時	1
			異常時	0	圧縮されなかった・増えた・補正値より大きい
					-1	ヘッダのオーバーフロー
					-2	その他（メモリの確保失敗）
					
----------------------------------------------------------*/
int		RLS_encodeWORD( MEMBUFF memSi, MEMBUFF *memDi, UInt32 *size, int Direct, UInt32 SiSize );


/*----------------------------------------------------------
	オフセット UInt32 型 圧縮ルーチン

int		RLS_encodeDWORD( MEMBUFF memSi, MEMBUFF *memDi, UInt32 *size, int Direct, UInt32 SiSize );

  引数
	MEMBUFF		圧縮元メモリ構造体
	MEMBUFF *	圧縮後メモリ構造体
	UInt32 *		サイズを格納
	int			0 :オフセット
				1 :ダイレクト
	UInt32		圧縮元サイズ
	Bool		戻り値 0 で終了が発生するか

	●非圧縮にする方法
	UInt32 *size の 呼びもとで この変数に 0 を格納した状態で、この関数にポインタを渡す。

  戻り値	正常時	1
			異常時	0	圧縮されなかった・増えた・補正値より大きい
					-1	ヘッダのオーバーフロー
					-2	その他（メモリの確保失敗）
					
----------------------------------------------------------*/
int		RLS_encodeDWORD( MEMBUFF memSi, MEMBUFF *memDi, UInt32 *size, int Direct, UInt32 SiSize );


#endif
#endif	// PLATFORM_WIN32


Int32	RLS_encodeWORD( Char *_pMemSi, Char *_pMemDi, UInt32 *_pSize, const Bool _bDirect, UInt32 _uSiSize );

Int32	RLS_encodeDWORD( Char *memSi, Char *memDi, UInt32 *size, const Bool Direct, UInt32 SiSize );

/*----------------------------------------------------------
	オフセット UInt16 型 解凍ルーチン

void	RLS_decodeWORDoffset( UInt16 *datas, UInt16 *decode);

  引数
	UInt16	*datas	解凍元メモリ
	UInt16	*decode	解凍後メモリ
----------------------------------------------------------*/
void	RLS_decodeWORDoffset( UInt16 *datas, UInt16 *decode );


/*----------------------------------------------------------
	オフセット UInt16 型 解凍ルーチン

void	RLS_decodeDWORDoffset( UInt32 *datas, UInt32 *decode );

  引数
	UInt32	*datas	解凍元メモリ
	UInt32	*decode	解凍後メモリ
----------------------------------------------------------*/
void	RLS_decodeDWORDoffset( UInt32 *datas,UInt32 *decode );


/*----------------------------------------------------------
	オフセット UInt16 型 ダイレクト 解凍ルーチン

void	RLS_decodeWORDdirect( UInt16 *datas, UInt16 *decode );

  引数
	UInt16	*datas	解凍元メモリ
	UInt16	*decode	解凍後メモリ
----------------------------------------------------------*/
void	RLS_decodeWORDdirect( UInt16 *datas, UInt16 *decode );


/*----------------------------------------------------------
	オフセット UInt32 型 ダイレクト 解凍ルーチン

void	RLS_decodeDWORDdirect( UInt32 *datas, UInt32 *decode );

  引数
	UInt32	*datas	解凍元メモリ
	UInt32	*decode	解凍後メモリ
----------------------------------------------------------*/
void	RLS_decodeDWORDdirect( UInt32 *datas, UInt32 *decode );


#endif // _RLS_H_ 重複定義防止
//^^^^^^^^ CombineInclude press\rls.h
//vvvvvvvv CombineInclude system\ezParam.h
//********************************************************************************************
/**
 * @file		ezParam.h
 * @brief		パラメータ管理クラス
	
		引数に渡された _szCmdLine などの文字列があった時
		
		CEzParam	cParam( _szCmdLine );	///< 分解. _szCmdLine がconst の時は内部でコピーされたものが書き換えられる.
		
		/// 以下のように取得.
		cParam.SearchOption( 'p' );			///< -p の指定があればインデックスが返る.
		cParam.GetString();					///< オプションでない最初のパラメータを得る.
		cParam.GetString(1);				///< 2つ目のパラメータを得る.
		cParam.GetStringIndex( 0 );			///< index0番目の文字列を得る(オプションかどうかは無視).
		
		cParam.GetStringOption( 'p' )		///< -pSTRING のようなパラメータから "STRING" を得る.
		cParam.GetIntOption( 'o' )			///< -o12 のようなパラメータから 12 を得る.
 * 
 * @author		N.Takeda
 * @date		2011/05/30(月) 22:07:10
 */
//********************************************************************************************

#ifndef	_EZPARAM_H_	/* 重複定義防止 */
#define	_EZPARAM_H_	/* 重複定義防止マクロ */


//********************************************************************************************
/**
 * @class		CEzParam
 * @brief		
 * @author		N.Takeda
 * @date		2011/05/30(月) 18:27:59
 */
//********************************************************************************************
class CEzParam
{
protected:
	
	LPTSTR	m_pBuff;								///< 内部バッファ.
	LPTSTR	m_pParamString;							///< 与えれたパラメータ.
	Int32	m_iParamLength;							///< 与えれたパラメータ長さ.

	Int32	m_iEntry;								///< パラメータ数.


	//********************************************************************************************
	/**
	 * @brief		初期化.
	 * @author		N.Takeda
	 * @date		2011/05/30(月) 21:03:24
	 *
	 * @return		なし (none)
	 */
	//********************************************************************************************
	void	initialize()
	{
		Int32	ii = 0, iStrTop = 0;
		Bool	bInString = FALSE;					///< 文字列内判定.
		
		if( !m_pParamString )	return;
		
		/// 先頭に余計なスペースがあったら除外.
		while( ' ' >= *m_pParamString && 0 < m_iParamLength )
		{
			m_pParamString++;
			m_iParamLength--;
		}
		/// 末尾に余計なスペースがあったら除去.
		while( ' ' >= *(m_pParamString + m_iParamLength - 1 ) && 0 < m_iParamLength )
		{
			m_iParamLength--;
			*(m_pParamString + m_iParamLength) = '\0';
		}
		if( 0 >= m_iParamLength )	return;
		
		
		iStrTop = 0;
		for( ii=0 ; ii<m_iParamLength ; ii++ )
		{
			/// 文字列内はスペース、タブ有効.
			if( '"' == *(m_pParamString + ii ) )	bInString = 1 - bInString;
			
			/// スペース、タブを区切りとして分解.
			if( ('\t' == *(m_pParamString + ii) || ' ' == *(m_pParamString + ii) ) && !bInString )
			{
				Int32	iBottom = ii;
				*(m_pParamString + ii) = '\0';
				
				/// 空白が続く場合はスキップ.
				while( ('\t' == *(m_pParamString + ii+1) || ' ' == *(m_pParamString + ii+1) ) && ii<m_iParamLength )
				{
					ii++;
					*(m_pParamString + ii) = '\0';
				}
				
				deleteDkakko( iStrTop, iBottom );
				iStrTop = ii + 1;
				m_iEntry++;
			}
		}
		
		/// 最後の文字列も含む.
		if( (ii+1) != iStrTop )
		{
			deleteDkakko( iStrTop, ii );
			m_iEntry++;
		}
	}

#if 0
	//********************************************************************************************
	/**
	 * @brief		前後を括る " は削除.
	 * @author		N.Takeda
	 * @date		2011/05/30(月) 21:32:50
	 *
	 * @param[in]	const Int32	_iTop		先頭"位置.
	 * @param[in]	const Int32	_iBottom	末尾"位置.
	 *
	 * @return		なし (none)
	 */
	//********************************************************************************************
	void	deleteDkakko( const Int32 _iTop, const Int32 _iBottom )
	{
		/// 前後を括る " は削除.
		if( *(m_pParamString + _iTop) == '\"' && *(m_pParamString + _iBottom - 1) == '\"' )
		{
			*(m_pParamString + _iTop) = '\0';
			*(m_pParamString + _iBottom - 1)  = '\0';
		}
	}
#else
	void	deleteDkakko( const Int32 , const Int32  ){}
#endif

public:
	//********************************************************************************************
	/**
	 * @brief		指定インデックスがオプション指定かを得る.
	 * @author		N.Takeda
	 * @date		2011/06/02(木) 16:33:29
	 *
	 * @param[in]	const Int32	_iIndex	番号.
	 *
	 * @return		Bool	TRUE:成 / FALSE:否
	 */
	//********************************************************************************************
	Bool	IsOption( const Int32 _iIndex )
	{
		LPTSTR	pPtr = GetStringIndex( _iIndex );
		if( !pPtr )	return FALSE;
		return ( '-' == *pPtr );
	}
	
	//********************************************************************************************
	/**
	 * @brief		-? オプションが指定されているならそのインデックスを返す.
	 * @author		N.Takeda
	 * @date		2010/08/26(木) 17:16:14
	 *
	 * @param[in]	const TCHAR	_cOption	オプション記号(省略すると-を無条件に拾う).
	 *
	 * @return		Int32	インデックス(見つからない時-1)
	 */
	//********************************************************************************************
	Int32	SearchOption( const TCHAR _cOption = 0 )
	{
		TCHAR	sTemp[] = TEXT("- ");
		sTemp[ 1 ] = _cOption;
		
		LPTSTR	pPtr = STRING_str( m_pParamString, sTemp, m_iParamLength );
		if( pPtr )
		{
			Int32	iIdx = 0;
			for( LPTSTR p2=m_pParamString ; p2<pPtr ; p2++ )
			{
				if( '\0' == *(p2) )	iIdx++;
				while( '\0' == *(p2) && p2<pPtr )	p2++;
			}
			return iIdx;
		}
		
		return -1;
	}
	
	//********************************************************************************************
	/**
	 * @brief		-pSTRING のような文字列の続くオプションから文字列を取得.
	 * @author		N.Takeda
	 * @date		2010/08/26(木) 20:16:11
	 *
	 * @param[in]	const TCHAR	_cOption	オプション記号.
	 * @param[in]	LPCTSTR		_sDef		デフォルト文字列(省略するとNULL).
	 *
	 * @return		LPTSTR	-? 以降の指定文字列
	 */
	//********************************************************************************************
	LPCTSTR	GetStringOption( const TCHAR _cOption, LPCTSTR _sDef = NULL )
	{
		LPTSTR	pPtr;
		
		pPtr = GetStringIndex( SearchOption( _cOption ) );
		if( !pPtr )	return _sDef;
		
		return (pPtr + 2);
	}
	
	//********************************************************************************************
	/**
	 * @brief		-o12 のような数値の続くオプションから数値を取得.
	 * @author		N.Takeda
	 * @date		2010/08/26(木) 20:18:36
	 *
	 * @param[in]	const TCHAR	_cOption	オプション記号.
	 * @param[in]	const Int32	_iDef		デフォルト数値.
	 *
	 * @return		Int32	数値.
	 */
	//********************************************************************************************
	Int32	GetIntOption( const TCHAR _cOption, const Int32 _iDef = -1 )
	{
		LPCTSTR		pPtr = GetStringOption( _cOption );
		if( !pPtr )	return _iDef;
		return STRING_atoi( pPtr );
	}
	
	//********************************************************************************************
	/**
	 * @brief		オプション要素をチェック.
 	 *				-oABC というオプションが指定されている時、_cOptionに'B'を指定するとtrueが返る.
 	 *
	 * @author		N.Takeda
	 * @date		2010/09/02(木) 15:06:58
	 *
	 * @param[in]	const int	_iIdx		パラメータ番号.
	 * @param[in]	const TCHAR	_cOption	オプション文字(小文字)
	 * @param[in]	const Bool	_bFlag		trueで大文字小文字を区別しない.
	 *
	 * @return		Bool	TRUE:成 / FALSE:否
	 */
	//********************************************************************************************
	Bool	CheckOption( const int _iIdx, const TCHAR _cOption , const Bool _bFlag )
	{
		TCHAR		cOption = _cOption;
		LPCTSTR		pPtr = GetStringIndex( _iIdx );
		LPCTSTR		pCh;
		
		if( !pPtr )	return FALSE;
		
		pCh = STRING_chri( pPtr, cOption );
		
		/// "-o"の部分は判定しない.
		if( pCh && 2 <= (pCh-pPtr) )	return TRUE;
		
		return FALSE;
	}

	//********************************************************************************************
	/**
	 * @brief		Entryの取得.
	 * @author		N.Takeda
	 * @date		2011/05/30(月) 21:20:46
	 *
	 * @return		Int32	
	 */
	//********************************************************************************************
	Int32	GetEntry() const {	return m_iEntry;	}

	//********************************************************************************************
	/**
	 * @brief		パラメータが存在するかどうかのチェック.
	 * @author		N.Takeda
	 * @date		2011/05/30(月) 21:46:57
	 *
	 * @param[in]	const Int32	_iIdx	番号.
	 *
	 * @return		Bool	TRUE:成 / FALSE:否
	 */
	//********************************************************************************************
	Bool	IsParam( const Int32 _iIdx )
	{
		if( !m_pParamString || 0 >= m_iParamLength )	return FALSE;
		if( 0 > _iIdx || m_iEntry <= _iIdx )			return FALSE;
		
		return ( 0 < STRING_len( GetStringIndex( _iIdx ) ) );
	}

	//********************************************************************************************
	/**
	 * @brief		文字列の取得.
 	 *				毎度サーチしている分負荷はあるが容量と制限なしを優先.
	 * @author		N.Takeda
	 * @date		2011/05/30(月) 21:20:34
	 *
	 * @param[in]	const Int32	_iIdx		番号.
	 * @param[in]	LPCTSTR		_pDefStr	文字列(省略するとNULL).
	 *
	 * @return		LPTSTR	文字列ポインタ.
	 */
	//********************************************************************************************
	LPTSTR	GetStringIndex( const Int32 _iIdx, LPCTSTR _pDefStr = NULL )
	{
		if( !m_pParamString || 0 >= m_iParamLength )	return (LPTSTR)_pDefStr;
		if( 0 > _iIdx || m_iEntry <= _iIdx )			return (LPTSTR)_pDefStr;
		Int32	iPtr = 0;
		
		if( '"' == *(m_pParamString + iPtr ) )	iPtr++;
		for( Int32 ii=0 ; ii<_iIdx ; ii++ )
		{
			while( '\0' != *(m_pParamString + iPtr ) && m_iParamLength > iPtr)	iPtr += STRING_len( m_pParamString + iPtr );
			while( '\0' == *(m_pParamString + iPtr ) && m_iParamLength > iPtr)	iPtr++;
		}
		Int32	iLast = STRING_len(m_pParamString + iPtr ) - 1;
		if( *(m_pParamString + iPtr + iLast ) == '"' )	*(m_pParamString + iPtr + iLast ) = '\0';
		return m_pParamString + iPtr;
	}

	//********************************************************************************************
	/*!
	 * @brief		オプションでない文字列のパラメータを得る.
	 * @author		N.Takeda
	 * @date		2013/06/04(火) 18:32:11
	 *
	 * @param[in]	const Int32	_iIdx		何番目か.
	 *
	 * @return		LPTSTR	文字列ポインタ.
	 */
	//********************************************************************************************
	LPTSTR	GetString( const Int32 _iIdx = 0 )
	{
		Int32	ii = 0, jj = 0;
		for( ii=0 ; ii<m_iEntry ; ii++ )
		{
			if( !IsOption(ii) )
			{
				if( jj++ == _iIdx )	break;
			}
		}
		if( ii == m_iEntry )	return NULL;
		return GetStringIndex( ii );
	}

	//********************************************************************************************
	/**
	 * @brief		パラメータを数値として取得.
	 * @author		N.Takeda
	 * @date		2011/05/30(月) 21:51:39
	 *
	 * @param[in]	const Int32	_iIdx		番号.
	 * @param[in]	const Int32	_iDefVal	(省略すると0).
	 *
	 * @return		Int32	
	 */
	//********************************************************************************************
	Int32	GetInt( const Int32 _iIdx, const Int32 _iDefVal = 0 )
	{
		LPCTSTR		pp = GetStringIndex( _iIdx );
		if( !pp )	return _iDefVal;
		return STRING_atoi( pp );
	}

	//********************************************************************************************
	/**
	 * @brief		コンストラクタ.
	 * @author		N.Takeda
	 * @date		2011/05/30(月) 18:34:24
	 *
	 * @param[in]	LPCTSTR	_pParamString	書き換えてはいけない文字列.
	 *
	 * @return		なし (none)
	 */
	//********************************************************************************************
	CEzParam( LPCTSTR _pParamString )
	 : m_pParamString( NULL )
	 , m_iParamLength( 0 )
	 , m_pBuff( NULL )	///< 内部バッファ.
	 , m_iEntry( 0 )	///< パラメータ数.
	{
		m_iParamLength = STRING_len(_pParamString);
		
		if( 0 < m_iParamLength )
		{
			enum{	enAlinByte = 64	};
			Int32	iLength = (((m_iParamLength+1) + (enAlinByte-1)) / enAlinByte) * enAlinByte;
			
			/// 内部で確保してコピー.
			mem_alloc( TCHAR, m_pBuff, iLength );
			STRING_cpy( m_pBuff, _pParamString );
		}
		
		m_pParamString = m_pBuff;
		
		initialize();
	};
	
	//********************************************************************************************
	/**
	 * @brief		コンストラクタ.
	 * @author		N.Takeda
	 * @date		2011/05/30(月) 18:34:49
	 *
	 * @param[in]	LPTSTR	_pParamString	書き換えてよい文字列.
	 *
	 * @return		なし (none)
	 */
	//********************************************************************************************
	CEzParam( LPTSTR _pParamString )
	 : m_pParamString( _pParamString )
	 , m_iParamLength( 0 )
	 , m_pBuff( NULL )	///< 内部バッファ.
	 , m_iEntry( 0 )	///< パラメータ数.
	{
		
		m_iParamLength = STRING_len(_pParamString);
		
		initialize();
	};
	
	//********************************************************************************************
	/**
	 * @brief		デストラクタ.
	 * @author		N.Takeda
	 * @date		2011/05/30(月) 18:34:30
	 *
	 * @return		なし (none)
	 */
	//********************************************************************************************
	virtual ~CEzParam()
	{
		
		mem_del( m_pBuff );
		
	};
	
	
#ifdef T_DEBUG
	//********************************************************************************************
	/**
	 * @brief		Trace関数.
	 * @author		N.Takeda
	 * @date		2011/05/30(月) 21:49:54
	 *
	 * @return		なし (none)
	 */
	//********************************************************************************************
	void	Trace()
	{
		void	dprintf_real( const TCHAR * _fmt, ... );
		
		dprintf_real( TEXT("%d\n"), GetEntry() );
		
		for( Int32 ii=0 ; ii<GetEntry() ; ii++ ){
			dprintf_real( TEXT("%2d:%s\n"), ii, GetStringIndex(ii) );
		}
	}
#endif
};

#endif /* _EZPARAM_H_ 重複定義防止 */
//^^^^^^^^ CombineInclude system\ezParam.h
//vvvvvvvv CombineInclude system\win32\env.h
//********************************************************************************************
/**
 * @file		env.h
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2011/10/25(火) 13:52:55
 */
//********************************************************************************************

#ifndef	_ENV_H_	// 重複定義防止
#define	_ENV_H_	// 重複定義防止マクロ


/// 環境変数に設定されている文字列を得る.
Bool	ENV_GetStr( LPTSTR _pString, UInt32 _iLength, LPCTSTR _pEnvName, const Bool _bNotFoundErr = false );


#endif // _ENV_H_ 重複定義防止
//^^^^^^^^ CombineInclude system\win32\env.h
//vvvvvvvv CombineInclude system\win32\dde.h
//********************************************************************************************
/**
 * @file		dde.h
 * @brief		要約説明
 *
 *	このファイルの詳細説明
 *
 * @author		N.Takeda
 * @date		2009/08/26(水) 13:35:53
 */
//********************************************************************************************

#ifndef _DDE_H_
#define _DDE_H_

#include <ddeml.h>


/// DDE情報.
struct StDDEState
{
	DWORD	m_uDdeInst;
	HSZ		m_hszService;
	HSZ		m_hszTopic;
	HCONV	m_hConv;
	HSZ		m_hszTopicSheet;						///< シート名.
	HCONV	m_hConvSheet;							///< シートのハンドル.

	/// 構造体にコンストラクタを付けるのは推奨しないがクリア必須のため.
	StDDEState()
	: m_uDdeInst( 0 )
	, m_hszService( 0 )
	, m_hszTopic( 0 )
	, m_hConv( 0L )
	, m_hszTopicSheet( 0 )
	, m_hConvSheet( 0L )
	{}
};


/// DDE開始.
Bool	DDEXL_Start( StDDEState *_pDdeState, LPCTSTR _pXlsPath, LPCTSTR _pSheetName = NULL );

/// DDE終了.
int		DDEXL_End( StDDEState *_pDdeState );

/// セルデータの読み取り関数.
Int32	DDEXL_GetData( const StDDEState *_pDdeState, const Int32 iCelR, const Int32 iCelC, LPTSTR _pReceiptBuff, const Int32 _iBuffSize );

/// xlsからシート名を得る.
Int32	DDEXL_GetSheets( LPCTSTR _pXlsPath, LPTSTR _pReceiptBuff = NULL, const Int32 _iBuffSize = 0 );


#ifdef T_DEBUG
/// DDEErrメッセージ関数.
void	DDE_ErrMessage( HWND _hWnd, StDDEState *_pDdeState );
#else	// T_DEBUG

#endif	// not T_DEBUG


#endif	// _DDE_H_
//^^^^^^^^ CombineInclude system\win32\dde.h
//vvvvvvvv CombineInclude system\stDump.h
//********************************************************************************************
/**
 * @file		stDump.h
 * @brief		要約説明
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2011/04/04(月) 21:19:32
 */
//********************************************************************************************


#define		_ALINE(num,aline)		((((num)+(aline-1))/aline)*aline)
#define		_ALINE8(num)			_ALINE(num,8)
#define		_ALINE4(num)			_ALINE(num,4)
#define		_ALINE1(num)			(num)


//********************************************************************************************
/**
 * @class		CStDump
 * @brief		
 * @author		N.Takeda
 * @date		2011/04/04(月) 21:19:32
 */
//********************************************************************************************
class	CStDump
{
	enum{	enDefaultRowNum = 16	};	///< デフォルトのバイト桁数.
	
	enum{	enPointerByteLength = 4	};	///< ポインタのバイト長.
public:
	
	/// 型.
	enum EnMethodType
	{
		enMethodTypeBuff,				///< バッファ(動作は文字列と同じ).
		enMethodTypeString,				///< 文字列.
#ifdef	_UNICODE
		enMethodTypeSJIS,				///< S-JIS文字列.
#else
		enMethodTypeUNICODE,			///< UNICODE文字列.
#endif
		enMethodTypeInt,				///< 整数値.
		enMethodTypeUInt,				///< 符号なし整数値.
		enMethodTypeHexInt,				///< 16進数整数値.
		enMethodTypeFloat,				///< 浮動小数点値.
		enMethodTypePointer,			///< ポインタ.
		enMethodTypeMax,
	};

	/// 構造体情報 構造体.
	struct	StMethodInfo
	{
		EnMethodType	m_eType;		///< メソッドのタイプ.
		Int32			m_iSize;		///< サイズ(byte).
	};
	
	static Int32	StructDump( LPTSTR _pBuff, const Int32 _iBuffSize, const void *_pPtr, const Int32 _iSize, StMethodInfo *_pMInfi = NULL, const Int32 _iRowNum = enDefaultRowNum );

private:
	static Int32	buffPrintf( LPTSTR _pBuff, const Int32 _iBuffSize, LPCTSTR _pFormat, ... );
	static Bool		viewBuff( Int32 &iBuffLen, LPTSTR _pBuff, const Int32 _iBuffSize, UInt8 *_pLineTopPtr, const Int32 _iSize, const Bool _bBeforeOver );
	static Bool		viewString( Int32 &_iBuffLen, LPTSTR _pBuff, const Int32 _iBuffSize, const UInt8 *_pStateTopPtr, const Int32 _iStateLength, const Bool _bBeforeOver );
	static Int64	getValue( UInt8 *_pLineTopPtr, const Int32 _iSize, const LPCTSTR _pLabel );
	static Float64	getFloatValue( UInt8 *_pLineTopPtr, const Int32 _iSize, const LPCTSTR _pLabel );
};


//********************************************************************************************
/**
 * @class		CInt2Str
 * @brief		64ビット型整数値を文字列変換.
 *				主に %ld %ud が効かない条件下で利用する.

		UInt32の最大値	0xffffffff -> 4294967295
		Int64の最大値	0x7fffffffffffffff -> 9223372036854775807
		UInt64の最大値	0xffffffffffffffff -> 18446744073709551615

	CInt2Str<Int64>	obj;
	printf( "%s", obj.From( 18446744073709551615LL ) );

 * @author		N.Takeda
 * @date		2011/05/24(火) 16:43:29
 */
//********************************************************************************************
template <class T> class CInt2Str
{
	enum{	enBuffSize = 24	};	///< 文字列展開するバッファサイズ(21あればよい).
public:
	//********************************************************************************************
	/**
	 * @brief		From関数.
	 * @author		N.Takeda
	 * @date		2011/05/24(火) 17:05:17
	 *
	 * @param[in]	const T		_Value	値.
	 * @param[in]	const Int32	_iSinsu	16を指定すると16進数表記(省略すると10).
	 *
	 * @return		char*	変換文字列.
	 */
	//********************************************************************************************
	char	*From( const T _Value, const Int32 _iSinsu=10 )
	{
		T		iTemp = _Value;
		Int32	iKeta = 0;
		TCHAR	cBase = '0';
		Int32	iNum = 0;
		
		while( 0 != iTemp )
		{
			iKeta++;
			iTemp /= _iSinsu;
		}
		if( 0 == iKeta )	iKeta = 1;
		if( 0 > _Value )	iKeta++;
		if( iKeta >= enBuffSize )	return NULL;
		
		iTemp = _Value;
		if( 0 > _Value )	iTemp *= -1;
		
		m_sWork[ iKeta ] = 0;
		for( Int32 ii=iKeta-1 ; ii >= 0 ; ii-- )
		{
			iNum = static_cast<Int32>( iTemp % _iSinsu );
			cBase = ( 10 > iNum ) ? '0' : 'a';
			m_sWork[ ii ] = cBase + static_cast<TCHAR>(iNum);
			iTemp /= _iSinsu;
		}
		if( 0 > _Value )	m_sWork[ 0 ] = '-';
		
		return m_sWork;
	}
private:
	TCHAR	m_sWork[ enBuffSize ];
};

//^^^^^^^^ CombineInclude system\stDump.h
#endif

/// ■メディア関連.
#if defined( PLATFORM_WIN32 )
//vvvvvvvv CombineInclude graphics\bmp.h
//********************************************************************************************
/**
 * @file		bmp.h
 * @brief		ビットマップ関連
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2011/06/20(月) 20:12:11
 */
//********************************************************************************************

#ifndef	_BMP_H_	// 重複定義防止
#define	_BMP_H_	// 重複定義防止マクロ


//----------------------------------
//	ビットマップ情報構造体			
//----------------------------------
struct	BMPINFO{
	LPVOID			lpBuf;					// バッファのポインタ
	
	LPBITMAPINFO	lpBMPInfo;				// ビットマップインフォメーション
	
	unsigned char	*lpIMG;					// Bipmapｲﾒｰｼﾞ部分ポインタ
	UInt32			PTx;					// X座標を得るためにX座標を操作する値　(割る／かける)
	UInt32			PTwid;					// Y座標を移動する際に加算する値
	
	UInt32			Height;					// BMPの高さ
	UInt32			Width;					// BMPの幅
	UInt16			BitCount;				// １ドットのもつビットカウント
	
	UInt16			wPalMax;				// 実際に使用されているパレット数
};


//----------------------------------
//	ビットマップ転送用構造体		
//----------------------------------
struct	BMPRECT{
	UInt32	x0;			// 転送元ＢＭＰ始点ｘ
	UInt32	y0;			// 転送元ＢＭＰ始点ｙ
	
	UInt32	x1;			// 転送先ＢＭＰ始点ｘ
	UInt32	y1;			// 転送先ＢＭＰ始点ｙ
	
	UInt32	dx;			// 転送幅
	UInt32	dy;			// 転送高さ
	
	BMPINFO	bmpSI;		// 転送元
	BMPINFO	bmpDI;		// 転送先
	
	int		trans;		// 抜き色指定	(0:べたコピー) (1:色指定) (2:自動) (3:範囲内自動)
	UInt32	col;		// 抜き色となるカラーコード　またはRGB値
	int		ptrn;		// 転送パターン	(0:不使用　(1:2:3:4:パターン0〜3)
};


//--------------------------------------
//		パレット情報構造体				
//--------------------------------------
struct	PALETTE{
	int			PALETTEMAX;					// 使用するパレットエントリー
	
	HPALETTE	hPalette;					// パレットハンドル
	HPALETTE	hSysPalette;				// ＤＣの以前のパレット
//	LOGPALETTE	*lpSysPalKeep;
	LOGPALETTE	*lpLogPalette;				// 論理パレットを格納するバッファポインタ
	
	char		*memPal;
};


//--------------------------------------
//		システムカラー保存用構造体		
//--------------------------------------
struct	PALETTE_SYS{
	int			Entry;						// システムカラーエントリー
	int			nIndex[20];					// システムカラー番号
	COLORREF	rgb[20];					// システムカラーのＲＧＢ値
};


#define	_RGBA(r,g,b,a)	((a<<24)+(b<<16)+(g<<8)+r)


//	ピットマップを扱うにあたって必要なパラメータを構造体にセットする
BMPINFO	BMP_GetRECTinfo(LPVOID lpBuf);


void	BMP_draw( HDC DC, int X, int Y ,BMPINFO *bmp);
void	BMP_drawRECT( HDC DC, int X, int Y ,int sx,int sy,int dx,int dy,BMPINFO *bmp);

void	BMP_drawRS( HDC DC, int X, int Y ,BMPINFO *bmp,UInt32 dwRop);
void	BMP_drawRSRECT( HDC DC, int X, int Y ,int sx,int sy,int dx,int dy,BMPINFO *bmp,UInt32 dwRop);


/*----------------------------------------------------------
	ＢＭＰ画像を指定ＤＣへ描画

void	BMP_draw( HDC DC, int X, int Y ,LPVOID lpBuffer);

　引数
	HDC			描画を行うＤＣ
	int			描画ＤＣのＸ座標
	int			描画ＤＣのＹ座標
	LPVOID		ＢＭＰを格納したバッファ
　戻り値
	なし
----------------------------------------------------------*/
void	BMP_draw( HDC DC, int X, int Y ,LPVOID lpBuffer);
/*	備考
指定ＤＣの指定の座標へＢＭＰを描画。
ＢＭＰはイメージ部がそのまま転送される。部分的に描画したい場合はBMP_drawRECTの方を使う。

この関数を実行しただけではパレットは合わされないので、この関数を 呼び出す前にパレットを
設定する必要がある。
*/


/*----------------------------------------------------------
	ＢＭＰ画像を指定ＤＣへ描画

void	BMP_drawRECT( HDC DC, int X, int Y ,int sx,int sy,int dx,int dy,LPVOID lpBuffer);

　引数
	HDC			描画を行うＤＣ
	int			描画ＤＣのＸ座標
	int			描画ＤＣのＹ座標
	int			元ＢＭＰのＸ座標
	int			元ＢＭＰのＹ座標
	int			コピーする幅
	int			コピーする高さ
	LPVOID		ＢＭＰを格納したバッファ
　戻り値
	なし
----------------------------------------------------------*/
void	BMP_drawRECT( HDC DC, int X, int Y ,int sx,int sy,int dx,int dy,LPVOID lpBuffer);
/*	備考
指定ＤＣの指定の座標へＢＭＰを描画。

この関数を実行しただけではパレットは合わされないので、この関数を 呼び出す前にパレットを
設定する必要がある。
*/




/*----------------------------------------------------------
	メモリ内ＢＭＰ画像をコピー

void	BMP_Copy(BMPRECT *ts);

　引数
	BMPRECT		
　戻り値
	なし
----------------------------------------------------------*/
void	BMP_Copy(BMPRECT *ts);
/*	備考

*/


/*----------------------------------------------------------
	メモリ内ＢＭＰ画像をコピー　

void	BMP_CopyEZ(BMPINFO si,int x0,int y0,BMPINFO di,int x1,int y1,int dx,int dy,int trans);

　引数
	
　戻り値
	なし
----------------------------------------------------------*/
void	BMP_CopyEZ(BMPINFO si,int x0,int y0,BMPINFO di,int x1,int y1,int dx,int dy,int trans);



/*---------------------------------------------------------------------
	ビットマップ作成間数

UInt32	BMP_Create( char **mem, LONG BiWidth, LONG BiHeight, UInt16 TypeColor, LONG BiXPelsPerMeter, LONG BiYPelsPerMeter);

	引数
		char**		作成したビットマップを格納するメモリ構造体
		LONG		幅
		LONG		高さ
		UInt16		１ピクセル当りのビット数     16色:4  256色:8
		LONG		水平解像度                   標準 72
		LONG		垂直解像度                   標準 72
	戻り値
		UInt32		作成されたBMPのサイズ　失敗:0
---------------------------------------------------------------------*/
UInt32	BMP_Create( char **mem, LONG BiWidth, LONG BiHeight, UInt16 TypeColor, LONG BiXPelsPerMeter, LONG BiYPelsPerMeter);


/*---------------------------------------------------------------------
	指定ウィンドウをBMPにして格納

in:
		HWND		スクリーンショット対象のウインドウハンドル
		RECT*		ショットする画面の範囲　right,bottopmは幅と高さ
		char*		BMPの格納されるポインタのポインタ　内部で tnew される
out:
		UInt32		作成されたBMPのサイズ
---------------------------------------------------------------------*/
UInt32	BMP_windowshot(HWND hWnd,RECT *rc,char **mptr);
#define	BMPbits(ptr)	(*(UInt16*)(ptr+sizeof(BITMAPFILEHEADER)+sizeof(UInt32)*3+sizeof(UInt16)))


/*---------------------------------------------------------------------
	ビットマップパレットコピー

Bool	BMP_PaletteCopy( BMPINFO lpOrigin, BMPINFO lpAhend, UInt32	Si, UInt32 Di, UInt32 Dt);

	引数
		BMPINFO		コピー元
		BMPINFO		コピー先
		UInt32		転送元パレットインデックス
		UInt32		転送先パレットインデックス
		UInt32		転送幅
	戻り値
		成功・失敗
---------------------------------------------------------------------*/
Bool	BMP_PaletteCopy( BMPINFO lpOrigin, BMPINFO lpAhend, UInt32	Si, UInt32 Di, UInt32 Dt);


/*----------------------------------------------------------
	指定ＢＭＰのパレットを論理パレットの任意の場所へセット

void	BMP_PalTranslate(PALETTE Palette,BMPINFO bmp,UInt16 wStartIndex, UInt16 wNumEntries);

　引数
	PALETTE		パレット構造体
	BMPINFO		使用するパレットを含んだビットマップ構造体
	UInt16		パレット使用開始番号
	UInt16		パレット使用終了番号
　戻り値
	なし
----------------------------------------------------------*/
void	BMP_PalTranslate(PALETTE Palette,BMPINFO bmp,UInt16 wStartIndex, UInt16 wNumEntries);


/*----------------------------------------------------------
	論理パレットを作成

PALETTE	PALETTE_set( HWND hWnd ,int PALETTEMAX);

　引数
	HWND		ウィンドウハンドル
	int			パレットに使用する最大色数
　戻り値
	PALETTE		パレット構造体
----------------------------------------------------------*/
PALETTE	PALETTE_set( HWND hWnd ,int PALETTEMAX);
/*	備考
アプリケーションで使用する論理パレットを作成。
内部で領域確保を行っているので終了時には必ずPALETTE_freeを呼び出す。

引数　PALETTEMAXに256を指定すると自動的にシステムカラーを２色に落とす。
それ以外の場合は通常通り２０色のシステムカラーを持たせる。

論理パレットは複数作成することも可能だが、通常１つのアプリケーションに１つである。
*/


/*----------------------------------------------------------
	論理パレットを開放

void	PALETTE_free(HWND hWnd, PALETTE Palette);

　引数
	HWND		ウィンドウハンドル
	PALETTE		パレット構造体
　戻り値
	なし
----------------------------------------------------------*/
void	PALETTE_free(HWND hWnd, PALETTE Palette);



/*--------------------------------------------------------------
	ボックスフルを描画
--------------------------------------------------------------*/
void	DRAW_boxful(HDC DC,int x,int y,int x1,int y1,COLORREF rgb);


/*--------------------------------------------------------------
	ボックスを描画
---------------------------------------------------------------*/
void	DRAW_box(HDC DC,int x,int y,int x1,int y1,COLORREF rgb);


/*---------------------------------------------------------------------
	指定した座標のカラーコードを得る　256/16 両対応

IN:
		BMPINFO*	bmpinfo		ビットマップ情報
		int			x			ｘ座標
		int			y			ｙ座標
OUT:
		UInt32		カラーコード
---------------------------------------------------------------------*/
UInt32	BMP_getpixel( BMPINFO *_pBmpInfo, Int32 _x, Int32 _y );

/*---------------------------------------------------------------------
	ビットマップの指定した座標にカラーコードをセット

IN:
		BMPINFO*	bmpinfo		ビットマップ情報
		int			x			ｘ座標
		int			y			ｙ座標
		UInt32		col			カラーコード
---------------------------------------------------------------------*/
void	BMP_setpixel( BMPINFO *_pBmpInfo, Int32 _x, Int32 _y, UInt32 _col );

/*---------------------------------------------------------------------
	指定カラーコードのRGB値を得る

IN:
		BMPINFO*	bmpinfo		ビットマップ情報
		int			col			カラーコード
OUT:
		UInt32		RGB値　カラーがオーバーしている場合は０を返す
---------------------------------------------------------------------*/
UInt32	BMP_getpalette(BMPINFO *bmpinfo,int col);

/*---------------------------------------------------------------------
	指定カラーコードのRGB値をセット

IN:
		BMPINFO*	bmpinfo		ビットマップ情報
		int			col			カラーコード
		UInt32		rgb			RGB値
OUT:
		Bool		カラーがオーバーしている場合は０を返す　それ以外は１
---------------------------------------------------------------------*/
Bool	BMP_setpalette(BMPINFO *bmpinfo,int col,UInt32 rgb);


/*---------------------------------------------------------------------
	ビットマップをフルカラービットマップに変換

int		BMP_to24RGB( BMPINFO bmpSi, char **memDi );

IN;
		char		*memSi		
		char		**memDi		
OUT:
		int			変換後サイズ

　内部で tnew を呼び出している
---------------------------------------------------------------------*/
int		BMP_to24RGB( char *memSi, char **memDi );
int		BMP_to32RGB( char *memSi, char **memDi );	//	マスクは 0xff


//		パレットを表示する　デバッグ用関数
void	VIEW_palette(HDC DC,int sx,int sy,int dx,int dy,PALETTE Palette);
void	VIEW_paletteINDEX(HDC DC,int sx,int sy,int dx,int dy);
void	VIEW_paletteSYSTEM(HDC DC,int sx,int sy,int dx,int dy);


#endif // _BMP_H_ 重複定義防止
//^^^^^^^^ CombineInclude graphics\bmp.h
//vvvvvvvv CombineInclude graphics\font.h
//********************************************************************************************
/**
 * @file		font.h
 * @brief		フォント関連
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2011/06/20(月) 20:11:49
 */
//********************************************************************************************

#ifndef	_FONT_H_	// 重複定義防止
#define	_FONT_H_	// 重複定義防止マクロ


//--------------------------
//	フォント構造体			
//--------------------------
struct	FONTRGB{
	LOGFONT         MyFont;
	UInt32			rgb;
};
//	ログフォントに色情報を加えただけのもの


/*----------------------------------------------------------
		指定の文字列を指定の書式で表示

void	FONT_TextOut( HDC DC, unsigned char *lpStr, int x, int y, FONTRGB *font,int length);

　引数
	HDC		デバイスコンテキスト
	char*	表示したい文字列
	int		表示 X 座標
	int		表示 Y 座標
	FONTRGB	フォントの種類
	int		出力文字数
  戻り値
	なし
----------------------------------------------------------*/
void	FONT_TextOut( HDC DC, unsigned char *lpStr, int x, int y, FONTRGB *font,int length);


/*----------------------------------------------------------
		フォントを設定する

FONTRGB	FONT_set( int nFont, int MojiSpace, int lfHeight,UInt32 rgb);

　引数
	int		フォントの種類
	int		文字幅
	int		文字高さ
  戻り値
	フォント構造体
----------------------------------------------------------*/
FONTRGB	FONT_set( int nFont, int MojiSpace, int lfHeight,UInt32 rgb);


//======================================================================================
//		その他
//======================================================================================


/*--------------------------------------------------------------------------------------
	漢字変換ウィンドウの表示／非表示を切り替える

Bool	IME_windowActive(HWND hWnd,int sw);

　引数
	HWND		ウィンドウハンドル
	int			パラメータ　TRUE:アクティブ化 FALSE:非アクティブ化 それ以外:変更しない
　戻り値
	Bool		実行前の状態
--------------------------------------------------------------------------------------*/
Bool	IME_windowActive(HWND hWnd,int sw);
/*	備考
　パラメータに TRUE/FALSE 以外の値を与えると現在の状態を取得することができる。
*/



/*--------------------------------------------------------------------------------------
	漢字の変換決定前の文字の表示位置を設定します。

void	IME_SetCaret(HWND hWnd,int x,int y);

　引数
	HWND		ウィンドウハンドル
	int		x	表示座標ｘ
	int		y	表示座標ｙ
　戻り値
	Bool		実行前の状態
--------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------
void	IME_SetCaret(HWND hWnd,int x,int y);

　引数
	HWND		ウィンドウハンドル
	int		x	表示座標ｘ
	int		y	表示座標ｙ
　戻り値
	Bool		実行前の状態
--------------------------------------------------------------------------------------*/
void	IME_SetCaret(HWND hWnd,int x,int y);


#endif // _FONT_H_ 重複定義防止
//^^^^^^^^ CombineInclude graphics\font.h
#endif	// PLATFORM_WIN32


// 旧バージョン互換用
#ifdef	USE_OLD_PATOL
//vvvvvvvv CombineInclude _junk/junk.h
//********************************************************************************************
/**
 * @file		_jumk.h.
 * @brief		互換用定義.
 *
 *	今後使用しない、または新仕様に置き換えられている物を集めたファイルです。
 *	かなり古いコードを修正する必要性に駆られる、または新仕様への移植漏れの再に参照する用に残してあるものです。
 *	整理もされていませんので.
 *
 * @date		2008/11/06(木) 19:10:22
 * @author		N.Takeda
 */
//********************************************************************************************

#ifndef _JUMK_H_ /* 重複定義防止 */
#define _JUMK_H_ /* 重複定義防止マクロ */

//----------------------------------
//	ビットマップ情報構造体			
//----------------------------------
struct	BMPINFO;


//------------------------------------------
//		メモリ構造体(互換用)  new を使用して下さい
//------------------------------------------
struct MEMBUFF{
	HANDLE	hBuf;		//	ハンドル
	LPVOID	lpBuf;		//	メモリポインタ
	UINT	fuFlags;	//	オブジェクト割り当て属性
	Bool	used;		//	メモリ確保すると Trueに
};


Bool	MEM_alloc(MEMBUFF *mem,UINT Attr,DWORD Size);

/*----------------------------------------------------------
	指定したサイズのメモリを再確保、構造体に情報を返す

Bool	MEM_realloc(MEMBUFF *mem,DWORD Size);

　引数
	MEMBUFF		メモリ構造体を示すポインタ
	UInt32		確保するメモリサイズ
　戻り値
	Bool		True:成功　False 失敗
----------------------------------------------------------*/
Bool	MEM_realloc(MEMBUFF *mem,UInt32 Size);


Bool	MEM_free(MEMBUFF *mem);

DWORD	MEM_TargetRead(MEMBUFF *mem,UINT Attr,const char* szFileName);

/*----------------------------------------------------------
	メモリを確保し、指定ファイルを読み込む

BOOL	MEM_BGMread(MEMBUFF *mem,char *curr,char *chain,char *name);

　引数
	MEMBUFF*	読み込むメモリ
	char*		対象フォルダ
	char*		アーカイブファイル名  NULL でアーカイブなし　戦闘に\をつけることでフォルダ指定
	char*		ファイル名
　戻り値
	Bool		True:成功　False 失敗
----------------------------------------------------------*/
Bool	MEM_BGMread(MEMBUFF *mem,char *curr,char *chain,char *name);
/*	備考
　アーカイブファイルを指定した場合　暗号コード内臓式
*/


/*----------------------------------------------------------
	確保されたメモリ領域のサイズを返す

UInt32	MEM_size(MEMBUFF mem);

　引数
	MEMBUFF		メモリ構造体
　戻り値
	UInt32		サイズ
----------------------------------------------------------*/
UInt32	MEM_size(MEMBUFF mem);


/*----------------------------------------------------------
	メモリ空間を複製

void	MEM_restorer(MEMBUFF memS,MEMBUFF *memD);

　引数
	MEMBUFF		複製するメモリ構造体
	MEMBUFF		新しく作成されるメモリ構造体
　戻り値
	なし
----------------------------------------------------------*/
void	MEM_restorer(MEMBUFF memS,MEMBUFF *memD);
/*

　第１引数で指定したメモリ空間と同じものが第２引数に複製される
双方は別々のポインタを示している

*/


// ----- fnsplit & fnmerge で使用する用		//	★99/07/27

#define MAXPATH		_MAX_PATH
#define MAXDRIVE	_MAX_DRIVE
#define MAXDIR		_MAX_DIR
#define MAXFILE		_MAX_FNAME
#define MAXEXT		_MAX_EXT




/*----------------------------------------------------------
	バッファ内の指定文字列を全て差し替える

DWORD	STRING_changeSTRall(MEMBUFF *mem,DWORD Length,const char* strSI,const char* strDI,char STRINGCOM);

　引数
	MEMBUFF*	バッファ
	UInt32		バッファの長さ
	const char*		差し替え元文字列
	const char*		差し替え後文字列
	char		文字列を括るキャラクターコード
　戻り値
	UInt32		変換後のバッファの長さ
----------------------------------------------------------*/
UInt32	STRING_changeSTRall(MEMBUFF *mem,UInt32 Length,const char* strSI,const char* strDI,char STRINGCOM);
/*	備考

STRINGCOM で括られた部分は文字列指定と判断し、処理対象から除外する。


*/

DWORD	BMP_Create( MEMBUFF *mem, LONG BiWidth, LONG BiHeight, WORD TypeColor, LONG BiXPelsPerMeter, LONG BiYPelsPerMeter);

/*---------------------------------------------------------------------
	ビットマップパレットカット

BOOL	BMP_PaletteCut( MEMBUFF *MemOrigin, MEMBUFF *MemAhend );

	引数
		MEMBUFF*	カット元ＢＭＰデータの格納されたメモリ
		MEMBUFF*	カット後ＢＭＰデータの格納されたメモリ
	戻り値
		Bool		成功・失敗
---------------------------------------------------------------------*/
UInt32	BMP_PaletteCut( MEMBUFF *MemOrigin, MEMBUFF *MemAhend );

/*	備考

　カット先のデータの格納されるメモリは関数内で確保されるので
予め確保しておく必要はない。

*/


/*---------------------------------------------------------------------
	256色のビットマップをフルカラービットマップに変換

Bool	BMP_256to24RGB( BMPINFO bmpSi, MEMBUFF *memDi );

IN;
		BMPINFO		bmpSi		256ビットマップ
		MEMBUFF		*memDi		フルカラー格納用メモリ
OUT:
		Bool		成功・失敗
---------------------------------------------------------------------*/
Bool	BMP_256to24RGB( BMPINFO bmpSi, MEMBUFF *memDi );


DWORD	FILT_deleteREM( MEMBUFF *mem,DWORD length,char *remln,char *remst,char *remen,char strch );

//		一括置換
int		FILT_replace( MEMBUFF *mem,UInt32 *length,UInt32 start,char *defstr,int entry,char *chkstr,char strch );

DWORD	FILT_hex2dec(MEMBUFF *mem,DWORD size,DWORD start,char *chkstr);

UInt32	FILT_toString( MEMBUFF *mem,UInt32 length,char strch );

//		全角かな文字を半角に
DWORD	FILT_zentohan( MEMBUFF *mem,DWORD length,char strch );

void	FILT_small2big( MEMBUFF *mem,UInt32 length,char strch );



struct CHAIN_INFO_HEADER01;
struct CHAIN_INFO_HEADER00;

BOOL	CANZ_open(MEMBUFF *mem,CHAIN_INFO_HEADER00 *ch,char *name);
DWORD	CANZ_MemTargetReadEntry(MEMBUFF *memdata,UINT Attr,char *arc,int index);
UInt32	CANZ_MemTargetRead(MEMBUFF *memdata,UINT Attr,char *arc,char *name);
DWORD	MEM_CANZread(MEMBUFF *mem,char *curr,char *chain,char *name);
UInt32	EXPA_GDA1(MEMBUFF *mem_gda,MEMBUFF *mem_put);
/*----------------------------------------------------------
	指定ファイル名のＧＤＡ Ver1 データを解凍
	ＧＤＡデータはメモリに読み込んでから解凍
	解凍データの容量が解っている場合

DWORD	EXPA_GDA1mem(MEMBUFF *mem_gda,LPVOID lpBuffer);

　引数
	MEMBUFF*	ＧＤＡデータの格納されたバッファポインタ
	LPVOID		解凍するバッファのポインタ
　戻り値
	UInt32		解凍されたデータの容量　エラー時:0
----------------------------------------------------------*/
UInt32	EXPA_GDA1mem(MEMBUFF *mem_gda,LPVOID lpBuffer);


//	使用禁止
/*----------------------------------------------------------
	指定ファイル名のＧＤＡ Ver1 データを解凍
		ＧＤＡデータは直接ストリームから読み出す

　引数
	char*		ＧＤＡファイルのファイル名
	MEMBUFF*	展開バッファ構造体のポインタ
　戻り値
	Bool		True:成功　False 失敗
----------------------------------------------------------*/
Bool	EXPA_GDA1stream(char *path,MEMBUFF *mem);



#if 1	//旧版
//------------------------------------------
//	ディレクトリ構成構造体
//------------------------------------------
struct	FILEXCOPY{
	char		szName[MAX_PATH];		//	検索パス
	int			pathlen;				//	パス長
	
	MEMBUFF		mem;					//	ファイルリスト格納バッファ
	DWORD		ptr;					//	バッファポインタ
	
	int			files;					//	ファイル数
	int			dircs;					//	ディレクトリ数
	UInt32		size;					//	ディレクトリ総容量
	
	char 		type[13];			//	検索ファイル名(ワイルドカード可)
};
#endif


#if 1	//旧版
/*----------------------------------------------------------
	ディレクトリ情報を取得

int		FILE_GetDircInfo( FILEXCOPY *xcpy,const char* szNameSi);

　引数
	FILEXCOPY	ディレクトリ構造体
	const char* 	ディレクトリパス
　戻り値
	DWORD		現在コピーしたファイルのファイルサイズ

----------------------------------------------------------*/
int		FILE_GetDircInfo( FILEXCOPY *xcpy,const char* szNameSi);


/*----------------------------------------------------------
	ディレクトリ構成を取得

int		FILE_GetXcopy( FILEXCOPY *xcpy,const char* szNameSi);

　引数
	FILEXCOPY	ディレクトリ構造体
	const char* 	ディレクトリパス
　戻り値
	int		エラーメッセージ
			 0	：エラーなし
			-1	：コピー元が入力されていない。
			-2	：コピー先が入力されていない。
			-3	：メモリ領域を越えた。
----------------------------------------------------------*/
int		FILE_GetXcopy( FILEXCOPY *xcpy,const char* szNameSi);


/*----------------------------------------------------------
	FILEXCOP構造体に従いファイルをコピー

UInt32	FILE_Xcopy( FILEXCOPY *xcpy,const char* szNameDi);

　引数
	FILEXCOPY	ディレクトリ構造体
	const char* 	コピー元
	const char* 	コピー先
　戻り値
	UInt32		現在コピーしたファイルのファイルサイズ

----------------------------------------------------------*/
UInt32	FILE_Xcopy( FILEXCOPY *xcpy,const char* szNameDi);


/*----------------------------------------------------------
	ファイル構成を作るため元のディレクトリを検索			

BOOL	FILE_GetDirctoryTree( FILEXCOPY *xcpy,const char* szPathSi,BOOL frg);

----------------------------------------------------------*/
Bool	FILE_GetDirctoryTree( FILEXCOPY *xcpy,const char* szPathSi,Bool frg);
/*	備考

	const char* szPathSi は内部で続けて使用するので MAXPATH 分確保されている必要がある
	frg に False を設定するとメモリバッファに書き込まず、ptr に必要なファイル名領域のメモリサイズを返す

	全てのファイルを検索する場合、この関数は使用されないが、特定の拡張子のみを複数検索する場合等、
	FILE_Xcopy関数のカスタマイズが必要な場合に使用する
*/
#endif

//vvvvvvvv CombineInclude cmp_old.h

//============================================	以下のものは互換用	=======================================

//----------------------------------
//		チェインファイル構造体		
//----------------------------------
struct	CHAININFO{
	HANDLE	fd;					
	int		err;				
	
	char	cmp;				
	UInt32	offset;				
	UInt32	length;				
	UInt32	comp_length;		
	
	int		pow;
};


//------------------------------------------
//		チェインファイルヘッダー構造体		
//------------------------------------------
struct	CHAINHEADINFO{
	UInt16		Entry;					// ファイルエントリー
	int			Ver;					// バージョン情報
	int			Byte_pow;				// ブロック長
	int			HeadLen;				// 
	UInt32		offset;					// 
};


/*------------------------------------------------------
	チェインファイル情報を得る

char	*CHAIN_GetHeadinfo(LPSTR chainName,CHAINHEADINFO *hinf);

　引数
	LPSTR		チェインファイルのファイル名
　戻り値
	Bool		True
------------------------------------------------------*/
char	*CHAIN_GetHeadinfo(LPSTR chainName,CHAINHEADINFO *hinf);


/*------------------------------------------------------
	チェインファイルをオープン。情報を調べる

CHAININFO	CHAIN_open(LPSTR chainName,LPSTR fileName,char *codes);

　引数
	LPSTR		チェインファイルのファイル名
	LPSTR		検出するデータのファイル名
　戻り値
	CHAININFO	チェインファイル構造体が返る
------------------------------------------------------*/
CHAININFO	CHAIN_open(LPSTR chainName,LPSTR fileName,char *codes);
/*	備考

　エラー情報は CHAININFO 内の err に返る

*/

/*------------------------------------------------------
	チェインファイルをオープン。情報を調べる

CHAININFO	CHAIN_openEntry(LPSTR chainName,int num){

　引数
	LPSTR		チェインファイルのファイル名
	int			
　戻り値
	CHAININFO	チェインファイル構造体が返る
------------------------------------------------------*/
CHAININFO	CHAIN_openEntry(LPSTR chainName,int num);


/*------------------------------------------------------
	チェインファイルよりデータを読み出す

CHAININFO	CHAIN_MemTargetRead(MEMBUFF *memdata,UINT Attr,LPSTR szFileName,LPSTR fileName);

　引数
	MEMBUFF		データを格納するバッファ
	UINT		メモリ確保条件
	LPSTR		チェインファイル名
	LPSTR		検出するデータのファイル名
　戻り値
	CHAININFO	チェインファイル構造体が返る
------------------------------------------------------*/
CHAININFO	CHAIN_MemTargetRead(MEMBUFF *memdata,UINT Attr,LPSTR szFileName,LPSTR fileName);
/*	備考

　エラー情報は CHAININFO 内の err に返る

*/


/*------------------------------------------------------
	チェインファイルよりデータを読み出す

CHAININFO	CHAIN_MemTargetRead2(MEMBUFF *memdata,UINT Attr,LPSTR szFileName,LPSTR fileName);

　引数
	MEMBUFF		データを格納するバッファ
	UINT		メモリ確保条件
	LPSTR		チェインファイル名
	LPSTR		検出するデータのファイル名
	char*		
　戻り値
	CHAININFO	チェインファイル構造体が返る
------------------------------------------------------*/
CHAININFO	CHAIN_MemTargetRead2(MEMBUFF *memdata,UINT Attr,LPSTR szFileName,LPSTR fileName,char *codes);


/*------------------------------------------------------
	チェインファイルよりデータを読み出す

CHAININFO	CHAIN_MemTargetRead(MEMBUFF *memdata,UINT Attr,LPSTR szFileName,LPSTR fileName);

　引数
	MEMBUFF		データを格納するバッファ
	UINT		メモリ確保条件
	LPSTR		チェインファイル名
	int			検出するデータの番号
　戻り値
	CHAININFO	チェインファイル構造体が返る
------------------------------------------------------*/
CHAININFO	CHAIN_MemTargetReadEntry(MEMBUFF *memdata,UINT Attr,LPSTR szFileName,int num);



/*------------------------------------------------------
	チェインファイルよりデータを読み出す

CHAININFO	CHAIN_FileTargetRead(LPSTR szName,LPSTR szFileName,LPVOID lpBuffer);

　引数
	LPSTR		チェインファイル名
	LPSTR		検出するデータのファイル名
	LPVOID		データを格納するバッファ
　戻り値
	CHAININFO	チェインファイル構造体が返る
------------------------------------------------------*/
CHAININFO	CHAIN_FileTargetRead(LPSTR szName,LPSTR szFileName,LPVOID lpBuffer);
/*	備考

　領域は予め確保しておく必要がある。
圧縮データの場合、サイズは解凍した状態の大きさを確保しておかなければならない。

　エラー情報は CHAININFO 内の err に返る

*/


/*------------------------------------------------------
		バージョンにそったデータを得る

void	CHAIN_GetInfo(int Ver,int *Byte_file,int *Byte_len,int *Byte_off);

　引数
	int			バージョン番号
	int*		１ファイルのヘッダー長が返る
	int*		データ長情報のバイト数が返る
	int*		オフセット情報のバイト数が返る
　戻り値
	なし
------------------------------------------------------*/
void	CHAIN_GetInfo(int Ver,int *Byte_file,int *Byte_len,int *Byte_off);


/*------------------------------------------------------
	ピリオドを除いたファイル名を有効なファイル名に書き換える

void	COMP_chin2norm(char *szName,char *outName);

　引数
	char*		元ファイル名
	char*		出力ファイル名
　戻り値
	なし
------------------------------------------------------*/
void	COMP_chin2norm(char *szName,char *outName);
/*	備考
　元ファイル名はフルパス有効。
出力される部分はファイル名のみ。
*/


/*------------------------------------------------------
	ファイル名をピリオドを除いた11文字の文字列に書き換える

void	COMP_norm2chin(char *szName,char *outName);

　引数
	char*		元ファイル名
	char*		出力ファイル名
　戻り値
	なし
------------------------------------------------------*/
void	COMP_norm2chin(char *szName,char *outName);
//^^^^^^^^ CombineInclude cmp_old.h

#endif /* _JUMK_H_ */
//^^^^^^^^ CombineInclude _junk/junk.h
#endif







/// 配列の要素数を得る.
#define		lengthof(array)			(sizeof((array)) / sizeof((array[0])))


/// 変数regに対して　(0〜val*2) の値を (0〜val)<->(val〜0) に変換
//		例	val=5の時　reg=0〜9 の値は 0 1 2 3 4 5 4 3 2 1 となる
#define		CUL_BOUND(reg,val)		(((reg)<=val) ? (reg) : ((val*2)-(reg)))

//		例	val=5の時　reg=0〜9 の値は -5 -4 -3 -2 -1 0 1 2 3 4 に緩急のついた値となる
#define		CUL_NRIDER(reg,val)		(cos( aql::math::PI / (2.f*(val)) * reg ) * (val))


/// 変数rS を値iD に値iA だけ近づける(リミット有)
#define		CUL_NEAR( rS, iD, iA )	if(rS!=(iD)){if((iD)<rS){rS-=(iA);if((iD)>rS){rS=iD;}}else if((iD)>rS){rS+=(iA);if((iD)<rS){rS =(iD);}}}

/// 小数点n以下を四捨五入.
#define		_round(_src,_n)	((double)(int)((_src*pow(10,_n))+(0.f<(_src*pow(10,_n))?0.5f:-0.5f)))*pow(10,-_n)

#define 	_between(_x0,_x1,n,m)	(((m-n) * _x0 + n * _x1) / m)

#define		_clump(_reg, _min,_max)		(( (_max) < (_reg) ) ? (_max) : (( (_min) > (_reg) ) ? (_min) : (_reg)))


//	WORD のデータ判定用　上位バイトと下位バイトを反転
#define	swap_word(code)	(((code)&0xff)*0x100+(code)/0x100)
#define	_WCHAR(ch)	(*((u_char*)ch)*0x100 + *((u_char*)ch+1))







#define	_message(mess)	MessageBox(NULL,mess,TEXT("情報"),MB_OK);


//		整数値を２のべき乗に調整
Int32	_topow( const Int32 _iValue );


//======================================================================================
//		バイナリーダンプ関連.
//======================================================================================
void	DUMP_stream32( LPCTSTR _szName,  UInt32 *_pPtr, UInt32 _iLength, Int32 _iRetNum );
void	DUMP_stream16( LPCTSTR _szName,  UInt16 *_pPtr, UInt32 _iLength, Int32 _iRetNum );
void	DUMP_stream8(  LPCTSTR _szName,  UInt8  *_pPtr, UInt32 _iLength, Int32 _iRetNum );
LPTSTR	DUMP_string32( LPTSTR _pBuffPtr, UInt32 *_pPtr, UInt32 _iLength, Int32 _iRetNum );
LPTSTR	DUMP_string16( LPTSTR _pBuffPtr, UInt16 *_pPtr, UInt32 _iLength, Int32 _iRetNum );
LPTSTR	DUMP_string8(  LPTSTR _pBuffPtr, UInt8  *_pPtr, UInt32 _iLength, Int32 _iRetNum );



//======================================================================================
//		フィルター関連
//======================================================================================

//		注釈文の削除
//UInt32	FILT_deleteREM( LPTSTR ptr,UInt32 length,LPTSTR remln,LPTSTR remst,LPTSTR remen,char strch );
UInt32	FILT_deleteREM( LPTSTR _pPtr, const UInt32 _iLength, LPCTSTR _pRemln = TEXT("//"), LPCTSTR _pRemst = TEXT("/*"), LPCTSTR _pRemen = TEXT("*/"), const TCHAR _cSymbleCh = '\"' );

//		余白を削除
UInt32	FILT_deleteSpace( LPTSTR _pBuff, const UInt32 _uLength, const TCHAR  _cSymbleCh );
UInt32	FILT_del_space( LPTSTR pBuff,UInt32 uLength,char st/*,const char *chkstr*/);//互換用
/// 	行末の余白を削除
Int32	FILT_deleteTailSpace( LPTSTR _pPtr, const Int32 _iLen );
inline	Int32	FILT_excessiveSPACE( LPTSTR _pPtr, const Int32 _iLen ){	return FILT_deleteTailSpace( _pPtr, _iLen );	}	///< 互換用(名前が分かりにくいので変更).

/// 連続した改行(改行のみの行)を削除.
UInt32	FILT_deleteRets( LPTSTR _pBuff, const UInt32 _uLength );

//		テキスト内の数値を演算
UInt32	FILT_culucurate( LPTSTR _pBuffer, const UInt32 _uSize = 0, const UInt32 _uStart = 0, const char _cStringSymble = '\"' );

//		テキスト内の１６進数を１０進数に変換
UInt32	FILT_hex2dec( LPTSTR ptr, const UInt32 size, LPCTSTR chkstr );

/// バッファ内の文字列を"で括る(スクリプト解析用、ベタ書きテキストを文字列に変換する)
UInt32	FILT_StringRelief( LPTSTR _pBuff, UInt32 const _uLength, const TCHAR _cStrSS = '#', const Bool _bSubstSkip = TRUE, const TCHAR _cStrCh = '\"' );

/// バッファ内の文字を大文字に変換。文字列内部はスキップする
void	FILT_ToBig( LPTSTR _pPtr, UInt32 _iLength, TCHAR _cStrCh = '\"' );
/// バッファ内の文字を小文字に変換。文字列内部はスキップする
void	FILT_ToSmall( LPTSTR _pPtr, UInt32 _iLength, TCHAR _cStrCh = '\"' );

/// chaos特殊.
UInt32	FILT_toString3( LPTSTR ptr,UInt32 length,LPTSTR chkstr,char strss,char strch );
/*
//		半角文字で括られた全角文字を文字列化
UInt32	FILT_toString2( LPTSTR ptr,UInt32 length,LPTSTR chkstr,char strch );

//		小文字を大文字に
void	FILT_small2big( LPTSTR ptr,UInt32 length,char strch );
*/




/*----------------------------------------------------------
		オートリピート補正

Bool	AutpRepeat(int d,int *cur_cnt,int AUTO_REP_CNT);

　引数
	int		ボタンが押されている状態:1　ボタンが放されている状態:0　をセット
	int*	オートリピートカウンターを示すポインタ
	int		リピートカウント数
  戻り値
	Bool	TRUE:稼動良し　FALSE:停止中
----------------------------------------------------------*/
Bool	AutpRepeat(int d,int *cur_cnt,int AUTO_REP_CNT);




//======================================================================================
//		音源関連
//======================================================================================

/*----------------------------------------------------------
	指定ファイル名のウェーブデータを再生

Bool	WAVE_debug(char *FileName);

　引数
	char*		ウェーブデータのファイル名
　戻り値
	Bool		TRUE:成功　FALSE 失敗
----------------------------------------------------------*/
Bool	WAVE_debug( LPCTSTR FileName );

Bool	WAVE_play( LPCTSTR FileName );

Bool	WAVE_sound( LPCTSTR FileName, UInt32 option );

Bool	WAVE_bord();
Bool	WAVE_check();

void	randomize();
Int32	random( Int32 _iMax );

void	_swap( TCHAR &a, TCHAR &b );
void	_swap( int &a, int &b );
void	_swap( long &a, long &b );
void	_swap( float &a, float &b );
void	_swap( double &a, double &b );
void	_swap( LPTSTR a, LPTSTR b );



//======================================================================================
//		デバッグ関連
//			DEBUG_TRACE を無効にするとなくなるので必要な出力に対して使わない事
//======================================================================================
#ifdef	DEBUG_TRACE
	#define	DEBUGSTREAM_NAME	TEXT("D.TXT")

	Bool	DEBUG_stream( LPCTSTR szName, LPCTSTR str );
	Bool	DEBUG_streamINT( LPCTSTR szName, int num );
	Bool	DEBUG_streamINTx( LPCTSTR szName, int num );
	Bool	DEBUG_streamCHAR( LPCTSTR szName, char ch );
	Bool	DEBUG_streamFLOAT( LPCTSTR szName, float dat );
	Bool	DEBUG_printf( LPCTSTR szName, LPCTSTR format, ... );
	Bool	DEBUG_message( LPCTSTR str );
	Bool	DEBUG_buffer( LPCTSTR szName, char *ptr, UInt32	length );
	Bool	DEBUG_strword( LPCTSTR szName, char *ptr );

	Bool	_printf( LPCTSTR format, ... );
	void	dprintf_real( const TCHAR * _fmt, ... );

//	省略版
	#define	_crlf			DEBUG_stream( DEBUGSTREAM_NAME, TEXT("\r\n"))
	#define	_str(str)		{DEBUG_stream( DEBUGSTREAM_NAME, str);_crlf;}
	#define	_int(val)		DEBUG_streamINT( DEBUGSTREAM_NAME, val)
	#define	_intx(val)		DEBUG_streamINTx( DEBUGSTREAM_NAME, val)
	#define	_char(ch)		DEBUG_streamCHAR( DEBUGSTREAM_NAME, ch)
	#define	_float(val)		DEBUG_streamFLOAT( DEBUGSTREAM_NAME, val)
	#define	_gate(val)		DEBUG_printf( DEBUGSTREAM_NAME, TEXT("gate %d\r\n"), val)
	#define	_strwd(str)		{DEBUG_strword( DEBUGSTREAM_NAME, str);_crlf;}

	#define	TRACE			dprintf_real

#else
	#define	DEBUG_stream		__noop
	#define	DEBUG_streamINT		__noop
	#define	DEBUG_streamINTx	__noop
	#define	DEBUG_streamCHAR	__noop
	#define	DEBUG_streamFLOAT	__noop
	#define	DEBUG_printf		__noop
	#define	DEBUG_message		__noop
	#define	DEBUG_buffer		__noop
	#define	DEBUG_strword		__noop

	#define	_printf				__noop
#if defined( PLATFORM_WIN32 )
	#define	DEBUG_LastError		__noop
	#define	WINDOW_GetMsgString	__noop
#endif	// PLATFORM_WIN32

//	省略版
	#define	_crlf				__noop
	#define	_str				__noop
	#define	_int				__noop
	#define	_intx				__noop
	#define	_char				__noop
	#define	_float				__noop
	#define	_gate				__noop
	#define	_strwd				__noop

	#define	TRACE				__noop
#endif

LPCTSTR		GetLastErrStr();



//********************************************************************************************
/*!
 * @class		CBenchMark
 * @brief		処理時間計測用.
 *				計測したいnamespaceで定義するとコンストラクタからデストラクタまでの時間を計測してTRACE表示.
 *				コンストラクタにポインタ引数を渡すと時間を取得するのみ.
 * @author		N.Takeda
 * @date		2013/06/12(水) 11:22:39
 */
//********************************************************************************************
#ifdef	DEBUG_TRACE
class CBenchMark
{
	UInt32	m_uTime;
	UInt32	*m_pTime;
	LPCTSTR	m_pLabel;
public:
	CBenchMark( LPCTSTR _pLabel, UInt32 *_pTime )
	 : m_pTime( _pTime )
	 , m_pLabel( _pLabel )
	{
		m_uTime = GetTickCount();
	}
	CBenchMark( LPCTSTR _pLabel )
	 : m_pTime( NULL )
	 , m_pLabel( _pLabel )
	{
		m_uTime = GetTickCount();
	}
	virtual ~CBenchMark()
	{
		UInt32	uTime = GetTickCount() - m_uTime;
		if( m_pTime )	*m_pTime = uTime;
		else			TRACE( TEXT("%s %.3fsec.\n"), m_pLabel, (float)uTime / 1000L );
	}
};
#else
class CBenchMark
{
public:
	CBenchMark( LPCTSTR, UInt32 * )
	{}
	CBenchMark( LPCTSTR )
	{}
};
#endif



#endif /* _TOOLS_H_ */
