/*===========================================================================

FILE: iautolog.c
===========================================================================*/

//--------------------------------------------------------------------------------------------------------+
//改版履歴                                                                                                |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  No.   |  date     | 問題表番号 | 変更/修正内容                                          |    name     |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  #000  | 05.xx.xx  |            | 新規作成                                               |             |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  #001  | 05.06.30  |            | 最古のデータ検索終了判定不正修正                       | N.Kanagawa  |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  #002  | 05.07.22  |            | エラーコード追加                                       | t.morishita |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//        |           |            |                                                        |             |
//--------+-----------+------------+--------------------------------------------------------+-------------+


/*===============================================================================
INCLUDES AND VARIABLE DEFINITIONS
=============================================================================== */
#include "iautolog.h"
#include "errorlib.c"




// --------------------------------------------------------------
//			function prototypes
// --------------------------------------------------------------

static	int		IAUTOLOG_Initialization( int16  nSize, IShell  *pIShell,
												IModule  *pIModule, AutoLog  **ppData );
static  uint32	IAutoLog_AddRef( IAutoLog *p );
static	uint32	IAutoLog_Release( IAutoLog *p );
static	int		IAutoLog_MemoryCheck( IAutoLog  *p );
static	int		IAutoLog_Management( IAutoLog *p, const char *szFilename );
static	uint32	IAutoLog_FileWrite( IAutoLog *p, boolean Flag, const char *format, ... );
static	int		IAutoLog_Main( IAutoLog *p, IHtmlViewer *pIHTMLViewer, uint32 nCase );
static	int		IAutoLog_Debug( IAutoLog *p, IHtmlViewer *pIHTMLViewer, HViewNotify *pHViewNotify );
static	void	IAutoLog_GetParam( IAutoLog  *p, const char  *pszData, const char *element, char *pszBuffer, uint16  nBufSize );

// --------------------------------------------------------------
//	AEEClsCreateInstance :: インスタンスの作成
// --------------------------------------------------------------
int	AEEClsCreateInstance( AEECLSID  ClsId, IShell  *pIShell,
										IModule  *pIModule, void  **ppObj )
{
	AutoLog			*pAutoLog = NULL;
	*ppObj = NULL;


	if( ClsId == AEECLSID_IAUTOLOG )
	{
		if( AEE_SUCCESS != IAUTOLOG_Initialization( sizeof(AutoLog), pIShell, pIModule, (AutoLog**)ppObj ))
		{
			return EFAILED;
		}
	}

	// 汎用構造体の初期化処理
	pAutoLog = (AutoLog*)*ppObj;
	MEMSET( pAutoLog->szCreateName, 0x00, MIDDLE_BUFFER );
	MEMSET( pAutoLog->szFileName, 0x00, MIDDLE_BUFFER );


	return AEE_SUCCESS;
}


// --------------------------------------------------------------
//	IAUTOLOG_Initialization :: インタフェイス初期化処理
// --------------------------------------------------------------
static int IAUTOLOG_Initialization( int16  nSize, IShell  *pIShell,
											IModule  *pIModule, AutoLog  **ppData )
{
	AutoLog					*pAutoLog = NULL;
	AEEVTBL(IAutoLog)		*pIAutoLog;


	//	NULLチェック
	if( ( pIShell == NULL ) || ( pIModule == NULL ) || ( ppData == NULL ) )
	{
		return EFAILED;
	}

	//	作業用初期化
	*ppData = NULL;


	//	取得メモリサイズ
	if( nSize < sizeof( AutoLog ) )
	{
		nSize += sizeof( AutoLog ) ;
	}

	//	メモリ確保
	pAutoLog = (AutoLog *)MALLOC( nSize + sizeof(AEEVTBL(IAutoLog)) ) ;
	if( pAutoLog == NULL )
	{
		//	メモリ確保失敗
		return  ENOMEMORY ;
	}

	//	メンバ関数の先頭部にポインタを移動させる
	pIAutoLog = (IAutoLogVtbl *)( (byte *)pAutoLog + nSize ) ;


	//	メンバ関数の設定
	pIAutoLog->AddRef = IAutoLog_AddRef;
	pIAutoLog->Release = IAutoLog_Release;
	pIAutoLog->MemoryCheck = IAutoLog_MemoryCheck;
	pIAutoLog->Management = IAutoLog_Management;
	pIAutoLog->FileWrite = IAutoLog_FileWrite;
	pIAutoLog->Main = IAutoLog_Main;
	pIAutoLog->Debug = IAutoLog_Debug;
	pIAutoLog->ErrorCheck = IAutoLog_ErrorCheck;
	pIAutoLog->BTErrorCheck = IAutoLog_BTErrorCheck;
	pIAutoLog->KDDIErrorCheck = IAutoLog_KDDIErrorCheck;
	pIAutoLog->FILEErrorCheck = IAutoLog_FILEErrorCheck;
	pIAutoLog->AUTOErrorCheck = IAutoLog_AUTOErrorCheck;
	pIAutoLog->GetParam = IAutoLog_GetParam;

	
	//	テーブルの初期化
	INIT_VTBL( pAutoLog , IAutoLog, *pIAutoLog ) ;


	//	メンバ変数の初期化
	pAutoLog->m_nReferenceCount = 1 ;
	pAutoLog->aApplet.m_pIShell = pIShell ;
	ISHELL_AddRef( pAutoLog->aApplet.m_pIShell ) ;				//	新たな参照をする為インクリメントする
	pAutoLog->aApplet.m_pIModule = pIModule ;
	IMODULE_AddRef( pAutoLog->aApplet.m_pIModule ) ;
		
	//	受渡し
	*ppData = (AutoLog *)pAutoLog ;


	return  AEE_SUCCESS ;
}


// --------------------------------------------------------------
//	IAUTOLOG_AddRef :: 参照カウンタのインクリメント
// --------------------------------------------------------------
static  uint32  IAutoLog_AddRef( IAutoLog  *p )
{
	AutoLog			*pAutoLog = (AutoLog*) p ;


	return	pAutoLog->m_nReferenceCount++ ;

}

// --------------------------------------------------------------
//	IAUTOLOG_Release :: 参照カウンタのデクリメント
// --------------------------------------------------------------
static	uint32	IAutoLog_Release( IAutoLog  *p )
{
	AutoLog			*pAutoLog = (AutoLog*) p ;


	pAutoLog->m_nReferenceCount-- ;

	if( pAutoLog->m_nReferenceCount < 1 )
	{
		// IFileMgrのメモリー解放
		if( pAutoLog->m_pFileMgr != NULL )
		{
			IFILEMGR_Release( pAutoLog->m_pFileMgr );
			pAutoLog->m_pFileMgr = NULL;
		}

		// IFileのメモリー解放
		if( pAutoLog->m_pFile != NULL )
		{
			IFILE_Release( pAutoLog->m_pFile );
			pAutoLog->m_pFile = NULL;
		}
		//	メモリの解放
		ISHELL_Release( pAutoLog->aApplet.m_pIShell ) ;
		pAutoLog->aApplet.m_pIShell = NULL ;
		IMODULE_Release( pAutoLog->aApplet.m_pIModule ) ;
		pAutoLog->aApplet.m_pIModule = NULL ;

		FREE_VTBL( pAutoLog , IAutoLog ) ;
		FREE( pAutoLog ) ;

		return  0 ;
	}


	return  pAutoLog->m_nReferenceCount ;
}

//---------------------------------------------------------------------------
//	IAutoLog_MemoryCheck::ヒープメモリの空き容量チェック
//---------------------------------------------------------------------------
static int IAutoLog_MemoryCheck( IAutoLog  *p )
{
	AutoLog			*pAutoLog = (AutoLog*) p ;
	IHeap			*pIHeap = NULL;
	uint32			unUseSize = 0;
	int				nFreeSize = 0;
	AEEDeviceInfo	pi;


	MEMSET( &pi, 0x00, sizeof(AEEDeviceInfo));

	if( pAutoLog == NULL )
	{
		DBGPRINTF("IAutoLog NULL");
		return IAUTOLOG_EBADPARM;
	}
	if( SUCCESS != ISHELL_CreateInstance( pAutoLog->aApplet.m_pIShell , AEECLSID_HEAP , (void**)&pIHeap))	{
		DBGPRINTF("AEECLSID_HEAP CreateInstance Error");
		return IAUTOLOG_ECLASS;
	}

	ISHELL_GetDeviceInfo( pAutoLog->aApplet.m_pIShell, &pi );
	unUseSize = IHEAP_GetMemStats( pIHeap );
	nFreeSize = 100 - (( unUseSize * 100 ) / pi.dwRAM );
	// 空き容量が FREE_SIZE 以下の場合
	if( nFreeSize < FREE_SIZE )
	{
		DBGPRINTF("IAUTOLOG_ENOMEMORY");
		DBGPRINTF("MemSize :: %d", pi.dwRAM);
		DBGPRINTF("UseSize :: %d", unUseSize);
		return IAUTOLOG_ENOMEMORY;
	}

	// IHeapインタフェースの解放
	IHEAP_Release( pIHeap );
	pIHeap = NULL;

	return IAUTOLOG_SUCCESS;

}
//---------------------------------------------------------------------------
//	IAutoLog_Management::ログファイルの作成、及び作成環境の確認
//---------------------------------------------------------------------------
static int  IAutoLog_Management( IAutoLog  *p, const char *szFilename )
{
	AutoLog			*pAutoLog = (AutoLog*) p ;
	int				rc = 0;
	JulianType		JulianDate;


	MEMSET( &pAutoLog->szCreateName, 0x00, sizeof(SHORT_BUFFER));
	MEMSET( &pAutoLog->szFileName, 0x00, sizeof(SHORT_BUFFER));

	if( pAutoLog == NULL )
	{
		DBGPRINTF("IAutoLog NULL");
		return IAUTOLOG_EBADPARM;
	}
	if( pAutoLog->m_pFileMgr == NULL )
	{
		if( SUCCESS != ISHELL_CreateInstance( pAutoLog->aApplet.m_pIShell , AEECLSID_FILEMGR , (void**)&pAutoLog->m_pFileMgr))
		{
			DBGPRINTF("AEECLSID_FILEMGR CreateInstance Error");
			return IAUTOLOG_ECLASS;
		}
	}
	if( pAutoLog->m_pFile != NULL )
	{
		IFILE_Release( pAutoLog->m_pFile );	
		pAutoLog->m_pFile = NULL;
	}

	rc = IAutoLog_MemoryCheck( (IAutoLog*)pAutoLog );
	if( rc != IAUTOLOG_SUCCESS )
	{
		DBGPRINTF("IAutoLog_MemoryCheck Error");
		return rc;
	}

	//	ログファイルを入れるフォルダが存在するかのチェック
	if(	SUCCESS != IFILEMGR_Test( pAutoLog->m_pFileMgr, LOGDIRECTRY ))
	{
		if(SUCCESS != IFILEMGR_MkDir( pAutoLog->m_pFileMgr, LOGDIRECTRY ))
		{
			DBGPRINTF( "Logdirectory create error" );
			return IAUTOLOG_EDIRECTRY;
		}
	}
	// ログファイル数のチェック
	if( TRUE != IAutoLog_FileCheck( pAutoLog ))
	{
		DBGPRINTF( "IAutoLog_FileCheck Error" );
		return IAUTOLOG_EFAILED;
	}

	//現在時刻を取得
	MEMSET( &JulianDate, 0x00, sizeof(JulianType));
	GETJULIANDATE( 0, &JulianDate );
	// ファイル名の作成
	SPRINTF( pAutoLog->szCreateName, "log/%04d%02d%02d_%02d%02d%02d%s_log.txt",
									  JulianDate.wYear, 
									  JulianDate.wMonth , 
									  JulianDate.wDay , 
									  JulianDate.wHour , 
									  JulianDate.wMinute,
									  JulianDate.wSecond,
									  szFilename );

	//ログファイルの作成
	pAutoLog->m_pFile = IFILEMGR_OpenFile( pAutoLog->m_pFileMgr, pAutoLog->szCreateName, _OFM_CREATE );
	if( pAutoLog->m_pFile == NULL )
	{
		DBGPRINTF( "LOGFILE createInstance error" );
		return IAUTOLOG_EFILE;
	}



	// IFileのメモリー解放
	IFILE_Release( pAutoLog->m_pFile );
	pAutoLog->m_pFile = NULL;


	return IAUTOLOG_SUCCESS;
}


//---------------------------------------------------------------------------
//	WriteLog::ログの書込み
//---------------------------------------------------------------------------
static uint32  IAutoLog_FileWrite( IAutoLog  *p, boolean Flag, const char *pszFormat, ... )
{
	AutoLog			*pAutoLog = (AutoLog*) p ;
	char			*Logbuf = NULL;
	char			*Mesbuf = NULL;
	char			szbuf[SHORT_BUFFER] = "";
	int				LogSize = 0;
	uint32			WriteSize = 0;
	va_list			arg;
	JulianType		JulianDate;


	if( pAutoLog == NULL )				{	DBGPRINTF("IAutoLog NULL");				return WriteSize;	}
	if( pAutoLog->m_pFileMgr == NULL )	{	DBGPRINTF("IFILEMGR Instance NULL");	return WriteSize;	}
	
	LogSize = STRLEN( pszFormat );
	if( LogSize > 1023 ){	DBGPRINTF("Buffer FULL");	return WriteSize;	}

	//ログファイルの作成
	pAutoLog->m_pFile = IFILEMGR_OpenFile( pAutoLog->m_pFileMgr, pAutoLog->szCreateName, _OFM_APPEND );
	if( pAutoLog->m_pFile == NULL )
	{
		DBGPRINTF( "LOGFILE createInstance error" );
		return WriteSize;
	}

	
	// メモリの確保
	Logbuf = (char*)MALLOC( (LARGE_BUFFER * 2) + SHORT_BUFFER );
	Mesbuf = (char*)MALLOC( (LARGE_BUFFER * 2) + 1 );

	va_start( arg, pszFormat );
	VSPRINTF( Mesbuf, pszFormat, arg );
	va_end( arg );


	if( Flag == TRUE )
	{
		MEMSET( &JulianDate, 0x00, sizeof(JulianType));
		//現在時刻を取得
		GETJULIANDATE( 0, &JulianDate );
		// ファイル名の作成
		SPRINTF( Logbuf, "[%04d/%02d/%02d %02d:%02d:%02d]\t%s\n",
							 JulianDate.wYear , 
							 JulianDate.wMonth , 
							 JulianDate.wDay , 
							 JulianDate.wHour , 
							 JulianDate.wMinute,
							 JulianDate.wSecond,
							 Mesbuf);
	}
	else if( Flag == FALSE )
	{
		SPRINTF( Logbuf, "%s\n", Mesbuf );
	}
	else
	{
		DBGPRINTF( "Flag = NULL" );
		FREEIF( Logbuf );
		FREEIF( Mesbuf );
		return WriteSize;
	}

	// ログファイルの書込み
	LogSize = STRLEN( Logbuf );
	WriteSize = IFILE_Write( pAutoLog->m_pFile, Logbuf, LogSize );
	IAutoLog_FILEErrorCheck( (IAutoLog*)pAutoLog, pAutoLog->m_pFileMgr, szbuf, SHORT_BUFFER );
	if( 0 != STRCMP( szbuf, "SUCCESS" ))
	{
		DBGPRINTF( "LOGWRITE FAILED" );
		FREEIF( Logbuf );
		FREEIF( Mesbuf );
		return WriteSize;
	}	

	// IFileのメモリー解放
	if( pAutoLog->m_pFile != NULL )
	{
		IFILE_Release( pAutoLog->m_pFile );
		pAutoLog->m_pFile = NULL;
	}


	FREEIF( Logbuf );
	FREEIF( Mesbuf );
	return WriteSize;
 }

//---------------------------------------------------------------------------
//	Log_Main::Loggerによるログ出力処理のメイン画面
//---------------------------------------------------------------------------
static int  IAutoLog_Main( IAutoLog  *p, IHtmlViewer *pIHTMLViewer, uint32 nCase )
{
	AutoLog			*pAutoLog = (AutoLog*) p ;
	char			LogHtml[LARGE_BUFFER*4] = "";
	char			szBuf[MIDDLE_BUFFER] = "";
	char			LogName[LARGE_BUFFER*2] = "";
	int				ii;
	int				size = 0;
	FileInfo 		pInfo;


	if( pAutoLog == NULL )
	{
		DBGPRINTF("IAutoLog NULL");
		return IAUTOLOG_EBADPARM;
	}
	size = STRLEN( LOGDIRECTRY );
	if( pIHTMLViewer == NULL )
	{
		DBGPRINTF("IHtmlViewerIns NULL");
		return IAUTOLOG_EBADPARM;
	}

	if( pAutoLog->m_pFileMgr == NULL )
	{
		if( SUCCESS != ISHELL_CreateInstance( pAutoLog->aApplet.m_pIShell , AEECLSID_FILEMGR , (void**)&pAutoLog->m_pFileMgr))
		{
			DBGPRINTF("LogFILEMGR CreateInstance Error");
			return IAUTOLOG_ECLASS;
		}
	}
	if( pAutoLog->m_pFile != NULL )
	{
		IFILE_Release( pAutoLog->m_pFile );	
		pAutoLog->m_pFile = NULL;
	}

	if(	SUCCESS != IFILEMGR_Test( pAutoLog->m_pFileMgr, LOGDIRECTRY ))
	{
		STRCAT( LogHtml, "参照できるログが存在しません" );
		IHTMLVIEWER_ParseBuffer( pIHTMLViewer , LogHtml ) ;
		return IAUTOLOG_EDIRECTRY;
	}
	if( SUCCESS != IFILEMGR_EnumInit( pAutoLog->m_pFileMgr, LOGDIRECTRY, FALSE))
	{
		STRCAT( LogHtml, "参照できるログが存在しません" );
		IHTMLVIEWER_ParseBuffer( pIHTMLViewer , LogHtml ) ;
		return IAUTOLOG_EDIRECTRY;
	}
	for( ii = 0; ; ii++ )
	{
		MEMSET( &pInfo, 0x00, sizeof( FileInfo ));
		if( TRUE != IFILEMGR_EnumNext( pAutoLog->m_pFileMgr, &pInfo ))
		{
			ii--;
			break;
		}
		SPRINTF( szBuf, "<input type=radio name=\"FILE\"value=\"%s\">%s<br>"
					  ,	(pInfo.szName + size)
					  , (pInfo.szName + size)
				);
		STRCAT( LogName, szBuf );
	}

	if( ii < 0 )
	{
		STRCAT( LogHtml, "参照できるログが存在しません" );
		IHTMLVIEWER_ParseBuffer( pIHTMLViewer , LogHtml ) ;
		return IAUTOLOG_EFILE;
	}
	SPRINTF( LogHtml, "Brew Loggerを起動してください<br>"
					  "起動後、参照するログを選択し[START]ボタンを押下してください<br>"
					  "<form method=\"POST\" action=\"%u\">"
					  "<hr>"
					  "%s"
					  "<hr>"
					  "<input type=submit name=command value=START>"
					  "</form>"
					  "<br>"
					  , nCase
					  , LogName );

	IHTMLVIEWER_ParseBuffer( pIHTMLViewer, LogHtml ) ;
	return IAUTOLOG_SUCCESS;

}


//---------------------------------------------------------------------------
//	IAutoLog_Debug::Debugモードによるログの出力
//---------------------------------------------------------------------------
static int IAutoLog_Debug( IAutoLog *p, IHtmlViewer *pIHTMLViewer, HViewNotify *pHViewNotify )
{
	AutoLog			*pAutoLog = (AutoLog*) p ;
	char			szName[64] = "";
	char			szDBGHtml[MIDDLE_BUFFER] = "";
	FileInfo		pInfo; 


	if( pAutoLog == NULL )
	{
		DBGPRINTF("IAutoLog NULL");
		return IAUTOLOG_EBADPARM;
	}
	// 初期化処理(下準備)
	pAutoLog->pszReadBuf = NULL;
	pAutoLog->unReadSize = 0;
	MEMSET( &pInfo, 0x00, sizeof( FileInfo ));

	// 選択されたファイルの情報を取得
	IAutoLog_GetParam( (IAutoLog*)pAutoLog, pHViewNotify->u.submit.pszData, "FILE", pAutoLog->szFileName, SHORT_BUFFER );	
	if( *pAutoLog->szFileName == NULL )
	{
		DBGPRINTF( "pAutoLog->szFileName = NULL" );
		SPRINTF( szDBGHtml, "パラメータ不良です<br>" );
		IHTMLVIEWER_ParseBuffer( pIHTMLViewer , szDBGHtml ) ;
		return IAUTOLOG_EBADPARM;
	}

	
	// DBGするファイルのオープン
	SPRINTF( szName, "%s%s", LOGDIRECTRY, pAutoLog->szFileName );
	pAutoLog->m_pFile = IFILEMGR_OpenFile( pAutoLog->m_pFileMgr, szName, _OFM_READWRITE ) ;
	if( pAutoLog->m_pFile == NULL )
	{
		DBGPRINTF( "*** IFileInc_Null ***" );
		return IAUTOLOG_EFILE;
	}

	// DBGするファイルの情報を取得
	if( SUCCESS != IFILEMGR_GetInfo( pAutoLog->m_pFileMgr, szName, &pInfo ))
	{
		DBGPRINTF( "*** GetInfo_Error ***" );
		IFILE_Release( pAutoLog->m_pFile );	
		pAutoLog->m_pFile = NULL;
		return IAUTOLOG_EFILE;
	}

	// DBGするファイルのメモリを確保
	pAutoLog->pszReadBuf = (char *)MALLOC(( pInfo.dwSize + 1 ));
	// DBGするファイルの読込み
	pAutoLog->unReadSize = IFILE_Read( pAutoLog->m_pFile, (void *)pAutoLog->pszReadBuf, (pInfo.dwSize +1) );
	IFILE_Release( pAutoLog->m_pFile );	
	pAutoLog->m_pFile = NULL;
	// 読込み失敗なので...
	if( pAutoLog->unReadSize == 0 )
	{
		DBGPRINTF( "*** Read_Error ***" );
		FREE((void *) pAutoLog->pszReadBuf );
		return IAUTOLOG_EFILE;
	}

	// DBG出力処理の準備
	pAutoLog->pIHtmlViewer = pIHTMLViewer;
	pAutoLog->pszReadPoint = pAutoLog->pszReadBuf;
	DBGPRINTF( "" );
	DBGPRINTF( "**** LOG START ****" );

	// DBGする関数
	IAutoLog_DBGTimer( pAutoLog );

	
	return IAUTOLOG_SUCCESS;
}


//------------------------------------------------------------------------------------------
//		IAutoLog_GetParam :: 文字列の切り分け
//------------------------------------------------------------------------------------------
static void	IAutoLog_GetParam( IAutoLog  *p, const char  *pszData, const char *element, char *pszBuffer, uint16  nBufSize )
{

	//	作業用変数の定義
	AutoLog		*pAutoLog = (AutoLog*) p ;
	char		*pszWorkBuffer = NULL;		//	作業用バッファ
	char		*pWork ;					//	現在取得作業中位置を示すポインタ
	char		buf , buf2 ;				//	デコード用
	uint16		nLoopNum = 0 ;				//	ループ回数を示す変数

	//	NULL チェック
	if( pAutoLog == NULL )	{	DBGPRINTF( "GetElemParam::IAutoLog is null" );	return;	}
	if( pszData == NULL )	{	DBGPRINTF( "GetElemParam::pszData is null" );	return;	}
	if( element == NULL )	{	DBGPRINTF( "GetElemParam::element is null" );	return;	}
	if( pszBuffer == NULL )	{	DBGPRINTF( "GetElemParam::pszBuffer is null" );	return; }

	pszWorkBuffer = (char*)MALLOC( nBufSize + 1 );

	//	キーによる検索
	pWork = STRSTR( pszData , element ) ;
	if( pWork == NULL )	{	FREEIF( pszWorkBuffer );	return  ;	}

	//	区切り文字の位置を検索
	pWork = STRCHR( pWork , '=' ) ;
	if( pWork == NULL )	{	FREEIF( pszWorkBuffer );	return  ;	}

	//	終端文字までをコピーする
	pWork++ ;
	while( *pWork != '&' && *pWork != '\0' )
	{

		//	特殊文字の検出
		if( *pWork == '%' )
		{

			//	文字データの変換を行う
			pWork++ ;
			buf = *pWork ;
			if( ( 'A' <= buf ) && ( buf <= 'F' ) ){
				
				buf2 = buf - 'A' + 10 ;
			}
			else if( ( '0' <= buf ) && ( buf <= '9' ) )
			{

				buf2 = buf - '0' ;
			}
			else
			{

				buf2 = 0 ;
			}
			buf2 <<= 4 ;
			pWork++ ;
			buf = *pWork ;
			if( ( 'A' <= buf ) && ( buf <= 'F' ) )
			{

				buf2 += buf - 'A' + 10 ;
			}
			else if( ( '0' <= buf ) && ( buf <= '9' ) )
			{

				buf2 += buf - '0' ;
			}
			pszWorkBuffer[nLoopNum] = buf2 ;
		}
		else
		{

			//	そのまま代入
			pszWorkBuffer[nLoopNum] = *pWork ;
		}

		//	作業ポインタをインクリメント
		pWork++ ;
		nLoopNum++ ;
	}
	//	終端文字を挿入
	pszWorkBuffer[nLoopNum] = '\0' ;

	//	用意されたバッファに文字列を挿入
	if( nLoopNum >= nBufSize )
	{

		DBGPRINTF( "GetElemParam::unless buffer size(pszBuffer)" ) ;
		FREEIF( pszWorkBuffer );
		return ;
	}
	SPRINTF( pszBuffer , "%s" , pszWorkBuffer );
	FREEIF( pszWorkBuffer );

	return;
}






