source: anotherchoice/tags/jsp-1.4.4-full-UTF8/cfg/base/filecontainer.h@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 10.5 KB
RevLine 
[26]1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: filecontainer.h,v 1.8 2003/12/15 07:32:13 takayuki Exp $
51 */
52
53// $Header: /home/CVS/configurator/base/filecontainer.h,v 1.8 2003/12/15 07:32:13 takayuki Exp $
54
55#ifndef FILECONTAINER_H
56#define FILECONTAINER_H
57
58#ifdef _MSC_VER
59#pragma warning(disable:4786) //デバッグ情
60報を255文字に切り詰めました
61#endif
62
63#include "testsuite.h"
64
65#include <string>
66#include <map>
67
68#include "base/except.h"
69#include "base/message.h"
70#include "base/collection.h"
71
72class FileContainer : public RuntimeObject
73{
74public:
75 typedef unsigned long address_t;
76
77 struct tagVariableInfo {
78 address_t address;
79 union {
80 size_t size;
81 int value;
82 };
83 };
84
85 enum tagByteOrder { LITTLE, BIG, HOSTORDER=LITTLE, UNKNOWN }; /* UNKNOWNはテスト用 */
86
87protected:
88 enum tagByteOrder byteorder;
89
90 std::map<std::string, struct tagVariableInfo> variableinfo;
91
92 FileContainer(void) throw() : byteorder(HOSTORDER) {}
93 virtual ~FileContainer(void) throw() {}
94
95public:
96 /* インタフェース部 */
97 virtual void attachModule(const std::string & filename) throw(Exception) = 0;
98 virtual void loadContents(void * dest, address_t address, size_t size) throw(Exception) = 0;
99 virtual address_t getSymbolAddress(const std::string & symbol) throw(Exception) = 0;
100 virtual std::string getArchitecture(void) throw(Exception) = 0;
101
102 virtual struct tagVariableInfo getVariableInfo(const std::string & name) throw(Exception);
103 virtual void attachInfo(const std::string & filename) throw(Exception);
104
105 /* 登録されているコンテナの呼び出し */
106 static inline FileContainer * getInstance(void) throw(Exception)
107 {
108 FileContainer * result;
109 RuntimeObjectTable::getInstance(&result);
110 if(result == 0)
111 ExceptionMessage("[Internal error] Filecontainer has no instance.","[内
112部エラー] FileContainerのインスタンスがありません").throwException();
113 return result;
114 }
115
116 enum tagByteOrder getByteOrder(void) const
117 { return byteorder; }
118};
119
120class TargetVariableBase
121{
122protected:
123 FileContainer::address_t address; //変数のアドレス
124 size_t size; //変数のサイズ
125 size_t offset; //属する構造体のå…
126ˆé ­ã‹ã‚‰ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ
127 size_t structure_size; //属する構造体の大きさ
128 bool loaded; //値が読出し済みであることを保持するフラグ
129
130 inline TargetVariableBase(FileContainer::address_t _address, size_t _size) throw()
131 : address(_address), size(_size), offset(0), structure_size(_size), loaded(false)
132 {}
133
134 inline TargetVariableBase(FileContainer::address_t addr, size_t sz, size_t ofs, size_t ssz) throw()
135 : address(addr), size(sz), offset(ofs), structure_size(ssz), loaded(false)
136 {}
137
138 TargetVariableBase(const std::string & sym) throw();
139 TargetVariableBase(const std::string & sym, size_t _size) throw();
140 TargetVariableBase(const std::string & sym, const std::string & sz) throw();
141 TargetVariableBase(const TargetVariableBase & src) throw();
142
143 virtual ~TargetVariableBase(void) throw() {}
144
145 /* 内
146容の取得 */
147 void loadContent(void * dest, size_t dest_size) throw(Exception);
148
149 /* エンディアン変換 */
150 void changeEndian(char * buffer, size_t size) throw();
151
152 /* アドレスの移動 (ついでにloadedを下げる) */
153 inline void setAddress(int offset) throw()
154 {
155 if(isValid()) {
156 address += offset;
157 loaded = false;
158 }
159 }
160
161public:
162 inline bool isValid(void) const throw()
163 { return this != 0 && address != 0 && size != 0 && structure_size != 0; }
164
165 inline size_t getSize(void) const throw()
166 { return this != 0 ? size : 0; }
167
168 inline size_t getOffset(void) const throw()
169 { return this != 0 ? offset : 0; }
170
171 inline size_t getStructureSize(void) const throw()
172 { return this != 0 ? structure_size : 0; }
173
174 inline FileContainer::address_t getAddress(void) const throw()
175 { return this != 0 ? address : 0; }
176
177 inline bool isLoaded(void) const throw()
178 { return this != 0 ? loaded : false; }
179
180 /* 基本的な操作 */
181 inline bool operator == (const TargetVariableBase & right) const throw()
182 { return isValid() && right.isValid() && address == right.address; }
183
184 inline bool operator != (const TargetVariableBase & right) const throw()
185 { return ! operator ==(right); }
186
187 inline FileContainer::address_t operator & (void) const throw()
188 { return isValid() ? address + offset : 0; }
189
190 inline size_t sizeOf(void) const throw()
191 { return isValid() ? size : 0; }
192};
193
194template<class T>
195class TargetVariable : public TargetVariableBase
196{
197protected:
198 T entity;
199
200public:
201 /*
202 * コンストラクタ (TargetVariableBaseに回送)
203 */
204 inline TargetVariable(FileContainer::address_t addr) throw()
205 : TargetVariableBase(addr, sizeof(T)), entity()
206 {}
207
208 inline TargetVariable(FileContainer::address_t addr, size_t sz) throw()
209 : TargetVariableBase(addr, sz), entity()
210 {}
211
212 inline TargetVariable(FileContainer::address_t addr, size_t sz, size_t ofs, size_t ssz) throw()
213 : TargetVariableBase(addr, sz, ofs, ssz), entity()
214 {}
215
216 inline TargetVariable(const std::string & sym) throw()
217 : TargetVariableBase(sym), entity()
218 {}
219
220 inline TargetVariable(const std::string & sym, const std::string & sz) throw()
221 : TargetVariableBase(sym, sz), entity()
222 {}
223
224 inline TargetVariable(const TargetVariable<T> & src) throw()
225 : TargetVariableBase(src), entity()
226 {
227 if(isValid() && src.isValid()) {
228 loaded = src.loaded;
229 entity = src.entity;
230 }
231 }
232
233 /* デストラクタ (特に何もしない) */
234 virtual ~TargetVariable(void) throw()
235 {}
236
237 /* 正当判定に格納に十分なサイズがあるかどうかを追加しておく */
238 inline bool isValid(void) const
239 { return TargetVariableBase::isValid() && (sizeof(T) >= getSize()); }
240
241 /*
242 * ポインタ風の動作をするオペレータ群
243 */
244 inline TargetVariable<T> offsetInBytes(int offset) const throw()
245 { return TargetVariable<T>(getAddress() + offset, getSize(), getOffset(), getStructureSize()); }
246
247 inline TargetVariable<T> operator + (int index) const throw()
248 { return offsetInBytes(index * static_cast<int>(getStructureSize())); }
249
250 inline TargetVariable<T> operator - (int index) const throw()
251 { return offsetInBytes(- index * static_cast<int>(getStructureSize())); }
252
253 inline TargetVariable<T> operator ++ (int) throw()
254 {
255 TargetVariable<T> result(*this);
256 ++ (*this);
257 return result;
258 }
259
260 inline TargetVariable<T> operator -- (int) throw()
261 {
262 TargetVariable<T> result(*this);
263 -- (*this);
264 return result;
265 }
266
267 inline TargetVariable<T> & operator ++ (void) throw()
268 {
269 setAddress(static_cast<int>(getStructureSize()));
270 return *this;
271 }
272
273 inline TargetVariable<T> & operator -- (void) throw()
274 {
275 setAddress(-static_cast<int>(getStructureSize()));
276 return *this;
277 }
278
279 inline TargetVariable<T> & operator += (int sz) throw()
280 {
281 setAddress(static_cast<int>(getStructureSize()) * sz);
282 return *this;
283 }
284
285 inline TargetVariable<T> & operator -= (int sz) throw()
286 {
287 setAddress(-static_cast<int>(getStructureSize()) * sz);
288 return *this;
289 }
290
291 inline const T & operator * (void) throw(Exception)
292 {
293 if(!isLoaded())
294 loadContent(&entity, sizeof(T));
295 return entity;
296 }
297
298 inline T operator [] (int index) const throw(Exception)
299 { return * TargetVariable<T>(getAddress() + index * getStructureSize(), getSize(), getOffset(), getStructureSize()); }
300};
301
302#endif
303
Note: See TracBrowser for help on using the repository browser.