/******************************************************************************* * 関数名称 :FTLCOM900_SplitChar * 文字列分割処理 *------------------------------------------------------------------------------ * 機能概要 :分解対象文字列を、キーワードで分割する(区切:対象文字を'\0'で * 上書き)。 * 分割した文字列の先頭ポインタを、分割アイテムポインタ配列に設定。 * 分割した文字列が以下の場合は、処理結果チェックエラーとし、出力 * パラメータにエラー内容を格納する。(格納値はdefine定義参照) * ・分割した文字列の個数が、iMaxCntより多い場合 * ・分割した文字列が、 iMaxLenより長い場合 * * パラメータ: char* pczInputText 分解対象文字列 * char* pczKeyWord キーワード。区切り文字群。 * 複数の区切り文字を指定することが可能 * 例) '?' と '/'と '!' で区切りたい場合 * ""?/!"" と指定する * int iMaxCnt 分解可能な最大件数(分割アイテム確保数) * int iMaxLen 分解文字列の最大長(指定なし:0) *int* piItemCnt 分割アイテム取得数 * char** pArray 分割アイテムポインタ配列 * 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;}