OSDN Git Service

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