OSDN Git Service

(none)
[hos/hos-v4a.git] / cfgrtr / source / credtq.cpp
1 // ---------------------------------------------------------------------------
2 //  Hyper Operating System V4  コンフィギュレーター                           
3 //    CRE_DTQ API の処理                                                      
4 //                                                                            
5 //                                    Copyright (C) 1998-2003 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 "credtq.h"
15 #include "analyze.h"
16 #include "readcfg.h"
17
18
19
20 #define CREDTQ_DTQID            0
21 #define CREDTQ_DTQATR           1
22 #define CREDTQ_DTQCNT           2
23 #define CREDTQ_DTQ                      3
24
25
26
27 // コンストラクタ
28 CApiCreDtq::CApiCreDtq()
29 {
30         // %jp{デフォルトの最大ID設定}
31         m_iDefaultMaxId = _KERNEL_TMAX_DTQID;
32         
33         // パラメーター構文設定
34         m_iParamSyntax[0] = 0;          // 単独パラメーター
35         m_iParamSyntax[1] = 3;          // 3パラメーターのブロック
36         m_iParams = 2;
37 }
38
39 // デストラクタ
40 CApiCreDtq::~CApiCreDtq()
41 {
42 }
43
44
45 // APIの解析
46 int CApiCreDtq::AnalyzeApi(const char* pszApiName, const char* pszParams)
47 {
48         if ( strcmp(pszApiName, "CRE_DTQ") == 0 )
49         {
50                 return AddParams(pszParams);
51         }
52         else if ( strcmp(pszApiName, "KERNEL_MAX_DTQID") == 0 )
53         {
54                 int iId;
55
56                 if ( m_iMaxId > 0 )
57                 {
58                         return CFG_ERR_MULTIDEF;
59                 }
60
61                 if ( m_iResObj > 0 )
62                 {
63                         return CFG_ERR_DEF_CONFLICT;
64                 }
65
66                 if ( (iId = atoi(pszParams)) <= 0 )
67                 {
68                         return CFG_ERR_PARAM;
69                 }
70
71                 m_iMaxId = iId;
72
73                 return CFG_ERR_OK;
74         }
75         else if ( strcmp(pszApiName, "KERNEL_RES_DTQID") == 0 )
76         {
77                 int iId;
78
79                 if ( m_iMaxId > 0 )
80                 {
81                         return CFG_ERR_DEF_CONFLICT;
82                 }
83
84                 if ( (iId = atoi(pszParams)) < 0 )
85                 {
86                         return CFG_ERR_PARAM;
87                 }
88
89                 m_iResObj += iId;
90
91                 return CFG_ERR_OK;
92         }
93         
94         return CFG_ERR_NOPROC;
95 }
96
97
98 // ID 定義ファイル書き出し
99 void CApiCreDtq::WriteId(FILE* fp)
100 {
101         int i;
102
103         if ( m_iMaxId <= 0 )
104         {
105                 return;
106         }
107
108         // ID 直接指定でないオブジェクトが在るかどうかサーチ
109         for ( i = 0; i < m_iObjs; i++ )
110         {
111                 if ( atoi(m_pParamPacks[i]->GetParam(CREDTQ_DTQID)) == 0 )
112                 {
113                         break;
114                 }
115         }
116         if ( i == m_iObjs )
117         {
118                 return;
119         }
120
121         fputs("\n\n/* data queue ID definetion */\n", fp);
122         for ( i = 0; i < m_iObjs; i++ )
123         {
124                 if ( atoi(m_pParamPacks[i]->GetParam(CREDTQ_DTQID)) == 0 )
125                 {
126                         fprintf(
127                                 fp,
128                                 "#define %s\t\t%d\n",
129                                 m_pParamPacks[i]->GetParam(CREDTQ_DTQID),
130                                 m_iId[i]);
131                 }
132         }
133
134         fprintf( fp,"\n#define TMAX_DTQID\t\t%d\n", m_iMaxId );
135 }
136
137
138 // cfgファイル定義部書き出し
139 void  CApiCreDtq::WriteCfgDef(FILE* fp)
140 {
141         const char* pszParam;
142         bool blOutput;
143         int  i, j;
144
145         if ( m_iMaxId <= 0 )
146         {
147                 return;
148         }
149
150         // コメント出力
151         fputs(
152                 "\n\n\n"
153                 "/* ------------------------------------------ */\n"
154                 "/*        create data queue objects           */\n"
155                 "/* ------------------------------------------ */\n"
156                 , fp);
157
158         // データキュー領域出力
159         blOutput = false;
160         for ( i = 0; i < m_iObjs; i++ )
161         {
162                 pszParam = m_pParamPacks[i]->GetParam(CREDTQ_DTQ);
163                 if ( strcmp(pszParam, "NULL") == 0 )
164                 {
165                         if ( !blOutput )
166                         {
167                                 fputs("\n/* data que area */\n", fp);
168                                 blOutput = true;
169                         }
170
171                         fprintf(
172                                 fp,
173                                 "static VP_INT kernel_dtq%d_dtq[%s];\n",
174                                 m_iId[i],
175                                 m_pParamPacks[i]->GetParam(CREDTQ_DTQCNT));
176                 }
177         }
178
179         if ( m_iObjs > 0 )
180         {
181                 fprintf(
182                         fp,
183                         "\n/* data queue control block for rom area */\n"
184                         "const T_KERNEL_DTQCB_ROM kernel_dtqcb_rom[%d] =\n"
185                         "\t{\n",
186                         m_iObjs);
187
188                 // コントロールブロック(ROM部)出力
189                 for ( i = 0; i < m_iObjs; i++ )
190                 {
191                         fprintf(
192                                 fp,
193                                 "\t\t{(ATR)(%s), (UINT)(%s), ",
194                                 m_pParamPacks[i]->GetParam(CREDTQ_DTQATR),
195                                 m_pParamPacks[i]->GetParam(CREDTQ_DTQCNT));
196                         pszParam = m_pParamPacks[i]->GetParam(CREDTQ_DTQ);
197                         if ( strcmp(pszParam, "NULL") == 0 )
198                         {
199                                 fprintf(fp,     "kernel_dtq%d_dtq},\n", m_iId[i]);
200                         }
201                         else
202                         {
203                                 fprintf(fp,     "(VP_INT *)(%s)},\n", pszParam);
204                         }
205                 }
206                 fprintf(fp, "\t};\n");
207         }
208
209         // コントロールブロック(RAM部)出力
210         if ( m_iObjs > 0 )
211         {
212                 fprintf(
213                         fp,
214                         "\n/* data queue control block for ram area */\n"
215                         "T_KERNEL_DTQCB_RAM kernel_dtqcb_ram[%d];\n",
216                         m_iObjs);
217         }
218
219         // コントロールブロックテーブル出力
220         if ( m_iMaxId > 0 )
221         {
222                 fprintf(
223                         fp,
224                         "\n/* data queue control block table */\n"
225                         "T_KERNEL_DTQCB_RAM *kernel_dtqcb_ram_tbl[%d] =\n"
226                         "\t{\n",
227                         m_iMaxId);
228
229                 for ( i = 0; i < m_iMaxId; i++ )
230                 {
231                         // ID検索
232                         for ( j = 0; j < m_iObjs; j++ )
233                         {
234                                 if ( m_iId[j] == i + 1 )
235                                 {
236                                         break;
237                                 }
238                         }
239                         if ( j < m_iObjs )
240                         {
241                                 // オブジェクトが存在した場合
242                                 fprintf(fp, "\t\t&kernel_dtqcb_ram[%d],\n", j);
243                         }
244                         else
245                         {
246                                 // オブジェクトが無い場合
247                                 fputs("\t\tNULL,\n", fp);
248                         }
249                 }
250                 fputs("\t};\n", fp);
251         }
252
253         // テーブルサイズ情報出力
254         fprintf(
255                 fp,
256                 "\n/* data queue control block count */\n"
257                 "const INT kernel_dtqcb_cnt = %d;\n",
258                 m_iMaxId);
259 }
260
261
262 // cfgファイル初期化部書き出し
263 void  CApiCreDtq::WriteCfgIni(FILE* fp)
264 {
265         if ( m_iMaxId <= 0 )
266         {
267                 return;
268         }
269
270         // オブジェクト存在チェック
271         if ( m_iObjs == 0 )
272         {
273                 return;
274         }
275 }
276
277
278 // cfgファイル起動部書き出し
279 void  CApiCreDtq::WriteCfgStart(FILE* fp)
280 {
281         // オブジェクト存在チェック
282         if ( m_iObjs == 0 )
283         {
284                 return;
285         }
286
287         if ( m_iMaxId <= 0 )
288         {
289                 return;
290         }
291 }
292
293
294 // end of file