/*******************************************************************************
* 関数名称 :FTLCOM900_SplitChar
* 文字列分割処理
*------------------------------------------------------------------------------
* 機能概要 :分解対象文字列を、キーワードで分割する(区切:対象文字を'\0'で
* 上書き)。
* 分割した文字列の先頭ポインタを、分割アイテムポインタ配列に設定。
* 分割した文字列が以下の場合は、処理結果チェックエラーとし、出力
* パラメータにエラー内容を格納する。(格納値はdefine定義参照)
* ・分割した文字列の個数が、iMaxCntより多い場合
* ・分割した文字列が、 iMaxLenより長い場合
*
* パラメータ:<I/O> char* pczInputText 分解対象文字列
* <I> char* pczKeyWord キーワード。区切り文字群。
* 複数の区切り文字を指定することが可能
* 例) '?' と '/'と '!' で区切りたい場合
* ""?/!"" と指定する
* <I> int iMaxCnt 分解可能な最大件数(分割アイテム確保数)
* <I> int iMaxLen 分解文字列の最大長(指定なし:0)
* <O> int* piItemCnt 分割アイテム取得数
* <O> char** pArray 分割アイテムポインタ配列
* <O> int* piErrDetail 処理結果エラー詳細情報
*
* リターン値:int FTL_RESULT_NORMAL 処理結果正常
* int FTL_RESULT_CHK_ERROR 処理結果チェックエラー
* int FTL_RESULT_SYSTEM_ERROR 処理結果異常(ロジックエラー)
******************************************************************************/
int SplitChar(char* pczInputText, char* pczKeyWord, int iMaxCnt, int iMaxLen, int* piItemCnt, char** pArray,
int* piErrDetail)
{
/* ローカル変数の宣言 */
int iCount = 0; /* ループカウンタ */
char czLog[FTL_LOG_MAX_LEN + 1]; /* ログ情報 */
char * pcTemp = NULL; /* 分解文字列のポインタ */
int iInputTextLen = 0; /* 分解文字列の長さ */
/* 分解対象文字列(pczInputText)がNULL場合 */
if ( NULL == pczInputText )
{
/* システムエラー(FTL_RESULT_SYSTEM_ERROR)を呼び出し元に返却する */
return FTL_RESULT_SYSTEM_ERROR;
}
/* キーワード(pczKeyWord)がNULL場合 */
if ( NULL == pczKeyWord )
{
/* システムエラー(FTL_RESULT_SYSTEM_ERROR)を呼び出し元に返却する */
return FTL_RESULT_SYSTEM_ERROR;
}
/* 分割アイテム取得数(piItemCnt) */
if ( NULL == piItemCnt )
{
/* システムエラー(FTL_RESULT_SYSTEM_ERROR)を呼び出し元に返却する */
return FTL_RESULT_SYSTEM_ERROR;
}
/* 分割アイテムポインタ配列(pArray)がNULL場合 */
if ( NULL == pArray )
{
/* システムエラー(FTL_RESULT_SYSTEM_ERROR)を呼び出し元に返却する */
return FTL_RESULT_SYSTEM_ERROR;
}
/* 処理結果エラー詳細情報(piErrDetail)がNULLの場合 */
if ( NULL == piErrDetail )
{
/* システムエラー(FTL_RESULT_SYSTEM_ERROR)を呼び出し元に返却する */
return FTL_RESULT_SYSTEM_ERROR;
}
/* FT_IC_MODULE デバッグログ使用 start */
/* ローカル変数を初期化する */
iInputTextLen = (int)strlen(pczInputText);
/* FT_IC_MODULE デバッグログ使用 end */
/* 分解文字列のポインタ(pcTemp)にpczInputTextを設定する */
pcTemp = pczInputText;
/* ループ条件:分解文字列(pcTemp)がNULL以外の場合、分割アイテムポインタ配列の設定処理を行う */
while ( 1 == 1 )
{
/* 分割アイテム(pArray[iCount])にpcTempを設定する */
pArray[iCount] = pcTemp;
/* 分解文字列取得 */
pcTemp = strpbrk(pArray[iCount], pczKeyWord);
/* 分解文字列(pcTemp)がNULLの場合 */
if ( NULL == pcTemp )
{
/* 分割アイテムポインタ配列の設定処理のLoopを抜ける */
break;
}
/* 分解文字列(pcTemp[0])に0x00を設定する */
pcTemp[0] = '\0';
/* 分解文字列(pcTemp)にpcTemp + 1を設定する */
pcTemp += 1;
/* ループカウンタ(iCount)にiCount + 1を設定する */
iCount++;
}
/* 分割アイテム取得数設定する */
*piItemCnt = iCount + 1;
/* 分割アイテム取得数 > 分解可能な最大件数場合 */
if ( *piItemCnt > iMaxCnt )
{
/* 処理結果エラー詳細情報(*piErrDetail)を
* FTLCOM900_SPLITCHAR_ERR_CNTに設定する */
*piErrDetail = FTLCOM900_SPLITCHAR_ERR_CNT;
/* チェックエラー(FTL_RESULT_CHK_ERROR)を呼び出し元に返却する */
return FTL_RESULT_CHK_ERROR;
}
/* 分解文字列の最大長チェック要否判定処理を行う
* 引数: 分解文字列の最大長(iMaxLen) != FTLCOM900_SPLITCHAR_NOT_CHECK_MAXLENの場合 */
if ( FTLCOM900_SPLITCHAR_NOT_CHECK_MAXLEN != iMaxLen )
{
/* ループ条件:ループカウンタが*piItemCntになるまで
* 分解文字列の最大長チェック処理を行う */
for ( iCount = 0; iCount < *piItemCnt; iCount++ )
{
/* 分解文字列の最大長(iMaxLen) < strlen(pArray[iCount])の場合 */
if ( iMaxLen < (int)strlen(pArray[iCount]) )
{
/* 処理結果エラー詳細情報(*piErrDetail)を
* FTLCOM900_SPLITCHAR_ERR_LENに設定する */
*piErrDetail = FTLCOM900_SPLITCHAR_ERR_LEN;
/* チェックエラー(FTL_RESULT_CHK_ERROR)を呼び出し元に返却する */
return FTL_RESULT_CHK_ERROR;
}
}
}
/* 処理結果エラー詳細情報(*piErrDetail)をFTLCOM900_SPLITCHAR_OKに設定する */
*piErrDetail = FTLCOM900_SPLITCHAR_OK;
/* 正常終了(FTL_RESULT_NORMAL)を呼び出し元に返却する */
return FTL_RESULT_NORMAL;
}