tecscde 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rubocop.yml +125 -0
  4. data/.rubocop_todo.yml +188 -0
  5. data/CHANGELOG.md +3 -0
  6. data/Gemfile +6 -0
  7. data/LICENSE +46 -0
  8. data/LICENSE.ja +32 -0
  9. data/README.ja.md +200 -0
  10. data/README.md +35 -0
  11. data/Rakefile +27 -0
  12. data/bin/tecscde +64 -0
  13. data/glade/tecscde-cell-property.glade +205 -0
  14. data/glade/tecscde-celltype-property.glade +172 -0
  15. data/glade/tecscde-celltype.glade +414 -0
  16. data/glade/tecscde-export.glade +161 -0
  17. data/glade/test-cell-plugin.rb +51 -0
  18. data/glade/test-cell-property.rb +35 -0
  19. data/glade/test-export.rb +35 -0
  20. data/glade/test-palette.rb +26 -0
  21. data/lib/tcflow.rb +148 -0
  22. data/lib/tecscde.rb +65 -0
  23. data/lib/tecscde/NewCell.png +0 -0
  24. data/lib/tecscde/SelectArrow.png +0 -0
  25. data/lib/tecscde/attr_tree_view.rb +253 -0
  26. data/lib/tecscde/cell_plugin_dialog.glade +294 -0
  27. data/lib/tecscde/cell_plugin_dialog.rb +89 -0
  28. data/lib/tecscde/celltype_tree_view.rb +105 -0
  29. data/lib/tecscde/change_set_control.rb +35 -0
  30. data/lib/tecscde/change_set_control/change_set.rb +32 -0
  31. data/lib/tecscde/change_set_control/change_set_manager.rb +62 -0
  32. data/lib/tecscde/command.rb +35 -0
  33. data/lib/tecscde/control.rb +491 -0
  34. data/lib/tecscde/highlighted_objects.rb +180 -0
  35. data/lib/tecscde/logger.rb +74 -0
  36. data/lib/tecscde/main_view_and_model.rb +80 -0
  37. data/lib/tecscde/palette.glade +553 -0
  38. data/lib/tecscde/palette.rb +174 -0
  39. data/lib/tecscde/preferences.glade +117 -0
  40. data/lib/tecscde/preferences.rb +44 -0
  41. data/lib/tecscde/tecs_model.rb +1137 -0
  42. data/lib/tecscde/tecs_model/hbar.rb +68 -0
  43. data/lib/tecscde/tecs_model/tm_c_port.rb +122 -0
  44. data/lib/tecscde/tecs_model/tm_c_port_array.rb +98 -0
  45. data/lib/tecscde/tecs_model/tm_cell.rb +496 -0
  46. data/lib/tecscde/tecs_model/tm_e_port.rb +126 -0
  47. data/lib/tecscde/tecs_model/tm_e_port_array.rb +78 -0
  48. data/lib/tecscde/tecs_model/tm_join.rb +293 -0
  49. data/lib/tecscde/tecs_model/tm_join_bar.rb +146 -0
  50. data/lib/tecscde/tecs_model/tm_port.rb +238 -0
  51. data/lib/tecscde/tecs_model/tm_port_array.rb +246 -0
  52. data/lib/tecscde/tecs_model/tm_region.rb +107 -0
  53. data/lib/tecscde/tecs_model/tm_uneditable.rb +68 -0
  54. data/lib/tecscde/tecs_model/vbar.rb +68 -0
  55. data/lib/tecscde/templates/_cell_info.cde.erb +15 -0
  56. data/lib/tecscde/templates/_join_info.cde.erb +28 -0
  57. data/lib/tecscde/templates/main.cde.erb +49 -0
  58. data/lib/tecscde/tm_object.rb +91 -0
  59. data/lib/tecscde/version.rb +4 -0
  60. data/lib/tecscde/view.rb +58 -0
  61. data/lib/tecscde/view/cairo_matrix.rb +90 -0
  62. data/lib/tecscde/view/canvas.rb +59 -0
  63. data/lib/tecscde/view/constants.rb +114 -0
  64. data/lib/tecscde/view/main_view.rb +1245 -0
  65. data/lib/tecsflow.rb +475 -0
  66. data/lib/tecsflow/C_parser.tab.rb +2471 -0
  67. data/lib/tecsflow/C_parser.y.rb +1087 -0
  68. data/lib/tecsflow/classes.rb +421 -0
  69. data/lib/tecsgen.rb +581 -0
  70. data/lib/tecsgen/core/C_parser.tab.rb +2477 -0
  71. data/lib/tecsgen/core/C_parser.y +1032 -0
  72. data/lib/tecsgen/core/bnf-deb.tab.rb +5193 -0
  73. data/lib/tecsgen/core/bnf.tab.rb +5193 -0
  74. data/lib/tecsgen/core/bnf.y +2211 -0
  75. data/lib/tecsgen/core/componentobj.rb +7901 -0
  76. data/lib/tecsgen/core/ctypes.rb +226 -0
  77. data/lib/tecsgen/core/expression.rb +1031 -0
  78. data/lib/tecsgen/core/gen_xml.rb +374 -0
  79. data/lib/tecsgen/core/generate.rb +5206 -0
  80. data/lib/tecsgen/core/location.rb +116 -0
  81. data/lib/tecsgen/core/messages.rb +101 -0
  82. data/lib/tecsgen/core/optimize.rb +456 -0
  83. data/lib/tecsgen/core/plugin.rb +332 -0
  84. data/lib/tecsgen/core/pluginModule.rb +165 -0
  85. data/lib/tecsgen/core/syntaxobj.rb +1234 -0
  86. data/lib/tecsgen/core/tecs_lang.rb +306 -0
  87. data/lib/tecsgen/core/tecsgen.rb +453 -0
  88. data/lib/tecsgen/core/tecsinfo.rb +860 -0
  89. data/lib/tecsgen/core/tool_info.rb +258 -0
  90. data/lib/tecsgen/core/types.rb +1632 -0
  91. data/lib/tecsgen/core/unjoin_plugin.rb +218 -0
  92. data/lib/tecsgen/core/value.rb +650 -0
  93. data/lib/tecsgen/messages/messages_console_en_US.rb +1171 -0
  94. data/lib/tecsgen/messages/messages_console_ja_JP.rb +1171 -0
  95. data/lib/tecsgen/messages/messages_file_en_US.rb +334 -0
  96. data/lib/tecsgen/messages/messages_file_ja_JP.rb +163 -0
  97. data/lib/tecsgen/plugin/ATK1AlarmPlugin.rb +196 -0
  98. data/lib/tecsgen/plugin/ATK1DelayTaskPlugin.rb +106 -0
  99. data/lib/tecsgen/plugin/ATK1EventPlugin.rb +147 -0
  100. data/lib/tecsgen/plugin/ATK1ISRPlugin.rb +174 -0
  101. data/lib/tecsgen/plugin/ATK1KernelPlugin.rb +287 -0
  102. data/lib/tecsgen/plugin/ATK1ResourcePlugin.rb +124 -0
  103. data/lib/tecsgen/plugin/ATK1TaskPlugin.rb +220 -0
  104. data/lib/tecsgen/plugin/C2TECSBridgePlugin.rb +210 -0
  105. data/lib/tecsgen/plugin/CellPlugin.rb +61 -0
  106. data/lib/tecsgen/plugin/CelltypePlugin.rb +72 -0
  107. data/lib/tecsgen/plugin/CompositePlugin.rb +66 -0
  108. data/lib/tecsgen/plugin/DomainPlugin.rb +89 -0
  109. data/lib/tecsgen/plugin/HRP2AlarmHandlerPlugin.rb +76 -0
  110. data/lib/tecsgen/plugin/HRP2Cache.rb +1 -0
  111. data/lib/tecsgen/plugin/HRP2CyclicHandlerPlugin.rb +75 -0
  112. data/lib/tecsgen/plugin/HRP2DataqueuePlugin.rb +68 -0
  113. data/lib/tecsgen/plugin/HRP2EventflagPlugin.rb +68 -0
  114. data/lib/tecsgen/plugin/HRP2FixedSizeMemoryPoolPlugin.rb +68 -0
  115. data/lib/tecsgen/plugin/HRP2HandlerPlugin.rb +117 -0
  116. data/lib/tecsgen/plugin/HRP2KernelObjectPlugin.rb +372 -0
  117. data/lib/tecsgen/plugin/HRP2ObjectPlugin.rb +94 -0
  118. data/lib/tecsgen/plugin/HRP2Plugin.rb +140 -0
  119. data/lib/tecsgen/plugin/HRP2PostHook.rb +111 -0
  120. data/lib/tecsgen/plugin/HRP2PriorityDataqueuePlugin.rb +66 -0
  121. data/lib/tecsgen/plugin/HRP2RPCPlugin.rb +319 -0
  122. data/lib/tecsgen/plugin/HRP2SVCPlugin.rb +473 -0
  123. data/lib/tecsgen/plugin/HRP2SemaphorePlugin.rb +67 -0
  124. data/lib/tecsgen/plugin/HRP2TaskPlugin.rb +200 -0
  125. data/lib/tecsgen/plugin/HRPHandlerPlugin.rb +125 -0
  126. data/lib/tecsgen/plugin/HRPKernelObjectManager.rb +72 -0
  127. data/lib/tecsgen/plugin/HRPKernelObjectPlugin.rb +333 -0
  128. data/lib/tecsgen/plugin/HRPObjectPlugin.rb +93 -0
  129. data/lib/tecsgen/plugin/HRPPlugin.rb +356 -0
  130. data/lib/tecsgen/plugin/HRPRPCPlugin.rb +407 -0
  131. data/lib/tecsgen/plugin/HRPSVCPlugin.rb +859 -0
  132. data/lib/tecsgen/plugin/HRPTaskPlugin.rb +107 -0
  133. data/lib/tecsgen/plugin/Mruby2CBridgePlugin.rb +86 -0
  134. data/lib/tecsgen/plugin/MrubyBridgeCellPlugin.rb +264 -0
  135. data/lib/tecsgen/plugin/MrubyBridgeCelltypePlugin.rb +293 -0
  136. data/lib/tecsgen/plugin/MrubyBridgeCompositePlugin.rb +49 -0
  137. data/lib/tecsgen/plugin/MrubyBridgePlugin.rb +67 -0
  138. data/lib/tecsgen/plugin/MrubyBridgeSignaturePlugin.rb +1307 -0
  139. data/lib/tecsgen/plugin/MrubyInfoBridgePlugin.rb +14 -0
  140. data/lib/tecsgen/plugin/MrubyInfoBridgeSignaturePlugin.rb +994 -0
  141. data/lib/tecsgen/plugin/MultiPlugin.rb +57 -0
  142. data/lib/tecsgen/plugin/NotifierPlugin.rb +1217 -0
  143. data/lib/tecsgen/plugin/OpaqueMarshalerPlugin.rb +81 -0
  144. data/lib/tecsgen/plugin/OpaqueRPCPlugin.rb +323 -0
  145. data/lib/tecsgen/plugin/RPCPlugin.rb +266 -0
  146. data/lib/tecsgen/plugin/RepeatCellPlugin.rb +166 -0
  147. data/lib/tecsgen/plugin/RepeatJoinPlugin.rb +130 -0
  148. data/lib/tecsgen/plugin/SharedOpaqueRPCPlugin.rb +357 -0
  149. data/lib/tecsgen/plugin/SharedRPCPlugin.rb +329 -0
  150. data/lib/tecsgen/plugin/SignaturePlugin.rb +77 -0
  151. data/lib/tecsgen/plugin/TECS2CBridgePlugin.rb +178 -0
  152. data/lib/tecsgen/plugin/TECSInfoPlugin.rb +280 -0
  153. data/lib/tecsgen/plugin/ThroughPlugin.rb +333 -0
  154. data/lib/tecsgen/plugin/TracePlugin.rb +484 -0
  155. data/lib/tecsgen/plugin/lib/GenHRP2Marshaler.rb +761 -0
  156. data/lib/tecsgen/plugin/lib/GenOpaqueMarshaler.rb +1107 -0
  157. data/lib/tecsgen/plugin/lib/GenParamCopy.rb +365 -0
  158. data/lib/tecsgen/plugin/lib/GenTransparentMarshaler.rb +683 -0
  159. data/lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb +283 -0
  160. data/lib/tecsgen/plugin/lib/MrubyBridgeSignaturePluginModule.rb +277 -0
  161. data/lib/tecsgen/version.rb +6 -0
  162. data/samples/FigureSamples/active/active.cde +104 -0
  163. data/samples/FigureSamples/active/active.cdl +20 -0
  164. data/samples/FigureSamples/active/active.pdf +0 -0
  165. data/samples/FigureSamples/active/active.png +0 -0
  166. data/samples/FigureSamples/active/gen/tmp_C_src.c +36 -0
  167. data/samples/FigureSamples/active/gen/tmp_cygwin_tecs.h +1908 -0
  168. data/samples/FigureSamples/active/gen/tmp_plugin_post_code.cdl +0 -0
  169. data/samples/FigureSamples/allocator/allocator-internal.png +0 -0
  170. data/samples/FigureSamples/allocator/allocator.cde +171 -0
  171. data/samples/FigureSamples/allocator/allocator.cdl +58 -0
  172. data/samples/FigureSamples/allocator/allocator.png +0 -0
  173. data/samples/FigureSamples/basic/Makefile +87 -0
  174. data/samples/FigureSamples/basic/SimpleSample-trace.cdl +50 -0
  175. data/samples/FigureSamples/basic/SimpleSample.cde +91 -0
  176. data/samples/FigureSamples/basic/SimpleSample.cdl +47 -0
  177. data/samples/FigureSamples/basic/basic.cde +93 -0
  178. data/samples/FigureSamples/basic/basic.cdl +46 -0
  179. data/samples/FigureSamples/basic/basic.png +0 -0
  180. data/samples/FigureSamples/callback/callback.cde +130 -0
  181. data/samples/FigureSamples/callback/callback.cdl +29 -0
  182. data/samples/FigureSamples/callback/callback.png +0 -0
  183. data/samples/FigureSamples/carray/carray.cde +144 -0
  184. data/samples/FigureSamples/carray/carray.cdl +38 -0
  185. data/samples/FigureSamples/carray/carray.png +0 -0
  186. data/samples/FigureSamples/cearray/cearray.cde +314 -0
  187. data/samples/FigureSamples/cearray/cearray.cdl +60 -0
  188. data/samples/FigureSamples/cearray/cearray.png +0 -0
  189. data/samples/FigureSamples/composite/composite-internal.png +0 -0
  190. data/samples/FigureSamples/composite/composite.cde +216 -0
  191. data/samples/FigureSamples/composite/composite.cdl +95 -0
  192. data/samples/FigureSamples/composite/composite.png +0 -0
  193. data/samples/FigureSamples/earray/earray.cde +142 -0
  194. data/samples/FigureSamples/earray/earray.cdl +38 -0
  195. data/samples/FigureSamples/earray/earray.png +0 -0
  196. data/samples/FigureSamples/join/Makefile +87 -0
  197. data/samples/FigureSamples/join/join.cde +132 -0
  198. data/samples/FigureSamples/join/join.cdl +40 -0
  199. data/samples/FigureSamples/join/join.png +0 -0
  200. data/samples/FigureSamples/relay/Makefile +99 -0
  201. data/samples/FigureSamples/relay/relay-internal.png +0 -0
  202. data/samples/FigureSamples/relay/relay.cde +284 -0
  203. data/samples/FigureSamples/relay/relay.cdl +52 -0
  204. data/samples/FigureSamples/relay/relay.png +0 -0
  205. data/samples/FigureSamples/rpc/Makefile +123 -0
  206. data/samples/FigureSamples/rpc/rpc-expand.png +0 -0
  207. data/samples/FigureSamples/rpc/rpc.cde +245 -0
  208. data/samples/FigureSamples/rpc/rpc.png +0 -0
  209. data/samples/FigureSamples/rpc/rpc_sample.cdl +53 -0
  210. data/samples/SimpleSample/Makefile +25 -0
  211. data/samples/SimpleSample/SimpleSample/Makefile +86 -0
  212. data/samples/SimpleSample/SimpleSample/Makefile-trace +91 -0
  213. data/samples/SimpleSample/SimpleSample/README.txt +106 -0
  214. data/samples/SimpleSample/SimpleSample/SimpleSample-trace.cdl +50 -0
  215. data/samples/SimpleSample/SimpleSample/SimpleSample.cdl +45 -0
  216. data/samples/SimpleSample/SimpleSample/src/tSample.c +77 -0
  217. data/samples/SimpleSample/SimpleSample/src/tSimple.c +48 -0
  218. data/samples/SimpleSample/SimpleSample/src/tecs-types.h +27 -0
  219. data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile +51 -0
  220. data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile-trace +91 -0
  221. data/samples/SimpleSample/SimpleSampleOpaqueRPC/README.txt +106 -0
  222. data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample-trace.cdl +80 -0
  223. data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample.cdl +77 -0
  224. data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSample/Makefile +112 -0
  225. data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSimple/Makefile +109 -0
  226. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSample.c +80 -0
  227. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSimple.c +47 -0
  228. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tTaskMain.c +66 -0
  229. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tecs-types.h +27 -0
  230. data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile +125 -0
  231. data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile-trace +130 -0
  232. data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample-trace.cdl +54 -0
  233. data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample.cdl +53 -0
  234. data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSample.c +80 -0
  235. data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSimple.c +54 -0
  236. data/tecscde.gemspec +41 -0
  237. metadata +353 -0
@@ -0,0 +1,332 @@
1
+ #
2
+ # TECS Generator
3
+ # Generator for TOPPERS Embedded Component System
4
+ #
5
+ # Copyright (C) 2008-2017 by TOPPERS Project
6
+ #--
7
+ # 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
8
+ # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9
+ # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
10
+ # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
11
+ # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
12
+ # スコード中に含まれていること.
13
+ # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
14
+ # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
15
+ # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
16
+ # の無保証規定を掲載すること.
17
+ # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
18
+ # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
19
+ # と.
20
+ # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
21
+ # 作権表示,この利用条件および下記の無保証規定を掲載すること.
22
+ # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
23
+ # 報告すること.
24
+ # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
25
+ # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
26
+ # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
27
+ # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
28
+ # 免責すること.
29
+ #
30
+ # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
31
+ # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
32
+ # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
33
+ # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
34
+ # の責任を負わない.
35
+ #
36
+ # $Id: plugin.rb 2633 2017-04-02 06:02:05Z okuma-top $
37
+ #++
38
+
39
+ #== Plugin クラス
40
+ # ThroughPlugin, SignaturePlugin, CelltypePlugin に include する
41
+ class Plugin < Node
42
+ # @error_backlog:: [msg1, msg2, ... ] @locale が設定される前に発生したエラー
43
+
44
+ PluginArgProc = {
45
+ "silent" => Proc.new {|obj, rhs| obj.set_silent rhs },
46
+ }
47
+
48
+ def initialize
49
+ super
50
+ @b_silent = false
51
+ @locale = nil # set_locale が呼び出されるまで nil となる
52
+ @error_backlog = []
53
+ end
54
+
55
+ #=== Plugin#cdl_error
56
+ # set_locale が呼び出されるまで @error_backlog に保存し保留する
57
+ def cdl_error(*arg)
58
+ if @locale
59
+ Generator.error2(@locale, *arg)
60
+ else
61
+ @error_backlog << arg
62
+ end
63
+ end
64
+
65
+ #=== locale を設定する
66
+ # Node は initialize で locale を設定するが、plugin は parse とは
67
+ # 異なるタイミング new されるため、locale を再設定する
68
+ # このメソッドを2度呼び出すと @error_backlog のエラーが2度出力されてしまう
69
+ def set_locale(locale)
70
+ @locale = locale
71
+ @error_backlog.each {|arg|
72
+ Generator.error2(locale, *arg)
73
+ }
74
+ end
75
+
76
+ ### 構文解釈 または 意味解析段階で呼び出されるメソッド ###
77
+ # generate 指定子の場合、構文解釈次第(end_of_parseで)呼び出される
78
+ # generate 文の場合、出現次第呼び出される
79
+ ### 意味解析段階で呼び出されるメソッド ### <<< コメント誤り (V1.4.2)
80
+ #=== CDL ファイルの生成
81
+ # typedef, signature, celltype, cell のコードを生成
82
+ # 重複して生成してはならない
83
+ # すでに生成されている場合は出力しないこと。
84
+ # もしくは同名の import により、重複を避けること。
85
+ # file:: FILE 生成するファイル
86
+ def gen_cdl_file(file)
87
+ end
88
+
89
+ ### コード生段階で呼び出されるメソッド ###
90
+ #=== プラグインは gen_ep_func を提供するか
91
+ # gen_ep_func 定義 ⇒ テンプレートではない、セルタイプコード(tCelltype.c)を生成
92
+ # gen_ep_func 未定義 ⇒ テンプレート(tCelltype_templ.c)を生成
93
+ def gen_ep_func?
94
+ self.class.method_defined?(:gen_ep_func_body)
95
+ end
96
+
97
+ #=== 受け口関数の本体(C言語)を生成する
98
+ # プラグインの場合、変更する必要のないセルタイプコードを生成する
99
+ # このメソッドが未定義であれば、プラグインはセルタイプコードを生成しない (通常通りテンプレートを生成する)
100
+ # gen_cdl_file の中で生成されたセルタイプに対して呼び出される
101
+ # file:: FILE 出力先ファイル (tCelltype.c)
102
+ # b_singleton:: bool true if singleton
103
+ # ct_name:: Symbol
104
+ # global_ct_name:: string
105
+ # sig_name:: string
106
+ # ep_name:: string
107
+ # func_name:: string
108
+ # func_global_name:: string
109
+ # func_type:: class derived from Type
110
+ # 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 )
111
+ # end
112
+
113
+ #=== 受け口関数の preamble (C言語)を生成する
114
+ # 必要なら preamble 部に出力する
115
+ # gen_cdl_file の中でで生成されたセルタイプに対して呼び出される
116
+ # file:: FILE 出力先ファイル
117
+ # b_singleton:: bool true if singleton
118
+ # ct_name:: Symbol
119
+ # global_ct_name:: string
120
+ def gen_preamble(file, b_singleton, ct_name, global_ct_name)
121
+ # デフォルトでは何も出力しない
122
+ end
123
+
124
+ #=== 受け口関数の postamble (C言語)を生成する
125
+ # 必要なら postamble 部に出力する
126
+ # gen_cdl_file の中で生成されたセルタイプに対して呼び出される
127
+ # file:: FILE 出力先ファイル
128
+ # b_singleton:: bool true if singleton
129
+ # ct_name:: Symbol
130
+ # global_ct_name:: string
131
+ def gen_postamble(file, b_singleton, ct_name, global_ct_name)
132
+ # デフォルトでは何も出力しない
133
+ end
134
+
135
+ #=== gen_cdl_file の中で生成されたセルタイプに新しいセルが生成された
136
+ # どのセルタイプかは cell.get_celltype で分かる
137
+ #
138
+ # file:: FILE 出力先ファイル
139
+ # b_singleton:: bool true if singleton
140
+ # ct_name:: Symbol
141
+ # global_ct_name:: string
142
+ def new_cell(cell)
143
+ # デフォルトでは何もしない
144
+ end
145
+
146
+ ### プラグイン引数の解釈 ###
147
+ def parse_plugin_arg
148
+ arg = @plugin_arg_str.dup
149
+
150
+ # 改行を消す
151
+ arg.gsub!(/\\\n/, "")
152
+
153
+ while arg != ""
154
+
155
+ # 前の空白読み飛ばす
156
+ arg.sub!(/\A\s*(?:\\\n)*\s*(.*)/, '\1')
157
+
158
+ # 識別子取得
159
+ if arg =~ /\A[a-zA-Z_]\w*/
160
+ ident = $~
161
+ arg = $'
162
+ else
163
+ cdl_error("P1001 plugin arg: cannot find identifier in $1", arg)
164
+ return
165
+ end
166
+
167
+ # 前の空白読み飛ばす
168
+ arg.sub!(/\A\s*(?:\\\n)*\s*(.*)/, '\1')
169
+
170
+ if arg =~ /=/
171
+ arg = $'
172
+ else
173
+ cdl_error("P1002 plugin arg: expecting \'=\' not \'$1\'", arg)
174
+ return
175
+ end
176
+
177
+ # 前の空白読み飛ばす
178
+ arg.sub!(/\A\s*(?:\\\n)*\s*(.*)/, '\1')
179
+
180
+ # 右辺文字列
181
+ if arg =~ /\A\\"(.*?)\\"\s*,/ # \" \" で囲まれている場合
182
+ rhs = $1
183
+ remain = $'
184
+ elsif arg =~ /\A%(.*?)%\s*,/ # % % で囲まれている場合
185
+ rhs = $1
186
+ remain = $'
187
+ elsif arg =~ /\A!(.*?)!\s*,/ # $ $ で囲まれている場合
188
+ rhs = $1
189
+ remain = $'
190
+ elsif arg =~ /\A'(.*?)'\s*,/ # $ $ で囲まれている場合
191
+ rhs = $1
192
+ remain = $'
193
+ elsif arg =~ /\A\\"(.*?)\\"\s*,/ # || にも [,$] にもできなかった
194
+ rhs = $1
195
+ remain = $'
196
+ # elsif arg =~ /\A(.*?)\s*$/ then
197
+ elsif arg =~ /\A\\"(.*?)\\"\s*\z/ # \" \" で囲まれている場合
198
+ rhs = $1
199
+ remain = $'
200
+ elsif arg =~ /\A%(.*?)%\s*\z/ # % % で囲まれている場合
201
+ rhs = $1
202
+ remain = $'
203
+ elsif arg =~ /\A!(.*?)!\s*\z/ # $ $ で囲まれている場合
204
+ rhs = $1
205
+ remain = $'
206
+ elsif arg =~ /\A'(.*?)'\s*\z/ # $ $ で囲まれている場合
207
+ rhs = $1
208
+ remain = $'
209
+ elsif arg =~ /\A\\"(.*?)\\"\s*\z/ # || にも [,$] にもできなかった
210
+ rhs = $1
211
+ remain = $'
212
+ elsif arg =~ /\A(.*?),/
213
+ rhs = $1
214
+ remain = $'
215
+ # 前の空白読み飛ばす
216
+ rhs.sub!(/\A\s*(.*)\s*\z/, '\1')
217
+ elsif arg =~ /\A(.*?)\s*\z/
218
+ rhs = $1
219
+ remain = $'
220
+ else
221
+ cdl_error("P1003 plugin arg: unexpected $1", arg)
222
+ return
223
+ end
224
+
225
+ # 0文字の文字列を to_sym すると例外発生するので空白文字とする
226
+ if rhs == ""
227
+ rhs = " "
228
+ end
229
+
230
+ arg = remain # arg の残りの部分
231
+ arg.sub!(/\A\s*(?:\\\n)*\s*(.*)/, '\1') # 前の空白読み飛ばす
232
+
233
+ # \ を外す
234
+ rhs = rhs.gsub(/\\(.)/, "\\1") # ここで $' が変わることに注意!
235
+ # print "parse_plugin_arg: #{ident} #{rhs}\n"
236
+ @plugin_arg_list[ident] = rhs
237
+
238
+ check_plugin_arg(ident, rhs)
239
+ end
240
+ # @plugin_arg_list.each{|i,r| print "ident: #{i} rhs: #{r}\n" }
241
+ end
242
+
243
+ #=== プラグイン引数をチェックする
244
+ # @plugin_arg_check_proc_tab に従ってプラグイン引数をチェックすする
245
+ # 古い用法:子クラスでオーバーライドし、引数識別子が正しいかチェックする
246
+ # ident:: string: 引数識別子
247
+ # rhs:: string: 右辺文字列
248
+ def check_plugin_arg(ident, rhs)
249
+ dbgPrint "check_plugin_arg: #{ident} #{rhs.to_str}\n"
250
+ proc = nil
251
+ if @plugin_arg_check_proc_tab
252
+ proc = @plugin_arg_check_proc_tab[ident.to_s]
253
+ end
254
+ if proc.nil?
255
+ proc = PluginArgProc[ident.to_s]
256
+ end
257
+ if proc.instance_of? Proc
258
+ dbgPrint "calling: #{self.class.name}.#{proc}\n"
259
+ proc.call(self, rhs)
260
+ else
261
+ params = ""
262
+ delim = ""
263
+ @plugin_arg_check_proc_tab.each{|j, p|
264
+ params = "#{params}#{delim}#{j}"
265
+ delim = ", "
266
+ }
267
+ cdl_error("P1004 $1: unknown plugin argument\'s identifier\n $2 are acceptible for RPCPlugin.", ident, params)
268
+ end
269
+ end
270
+
271
+ #=== プラグインのメッセージ出力
272
+ def print_msg(msg)
273
+ if @b_silent == true
274
+ return
275
+ end
276
+ print msg
277
+ end
278
+
279
+ #=== プラグイン引数 silent
280
+ def set_silent(rhs)
281
+ if rhs == "true" || rhs.nil?
282
+ @b_silent = true
283
+ end
284
+ end
285
+ end
286
+
287
+ #== 出力文字列を utf-8 から出力ファイルに convert する
288
+ # tecsgen のソースコードは utf-8 で記述されている
289
+ # これを、出力ファイルの文字コードに変換して出力する
290
+ #
291
+ # generate.rb で出力するものは message.rb で変換している
292
+ # generate.rb で出力するものは APPFile クラスを使用している
293
+ # mikan: CFile で出力したものに factory で追記できない (cdl ファイルの場合、追記できても意味がない)
294
+ class CFile
295
+ def self.open(path, mode)
296
+ CFile.new(path, mode)
297
+ end
298
+
299
+ def initialize(path, mode)
300
+ mode += ":" + $Ruby19_File_Encode
301
+ @file = File.open(path, mode)
302
+ end
303
+
304
+ def print(str)
305
+ if $ENCODING_CONSOLE == Encoding::BINARY
306
+ @file.print(str)
307
+ else
308
+ @file.print(str.encode($ENCODING_CDL))
309
+ end
310
+ end
311
+
312
+ def puts(str)
313
+ if $ENCODING_CONSOLE == Encoding::BINARY
314
+ @file.print(str)
315
+ else
316
+ @file.print(str.encode($ENCODING_CDL))
317
+ end
318
+ @file.print("\n")
319
+ end
320
+
321
+ def printf(format, *arg)
322
+ if $ENCODING_CONSOLE == Encoding::BINARY
323
+ @file.print(sprintf(format, *arg))
324
+ else
325
+ @file.print(sprintf(format, *arg).encode($ENCODING_CDL))
326
+ end
327
+ end
328
+
329
+ def close
330
+ @file.close
331
+ end
332
+ end
@@ -0,0 +1,165 @@
1
+ #
2
+ # TECS Generator
3
+ # Generator for TOPPERS Embedded Component System
4
+ #
5
+ # Copyright (C) 2008-2017 by TOPPERS Project
6
+ #--
7
+ # 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
8
+ # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9
+ # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
10
+ # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
11
+ # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
12
+ # スコード中に含まれていること.
13
+ # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
14
+ # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
15
+ # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
16
+ # の無保証規定を掲載すること.
17
+ # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
18
+ # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
19
+ # と.
20
+ # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
21
+ # 作権表示,この利用条件および下記の無保証規定を掲載すること.
22
+ # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
23
+ # 報告すること.
24
+ # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
25
+ # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
26
+ # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
27
+ # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
28
+ # 免責すること.
29
+ #
30
+ # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
31
+ # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
32
+ # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
33
+ # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
34
+ # の責任を負わない.
35
+ #
36
+ # $Id: pluginModule.rb 2633 2017-04-02 06:02:05Z okuma-top $
37
+ #++
38
+
39
+ #== プラグインをロードする側のモジュール
40
+ # @@loaded_plugin_list:: {Symbol=>Integer}
41
+ module PluginModule
42
+
43
+ @@loaded_plugin_list = {}
44
+
45
+ #=== プラグインをロードする
46
+ # return:: PluginClass
47
+ # V1.4.1 まで return:: true : 成功、 false : 失敗
48
+ #
49
+ # #{plugin_name}.rb をロードし、plugin_name クラスのオブジェクトを生成する.
50
+ # plugin_name が MultiPlugin の場合、get_plugin により、superClass のプラグインオブジェクトをロードする.
51
+ #
52
+ # すでにロードされているものは、重複してロードしない
53
+ # load 時の例外はこのメソッドの中でキャッチされて false が返される
54
+ def load_plugin(plugin_name, superClass)
55
+ dbgPrint "PluginModule: load_plugin: #{plugin_name}\n"
56
+ begin
57
+ unless @@loaded_plugin_list[plugin_name.to_sym]
58
+ @@loaded_plugin_list[plugin_name.to_sym] = 0
59
+ if $verbose
60
+ print("load '#{plugin_name}.rb'\n")
61
+ end
62
+ # "#{plugin_name}.rb" をロード(システム用ではないので、fatal エラーにしない)
63
+ if require_tecsgen_lib("#{plugin_name}.rb", false) == false
64
+ cdl_error("P2001 $1.rb : fail to load plugin", plugin_name)
65
+ return nil
66
+ end
67
+ end
68
+
69
+ plClass = Object.const_get plugin_name
70
+ if plClass <= superClass # plClass inherits superClass
71
+ return plClass
72
+ elsif plClass <= MultiPlugin # plClass inherits MultiPlugin
73
+ dbgPrint "pluginClass=#{plClass}\n"
74
+ plugin_object = plClass.get_plugin superClass
75
+ dbgPrint "pluginClass=#{plugin_object}\n"
76
+ if plugin_object.nil?
77
+ cdl_error("P9999 '$1': MultiPlugin not support '$2'", plugin_name, superClass.name)
78
+ end
79
+ @@loaded_plugin_list[plugin_name.to_sym] = :MultiPlugin
80
+ return plugin_object
81
+ else
82
+ cdl_error("P2002 $1: not kind of $2", plugin_name, superClass.name)
83
+ return nil
84
+ end
85
+ rescue Exception => evar
86
+ if $debug
87
+ p evar.class
88
+ pp evar.backtrace
89
+ end
90
+ cdl_error("P2003 $1: load failed", plugin_name)
91
+ return nil
92
+ end
93
+ # ここへは来ない
94
+ return nil
95
+ end
96
+
97
+ #=== プラグインの gen_cdl_file を呼びして cdl ファイルを生成させ、解釈を行う
98
+ def generate_and_parse(plugin_object)
99
+ if plugin_object.nil? # プラグインのロードに失敗している(既にエラー)
100
+ return
101
+ end
102
+ plugin_name = plugin_object.class.name.to_sym
103
+ if @@loaded_plugin_list[plugin_name] == :MultiPlugin
104
+ p "#{plugin_name}: MultiPlugin"
105
+ return
106
+ elsif @@loaded_plugin_list[plugin_name].nil?
107
+ # raise "#{plugin_name} might have different name "
108
+ ## プラグインのファイル名と、プラグインのクラス名が相違する場合
109
+ # MultiPlugin の get_plugin で返されたケースでは nil になっている
110
+ @@loaded_plugin_list[plugin_name] = 0
111
+ end
112
+ count = @@loaded_plugin_list[plugin_name]
113
+ @@loaded_plugin_list[plugin_name] += 1
114
+ tmp_file_name = "#{$gen}/tmp_#{plugin_name}_#{count}.cdl"
115
+
116
+ begin
117
+ tmp_file = CFile.open(tmp_file_name, "w")
118
+ rescue Exception => evar
119
+ cdl_error("P2004 $1: open error \'$2\'", plugin_name, tmp_file_name)
120
+ print_exception(evar)
121
+ end
122
+ dbgPrint "generate_and_parse: #{plugin_object.class}: gen_cdl_file\n"
123
+ begin
124
+ plugin_object.gen_cdl_file(tmp_file)
125
+ rescue Exception => evar
126
+ cdl_error("P2005 $1: plugin error in gen_through_cell_code ", plugin_name)
127
+ print_exception(evar)
128
+ end
129
+ begin
130
+ tmp_file.close
131
+ rescue Exception => evar
132
+ cdl_error("P2006 $1: close error \'$2\'", plugin_name, tmp_file_name)
133
+ print_exception(evar)
134
+ end
135
+
136
+ generator = Generator.new
137
+ generator.set_plugin(plugin_object)
138
+ generator.parse([tmp_file_name])
139
+ generator.finalize
140
+ end
141
+
142
+ #=== プラグインが CDL の POST コードを生成
143
+ # tmp_plugin_post_code.cdl への出力
144
+ def self.gen_plugin_post_code(file)
145
+ dbgPrint "PluginModule #{@@loaded_plugin_list}\n"
146
+ @@loaded_plugin_list.each{|plugin_name, count|
147
+ if count == :MultiPlugin
148
+ next
149
+ end
150
+ dbgPrint "PluginModule: #{plugin_name}\n"
151
+ eval_str = "#{plugin_name}.gen_post_code( file )"
152
+ if $verbose
153
+ print "gen_plugin_post_code: #{eval_str}\n"
154
+ end
155
+ begin
156
+ eval(eval_str)
157
+ rescue Exception => evar
158
+ Generator.error("P2007 $1: fail to generate post code", plugin_name)
159
+
160
+ print_exception(evar)
161
+ end
162
+ }
163
+ end
164
+
165
+ end