OSDN Git Service

(none)
[hos/hos-v4a.git] / cfgrtr / source / h4acfg.cpp
1 /**
2  *  Hyper Operating System V4 Advance Configurator
3  *
4  * @file  hos4cfg.cpp
5  * @brief %jp{メインルーチン}%en{main}
6  *
7  * Copyright (C) 1998-2006 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include "readcfg.h"
16 #include "defercd.h"
17 #include "read.h"
18 #include "analyze.h"
19 #include "apiinc.h"
20 #include "dpcque.h"
21 #include "idlstk.h"
22 #include "intstk.h"
23 #include "knlheap.h"
24 #include "maxtpri.h"
25 #include "cretsk.h"
26 #include "deftex.h"
27 #include "cresem.h"
28 #include "creflg.h"
29 #include "credtq.h"
30 #include "crembx.h"
31 #include "cremtx.h"
32 #include "crembf.h"
33 #include "crempf.h"
34 #include "timtic.h"
35 #include "crecyc.h"
36 #include "crealm.h"
37 #include "definh.h"
38 #include "attisr.h"
39 #include "attini.h"
40 #include "defexc.h"
41
42
43 #define DEFAULT_INPUTFILE               "system.i"
44 #define DEFAULT_IDFILE                  "kernel_id.h"
45 #define DEFAULT_CFGFILE                 "kernel_cfg.c"
46
47
48 int  ReadConfigFile(FILE* fpConfig);    // コンフィギュレーションファイル読み込み
49 void WriteIdFile(FILE* fp);                             // ID 定義ヘッダファイル出力
50 void WriteCfgFile(FILE* fp);                    // C 言語ソース出力
51 void PrintUsage(void);
52
53
54 CApiInclude    g_ApiInclude;
55 CApiKernelHeap g_ApiKernelHeap;
56 CApiDpcQue     g_ApiDpcQue;
57 CApiIdleStack  g_ApiIdleStack;
58 CApiMaxTpri    g_ApiMaxTpri;
59 CApiIntStack   g_IntStack;
60 CApiCreTsk     g_ApiCreTsk;
61 CApiDefTex     g_ApiDefTex;
62 CApiCreSem     g_ApiCreSem;
63 CApiCreFlg     g_ApiCreFlg;
64 CApiCreDtq     g_ApiCreDtq;
65 CApiCreMbx     g_ApiCreMbx;
66 CApiCreMtx     g_ApiCreMtx;
67 CApiCreMbf     g_ApiCreMbf;
68 CApiCreMpf     g_ApiCreMpf;
69 CApiTimTic     g_ApiTimTic;
70 CApiCreCyc     g_ApiCreCyc;
71 CApiCreAlm     g_ApiCreAlm;
72 CApiDefInh     g_ApiDefInh;
73 CApiAttIsr     g_ApiAttIsr;
74 CApiAttIni     g_ApiAttIni;
75 CApiDefExc     g_ApiDefExc;
76
77 static const char *s_szPhysicalInputFile  = NULL;
78 static const char *s_szIdFile             = DEFAULT_IDFILE;
79 static const char *s_szCfgFile            = DEFAULT_CFGFILE;
80
81 // API定義リスト
82 static CApiDef* g_ApiList[] =
83         {
84                 &g_ApiInclude,
85                 &g_ApiKernelHeap,
86                 &g_ApiDpcQue,
87                 &g_ApiIdleStack,
88                 &g_IntStack,
89                 &g_ApiCreTsk,
90 //              &g_ApiDefTex,
91                 &g_ApiCreSem,
92                 &g_ApiCreFlg,
93                 &g_ApiCreDtq,
94                 &g_ApiCreMbx,
95                 &g_ApiCreMtx,
96 //              &g_ApiCreMbf,
97                 &g_ApiCreMpf,
98                 &g_ApiTimTic,
99                 &g_ApiCreCyc,
100 //              &g_ApiCreAlm,
101                 &g_ApiDefInh,
102                 &g_ApiAttIsr,
103                 &g_ApiAttIni,
104 //              &g_ApiDefExc,
105         };
106
107 #define API_COUNT       ((int)(sizeof(g_ApiList) / sizeof(CApiDef*)))           // API個数
108
109
110
111
112 // メイン関数
113 int main(int argc, char *argv[])
114 {
115         FILE* fpInput;
116         FILE* fpCfg;
117         FILE* fpId;
118         int  iErr;
119         int  i;
120
121         // コマンドライン解析
122         for ( i = 1; i < argc; i++ )
123         {
124                 if ( strcmp(argv[i], "-c") == 0 )
125                 {
126                         i++;
127                         if ( i >= argc )
128                         {
129                                 fprintf(stderr, "option error \"-c\"\n");
130                                 PrintUsage();
131                                 return 1;
132                         }
133                         s_szCfgFile = argv[i];
134                 }
135                 else if ( strcmp(argv[i], "-i") == 0 )
136                 {
137                         i++;
138                         if ( i >= argc )
139                         {
140                                 fprintf(stderr, "option error \"-i\"\n");
141                                 PrintUsage();
142                                 return 1;
143                         }
144                         s_szIdFile = argv[i];
145                 }
146                 else if ( strcmp(argv[i], "-help") == 0 )
147                 {
148                         PrintUsage();
149                         return 0;
150                 }
151                 else if ( argv[i][0] == '-' && argv[i][1] != '\0' )
152                 {
153                         fprintf(stderr, "unknown option \"%s\"\n", argv[i]);
154                         PrintUsage();
155                         return 1;
156                 }
157                 else
158                 {
159                         if ( s_szPhysicalInputFile != NULL )
160                         {
161                                 fprintf(stderr, "too many input files\n");
162                                 PrintUsage();
163                                 return 1;
164                         }
165                         s_szPhysicalInputFile = argv[i];
166                 }
167         }
168
169         // 入力ファイル省略時のデフォルト設定
170         if ( s_szPhysicalInputFile == NULL )
171         {
172                 s_szPhysicalInputFile = DEFAULT_INPUTFILE;
173         }
174
175         // 入力ファイルオープン
176         if ( strcmp(s_szPhysicalInputFile, "-") == 0) {
177                 s_szPhysicalInputFile = "stdin";
178                 fpInput = stdin;
179         }
180         else if ( (fpInput = fopen(s_szPhysicalInputFile, "r")) == NULL )
181         {
182                fprintf(stderr, "could not open file \"%s\"\n", s_szPhysicalInputFile);
183                 return 1;
184         }
185         
186         // コンフィギュレーションファイル読み込み
187         iErr = ReadConfigFile(fpInput) != 0;
188         fclose(fpInput);
189         if ( iErr != 0 )
190         {
191                 return 1;
192         }
193
194         // 自動ID番号割り当て
195         for ( i = 0; i < API_COUNT; i++ )
196         {
197                 g_ApiList[i]->AutoId();
198         }
199
200         // ID 定義ファイルオープン
201         if ( (fpId = fopen(s_szIdFile, "w")) == NULL )
202         {
203                fprintf(stderr, "could not open file \"%s\"\n", s_szIdFile);
204                 return 1;
205         }
206
207         WriteIdFile(fpId);
208
209         fclose(fpId);
210
211
212         // Cfgファイルオープン
213         if ( (fpCfg = fopen(s_szCfgFile, "w")) == NULL )
214         {
215                fprintf(stderr, "could not open file \"%s\"\n", s_szCfgFile);
216                 return 1;
217         }
218
219         WriteCfgFile(fpCfg);
220
221         fclose(fpCfg);
222
223         return 0;
224 }
225
226
227 // コンフィギュレーションファイル読み込み
228 int ReadConfigFile(FILE* fpConfig)
229 {
230         char szState[READ_MAX_STATE];
231         char szApiName[READ_MAX_STATE];
232         char szParams[READ_MAX_STATE];
233         int  iErr;
234         int  i;
235
236         CRead read(fpConfig, s_szPhysicalInputFile);    // 読み出しオブジェクト生成
237
238         // 読み込み
239         while ( (iErr = read.ReadState(szState)) != CFG_ERR_COMPLETE )
240         {
241                 // 読み込みエラーチェック
242                 if ( iErr != CFG_ERR_OK )
243                 {
244                         fprintf(stderr, "%s line(%d) : %s\n",
245                                 read.GetLogicalInputFile(),
246                                 read.GetLogicalLineNum(), GetErrMessage(iErr));
247                         return 1;
248                 }
249                 
250                 // 構文解析
251                 iErr = CAnalyze::SplitState(szApiName, szParams, szState);
252                 if ( iErr != CFG_ERR_OK )
253                 {
254                         fprintf(stderr, "%s line(%d) : %s\n",
255                                 read.GetLogicalInputFile(),
256                                 read.GetLogicalLineNum(), GetErrMessage(iErr));
257                         return 1;
258                 }
259                 CAnalyze::SpaceCut(szApiName);
260                 CAnalyze::SpaceCut(szParams);
261
262                 // API検索
263                 iErr = CFG_ERR_SYNTAX;
264                 for ( i = 0; i < API_COUNT; i++ )
265                 {
266                         iErr = g_ApiList[i]->AnalyzeApi(szApiName, szParams);
267                         if ( iErr != CFG_ERR_NOPROC )
268                         {
269                                 break;
270                         }
271                 }
272                 if ( iErr != CFG_ERR_OK )
273                 {
274                         if ( iErr != CFG_ERR_NOPROC )
275                         {
276                                 fprintf(stderr, "%s line(%d) : %s\n",
277                                                 read.GetLogicalInputFile(),
278                                                 read.GetLogicalLineNum(), GetErrMessage(iErr));
279                                 return 1;
280                         }
281                         else
282                         {
283                                 fprintf(stderr, "%s line(%d) : Warning!  Ignore unknown API(%s)\n",
284                                                 read.GetLogicalInputFile(),
285                                                 read.GetLogicalLineNum(),
286                                                 szApiName);
287                         }
288                 }
289         }
290
291         return 0;
292 }
293
294
295 // ID定義ヘッダファイル出力
296 void WriteIdFile(FILE* fp)
297 {
298         int i;
299
300         /* ヘッダ出力 */
301         fputs(
302                 "/* ------------------------------------------------------------------------ */\n"
303                 "/*  HOS-V4a  kernel configuration                                           */\n"
304                 "/*    kernel object ID definition                                           */\n"
305                 "/*                                                                          */\n"
306                 "/* ------------------------------------------------------------------------ */\n"
307                 "\n\n"
308                 "#ifndef __KERNEL__kernel_id_h__\n"
309                 "#define __KERNEL__kernel_id_h__\n"
310                 "\n"
311                 , fp);
312
313         // ID 定義ファイル出力
314         for ( i = 0; i < API_COUNT; i++ )
315         {
316                 g_ApiList[i]->WriteId(fp);
317         }
318
319         // フッタ出力
320         fputs(
321                 "\n\n\n"
322                 "#endif\t/* __KERNEL__kernel_id_h__ */\n"
323                 "\n\n"
324                 "/* ------------------------------------------------------------------------ */\n"
325                 "/*  End of file                                                             */\n"
326                 "/* ------------------------------------------------------------------------ */\n"
327                 , fp);
328 }
329
330
331 // C 言語ソース出力
332 void WriteCfgFile(FILE* fp)
333 {
334         int i;
335
336         /* ヘッダ出力 */
337         fprintf(
338                 fp,
339                 "/* ------------------------------------------------------------------------ */\n"
340                 "/*  HOS-V4a  kernel configuration                                           */\n"
341                 "/*    kernel object create and initialize                                   */\n"
342                 "/*                                                                          */\n"
343                 "/* ------------------------------------------------------------------------ */\n"
344                 "\n\n");
345
346         fprintf(fp, "#include \"kernel.h\"\n");
347         fprintf(fp, "#include \"arch/proc/%s/procatr.h\"\n", _KERNEL_PROCATR_INC_PATH);
348         fprintf(fp, "#include \"arch/proc/%s/proc.h\"\n",    _KERNEL_PROCATR_INC_PATH);
349         fprintf(fp, "#include \"arch/irc/%s/ircatr.h\"\n",   _KERNEL_IRCATR_INC_PATH);
350         fprintf(fp, "#include \"arch/irc/%s/irc.h\"\n",      _KERNEL_IRCATR_INC_PATH);
351         fprintf(fp, "#include \"config/cfgknl.h\"\n");
352         fprintf(fp, "#include \"parser/parsknl.h\"\n");
353         fprintf(fp, "#include \"core/objid.h\"\n");
354         fprintf(fp, "#include \"core/objhdl.h\"\n");
355         fprintf(fp, "#include \"object/tskobj.h\"\n");
356         fprintf(fp, "#include \"object/semobj.h\"\n");
357         fprintf(fp, "#include \"object/flgobj.h\"\n");
358         fprintf(fp, "#include \"object/dtqobj.h\"\n");
359         fprintf(fp, "#include \"object/mbxobj.h\"\n");
360         fprintf(fp, "#include \"object/mtxobj.h\"\n");
361         fprintf(fp, "#include \"object/mpfobj.h\"\n");
362         fprintf(fp, "#include \"object/inhobj.h\"\n");
363         fprintf(fp, "#include \"object/isrobj.h\"\n");
364         fprintf(fp, "#include \"object/cycobj.h\"\n");
365         
366 //      fprintf(fp, "#include \"%s\"\n", s_szIdFile);
367         fprintf(fp, "#include \"kernel_id.h\"\n");
368         
369         
370         // ID 定義ファイル出力
371         for ( i = 0; i < API_COUNT; i++ )
372         {
373                 g_ApiList[i]->WriteCfgDef(fp);
374         }
375
376         // 初期化関数コメント出力
377         fputs(
378                 "\n\n\n"
379                 "/* ------------------------------------------ */\n"
380                 "/*          initialize functions              */\n"
381                 "/* ------------------------------------------ */\n",
382                 fp);
383
384         // 初期化関数出力
385         fputs(
386                 "\n/* object initialize */\n"
387                 "void _kernel_cfg_ini(void)\n"
388                 "{\n",
389                 fp);
390         for ( i = 0; i < API_COUNT; i++ )
391         {
392                 g_ApiList[i]->WriteCfgIni(fp);
393         }
394         fputs("}\n", fp);
395
396         // 初期化関数出力
397         fputs(
398                 "\n/* start up */\n"
399                 "void _kernel_cfg_sta(void)\n"
400                 "{\n",
401                 fp);
402         for ( i = 0; i < API_COUNT; i++ )
403         {
404                 g_ApiList[i]->WriteCfgStart(fp);
405         }
406         fputs("}\n", fp);
407
408         // フッタ出力
409         fputs(
410                 "\n\n"
411                 "/* ------------------------------------------------------------------------ */\n"
412                 "/*  End of file                                                             */\n"
413                 "/* ------------------------------------------------------------------------ */\n"
414                 , fp);
415 }
416
417 // 使い方表示
418 void PrintUsage(void)
419 {
420        fprintf(stderr,
421                "usage: hos4cfg [options] [input-file]\n"
422                "options are:\n"
423                "   -i FILE    specify auto-assginment headerfile (default: " DEFAULT_IDFILE ")\n"
424                "   -c FILE    specify kernel configuration file  (default: " DEFAULT_CFGFILE ")\n"
425                "   -help      show this help\n"
426                "\n"
427                "input-file (default: " DEFAULT_INPUTFILE ")\n");
428 }
429
430
431 // end of file