source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/TECS2CBridgePlugin.rb@ 389

Last change on this file since 389 was 389, checked in by coas-nagasima, 5 years ago

ビルドが通るよう更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
File size: 6.5 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2014 by TOPPERS Project
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# $Id$
38#++
39
40#== TECS => C 呼び出しプラグイン
41class TECS2CBridgePlugin < SignaturePlugin
42#@signature:: Signature プラグインの対象となるシグニチャ
43#@option:: String '"', '"' で囲まれた文字列
44
45 @@signature_list = { }
46
47 #signature:: Signature シグニチャ(インスタンス)
48 def initialize( signature, option )
49 super
50
51 @signature = signature
52 @header_name = "#{$gen}/#{@signature.get_global_name}.#{$h_suffix}"
53 @celltype_name = :"t#{@signature.get_global_name}"
54
55 parse_plugin_arg
56 end
57
58 def gen_cdl_file file
59 if @@signature_list[ @signature.get_global_name ] then
60 @@signature_list[ @signature.get_global_name ] << self
61 cdl_warning( "T2CW001 signature '$1' duplicate. ignored current one", @signature.get_namespace_path )
62 return
63 end
64 @@signature_list[ @signature.get_global_name ] = [ self ]
65
66 print_msg " TECS2CBridgePlugin: [celltype] TECS2C::#{@celltype_name}. Create cell then join to entry port 'eEntry' from the caller cell\n"
67 file.print <<EOT
68namespace nTECS2C{
69 [singleton]
70 celltype #{@celltype_name} {
71 [inline]
72 entry #{@signature.get_namespace_path} eEnt;
73 };
74};
75EOT
76 end
77
78 #=== 後ろのコードを生成
79 #プラグインの後ろのコードを生成
80 #file:: File:
81 def self.gen_post_code( file )
82 # 複数のプラグインの post_code が一つのファイルに含まれるため、以下のような見出しをつけること
83 # file.print "/* '#{self.class.name}' post code */\n"
84 end
85
86 #=== 受け口関数の本体(C言語)を生成する
87 # 通常であれば、ジェネレータは受け口関数のテンプレートを生成する
88 # プラグインの場合、変更する必要のないセルタイプコードを生成する
89 #file:: FILE 出力先ファイル
90 #b_singleton:: bool true if singleton
91 #ct_name:: Symbol
92 #global_ct_name:: string
93 #sig_name:: string
94 #ep_name:: string
95 #func_name:: string
96 #func_global_name:: string
97 #func_type:: class derived from Type
98 def gen_ep_func_body( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
99
100 ret_type = func_type.get_type
101 b_ret_void = ret_type.is_void?
102
103 if ! b_ret_void then
104 file.print( " #{ret_type.get_type_str} retval;\n" )
105 end
106
107 if ! b_singleton then
108
109 file.print <<EOT
110 #{ct_name}_CB *p_cellcb;
111 if( VALID_IDX( idx ) ){
112 p_cellcb = #{global_ct_name}_GET_CELLCB(idx);
113 }else{
114 /* エラー処理コードをここに記述 */
115 }
116
117EOT
118 end
119
120 # p "celltype_name, sig_name, func_name, func_global_name"
121 # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
122
123 if ! b_ret_void then
124 file.print( " retval = " )
125 else
126 file.print( " " )
127 end
128
129 file.print( "#{func_name}(" )
130
131 delim = ""
132 params.each{ |param|
133 file.printf( "#{delim} #{param.get_name}" )
134 delim = ","
135 }
136
137 file.print( " );\n" )
138
139 if ! b_ret_void then
140 file.print( " return retval;\n" )
141 end
142
143 end
144
145
146 def gen_postamble( file, b_singleton, ct_name, global_name )
147
148 # generate header file here, NOT postamble
149 file2 = CFile.open( @header_name, "w" )
150 file2.print <<EOT
151/*
152 * This file was generated by TECS2CBridgePlugin and has prototype
153 * decalarations of functions in signature '#{@signature.get_namespace_path}'
154 */
155
156#include "global_tecsgen.#{$h_suffix}"
157
158EOT
159 @signature.get_function_head_array.each { |f|
160 decl = f.get_declarator
161 func_type = decl.get_type
162 params = func_type.get_paramlist.get_items
163 func_name = decl.get_name
164
165 ret_type = func_type.get_type
166
167 # p "celltype_name, sig_name, func_name, func_global_name"
168 # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
169
170 file2.print( "#{ret_type.get_type_str} #{func_name}(" )
171
172 delim = ""
173 params.each{ |param|
174 file2.printf( "#{delim} #{param.get_name}" )
175 delim = ","
176 }
177
178 file2.print( " )#{ret_type.get_type_str_post};\n" )
179 }
180
181 file2.close
182 end
183
184end
185
Note: See TracBrowser for help on using the repository browser.