source: cfg_itronx+oil_gcc/toppers/oil/factory.cpp@ 165

Last change on this file since 165 was 54, checked in by ertl-ishikawa, 12 years ago

cfg+oil対応コンフィギュレータを追加

File size: 23.0 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2007-2008 by TAKAGI Nobuhisa
6 * Copyright (C) 2010 by Meika Sugimoto
7 *
8 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17 * の無保証規定を掲載すること.
18 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20 * と.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24 * 報告すること.
25 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29 * 免責すること.
30 *
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35 * の責任を負わない.
36 *
37 */
38#include <cstring>
39#include <cstdlib>
40#include <fstream>
41#include <boost/lexical_cast.hpp>
42#include <boost/spirit/include/classic_spirit.hpp>
43#include "toppers/misc.hpp"
44#include "toppers/global.hpp"
45#include "toppers/csv.hpp"
46#include "toppers/nm_symbol.hpp"
47#include "toppers/s_record.hpp"
48#include "toppers/diagnostics.hpp"
49#include "toppers/macro_processor.hpp"
50#include "toppers/io.hpp"
51#include "toppers/cpp.hpp"
52#include "toppers/oil/factory.hpp"
53#include "toppers/oil/cfg1_out.hpp"
54
55namespace toppers
56{
57 namespace oil
58 {
59 namespace
60 {
61
62 object_definition* find_object(string name , cfg1_out::cfg_obj_map const& obj_def_map)
63 {
64 // modified by takuya 110823
65 //std::map< std::string, std::vector<object_definition*>>::const_iterator p;
66 std::map< std::string, std::vector<object_definition*> >::const_iterator p;
67 std::vector<object_definition*>::const_iterator q;
68
69 // 名前が一致するオブジェクトを検索
70 for(p = obj_def_map.begin() ; p != obj_def_map.end() ; p++)
71 {
72 for(q = (*p).second.begin() ; q != (*p).second.end() ; q++)
73 {
74 if((*q)->get_name() == name)
75 {
76 return (*q);
77 }
78 }
79 }
80 return NULL;
81 }
82
83 // カーネルオブジェクト生成・定義用静的APIの各パラメータをマクロプロセッサの変数として設定する。
84 void set_object_vars( cfg1_out::cfg_obj_map const& obj_def_map, macro_processor& mproc )
85 {
86 typedef macro_processor::element element;
87 typedef macro_processor::var_t var_t;
88 std::map< std::string, var_t > order_list_map , obj_parameter;
89 std::map< std::string, long > id_map;
90
91 using namespace toppers::oil::oil_definition;
92 // modified by takuya 110823
93 //std::map< std::string, std::vector<object_definition*>>::const_iterator p;
94 std::map< std::string, std::vector<object_definition*> >::const_iterator p;
95 std::vector<object_definition*>::const_iterator q;
96 std::vector<object_parameter_def*>::const_iterator r;
97
98 for ( p = obj_def_map.begin() ; p != obj_def_map.end() ; p++)
99 {
100 element e;
101 var_t t;
102 string name;
103 long obj_id;
104 long param_id;
105
106 // パラメータの値代入
107 for(q = (*p).second.begin() ; q != (*p).second.end() ; q++)
108 {
109 std::map< std::string, var_t > obj_parameter;
110 std::map< std::string, var_t >::iterator s;
111 obj_id = (*q)->get_id();
112 name = (*p).first;
113 std::map<std::string , long> id_count;
114 std::map<std::string , long>::iterator id_iter;
115
116 // 値の取り出し
117 e.i = (*q)->get_id();
118 e.s = (*q)->get_name();
119 // 出現順リスト用の情報作成
120 order_list_map[ name ].push_back(e);
121 // オブジェクト自身の値代入
122 mproc.set_var( toppers::toupper(name), obj_id, var_t( 1, e ) );
123
124 // オブジェクトメンバの値代入
125 for(r = (*q)->get_params()->begin() ; r != (*q)->get_params()->end() ; r++)
126 {
127 name = (*p).first+ string(".") + (*r)->get_parameter_name();
128 e.s = (*r)->get_value();
129
130 if(e.s == string(""))
131 {
132 continue;
133 }
134
135 // メンバのIDを検索
136 id_iter = id_count.find(name);
137 if(id_iter == id_count.end())
138 {
139 id_count[name] = 0;
140 param_id = 0;
141 }
142 else
143 {
144 param_id = (*id_iter).second + 1;
145 id_count[name] = (*id_iter).second + 1;
146 }
147
148 if((*r)->get_type() == oil::TYPE_UINT)
149 {
150 string value_str(((*r)->get_value()));
151 try
152 {
153 e.i = boost::lexical_cast<uint64_t>((*r)->get_value());
154 }
155 catch( std::exception& exception)
156 {
157 uint64_t temp;
158 // 16進の場合があるので変換
159 /// きれいじゃないのでなんとかしたい
160 if(value_str.find("0x") == 0)
161 {
162 // modified by takuya 110823
163 //sscanf_s(value_str.c_str() , "0x%I64x" , &temp);
164 sscanf(value_str.c_str() , "0x%llx" , &temp);
165 e.i = temp;
166 }
167 else if(value_str.find("0X") == 0)
168 {
169 // modified by takuya 110823
170 //sscanf_s(value_str.c_str() , "0X%I64x" , &temp);
171 sscanf(value_str.c_str() , "0X%llx" , &temp);
172 e.i = temp;
173 }
174 else
175 {
176 // キャストに失敗したら0にしておく
177 e.i = 0;
178 }
179
180 }
181 }
182 else if((*r)->get_type() == oil::TYPE_INT)
183 {
184 string value_str(((*r)->get_value()));
185 try
186 {
187 e.i = boost::lexical_cast<int64_t>(value_str);
188 }
189 catch(std::exception& exception)
190 {
191 int64_t temp;
192 // 16進の場合があるので変換
193 /// きれいじゃないのでなんとかしたい
194 if(value_str.find("0x") == 0)
195 {
196 // modified by takuya 110823
197 //sscanf_s(value_str.c_str() , "0x%I64x" , &temp);
198 sscanf(value_str.c_str() , "0x%llx" , &temp);
199 e.i = temp;
200 }
201 else if(value_str.find("0X") == 0)
202 {
203 // modified by takuya 110823
204 //sscanf_s(value_str.c_str() , "0X%I64x" , &temp);
205 sscanf(value_str.c_str() , "0X%llx" , &temp);
206 e.i = temp;
207 }
208 else
209 {
210 // キャストに失敗したら0にしておく
211 e.i = 0;
212 }
213 }
214 }
215 else if((*r)->get_type() == oil::TYPE_REF)
216 {
217 object_definition *obj;
218 string refefence_obj_type;
219
220 // オブジェクトIDの探索
221 e.i = 0;
222 obj = find_object((*r)->get_value() , obj_def_map);
223 if(obj != NULL)
224 {
225 e.i = obj->get_id();
226 }
227 }
228 else
229 {
230 e.i = 0;
231 }
232 obj_parameter[name].push_back(e);
233 }
234
235 for(s = obj_parameter.begin() ; s != obj_parameter.end() ; s++)
236 {
237 mproc.set_var((*s).first , obj_id , (*s).second );
238 }
239 }
240
241 }
242 // 順序リストの作成
243 for ( std::map< std::string, var_t >::const_iterator iter( order_list_map.begin() ), last( order_list_map.end() );
244 iter != last;
245 ++iter )
246 {
247 // 出現順リスト $OBJ.ORDER_LIST$ -- ID番号の並び
248 mproc.set_var( toppers::toupper( iter->first + ".order_list" ), iter->second );
249 var_t rorder_list( iter->second );
250
251 // 逆順リスト $OBJ.RORDER_LIST$ -- ID番号の並び
252 std::reverse( rorder_list.begin(), rorder_list.end() );
253 mproc.set_var( toppers::toupper( iter->first + ".rorder_list" ), rorder_list );
254
255 // ID番号リスト $OBJ.ID_LIST$ -- ID番号の並び
256 var_t id_list( iter->second );
257 std::sort( id_list.begin(), id_list.end() );
258 mproc.set_var( toppers::toupper( iter->first + ".id_list" ), id_list );
259 }
260 }
261
262 // カーネルオブジェクト生成・定義用静的APIの各パラメータをマクロプロセッサの変数として設定する。
263 void set_object_vars( std::vector< object_definition* > const& obj_array, macro_processor& mproc )
264 {
265 typedef macro_processor::element element;
266 typedef macro_processor::var_t var_t;
267 long order = 1;
268 var_t order_list;
269
270 for ( std::vector< object_definition* >::const_iterator v_iter( obj_array.begin() ), v_last( obj_array.end() );
271 v_iter != v_last;
272 ++v_iter )
273 {
274 var_t params;
275 var_t args;
276
277#if 0
278 // 静的APIが出現した行番号
279 element e;
280 // e.s = v_iter->line().file;
281 // e.i = v_iter->line().line;
282 // mproc.set_var( "API.TEXT_LINE", order, var_t( 1, e ) );
283
284 // 静的API名
285 e.s = v_iter->get_name();
286 e.i = boost::none;
287 mproc.set_var( "OBJ.NAME", order, var_t( 1, e ) );
288
289 // オブジェクトタイプ("TSK", "SEM", ...)
290 e.s = toppers::toupper( v_iter->object_type );
291 mproc.set_var( "OBJ.TYPE", order, var_t( 1 , e ) );
292
293 // 各パラメータ
294 for ( static_api::const_iterator api_iter( v_iter->begin() ), api_last( v_iter->end() );
295 api_iter != api_last;
296 ++api_iter )
297 {
298 std::string name( toppers::toupper( ( boost::format( "%s.%s" ) % info->type % ( api_iter->symbol.c_str() + 1 ) ).str() ) );
299 // 末尾の ? を除去
300 if ( *name.rbegin() == '\?' )
301 {
302 name.resize( name.size() - 1 );
303 }
304 // 末尾の ... を除去 & order を付加
305 if ( name.size() > 3 && name.substr( name.size() - 3 ) == "..." )
306 {
307 name.resize( name.size() - 3 );
308 name += boost::lexical_cast< std::string >( api_iter->order );
309 }
310
311 element e;
312 e.s = api_iter->text; // ソースの字面
313 if ( api_iter->symbol[0] != '&' ) // 一般定数式パラメータは値が特定できない
314 {
315 if ( api_iter->symbol[0] == '$' ) // 文字列定数式パラメータ
316 {
317 e.v = api_iter->string; // 展開後の文字列
318 }
319 else
320 {
321 e.i = api_iter->value;
322 }
323 }
324 args.push_back( e );
325
326 e.s = name;
327 e.i = boost::none;
328 params.push_back( e );
329
330 if ( api_iter->symbol[0] == '%' )
331 {
332 continue;
333 }
334 }
335 mproc.set_var( "API.ARGS", order, args );
336 mproc.set_var( "API.PARAMS", order, params );
337 e.s.clear();
338 e.i = order;
339 order_list.push_back( e );
340#endif
341 ++order;
342 }
343 mproc.set_var( "API.ORDER_LIST", order_list );
344
345 element external_id;
346 external_id.i = get_global< bool >( "external-id" );
347 mproc.set_var( "USE_EXTERNAL_ID", var_t( 1, external_id ) );
348 }
349
350
351 // プラットフォーム・コンパイラ依存の値をマクロプロセッサの変数として設定する。
352 void set_platform_vars( cfg1_out const& cfg1out, macro_processor& mproc )
353 {
354 typedef macro_processor::element element;
355 typedef macro_processor::var_t var_t;
356
357 cfg1_out::cfg1_def_table const* def_table = cfg1out.get_def_table();
358 std::size_t sizeof_signed_t;
359 std::size_t sizeof_pointer;
360
361 static cfg1_out::cfg1_def_t const limit_defs[] =
362 {
363 { false, "TOPPERS_cfg_CHAR_BIT", "CHAR_BIT" },
364 { false, "TOPPERS_cfg_CHAR_MAX", "CHAR_MAX" },
365 { true, "TOPPERS_cfg_CHAR_MIN", "CHAR_MIN" },
366 { false, "TOPPERS_cfg_SCHAR_MAX", "SCHAR_MAX" }, // 本来は符号付きだが、負になることはない
367 { false, "TOPPERS_cfg_SHRT_MAX", "SHRT_MAX" }, // 本来は符号付きだが、負になることはない
368 { false, "TOPPERS_cfg_INT_MAX", "INT_MAX" }, // 本来は符号付きだが、負になることはない
369 { false, "TOPPERS_cfg_LONG_MAX", "LONG_MAX" }, // 本来は符号付きだが、負になることはない
370 };
371
372 nm_symbol::entry nm_entry = cfg1out.get_syms()->find( "TOPPERS_cfg_sizeof_signed_t" );
373 sizeof_signed_t = static_cast< std::size_t >( cfg1out.get_srec()->get_value( nm_entry.address, 4, cfg1out.is_little_endian() ) );
374
375 nm_entry = cfg1out.get_syms()->find( "TOPPERS_cfg_sizeof_pointer" );
376 sizeof_pointer = static_cast< std::size_t >( cfg1out.get_srec()->get_value( nm_entry.address, 4, cfg1out.is_little_endian() ) );
377
378 for ( std::size_t i = 0; i < sizeof limit_defs / sizeof limit_defs[ 0 ]; ++i )
379 {
380 element e;
381 e.s = limit_defs[ i ].expression;
382 nm_entry = cfg1out.get_syms()->find( limit_defs[ i ].name );
383 std::tr1::int64_t value = cfg1out.get_srec()->get_value( nm_entry.address, sizeof_signed_t, cfg1out.is_little_endian() );
384 if ( sizeof_signed_t < 8 && limit_defs[ i ].is_signed )
385 {
386 value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
387 }
388 mproc.set_var( e.s, var_t( 1, e ) );
389 }
390
391 for ( cfg1_out::cfg1_def_table::const_iterator iter( def_table->begin() ), last( def_table->end() );
392 iter != last;
393 ++iter )
394 {
395 element e;
396 std::tr1::int64_t value;
397
398 nm_entry = cfg1out.get_syms()->find( "TOPPERS_cfg_" + iter->name );
399 if ( nm_entry.type >= 0 )
400 {
401 if ( !iter->expression.empty() && iter->expression[ 0 ] == '@' ) // 式が'@'で始まる場合はアドレス定数式
402 {
403 value = cfg1out.get_srec()->get_value( nm_entry.address, sizeof_pointer, cfg1out.is_little_endian() );
404 if ( sizeof_signed_t < 8 && iter->is_signed )
405 {
406 value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
407 }
408
409 // 先ほど取り出したアドレスを使って間接参照
410 value = cfg1out.get_srec()->get_value( value, 8, cfg1out.is_little_endian() ); // 取り出す値は型に関係なく常に8バイト
411 if ( sizeof_signed_t < 8 && iter->is_signed )
412 {
413 value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
414 }
415 e.s = iter->expression.c_str() + 1; // 先頭の'@'を除去
416 }
417 else // アドレスではない通常の整数定数式
418 {
419 value = cfg1out.get_srec()->get_value( nm_entry.address, sizeof_signed_t, cfg1out.is_little_endian() );
420 if ( sizeof_signed_t < 8 && iter->is_signed )
421 {
422 value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
423 }
424 e.s = iter->expression;
425 }
426 e.i = value;
427 mproc.set_var( iter->name, var_t( 1, e ) );
428 }
429 }
430
431 // バイトオーダー
432 {
433 bool little_endian = cfg1out.is_little_endian();
434 element e;
435 e.i = little_endian;
436 mproc.set_var( "LITTLE_ENDIAN", var_t( 1, e ) );
437
438 e.i = !little_endian;
439 mproc.set_var( "BIG_ENDIAN", var_t( 1, e ) );
440 }
441 }
442
443 }
444
445 //! コンストラクタ
446 factory::factory( std::string const& kernel )
447 : kernel_( tolower( kernel ) )
448 {
449 }
450
451 //! デストラクタ
452 factory::~factory()
453 {
454 }
455
456 //! サポートしているオブジェクト情報の取得
457 std::vector<std::string> const* factory::get_object_definition_info() const
458 {
459 // CSVから静的API情報を読み取り、登録するためのローカルクラス
460 struct init_t
461 {
462 init_t()
463 {
464 boost::any t = global( "api-table" );
465 if ( !t.empty() )
466 {
467 std::vector< std::string > api_tables( boost::any_cast< std::vector< std::string >& >( t ) );
468 for ( std::vector< std::string >::const_iterator iter( api_tables.begin() ), last( api_tables.end() );
469 iter != last;
470 ++iter )
471 {
472 std::string buf;
473 std::string api_table_filename = *iter;
474 read( api_table_filename.c_str(), buf );
475 csv data( buf.begin(), buf.end() );
476 for ( csv::const_iterator d_iter( data.begin() ), d_last( data.end() );
477 d_iter != d_last;
478 ++d_iter )
479 {
480 unsigned int i;
481 for(i = 0 ; i < d_iter->size() ; i++)
482 {
483 volatile int x = 1;
484 object_definition_table.push_back((*d_iter)[i].c_str());
485 }
486 }
487
488 }
489 }
490 }
491
492 ~init_t()
493 {
494
495
496 }
497
498 std::vector<std::string> object_definition_table;
499 };
500 static init_t init;
501 std::vector<std::string> const* result = &init.object_definition_table;
502 return result;
503 }
504
505 /*!
506 * \brief cfg1_out.c への出力情報テーブルの生成
507 * \return 生成した cfg1_out::cfg1_def_table オブジェクトへのポインタ
508 * \note この関数が返すポインタは delete してはならない
509 *
510 * --cfg1-def-table オプションで指定したファイルから、cfg1_out.c へ出力する情報を読み取り、
511 * cfg1_out::cfg1_def_table オブジェクトを生成する。
512 *
513 * CSV の形式は以下の通り
514 *
515 * シンボル名,式[,s|signed]
516 *
517 * 末尾の s または signed は省略可能。省略時は符号無し整数とみなす。s または signed 指定時は
518 * 符号付き整数とみなす。\n
519 * 「式」の最初に # があれば前処理式とみなす。
520 */
521 cfg1_out::cfg1_def_table const* factory::get_cfg1_def_table() const
522 {
523 struct init_t
524 {
525 init_t()
526 {
527 boost::any t = global( "cfg1-def-table" );
528 if ( !t.empty() )
529 {
530 std::vector< std::string > cfg1_def_table = boost::any_cast< std::vector< std::string >& >( t );
531 for ( std::vector< std::string >::const_iterator iter( cfg1_def_table.begin() ), last( cfg1_def_table.end() );
532 iter != last;
533 ++iter )
534 {
535 std::string buf;
536 read( iter->c_str(), buf );
537 csv data( buf.begin(), buf.end() );
538 for ( csv::const_iterator d_iter( data.begin() ), d_last( data.end() );
539 d_iter != d_last;
540 ++d_iter )
541 {
542 csv::size_type len = d_iter->size();
543 if ( len < 2 )
544 {
545 toppers::fatal( _( "too little fields in `%1%\'" ), *iter );
546 }
547 cfg1_out::cfg1_def_t def = { 0 };
548 def.name = ( *d_iter )[ 0 ];
549 def.expression = ( *d_iter )[ 1 ];
550 if ( len >= 3 )
551 {
552 std::string is_signed( ( *d_iter )[ 2 ] );
553 def.is_signed = ( is_signed == "s" || is_signed == "signed" );
554 }
555 if ( len >= 4)
556 {
557 def.value1 = ( *d_iter )[ 3 ];
558 }
559 if ( len >= 5)
560 {
561 def.value2 = ( *d_iter )[ 4 ];
562 }
563 cfg1_def_table_.push_back( def );
564 }
565 }
566 }
567 }
568 cfg1_out::cfg1_def_table cfg1_def_table_;
569 };
570 static init_t init;
571 cfg1_out::cfg1_def_table const* result = &init.cfg1_def_table_;
572 return result;
573 }
574
575 //! オブジェクトの交換
576 void factory::do_swap( factory& other )
577 {
578 kernel_.swap( other.kernel_ );
579 }
580
581 macro_processor::hook_t factory::do_get_hook_on_assign() const
582 {
583// return &hook_on_assign;
584 return 0;
585 }
586
587 /*!
588 * \brief マクロプロセッサの生成
589 * \param[in] hook 変数に値を代入した際のフック処理
590 * \param[in] cfg1out cfg1_out オブジェクト
591 * \param[in] api_map .cfg ファイルに記述された静的API情報
592 * \return マクロプロセッサへのポインタ
593 */
594 std::auto_ptr< macro_processor > factory::do_create_macro_processor( macro_processor::hook_t hook, cfg1_out const& cfg1out, cfg1_out::cfg_obj_map const& obj_def_map ) const
595 {
596 typedef macro_processor::element element;
597 typedef macro_processor::var_t var_t;
598 std::auto_ptr< macro_processor > mproc( new macro_processor( hook ) );
599 element e;
600
601 e.s = " "; mproc->set_var( "SPC", var_t( 1, e ) ); // $SPC$
602 e.s = "\t"; mproc->set_var( "TAB", var_t( 1, e ) ); // $TAB$
603 e.s = "\n"; mproc->set_var( "NL", var_t( 1, e ) ); // $NL$
604
605 // バージョン情報
606 e.s = toppers::get_global< std::string >( "version" );
607 e.i = toppers::get_global< std::tr1::int64_t >( "timestamp" );
608 mproc->set_var( "CFG_VERSION", var_t( 1, e ) ); // $CFG_VERSION$
609
610 // その他の組み込み変数の設定
611 set_object_vars( obj_def_map, *mproc );
612 set_platform_vars( cfg1out, *mproc );
613 e.s = cfg1out.get_includes();
614 mproc->set_var( "INCLUDES", var_t( 1, e ) );
615
616 // パス情報
617 e.s = boost::lexical_cast< std::string >(toppers::get_global< int >( "pass" ));
618 e.i = toppers::get_global< int >( "pass" );
619 mproc->set_var( "CFG_PASS", var_t( 1, e ) );
620
621 return mproc;
622 }
623
624 /*!
625 * \brief マクロプロセッサの生成
626 * \param[in] cfg1out cfg1_out オブジェクト
627 * \param[in] api_array .cfg ファイルに記述された静的API情報
628 * \return マクロプロセッサへのポインタ
629 */
630 std::auto_ptr< macro_processor > factory::do_create_macro_processor( macro_processor::hook_t hook, cfg1_out const& cfg1out, std::vector< object_definition* > const& obj_array ) const
631 {
632 typedef macro_processor::element element;
633 typedef macro_processor::var_t var_t;
634 std::auto_ptr< macro_processor > mproc( new macro_processor( hook ) );
635 element e;
636
637 e.s = " "; mproc->set_var( "SPC", var_t( 1, e ) ); // $SPC$
638 e.s = "\t"; mproc->set_var( "TAB", var_t( 1, e ) ); // $TAB$
639 e.s = "\n"; mproc->set_var( "NL", var_t( 1, e ) ); // $NL$
640
641 // バージョン情報
642 e.s = toppers::get_global< std::string >( "version" );
643 e.i = toppers::get_global< std::tr1::int64_t >( "timestamp" );
644 mproc->set_var( "CFG_VERSION", var_t( 1, e ) ); // $CFG_VERSION$
645
646 // その他の組み込み変数の設定
647 set_object_vars( obj_array, *mproc );
648 set_platform_vars( cfg1out, *mproc );
649 e.s = cfg1out.get_includes();
650 mproc->set_var( "INCLUDES", var_t( 1, e ) );
651
652 // パス情報
653 e.s = boost::lexical_cast< std::string >(toppers::get_global< int >( "pass" ));
654 e.i = toppers::get_global< int >( "pass" );
655 mproc->set_var( "CFG_PASS", var_t( 1, e ) );
656
657 return mproc;
658 }
659
660
661 std::auto_ptr< cfg1_out > factory::do_create_cfg1_out( std::string const& filename ) const
662 {
663 return std::auto_ptr< oil::cfg1_out >( new cfg1_out( filename, get_cfg1_def_table() ) );
664 }
665 std::auto_ptr< checker > factory::do_create_checker() const
666 {
667 return std::auto_ptr< oil::checker >( new checker );
668 }
669
670 }
671}
Note: See TracBrowser for help on using the repository browser.