www.pudn.com > hos-v4_os.rar > hos4cfg.cpp


// --------------------------------------------------------------------------- 
//  Hyper Operating System V4  コンフィギュレーター                            
//    メインルーチン                                                           
//                                                                             
//                                    Copyright (C) 1998-2002 by Project HOS   
//                                    http://sourceforge.jp/projects/hos/      
// --------------------------------------------------------------------------- 
 
 
#include  
#include  
#include  
#include "defercd.h" 
#include "read.h" 
#include "analyze.h" 
#include "apiinc.h" 
#include "idlstk.h" 
#include "intstk.h" 
#include "knlheap.h" 
#include "timtic.h" 
#include "maxtpri.h" 
#include "cretsk.h" 
#include "deftex.h" 
#include "cresem.h" 
#include "creflg.h" 
#include "credtq.h" 
#include "crembx.h" 
#include "crembf.h" 
#include "crempf.h" 
#include "crecyc.h" 
#include "crealm.h" 
#include "attisr.h" 
#include "attini.h" 
#include "defexc.h" 
 
 
#define DEFAULT_INPUTFILE		"system.i" 
#define DEFAULT_IDFILE			"kernel_id.h" 
#define DEFAULT_CFGFILE			"kernel_cfg.c" 
 
 
int  ReadConfigFile(FILE* fpConfig);	// コンフィギュレーションファイル読み込み 
void WriteIdFile(FILE* fp);				// ID 定義ヘッダファイル出力 
void WriteCfgFile(FILE* fp);			// C 言語ソース出力 
void PrintUsage(void); 
 
 
CApiInclude    g_ApiInclude; 
CApiIdleStack  g_ApiIdleStack; 
CApiMaxTpri    g_ApiMaxTpri; 
CApiIntStack   g_IntStack; 
CApiKernelHeap g_ApiKernelHeap; 
CApiTimTic     g_ApiTimTic; 
CApiCreTsk     g_ApiCreTsk; 
CApiDefTex     g_ApiDefTex; 
CApiCreSem     g_ApiCreSem; 
CApiCreFlg     g_ApiCreFlg; 
CApiCreDtq     g_ApiCreDtq; 
CApiCreMbx     g_ApiCreMbx; 
CApiCreMbf     g_ApiCreMbf; 
CApiCreMpf     g_ApiCreMpf; 
CApiCreCyc     g_ApiCreCyc; 
CApiCreAlm     g_ApiCreAlm; 
CApiAttIsr     g_ApiAttIsr; 
CApiAttIni     g_ApiAttIni; 
CApiDefExc     g_ApiDefExc; 
 
static const char *s_szPhysicalInputFile  = NULL; 
static const char *s_szIdFile             = DEFAULT_IDFILE; 
static const char *s_szCfgFile            = DEFAULT_CFGFILE; 
 
// API定義リスト 
static CApiDef* g_ApiList[] = 
	{ 
		&g_ApiInclude, 
		&g_ApiIdleStack, 
		&g_ApiMaxTpri, 
		&g_IntStack, 
		&g_ApiKernelHeap, 
		&g_ApiTimTic, 
		&g_ApiCreTsk, 
		&g_ApiDefTex, 
		&g_ApiCreSem, 
		&g_ApiCreFlg, 
		&g_ApiCreDtq, 
		&g_ApiCreMbx, 
		&g_ApiCreMbf, 
		&g_ApiCreMpf, 
		&g_ApiCreCyc, 
		&g_ApiCreAlm, 
		&g_ApiAttIsr, 
		&g_ApiAttIni, 
		&g_ApiDefExc, 
	}; 
 
#define API_COUNT	(sizeof(g_ApiList) / sizeof(CApiDef*))		// API個数 
 
 
 
 
// メイン関数 
int main(int argc, char *argv[]) 
{ 
	FILE* fpInput; 
	FILE* fpCfg; 
	FILE* fpId; 
	int  iErr; 
	int  i; 
 
	// コマンドライン解析 
	for ( i = 1; i < argc; i++ ) 
	{ 
		if ( strcmp(argv[i], "-c") == 0 ) 
		{ 
			i++; 
			if ( i >= argc ) 
			{ 
				fprintf(stderr, "option error \"-c\"\n"); 
                               PrintUsage(); 
				return 1; 
			} 
			s_szCfgFile = argv[i]; 
		} 
		else if ( strcmp(argv[i], "-i") == 0 ) 
		{ 
			i++; 
			if ( i >= argc ) 
			{ 
				fprintf(stderr, "option error \"-i\"\n"); 
                               PrintUsage(); 
				return 1; 
			} 
			s_szIdFile = argv[i]; 
		} 
               else if ( strcmp(argv[i], "-help") == 0 ) 
               { 
                       PrintUsage(); 
                       return 0; 
               } 
               else if ( argv[i][0] == '-' && argv[i][1] != '\0' ) 
               { 
                       fprintf(stderr, "unknown option \"%s\"\n", argv[i]); 
                       PrintUsage(); 
                       return 1; 
               } 
		else 
		{ 
			if ( s_szPhysicalInputFile != NULL ) 
			{ 
				fprintf(stderr, "too many input files\n"); 
				PrintUsage(); 
				return 1; 
			} 
			s_szPhysicalInputFile = argv[i]; 
		} 
	} 
 
	// 入力ファイル省略時のデフォルト設定 
	if ( s_szPhysicalInputFile == NULL ) 
	{ 
		s_szPhysicalInputFile = DEFAULT_INPUTFILE; 
	} 
 
	// 入力ファイルオープン 
	if ( strcmp(s_szPhysicalInputFile, "-") == 0) { 
		s_szPhysicalInputFile = "stdin"; 
		fpInput = stdin; 
	} 
	else if ( (fpInput = fopen(s_szPhysicalInputFile, "r")) == NULL ) 
	{ 
               fprintf(stderr, "could not open file \"%s\"\n", s_szPhysicalInputFile); 
		return 1; 
	} 
	 
	// コンフィギュレーションファイル読み込み 
	iErr = ReadConfigFile(fpInput) != 0; 
	fclose(fpInput); 
	if ( iErr != 0 ) 
	{ 
		return 1; 
	} 
 
	// 自動ID番号割り当て 
	for ( i = 0; i < API_COUNT; i++ ) 
	{ 
		g_ApiList[i]->AutoId(); 
	} 
 
	// ID 定義ファイルオープン 
	if ( (fpId = fopen(s_szIdFile, "w")) == NULL ) 
	{ 
               fprintf(stderr, "could not open file \"%s\"\n", s_szIdFile); 
		return 1; 
	} 
 
	WriteIdFile(fpId); 
 
	fclose(fpId); 
 
 
	// Cfgファイルオープン 
	if ( (fpCfg = fopen(s_szCfgFile, "w")) == NULL ) 
	{ 
               fprintf(stderr, "could not open file \"%s\"\n", s_szCfgFile); 
		return 1; 
	} 
 
	WriteCfgFile(fpCfg); 
 
	fclose(fpCfg); 
 
	return 0; 
} 
 
 
// コンフィギュレーションファイル読み込み 
int ReadConfigFile(FILE* fpConfig) 
{ 
	char szState[READ_MAX_STATE]; 
	char szApiName[READ_MAX_STATE]; 
	char szParams[READ_MAX_STATE]; 
	int  iErr; 
	int  i; 
 
	CRead read(fpConfig, s_szPhysicalInputFile);	// 読み出しオブジェクト生成 
 
	// 読み込み 
	while (	(iErr = read.ReadState(szState)) != CFG_ERR_COMPLETE ) 
	{ 
		// 読み込みエラーチェック 
		if ( iErr != CFG_ERR_OK ) 
		{ 
                       fprintf(stderr, "%s line(%d) : %s\n", 
					read.GetLogicalInputFile(), 
					read.GetLogicalLineNum(), GetErrMessage(iErr)); 
			return 1; 
		} 
 
		// 構文解析 
		iErr = CAnalyze::SplitState(szApiName, szParams, szState); 
		if ( iErr != CFG_ERR_OK ) 
		{ 
                       fprintf(stderr, "%s line(%d) : %s\n", 
					read.GetLogicalInputFile(), 
					read.GetLogicalLineNum(), GetErrMessage(iErr)); 
			return 1; 
		} 
		CAnalyze::SpaceCut(szApiName); 
		CAnalyze::SpaceCut(szParams); 
 
		// API検索 
		iErr = CFG_ERR_SYNTAX; 
		for ( i = 0; i < API_COUNT; i++ ) 
		{ 
			iErr = g_ApiList[i]->AnalyzeApi(szApiName, szParams); 
			if ( iErr != CFG_ERR_NOPROC ) 
			{ 
				break; 
			} 
		} 
		if ( iErr != CFG_ERR_OK ) 
		{ 
                       fprintf(stderr, "%s line(%d) : %s\n", 
					read.GetLogicalInputFile(), 
					read.GetLogicalLineNum(), GetErrMessage(iErr)); 
			return 1; 
		} 
	} 
 
	return 0; 
} 
 
 
// ID定義ヘッダファイル出力 
void WriteIdFile(FILE* fp) 
{ 
	int i; 
 
	/* ヘッダ出力 */ 
	fputs( 
		"/* ------------------------------------------------------------------------ */\n" 
		"/*  HOS-V4  kernel configuration                                            */\n" 
		"/*    kernel object ID definition                                           */\n" 
		"/*                                                                          */\n" 
		"/* ------------------------------------------------------------------------ */\n" 
		"\n\n" 
		"#ifndef __HOS_V4__kernel_cfg_h__\n" 
		"#define __HOS_V4__kernel_cfg_h__\n" 
		"\n" 
		, fp); 
 
	// ID 定義ファイル出力 
	for ( i = 0; i < API_COUNT; i++ ) 
	{ 
		g_ApiList[i]->WriteId(fp); 
	} 
 
	// フッタ出力 
	fputs( 
		"\n\n\n" 
		"#endif\t/* __HOS_V4__kernel_cfg_h__ */\n" 
		"\n\n" 
		"/* ------------------------------------------------------------------------ */\n" 
		"/*  End of file                                                             */\n" 
		"/* ------------------------------------------------------------------------ */\n" 
		, fp); 
} 
 
 
// C 言語ソース出力 
void WriteCfgFile(FILE* fp) 
{ 
	int i; 
 
	/* ヘッダ出力 */ 
	fprintf( 
		fp, 
		"/* ------------------------------------------------------------------------ */\n" 
		"/*  HOS-V4  kernel configuration                                            */\n" 
		"/*    kernel object create and initialize                                   */\n" 
		"/*                                                                          */\n" 
		"/* ------------------------------------------------------------------------ */\n" 
		"\n\n" 
		"#include \"kernel.h\"\n" 
		"#include \"%s\"\n" 
		, s_szIdFile); 
 
	// ID 定義ファイル出力 
	for ( i = 0; i < API_COUNT; i++ ) 
	{ 
		g_ApiList[i]->WriteCfgDef(fp); 
	} 
 
	// 初期化関数コメント出力 
	fputs( 
		"\n\n\n" 
		"/* ------------------------------------------ */\n" 
		"/*          initialize functions              */\n" 
		"/* ------------------------------------------ */\n", 
		fp); 
 
	// 初期化関数出力 
	fputs( 
		"\n/* object initialize */\n" 
		"void kernel_cfg_init(void)\n" 
		"{\n" 
		"\tint i;\n", 
		fp); 
	for ( i = 0; i < API_COUNT; i++ ) 
	{ 
		g_ApiList[i]->WriteCfgIni(fp); 
	} 
	fputs("}\n", fp); 
 
	// 初期化関数出力 
	fputs( 
		"\n/* start up */\n" 
		"void kernel_cfg_start(void)\n" 
		"{\n", 
		fp); 
	for ( i = 0; i < API_COUNT; i++ ) 
	{ 
		g_ApiList[i]->WriteCfgStart(fp); 
	} 
	fputs("}\n", fp); 
 
	// フッタ出力 
	fputs( 
		"\n\n" 
		"/* ------------------------------------------------------------------------ */\n" 
		"/*  End of file                                                             */\n" 
		"/* ------------------------------------------------------------------------ */\n" 
		, fp); 
} 
 
// 使い方表示 
void PrintUsage(void) 
{ 
       fprintf(stderr, 
               "usage: hos4cfg [options] [input-file]\n" 
               "options are:\n" 
               "   -i FILE    specify auto-assginment headerfile (default: " DEFAULT_IDFILE ")\n" 
               "   -c FILE    specify kernel configuration file  (default: " DEFAULT_CFGFILE ")\n" 
               "   -help      show this help\n" 
               "\n" 
               "input-file (default: " DEFAULT_INPUTFILE ")\n"); 
} 
 
 
// --------------------------------------------------------------------------- 
//  Copyright (C) 1998-2002 by Project HOS                                     
// ---------------------------------------------------------------------------