|
// *********************************************************
// トークンを作成する
// 戻り値 : 無し
// *********************************************************
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;
}
| |