OSDN Git Service

Sメーター周りを修正
[trx-305dsp/dsp.git] / hirado / kernel / cfg / jsp / jsp_common.cpp
1 /*
2  *  TOPPERS/JSP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Just Standard Profile Kernel
5  * 
6  *  Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  * 
9  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
10  *  によって公表されている GNU General Public License の Version 2 に記
11  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
13  *  利用と呼ぶ)することを無償で許諾する.
14  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16  *      スコード中に含まれていること.
17  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20  *      の無保証規定を掲載すること.
21  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23  *      と.
24  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
26  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27  *        報告すること.
28  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30  * 
31  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
35  * 
36  *  @(#) $Id: jsp_common.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $
37  */
38
39 #include "jsp/jsp_common.h"
40
41 #include "base/option.h"
42
43 #include <ctime>
44
45 #if defined(_MSC_VER) || defined(__BORLANDC__)
46 #  define  GETLOGINNAME_WINDOWS
47 #  include <windows.h>
48 #elif __GNUC__
49 #  define  GETLOGINNAME_UNIX
50 #  include <unistd.h>
51 #endif
52
53 using namespace std;
54
55 #if 0
56 namespace {
57     string get_loginname(void) throw()
58     {
59         string result("TOPPERS/JSP KernelConfigurator");
60
61 #ifdef GETLOGINNAME_WINDOWS
62         char  buffer[1024];
63         DWORD sz = 1024;
64         ::GetUserName(buffer, &sz);
65         result.assign(buffer);
66 #elif defined(GETLOGINNAME_UNIX)
67         result.assign(getlogin());
68 #endif
69
70         return result;
71     }
72 }
73 #endif
74
75
76     //インクルードファイルの形を変更する
77 string ToppersJsp::conv_includefile(string file) throw()
78 {
79     OptionParameter & option = getOptionParameter();
80     string result;
81
82         //ilオプションが付いたときには "<...>" 形式で出力
83     if(option["il"].isValid())
84         result = string("<") + file + ">";
85     else
86         result = string("\"") + file + "\"";
87
88     return result;
89 }
90
91     //カーネルの変数名の形を変更する
92 string ToppersJsp::conv_kernelobject(string obj) throw()
93 {
94     OptionParameter & option = getOptionParameter();
95     string result;
96
97     result = obj;
98
99         // TOPPERS/JSP rel 1.3より後はカーネル変数の頭に _kernel_ をつける
100     if(!option["1.3"].isValid())
101         result = string("_kernel_") + obj;
102
103     return result;
104 }
105
106 ToppersJsp::SpecialtyFile::SpecialtyFile(void) throw() : MultipartStream(), RuntimeObject(true)
107 {}
108
109 #if 0
110 string ToppersJsp::get_agreement(string filename) throw()
111 {
112     const char * base_agreement =
113         "/*\n"
114         " *  TOPPERS/JSP Kernel\n"
115         " *      Toyohashi Open Platform for Embedded Real-Time Systems/\n"
116         " *      Just Standard Profile Kernel\n"
117         " * \n"
118         " *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory\n"
119         " *                              Toyohashi Univ. of Technology, JAPAN\n"
120         " * \n"
121         " *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation \n"
122         " *  によって公表されている GNU General Public License の Version 2 に記\n"
123         " *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア\n"
124         " *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,\n"
125         " *  利用と呼ぶ)することを無償で許諾する.\n"
126         " *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作\n"
127         " *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー\n"
128         " *      スコード中に含まれていること.\n"
129         " *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使\n"
130         " *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用\n"
131         " *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記\n"
132         " *      の無保証規定を掲載すること.\n"
133         " *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使\n"
134         " *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ\n"
135         " *      と.\n"
136         " *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著\n"
137         " *        作権表示,この利用条件および下記の無保証規定を掲載すること.\n"
138         " *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに\n"
139         " *        報告すること.\n"
140         " *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損\n"
141         " *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.\n"
142         " * \n"
143         " *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お\n"
144         " *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も\n"
145         " *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直\n"
146         " *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.\n"
147         " * \n";
148
149     string work(base_agreement);
150
151         //CVSのID風のものをくっつける
152     time_t t;
153     time(&t);
154
155     work += string(" * @(#)$Id: ");
156     work += filename;
157     work += " ";
158     work += static_cast<const char *>(asctime(localtime(&t)));
159     
160     work.erase(work.size() - 1);    //asctimeで改行が入るのでchomp
161
162     work += " ";
163     work += get_loginname();
164     work += " Exp $\n */\n\n";
165
166     return work;
167 }
168 #endif
169
170
171 /***************************************** テストスィート *****************************************/
172
173 #ifdef TESTSUITE
174
175 class SpecialtyFile_test : public ToppersJsp::SpecialtyFile
176 {
177 public:
178     ~SpecialtyFile_test(void) throw() { TestSuite::check("SpecialtyFile::~SpecialtyFile"); }
179     TESTSUITE_PROTOTYPE(main)
180 };
181
182 TESTSUITE(main, SpecialtyFile_test)
183 {
184     BEGIN_CASE("constructor","constructor") {
185         BEGIN_CASE("1","生成するとROTに乗る") {
186             SpecialtyFile_test file;
187
188             if(RuntimeObjectTable::getInstance<SpecialtyFile_test>() == 0)
189                 TEST_FAIL;
190         } END_CASE;
191
192         BEGIN_CASE("2","破棄の対象になっている") {
193             Singleton<RuntimeObjectTable>::Context context;
194             Singleton<RuntimeObjectTable>::saveContext(context);
195
196             Singleton<RuntimeObjectTable>::renewInstance();
197
198             new SpecialtyFile_test;
199
200             TEST_CASE("0","[前提] 登録されている", RuntimeObjectTable::getInstance<SpecialtyFile_test>() != 0);
201             
202             TestSuite::clearCheckpoints();
203             Singleton<RuntimeObjectTable>::renewInstance(); //インスタンスの再生成でROTが削除される
204
205             TEST_CASE("1","ROTから解除されている", RuntimeObjectTable::getInstance<SpecialtyFile_test>() == 0);
206             TEST_CASE("2","デストラクタが起動されている", TestSuite::isReached("SpecialtyFile::~SpecialtyFile"));
207
208             Singleton<RuntimeObjectTable>::restoreContext(context);
209         } END_CASE;
210     } END_CASE;
211
212     BEGIN_CASE("createInstance","createInstance") {
213         BEGIN_CASE("1","インスタンスが生成できる") {
214             SpecialtyFile_test * file = SpecialtyFile::createInstance<SpecialtyFile_test>("test.txt");
215
216             file->disableOutput();  //出力されても困るので
217
218             TEST_CASE("1","非NULLが返る", file != 0);
219             TEST_CASE("2","ファイル名が正常",  file->getFilename().compare("test.txt") == 0);
220         } END_CASE;
221
222         BEGIN_CASE("2","空文字を渡すと例外") {
223
224             bool result = false;
225             try {
226                 SpecialtyFile::createInstance<SpecialtyFile_test>("");
227             }
228             catch(Exception &) {
229                 result = true;
230             }
231
232             TEST_CASE("1","例外が起こる", result);
233             TEST_CASE("2","オブジェクトはない", RuntimeObjectTable::getInstance<SpecialtyFile_test>() == 0);
234         } END_CASE;
235     } END_CASE;
236 }
237
238 namespace {
239     extern void testsuite(TestSuiteControl & _suite_control);
240     TestSuite testsuite_onTop("TOPPERS/JSP Common Function(main)", testsuite);
241
242             //テストスィートの本体
243     void testsuite(TestSuiteControl & _suite_control)
244     {
245         Singleton<OptionParameter>::Context context;
246         Singleton<OptionParameter>::saveContext(context);
247
248         BEGIN_CASE("conv_includefile","conv_includefile") {
249             BEGIN_CASE("1","-ilが付いていないとダブルクォートでくくる") {
250                 Singleton<OptionParameter>::renewInstance();
251
252                 if(ToppersJsp::conv_includefile("test.h").compare("\"test.h\"") != 0)
253                     TEST_FAIL;
254             } END_CASE;
255
256             BEGIN_CASE("1","-ilが付いていると<>でくくる") {
257                 Singleton<OptionParameter>::renewInstance();
258                 char * argv[] = {"test.exe","-il"};
259                 getOptionParameter().parseOption(2, argv);
260
261                 if(ToppersJsp::conv_includefile("test.h").compare("<test.h>") != 0)
262                     TEST_FAIL;
263             } END_CASE;
264         } END_CASE;
265
266         BEGIN_CASE("conv_kernelobject","conv_kernelobject") {
267             BEGIN_CASE("1","-1.3が付いていないと_kernel_が付く") {
268                 Singleton<OptionParameter>::renewInstance();
269
270                 if(ToppersJsp::conv_kernelobject("test").compare("_kernel_test") != 0)
271                     TEST_FAIL;
272             } END_CASE;
273
274             BEGIN_CASE("1","-1.3が付いているとそのまま出てくる") {
275                 Singleton<OptionParameter>::renewInstance();
276                 char * argv[] = {"test.exe","-1.3"};
277                 getOptionParameter().parseOption(2, argv);
278
279                 if(ToppersJsp::conv_kernelobject("test").compare("test") != 0)
280                     TEST_FAIL;
281             } END_CASE;
282         } END_CASE;
283
284         Singleton<OptionParameter>::restoreContext(context);
285
286     }
287 }
288 #endif
289
290