OSDN Git Service

(none)
[hos/hos-v4a.git] / cfgrtr / source / creflg.cpp
1 // ---------------------------------------------------------------------------
2 //  Hyper Operating System V4a  コンフィギュレーター                           
3 //    CRE_FLG API の処理                                                      
4 //                                                                            
5 //                                    Copyright (C) 1998-2009 by Project HOS  
6 //                                    http://sourceforge.jp/projects/hos/     
7 // ---------------------------------------------------------------------------
8
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include "defercd.h"
14 #include "creflg.h"
15 #include "analyze.h"
16 #include "readcfg.h"
17
18
19 #define CREFLG_FLGID            0
20 #define CREFLG_FLGATR           1
21 #define CREFLG_IFLGPTN          2
22
23
24
25 // コンストラクタ
26 CApiCreFlg::CApiCreFlg()
27 {
28         // %jp{デフォルトの最大ID設定}
29         m_iDefaultMaxId = _KERNEL_TMAX_FLGID;
30         
31         // パラメーター構文設定
32         m_iParamSyntax[0] = 0;          // 単独パラメーター
33         m_iParamSyntax[1] = 2;          // 2パラメーターのブロック
34         m_iParams = 2;
35 }
36
37 // デストラクタ
38 CApiCreFlg::~CApiCreFlg()
39 {
40 }
41
42
43 // APIの解析
44 int CApiCreFlg::AnalyzeApi(const char* pszApiName, const char* pszParams)
45 {
46         if ( strcmp(pszApiName, "CRE_FLG") == 0 )
47         {
48                 return AddParams(pszParams);
49         }
50         else if ( strcmp(pszApiName, "KERNEL_MAX_FLGID") == 0 )
51         {
52                 int iId;
53
54                 if ( m_iMaxId > 0 )
55                 {
56                         return CFG_ERR_MULTIDEF;
57                 }
58                 
59                 if ( m_iResObj > 0 )
60                 {
61                         return CFG_ERR_DEF_CONFLICT;
62                 }
63
64                 if ( (iId = atoi(pszParams)) < 0 )
65                 {
66                         return CFG_ERR_PARAM;
67                 }
68
69                 m_iMaxId = iId;
70
71                 return CFG_ERR_OK;
72         }
73         else if ( strcmp(pszApiName, "KERNEL_RSV_FLGID") == 0 )
74         {
75                 int iId;
76
77                 if ( m_iMaxId > 0 )
78                 {
79                         return CFG_ERR_DEF_CONFLICT;
80                 }
81
82                 if ( (iId = atoi(pszParams)) <= 0 )
83                 {
84                         return CFG_ERR_PARAM;
85                 }
86
87                 m_iResObj += iId;
88
89                 return CFG_ERR_OK;
90         }
91
92         return CFG_ERR_NOPROC;
93 }
94
95
96 // ID 定義ファイル書き出し
97 void CApiCreFlg::WriteId(FILE* fp)
98 {
99         int i;
100         
101         if ( m_iMaxId <= 0 )
102         {
103                 return;
104         }
105
106         // %jp{コメントを出力}
107         fputs("\n\n/* event flag ID definetion */\n", fp);
108
109         // %jp{ID定義を出力}
110         for ( i = 0; i < m_iObjs; i++ )
111         {
112                 if ( atoi(m_pParamPacks[i]->GetParam(CREFLG_FLGID)) == 0 )
113                 {
114                         fprintf(
115                                 fp,
116                                 "#define %s\t\t%d\n",
117                                 m_pParamPacks[i]->GetParam(CREFLG_FLGID),
118                                 m_iId[i]);
119                 }
120         }
121
122         // %jp{ID最大値定義を出力}
123         fprintf( fp,
124                 "\n"
125                 "#ifdef  TMAX_FLGID\n"
126                 "#undef  TMAX_FLGID\n"
127                 "#endif\n"
128                 "\n"
129                 "#define TMAX_FLGID\t\t%d\n\n", m_iMaxId);
130 }
131
132
133 // cfgファイル定義部書き出し
134 void  CApiCreFlg::WriteCfgDef(FILE* fp)
135 {
136         int  i;
137
138         if ( m_iMaxId <= 0 )
139         {
140                 return;
141         }
142
143         // コメント出力
144         fputs(
145                 "\n\n\n"
146                 "/* ------------------------------------------ */\n"
147                 "/*        create eventflag objects            */\n"
148                 "/* ------------------------------------------ */\n"
149                 , fp);
150
151
152         if ( m_iMaxId > 0 )
153         {
154 #if _KERNEL_FLGCB_ALGORITHM == _KERNEL_FLGCB_ALG_BLKARRAY
155 #if _KERNEL_FLGCB_ROM
156         // %jp{ブロック配列&ROM分離}
157         {
158                 // %jp{RAM部出力}
159                 fprintf(fp, "\n_KERNEL_T_FLGCB _kernel_flgcb_tbl[%d] =\n\t{\n", m_iMaxId);
160                 for ( i = 1; i <= m_iMaxId; i++ )
161                 {
162                         int iObjNum = IdToObjNum(i);
163                         if ( iObjNum >= 0 )
164                         {
165                                 fprintf(fp, "\t\t{");
166                                 WriteSemcbRam(fp, iObjNum);
167                                 fprintf(fp, "},\n");
168                         }
169                         else
170                         {
171                                 fprintf(fp, "\t\t{{0}, },\n");
172                         }
173                 }
174                 fprintf(fp, "\t};\n");
175
176                 // %jp{ROM部出力}
177                 fprintf(fp, "\nconst _KERNEL_T_FLGCB_ROM _kernel_flgcb_rom_tbl[%d] =\n\t{\n", m_iMaxId);
178                 for ( i = 1; i <= m_iMaxId; i++ )
179                 {
180                         int iObjNum = IdToObjNum(i);
181                         if ( iObjNum >= 0 )
182                         {
183                                 fprintf(fp, "\t\t{");
184                                 WriteSemcbRom(fp, iObjNum);
185                                 fprintf(fp, "},\n");
186                         }
187                         else
188                         {
189                                 fprintf(fp, "\t\t{0},\n");
190                         }
191                 }
192                 fprintf(fp, "\t};\n\n");
193         }
194 #else
195         // ブロック配列&統合TCB
196         {
197                 // %jp{RAM部出力}
198                 fprintf(fp, "\n_KERNEL_T_FLGCB _kernel_flgcb_tbl[%d] =\n\t{\n", m_iMaxId);
199                 for ( i = 1; i <= m_iMaxId; i++ )
200                 {
201                         int iObjNum = IdToObjNum(i);
202                         if ( iObjNum >= 0 )
203                         {
204                                 fprintf(fp, "\t\t{");
205                                 WriteFlgcbRam(fp, iObjNum);
206                                 WriteFlgcbRom(fp, iObjNum);
207                                 fprintf(fp, "},\n");
208                         }
209                         else
210                         {
211                                 fprintf(fp, "\t\t{0},\n");
212                         }
213                 }
214                 fprintf(fp, "\t};\n");
215         }
216 #endif
217 #elif _KERNEL_FLGCB_ALGORITHM == _KERNEL_FLGCB_ALG_PTRARRAY
218 #if _KERNEL_FLGCB_ROM
219         // ポインタ配列&ROM分離
220         {
221                 fprintf(fp, "\n");
222                 for ( i = 0; i < m_iObjs; i++ )
223                 {
224                         fprintf(fp, "const _KERNEL_T_FLGCB_RO _kernel_flgcb_ro_blk_%d = {", m_iId[i]);
225                         WriteFlgcbRom(fp, i);
226                         fprintf(fp, "};\n");
227                 }
228                 fprintf(fp, "\n");
229                 for ( i = 0; i < m_iObjs; i++ )
230                 {
231                         fprintf(fp, "_KERNEL_T_FLGCB _kernel_flgcb_blk_%d = {", m_iId[i]);
232                         WriteFlgcbRam(fp, i);
233                         fprintf(fp, "};\n");
234                 }
235                 fprintf(fp, "\n");
236                 fprintf(fp, "\n_KERNEL_T_FLGCB *_kernel_flgcb_tbl[%d] =\n\t{\n", m_iMaxId);
237                 for ( i = 1; i <= m_iMaxId; i++ )
238                 {
239                         int iObjNum = IdToObjNum(i);
240                         if ( iObjNum >= 0 )
241                         {
242                                 fprintf(fp, "\t\t&_kernel_flgcb_blk_%d,\n", i);
243                         }
244                         else
245                         {
246                                 fprintf(fp, "\t\tNULL,\n");
247                         }
248                 }
249                 fprintf(fp, "\t};\n");          }
250 #else
251         // ポインタ配列&統合FLGCB
252         {
253                 fprintf(fp, "\n");
254                 for ( i = 0; i < m_iObjs; i++ )
255                 {
256                         fprintf(fp, "_KERNEL_T_FLGCB _kernel_flgcb_blk_%d = {", m_iId[i]);
257                         WriteFlgcbRam(fp, i);
258                         WriteFlgcbRom(fp, i);
259                         fprintf(fp, "};\n");
260                 }
261                 fprintf(fp, "\n");
262                 fprintf(fp, "\n_KERNEL_T_FLGCB *_kernel_flgcb_tbl[%d] =\n\t{\n", m_iMaxId);
263                 for ( i = 1; i <= m_iMaxId; i++ )
264                 {
265                         int iObjNum = IdToObjNum(i);
266                         if ( iObjNum >= 0 )
267                         {
268                                 fprintf(fp, "\t\t&_kernel_flgcb_blk_%d,\n", i);
269                         }
270                         else
271                         {
272                                 fprintf(fp, "\t\tNULL,\n");
273                         }
274                 }
275                 fprintf(fp, "\t};\n");          
276
277         }
278 #endif
279 #endif
280         }
281
282         // テーブルサイズ情報出力
283         fprintf(
284                 fp,
285                 "\nconst ID     _kernel_max_flgid = %d;\n",
286                 m_iMaxId);
287 }
288
289
290
291 void CApiCreFlg::WriteFlgcbRam(FILE *fp, int iObj)
292 {
293 #if _KERNEL_FLGCB_QUE
294         fprintf(fp, "{0}, ");                                                                                                           /* %jp{キュー} */
295 #endif
296
297 #if _KERNEL_FLGCB_FLGPTN
298         fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CREFLG_IFLGPTN));           /* %jp{} */
299 #endif
300 }
301
302
303 void CApiCreFlg::WriteFlgcbRom(FILE *fp, int iObj)
304 {
305 #if _KERNEL_FLGCB_FLGATR
306         fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CREFLG_FLGATR));            /* %jp{イベントフラグ属性} */
307 #endif
308 }
309
310
311
312 // cfgファイル初期化部書き出し
313 void  CApiCreFlg::WriteCfgIni(FILE* fp)
314 {
315 }
316
317
318 // cfgファイル起動部書き出し
319 void  CApiCreFlg::WriteCfgStart(FILE* fp)
320 {
321 }
322
323
324 // end of file