class LboxToken

  オブジェクトの作成と削除とトークンへのボインタ配列の作成



  
LboxDlg *Dlg;
LboxToken *Token;

LRESULT CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
	switch( message ) {
		case WM_INITDIALOG:
			Dlg = new LboxDlg( hDlg );
			Token = new LboxToken( );
			Token->CreateToken( "ABC,,漢字表示,,ZZZ", "," );
			Dlg->ListPrintf( IDC_LIST1, "<%s|%s|%s|%s|%s>",
				Token->Token[0],
				Token->Token[1],
				Token->Token[2],
				Token->Token[3],
				Token->Token[4] 
			);

			Token->CreateToken( ",,漢字表示,,", "," );
			Dlg->ListPrintf( IDC_LIST1, "<%s|%s|%s|%s|%s>",
				Token->Token[0],
				Token->Token[1],
				Token->Token[2],
				Token->Token[3],
				Token->Token[4] 
			);
			return TRUE;

		case WM_COMMAND:
			if( LOWORD(wParam) == IDCANCEL ) {
				Dlg->End( LOWORD(wParam) );
				delete Token;
				delete Dlg;
			}
			break;
	}
	return FALSE;
}
  



  コンストラクタ



  
// *********************************************************
// コンストラクタ
// *********************************************************
LboxToken::LboxToken()
{
	LboxToken::pszLboxToken = NULL;
	LboxToken::nMemSize = 0;
	LboxToken::Token = NULL;
	LboxToken::nCount = 0;
}

// *********************************************************
// デストラクタ
// *********************************************************
LboxToken::~LboxToken()
{
	if ( LboxToken::pszLboxToken != NULL ) {
		GlobalFree(
			(HGLOBAL)LboxToken::pszLboxToken
		);
		GlobalFree(
			(HGLOBAL)LboxToken::Token
		);
		LboxToken::pszLboxToken = NULL;
		LboxToken::nMemSize = 0;
		LboxToken::Token = NULL;
		LboxToken::nCount = 0;
	}
}
  



  CreateToken

  
// *********************************************************
// トークンを作成する
// 戻り値 : 無し
// *********************************************************
void LboxToken::CreateToken( LboxString *LString, LPCTSTR pszDelim )
{
	LboxToken::CreateToken( LString->szLboxString, pszDelim );
}
void LboxToken::CreateToken( LPCTSTR pszBuffer, LPCTSTR pszDelim )
{
	// トークン実体用メモリエリアの取得
	LboxToken::nMemSize = lstrlen( pszBuffer );
	if ( LboxToken::pszLboxToken != NULL ) {
		LboxToken::pszLboxToken = 
			(LPTSTR)GlobalReAlloc(
				(HGLOBAL)LboxToken::pszLboxToken,
				LboxToken::nMemSize + 128,
				GMEM_MOVEABLE
			);
		if ( LboxToken::pszLboxToken == NULL ) {
			LboxToken::pszLboxToken = NULL;
			LboxToken::nMemSize = 0;
			LboxToken::Token = NULL;
			LboxToken::nCount = 0;
			return;
		}
		ZeroMemory(
			LboxToken::pszLboxToken,
			LboxToken::nMemSize + 128
		);
	}
	else {
		LboxToken::pszLboxToken = 
			(LPTSTR)GlobalAlloc( GPTR, LboxToken::nMemSize + 128 );
		if ( LboxToken::pszLboxToken == NULL ) {
			return;
		}
		ZeroMemory(
			LboxToken::pszLboxToken,
			LboxToken::nMemSize + 128
		);
	}

	// 元文字列の保存
	lstrcpy( LboxToken::pszLboxToken, pszBuffer );

	LboxToken::nCount = 0;

	// トークン化と、トークン数の取得
	unsigned char *pszToken;
	pszToken = _mbstok(
		(unsigned char *)LboxToken::pszLboxToken,
		(const unsigned char *)pszDelim
	);
	while( pszToken != NULL ) {
		LboxToken::nCount++;
		pszToken = _mbstok( NULL, (const unsigned char *)pszDelim );
	}

	int i;
	if ( *(LboxToken::pszLboxToken) == *pszDelim ) {
		*(LboxToken::pszLboxToken) = 0x00;
	}
	for( i = 1; i < (int)(LboxToken::nMemSize); i++ ) {
		if ( *((LboxToken::pszLboxToken)+i) == *pszDelim ) {
			if ( *((LboxToken::pszLboxToken)+i-1) == 0x00 ) {
				*((LboxToken::pszLboxToken)+i) = 0x00;
				LboxToken::nCount++;
			}
		}
	}

	LboxToken::nCount = 0;
	for( i = 0; i < (int)(LboxToken::nMemSize); i++ ) {
		if ( *((LboxToken::pszLboxToken)+i) == 0x00 ) {
			LboxToken::nCount++;
		}
	}

	// インデックス用 ボインタ変数の配列エリア作成
	if ( LboxToken::Token != NULL ) {
		LboxToken::Token = 
			(LPTSTR *)GlobalReAlloc(
				(HGLOBAL)LboxToken::Token,
				((LboxToken::nCount)+10) * sizeof( LPTSTR ),
				GMEM_MOVEABLE
			);
	}
	else {
		LboxToken::Token =
			(LPTSTR *)GlobalAlloc(
				GMEM_FIXED, 
				((LboxToken::nCount)+10) * sizeof( LPTSTR )
			);
	}
	if ( LboxToken::Token == NULL ) {
		GlobalFree(
			(HGLOBAL)LboxToken::pszLboxToken
		);
		LboxToken::pszLboxToken = NULL;
		LboxToken::nMemSize = 0;
		LboxToken::Token = NULL;
		LboxToken::nCount = 0;
		return;
	}

	// インデックス作成
	BOOL bSetFlg;
	BOOL nPos;
	nPos = 1;

	LboxToken::Token[0] = LboxToken::pszLboxToken;
	if ( LboxToken::Token[0][0] == 0x00 || LboxToken::Token[0][0] == *pszDelim ) {
		LboxToken::Token[0][0] = 0x00;
		bSetFlg = false;
	}
	else {
		bSetFlg = true;
	}

	for( i = 1; i <= (int)(LboxToken::nMemSize); i++ ) {
		if ( *((LboxToken::pszLboxToken)+i) == 0x00 ) {
			bSetFlg = false;
			if ( *((LboxToken::pszLboxToken)+i-1) == 0x00 ) {
				LboxToken::Token[nPos] = 
					(LboxToken::pszLboxToken)+i;
				nPos++;
			}
		}
		else {
			if ( bSetFlg == false ) {
				bSetFlg = true;
				LboxToken::Token[nPos] = 
					(LboxToken::pszLboxToken)+i;
				nPos++;
			}
		}
	}
	LboxToken::nCount = nPos;
}
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ