/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 【機能概要】 : 共有メモリ定義ファイル解析API 共有メモリ定義ファイルの記述内容を解析して、呼び元プログラム に内容を返却する 【作成日】 : 2021.04.23 【呼出形式】 : GG_SHM1002 ( char ShmMng_ID[][32] # 共有メモリグループ名称返却領域 ,int iShmId_A_ID[] # 共有メモリID(A面)返却領域 ,int iShmId_B_ID[] # 共有メモリID(B面)返却領域 ,int iShmId_Len[] # 共有メモリサイズ返却領域 ) 【戻り値】 : int # 0 : 正常終了、-1 : 異常終了 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */ #include #include #include #include #include "GG_SHMCOM.h" int GG_SHM1002 ( char ShmMng_ID[][32], int iShmId_A_ID[] , int iShmId_B_ID[], int iShmId_Len[] ) { char cEnvString [ MAX_PATH ] ; // 共有メモリ定義ファイル名称 struct stat stat_buf ; // stat 関数情報領域 char szAccessDate [ 30 ] ; // YYYY/MM/DD HH:MM:SS.mmmmmm char ShmDefLineWk [ GG_SHM1001_SHMIDNUM + 1 ][ 512 ] ; // ShmDef ファイルの一時格納領域 char szLogFileTmpPath [ MAX_PATH ] ; // ログファイル一時名称 char szLogFilePath [ MAX_PATH ] ; // ログファイル名 // ログ出力場所の決定 getEnvString (szLogFileTmpPath,"GG_LogFileName",GG_SHM1001_LOGPATH,sizeof(szLogFileTmpPath)); getLocalTimeString(szLogFilePath,sizeof(szLogFilePath),szLogFileTmpPath); // 共有メモリ定義ファイルの取得 getEnvString(cEnvString,"GG_SHMID_MNGFILE",GG_SHM1002_SHMDEF,sizeof(cEnvString)) ; // 共有メモリ定義ファイルのサイズチェック if ( stat ( cEnvString, &stat_buf ) != 0 ) { getLocalTimeString ( szAccessDate,sizeof(szAccessDate),"%Y/%m/%d %H:%M:%S.%U" ) ; GG_MsgOut ( szLogFilePath , 1 , "**** ( %s ) **** GG_SHM1002 ShmMngDef ファイルのstat失敗 [ %s ] ****" , szAccessDate , cEnvString ) ; printf ( "Usage : GG_SHM1002 ファイルのstat失敗 [ %s ]\n" , cEnvString ) ; return (-1); } char *ShmDefChar = (char *)malloc ( stat_buf.st_size + 1 ) ; // 共有メモリ定義ファイルのデータ読み込み FILE *ShmMngDef = fopen ( cEnvString , "r" ) ; fread ( ShmDefChar , 1 , stat_buf.st_size + 1 , ShmMngDef ) ; ShmDefChar [ stat_buf.st_size ] = '\0' ; fclose ( ShmMngDef ) ; int i , j , k ; // ファイル内容の分解 char *ShmDefLinePtr = strtok( ShmDefChar , "\n" ); for ( i = 0 ; ShmDefLinePtr != NULL ; i++ ) { strcpy ( ShmDefLineWk[i] , ShmDefLinePtr ) ; if ( ShmDefLineWk[i][strlen(ShmDefLinePtr)] == '\r' ) ShmDefLineWk[i][strlen(ShmDefLinePtr)] = '\0' ; if ( strlen(ShmDefLineWk[i]) == 0 ) i-- ; ShmDefLinePtr = strtok( NULL , "\n" ); } ShmDefLineWk[i][0] = '\0' ; // ファイル内容の分析と返却領域への設定 for( i = 0 , k = 0 ; ShmDefLineWk[i][0] != '\0' ; i++ ) { if ( ShmDefLineWk[i][0] == ';' ) continue ; char *ShmDefColumnWk = strtok( ShmDefLineWk[i] , "," ); for( j=0 ; ShmDefColumnWk != NULL ; j++ ) { switch (j) { case 0: strcpy ( ShmMng_ID[k] , ShmDefColumnWk ) ; // 共有メモリグループ名称 break ; case 1: iShmId_A_ID[k] = atoi ( ShmDefColumnWk ) ; // 共有メモリID(A面) break ; case 2: iShmId_B_ID[k] = atoi ( ShmDefColumnWk ) ; // 共有メモリID(B面) break ; case 3: iShmId_Len[k] = atoi ( ShmDefColumnWk ) ; // 共有メモリサイズ break ; default: j = -1 ; } if ( j == -1 ) break ; ShmDefColumnWk = strtok( NULL , "," ) ; } k ++ ; } ShmMng_ID[k][0] = '\0' ; return (0) ; }