/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

	【機能概要】	: 共有メモリ定義ファイル解析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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>

#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) ;
}
