OSDN Git Service

(none)
[hos/hos-v4a.git] / cfgrtr / source / hos4cfg.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                        fprintf(stderr, "%s line(%d) : %s\n",
275                                         read.GetLogicalInputFile(),
276                                         read.GetLogicalLineNum(), GetErrMessage(iErr));
277                         return 1;
278                 }
279         }
280
281         return 0;
282 }
283
284
285 // ID定義ヘッダファイル出力
286 void WriteIdFile(FILE* fp)
287 {
288         int i;
289
290         /* ヘッダ出力 */
291         fputs(
292                 "/* ------------------------------------------------------------------------ */\n"
293                 "/*  HOS-V4a  kernel configuration                                           */\n"
294                 "/*    kernel object ID definition                                           */\n"
295                 "/*                                                                          */\n"
296                 "/* ------------------------------------------------------------------------ */\n"
297                 "\n\n"
298                 "#ifndef __KERNEL__kernel_id_h__\n"
299                 "#define __KERNEL__kernel_id_h__\n"
300                 "\n"
301                 , fp);
302
303         // ID 定義ファイル出力
304         for ( i = 0; i < API_COUNT; i++ )
305         {
306                 g_ApiList[i]->WriteId(fp);
307         }
308
309         // フッタ出力
310         fputs(
311                 "\n\n\n"
312                 "#endif\t/* __KERNEL__kernel_id_h__ */\n"
313                 "\n\n"
314                 "/* ------------------------------------------------------------------------ */\n"
315                 "/*  End of file                                                             */\n"
316                 "/* ------------------------------------------------------------------------ */\n"
317                 , fp);
318 }
319
320
321 // C 言語ソース出力
322 void WriteCfgFile(FILE* fp)
323 {
324         int i;
325
326         /* ヘッダ出力 */
327         fprintf(
328                 fp,
329                 "/* ------------------------------------------------------------------------ */\n"
330                 "/*  HOS-V4a  kernel configuration                                           */\n"
331                 "/*    kernel object create and initialize                                   */\n"
332                 "/*                                                                          */\n"
333                 "/* ------------------------------------------------------------------------ */\n"
334                 "\n\n");
335
336         fprintf(fp, "#include \"kernel.h\"\n");
337         fprintf(fp, "#include \"arch/proc/%s/procatr.h\"\n", _KERNEL_PROCATR_INC_PATH);
338         fprintf(fp, "#include \"arch/proc/%s/proc.h\"\n",    _KERNEL_PROCATR_INC_PATH);
339         fprintf(fp, "#include \"arch/irc/%s/ircatr.h\"\n",   _KERNEL_IRCATR_INC_PATH);
340         fprintf(fp, "#include \"arch/irc/%s/irc.h\"\n",      _KERNEL_IRCATR_INC_PATH);
341         fprintf(fp, "#include \"config/cfgknl.h\"\n");
342         fprintf(fp, "#include \"parser/parsknl.h\"\n");
343         fprintf(fp, "#include \"core/objid.h\"\n");
344         fprintf(fp, "#include \"core/objhdl.h\"\n");
345         fprintf(fp, "#include \"object/tskobj.h\"\n");
346         fprintf(fp, "#include \"object/semobj.h\"\n");
347         fprintf(fp, "#include \"object/flgobj.h\"\n");
348         fprintf(fp, "#include \"object/mbxobj.h\"\n");
349         fprintf(fp, "#include \"object/mtxobj.h\"\n");
350         fprintf(fp, "#include \"object/mpfobj.h\"\n");
351         fprintf(fp, "#include \"object/inhobj.h\"\n");
352         fprintf(fp, "#include \"object/isrobj.h\"\n");
353         fprintf(fp, "#include \"object/cycobj.h\"\n");
354         
355 //      fprintf(fp, "#include \"%s\"\n", s_szIdFile);
356         fprintf(fp, "#include \"kernel_id.h\"\n", s_szIdFile);
357
358
359         // ID 定義ファイル出力
360         for ( i = 0; i < API_COUNT; i++ )
361         {
362                 g_ApiList[i]->WriteCfgDef(fp);
363         }
364
365         // 初期化関数コメント出力
366         fputs(
367                 "\n\n\n"
368                 "/* ------------------------------------------ */\n"
369                 "/*          initialize functions              */\n"
370                 "/* ------------------------------------------ */\n",
371                 fp);
372
373         // 初期化関数出力
374         fputs(
375                 "\n/* object initialize */\n"
376                 "void _kernel_cfg_ini(void)\n"
377                 "{\n",
378                 fp);
379         for ( i = 0; i < API_COUNT; i++ )
380         {
381                 g_ApiList[i]->WriteCfgIni(fp);
382         }
383         fputs("}\n", fp);
384
385         // 初期化関数出力
386         fputs(
387                 "\n/* start up */\n"
388                 "void _kernel_cfg_sta(void)\n"
389                 "{\n",
390                 fp);
391         for ( i = 0; i < API_COUNT; i++ )
392         {
393                 g_ApiList[i]->WriteCfgStart(fp);
394         }
395         fputs("}\n", fp);
396
397         // フッタ出力
398         fputs(
399                 "\n\n"
400                 "/* ------------------------------------------------------------------------ */\n"
401                 "/*  End of file                                                             */\n"
402                 "/* ------------------------------------------------------------------------ */\n"
403                 , fp);
404 }
405
406 // 使い方表示
407 void PrintUsage(void)
408 {
409        fprintf(stderr,
410                "usage: hos4cfg [options] [input-file]\n"
411                "options are:\n"
412                "   -i FILE    specify auto-assginment headerfile (default: " DEFAULT_IDFILE ")\n"
413                "   -c FILE    specify kernel configuration file  (default: " DEFAULT_CFGFILE ")\n"
414                "   -help      show this help\n"
415                "\n"
416                "input-file (default: " DEFAULT_INPUTFILE ")\n");
417 }
418
419
420 // end of file