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,365 @@
1
+ #
2
+ # TECS Generator
3
+ # Generator for TOPPERS Embedded Component System
4
+ #
5
+ # Copyright (C) 2008-2014 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: GenParamCopy.rb 2952 2018-05-07 10:19:07Z okuma-top $
37
+ #++
38
+
39
+ #= ParamCopy
40
+ #
41
+ # パラメータコピーするマーシャラ/アンマーシャラコードを生成するメソッド print_param を提供する.
42
+ # RPCPlugin, OpaqueRPCPlugin に include される.
43
+ # RPCPlugin (トランスペアレント) では、oneway 関数で in のポインタ引数の場合に限って print_param が用いられる.
44
+ #
45
+ module GenParamCopy
46
+
47
+ #=== 引数の転送コードを生成
48
+
49
+ def print_param(name, type, file, nest, dir, outer, outer2, b_marshal, b_get, alloc_cp = nil, alloc_cp_extra = nil, name_list = nil)
50
+ if type.get_original_type.is_a?(ArrayType) && b_get && dir != :OUT
51
+ indent = " " * nest
52
+ subsc = type.get_subscript
53
+ if subsc.nil?
54
+ raise "Unsubscripted Array Not Supported"
55
+ else
56
+ size_str = subsc.to_str(name_list, outer, outer2)
57
+ file.print <<EOT
58
+ #{indent}if((ercd_=#{alloc_cp}(sizeof(#{type.get_type.get_type_str}#{type.get_type.get_type_str_post})*(#{size_str}),(void **)&#{outer}#{name}#{outer2}#{alloc_cp_extra}))!=E_OK)\t/* GenParamCopy 1 */
59
+ #{indent} goto error_reset;
60
+ EOT
61
+ if (dir == :SEND || dir == :RECEIVE) && type.get_type.has_pointer?
62
+ # send, receive の場合は、エラーリセットに備え NULL にする
63
+ file.print <<EOT
64
+ #{indent}memset( (void *)#{outer}#{name}#{outer2}#{alloc_cp_extra}, 0, sizeof(#{type.get_type.get_type_str}#{type.get_type.get_type_str_post})*(#{size_str}); /* GenParamCopy Alloc1 */
65
+ EOT
66
+ end
67
+ end
68
+ end
69
+ print_param0(name, type, file, nest, dir, outer, outer2, b_marshal, b_get, alloc_cp, alloc_cp_extra, name_list)
70
+ end
71
+
72
+ def print_param0(name, type, file, nest, dir, outer, outer2, b_marshal, b_get, alloc_cp = nil, alloc_cp_extra = nil, name_list = nil)
73
+ indent = " " * nest
74
+
75
+ case type
76
+ when DefinedType
77
+ print_param0(name, type.get_type, file, nest, dir, outer, outer2, b_marshal, b_get, alloc_cp, alloc_cp_extra)
78
+ when BoolType, IntType, FloatType
79
+ case type
80
+ when BoolType
81
+ type_str = "Bool"
82
+ when IntType
83
+ bit_size = type.get_bit_size
84
+ case type.get_sign
85
+ when :UNSIGNED
86
+ sign = "U"
87
+ when :SIGNED
88
+ if bit_size == -1 || bit_size == -11
89
+ sign = "S" # signed char の場合のみ S がつく
90
+ else
91
+ sign = ""
92
+ end
93
+ else
94
+ sign = ""
95
+ end
96
+
97
+ case bit_size
98
+ when -1, -11 # -1: char_t, -11: char
99
+ type_str = "#{sign}Char"
100
+ when -2
101
+ type_str = "#{sign}Short"
102
+ when -3
103
+ type_str = "#{sign}Int"
104
+ when -4
105
+ type_str = "#{sign}Long"
106
+ when -5
107
+ type_str = "Intptr"
108
+ when 8, 16, 32, 64, 128
109
+ type_str = "#{sign}Int#{bit_size}"
110
+ else
111
+ raise "unknown bit_size '#{bit_size}' for int type "
112
+ end
113
+
114
+ when FloatType
115
+ bit_size = type.get_bit_size
116
+ if bit_size == 32
117
+ type_str = "Float32"
118
+ else
119
+ type_str = "Double64"
120
+ end
121
+
122
+ end
123
+
124
+ if b_get
125
+ file.print indent
126
+ file.print "if( ( ercd_ = cTDR_get#{type_str}( &(#{outer}#{name}#{outer2}) ) ) != E_OK )\t/* GenParamCopy 2 */\n"
127
+ file.print indent
128
+ file.print " goto error_reset;\n"
129
+ else
130
+ file.print indent
131
+ file.print "if( ( ercd_ = cTDR_put#{type_str}( #{outer}#{name}#{outer2} ) ) != E_OK )\t/* GenParamCopy 3 */\n"
132
+ file.print indent
133
+ file.print " goto error_reset;\n"
134
+ end
135
+
136
+ when PtrType
137
+
138
+ count = type.get_count
139
+ size = type.get_size
140
+ string = type.get_string
141
+ if count || size || string
142
+ nest = print_nullable_pre(name, type, file, nest, dir, outer, outer2, b_marshal, b_get)
143
+ indent = "\t" * nest
144
+ loop_counter_type = IntType.new(32) # mikan 型を size_is, count_is の引数の型とする
145
+ file.print "#{indent}{\t/* GenParamCopy 4 */\n"
146
+ file.print "#{indent} #{loop_counter_type.get_type_str} i__#{nest}, length__#{nest};\n"
147
+
148
+ if size || count
149
+ if size
150
+ size_str = size.to_str(name_list, outer, outer2)
151
+ end
152
+
153
+ if count
154
+ count_str = count.to_str(name_list, outer, outer2)
155
+ else
156
+ # size_is は必須. count_is はオプション
157
+ count_str = size_str
158
+ end
159
+ file.print "#{indent} length__#{nest} = #{count_str};\t/* GenParamCopy 5 */\n"
160
+
161
+ # size_is に max 指定がある場合、length が max を超えているかチェックするコードを生成
162
+ # alloc_cp == nil のとき dir は INOUT, OUT のはず (条件が冗長)。試験が終わっているので、次回見直し時に外す
163
+ if b_get && !type.get_max.nil? && !((dir == :INOUT || dir == :OUT) && alloc_cp.nil?)
164
+ file.print "#{indent} if( length__#{nest} > #{type.get_max} ){\t/* GenParamCopy max check 1 */\n"
165
+ file.print "#{indent} ercd_ = E_PAR;\n"
166
+ file.print "#{indent} goto error_reset;\n"
167
+ file.print "#{indent} }\n"
168
+ end
169
+
170
+ else # if string then
171
+ case type.get_type.get_bit_size
172
+ when -1 # char_t
173
+ b_size = 8
174
+ when 8, 16, 32, 64 # intN_t, uintN_t
175
+ b_size = type.get_type.get_bit_size
176
+ else
177
+ cdl_error("R9999 $1: string specifier cannot be specified to '$2' in current implementation",
178
+ name, type.get_type.get_type_str + type.get_type.get_type_str_post)
179
+ end
180
+ if !b_get
181
+ if string.instance_of? Expression
182
+ len = string.to_str(name_list, outer, outer2)
183
+ file.print "#{indent} length__#{nest} = STRNLEN#{b_size}(#{outer}#{name}#{outer2},(#{len}-1))+1;\t/* GenParamCopy 6 */\n"
184
+ file.print "#{indent} if( length__#{nest} < #{len})\tlength__#{nest} += 1;\n"
185
+ else
186
+ file.print "#{indent} length__#{nest} = STRLEN#{b_size}(#{outer}#{name}#{outer2})+1;\t/* GenParamCopy 7 */\n"
187
+ end
188
+ size_str = "length__#{nest}" # string の場合、strnlen 以上の領域を確保しない
189
+ else
190
+ if dir == :INOUT
191
+ if string.instance_of? Expression
192
+ len = string.to_str(name_list, outer, outer2)
193
+ size_str = len.to_s # string(len) の場合 len を確保する
194
+ else
195
+ raise "unsuscripted string used for inout parameter #{name}"
196
+ end
197
+ else
198
+ size_str = "length__#{nest}" # string の場合、strnlen 以上の領域を確保しない
199
+ end
200
+ end
201
+ print_param0("length__#{nest}", loop_counter_type, file, nest + 1, dir, nil, nil, b_marshal, b_get)
202
+ end
203
+
204
+ if b_get && (dir == :IN || dir == :INOUT || dir == :SEND || dir == :RECEIVE) && alloc_cp
205
+ file.print <<EOT
206
+ #{indent} if((ercd_=#{alloc_cp}(sizeof(#{type.get_type.get_type_str}#{type.get_type.get_type_str_post})*(#{size_str}),(void **)&#{outer}#{name}#{outer2}#{alloc_cp_extra}))!=E_OK)\t/* GenParamCopy 8 */
207
+ #{indent} goto error_reset;
208
+ EOT
209
+ if (dir == :SEND || dir == :RECEIVE) && type.get_type.has_pointer?
210
+ # send, receive の場合は、エラーリセットに備え NULL にする
211
+ file.print <<EOT
212
+ #{indent} memset( (void *)#{outer}#{name}#{outer2}#{alloc_cp_extra}, 0, sizeof(#{type.get_type.get_type_str}#{type.get_type.get_type_str_post})*(#{size_str}) ); /* GenParamCopy Alloc2 */
213
+ EOT
214
+ end
215
+ end
216
+ file.print "#{indent} for( i__#{nest} = 0; i__#{nest} < length__#{nest}; i__#{nest}++ ){\t/* GenParamCopy 9 */\n"
217
+
218
+ print_param0(name, type.get_type, file, nest + 2, dir, outer, "#{outer2}[i__#{nest}]", b_marshal, b_get, alloc_cp, alloc_cp_extra)
219
+ file.print "#{indent} }\n"
220
+ file.print "#{indent}}\n"
221
+
222
+ nest = print_nullable_post(name, type, file, nest, dir, outer, outer2, b_marshal, b_get)
223
+ indent = "\t" * nest
224
+ else
225
+
226
+ # nullable (pre)
227
+ nest = print_nullable_pre(name, type, file, nest, dir, outer, outer2, b_marshal, b_get)
228
+ indent = " " * nest
229
+
230
+ # allocate memory for getting value
231
+ if b_get && (dir == :IN || dir == :INOUT || dir == :SEND || dir == :RECEIVE) && alloc_cp
232
+ file.print <<EOT
233
+ #{indent}if((ercd_=#{alloc_cp}(sizeof(#{type.get_type.get_type_str}#{type.get_type.get_type_str_post}),(void **)&#{outer}#{name}#{outer2}#{alloc_cp_extra}))!=E_OK)\t/* GenParamCopy 10 */
234
+ #{indent} goto error_reset;
235
+ EOT
236
+ if (dir == :SEND || dir == :RECEIVE) && type.get_type.has_pointer?
237
+ # send, receive の場合は、エラーリセットに備え NULL にする
238
+ file.print <<EOT
239
+ #{indent}memset( (void *)#{outer}#{name}#{outer2}#{alloc_cp_extra}, 0, sizeof(#{type.get_type.get_type_str}#{type.get_type.get_type_str_post}) ); /* GenParamCopy Alloc3 */
240
+ EOT
241
+ end
242
+ end
243
+
244
+ print_param0(name, type.get_type, file, nest, dir, "(*#{outer}", "#{outer2})", b_marshal, b_get, alloc_cp, alloc_cp_extra)
245
+ # nullable (post)
246
+ nest = print_nullable_post(name, type, file, nest, dir, outer, outer2, b_marshal, b_get)
247
+ indent = " " * nest
248
+ end
249
+ when StructType
250
+ members_decl = type.get_members_decl
251
+ members_decl.get_items.each {|m|
252
+ if m.is_referenced?
253
+ print_param0(m.get_name, m.get_type, file, nest, dir, "#{outer}#{name}#{outer2}.", nil, b_marshal, b_get, alloc_cp, alloc_cp_extra, members_decl)
254
+ end
255
+ }
256
+ members_decl.get_items.each {|m|
257
+ if !m.is_referenced?
258
+ print_param0(m.get_name, m.get_type, file, nest, dir, "#{outer}#{name}#{outer2}.", nil, b_marshal, b_get, alloc_cp, alloc_cp_extra, members_decl)
259
+ end
260
+ }
261
+
262
+ when VoidType
263
+ when EnumType # mikan EnumType
264
+ when FuncType # mikan FuncType
265
+ when ArrayType # mikan ArrayType
266
+ subsc = type.get_subscript
267
+ if subsc.nil?
268
+ raise "Unsubscripted Array Not Supported"
269
+ else
270
+ size_str = subsc.to_str(name_list, outer, outer2)
271
+
272
+ loop_counter_type = IntType.new(32) # mikan 型を size_is, count_is の引数の型とする
273
+ file.print "#{indent}{\t/* GenParamCopy 11 */\n"
274
+ file.print "#{indent} #{loop_counter_type.get_type_str} i__#{nest}, length__#{nest} = #{size_str};\n"
275
+
276
+ file.print "#{indent} for( i__#{nest} = 0; i__#{nest} < length__#{nest}; i__#{nest}++ ){\n"
277
+ print_param0(name, type.get_type, file, nest + 2, dir, outer, "#{outer2}[i__#{nest}]", b_marshal, b_get, alloc_cp, alloc_cp_extra)
278
+ file.print "#{indent} }\n"
279
+ file.print "#{indent}}\n"
280
+ end
281
+ end
282
+ end
283
+
284
+ #=== nullable (pre)
285
+ def print_nullable_pre(name, type, file, nest, dir, outer, outer2, b_marshal, b_get)
286
+ if type.is_nullable?
287
+ indent = " " * nest
288
+ if dir == :OUT # OUT の場合 print_out_nullable で NULL かどうかの情報を渡す
289
+ # 'null or not' is sent in the function 'print_out_nullable'
290
+ if b_get
291
+ file.print "#{indent}if( #{outer}#{name}#{outer2} ){\t/* GenParamCopy Null 10 */\n"
292
+ else
293
+ file.print "#{indent}if( ! b_#{name}_null_ ){\t/* GenParamCopy Null 11 */\n"
294
+ end
295
+ nest += 1
296
+ else # dir = :IN, :INOUT, :SEND, :RECEIVE
297
+ if b_get
298
+ file.print "#{indent}{\n"
299
+ if !(dir == :INOUT && b_marshal == true)
300
+ file.print <<EOT
301
+ #{indent} int8_t b_null_;
302
+ #{indent} if((ercd_=cTDR_getInt8( &b_null_ )) != E_OK )\t/* GenParamCopy Null 20 */
303
+ #{indent} goto error_reset;
304
+ #{indent} if( ! b_null_ ){
305
+ EOT
306
+ else # dir = :INOUT, b_marshal = true, b_get = true の場合、NULL かどうかの情報を渡さない
307
+ file.print <<EOT
308
+ #{indent} int8_t b_null_ = (#{outer}#{name}#{outer2} == NULL);\t/* GenParamCopy Null 21 */
309
+ #{indent} if( ! b_null_ ){
310
+ EOT
311
+ end
312
+ else
313
+ file.print <<EOT
314
+ #{indent}{
315
+ #{indent} int8_t b_null_ = (int8_t)(#{outer}#{name}#{outer2} == NULL);\t/* GenParamCopy Null 31 */
316
+ EOT
317
+
318
+ if !(dir == :INOUT && b_marshal == false)
319
+ # dir = :INOUT, b_marshal = false, b_get = false の場合
320
+ file.print <<EOT
321
+ #{indent} if((ercd_=cTDR_putInt8( b_null_ )) != E_OK )\t/* GenParamCopy Null 32 */
322
+ #{indent} goto error_reset;
323
+ EOT
324
+ end
325
+
326
+ file.print <<EOT
327
+ #{indent} if( ! b_null_ ){\t/* GenParamCopy Null 33 */
328
+ EOT
329
+ end
330
+ nest += 2
331
+ end
332
+ end
333
+ return nest
334
+ end
335
+
336
+ #== nullable (post)
337
+ def print_nullable_post(name, type, file, nest, dir, outer, outer2, b_marshal, b_get)
338
+ if type.is_nullable?
339
+ if dir == :OUT # OUT の場合 print_out_nullable で NULL かどうかの情報を渡す
340
+ nest -= 1
341
+ indent = " " * nest
342
+ file.print "#{indent}} /* ! b_#{name}_null_ GenParamCopy Null 50 */\n"
343
+ else # ( dir == :IN || dir == :INOUT || dir == :SEND || dir == :RECEIVE )
344
+ nest -= 2
345
+ indent = " " * nest
346
+ if b_get
347
+ if !(dir == :INOUT && b_marshal == true)
348
+ file.print <<EOT
349
+
350
+ #{indent} } else { /* null GenParamCopy Null 51 */
351
+ #{indent} #{outer}#{name}#{outer2} = NULL;
352
+ #{indent} } /* ! b_null_ */
353
+ EOT
354
+ else # dir = :INOUT, b_marshal = true # inout の out 方向
355
+ file.print "#{indent} } /* ! b_null_ GenParamCopy Null 52 */\n"
356
+ end
357
+ else
358
+ file.print "#{indent} }\t/* GenParamCopy Null 53 */\n"
359
+ end
360
+ file.print "#{indent}}\t/* GenParamCopy Null 54 */\n"
361
+ end
362
+ end
363
+ return nest
364
+ end
365
+ end
@@ -0,0 +1,683 @@
1
+ #
2
+ # TECS Generator
3
+ # Generator for TOPPERS Embedded Component System
4
+ #
5
+ # Copyright (C) 2008-2014 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: GenTransparentMarshaler.rb 2952 2018-05-07 10:19:07Z okuma-top $
37
+ #++
38
+
39
+ # プラグインオプション用変数
40
+ # @task_priority:: Integer
41
+ # @channelCelltype:: String
42
+ # @channelCellName:: String
43
+ # @PPAllocatorSize:: Integer
44
+ module GenTransparentMarshaler
45
+
46
+ # プラグイン引数名と Proc
47
+ RPCPluginArgProc = {
48
+ "taskPriority" => Proc.new {|obj, rhs| obj.set_taskPriority rhs },
49
+ "channelCelltype" => Proc.new {|obj, rhs| obj.set_channelCelltype rhs },
50
+ "TDRCelltype" => Proc.new {|obj, rhs| obj.set_TDRCelltype rhs },
51
+ "channelCell" => Proc.new {|obj, rhs| obj.set_channelCellName rhs },
52
+ "PPAllocatorSize" => Proc.new {|obj, rhs| obj.set_PPAllocatorSize rhs },
53
+ }
54
+
55
+ #=== プラグイン引数 taskPriority のチェック
56
+ def set_taskPriority(rhs)
57
+ @task_priority = rhs
58
+ end
59
+
60
+ #=== プラグイン引数 channelCelltype のチェック
61
+ def set_channelCelltype(rhs)
62
+ @channelCelltype = rhs.to_sym
63
+ # path = [ "::", @channelCelltype ]
64
+ # obj = Namespace.find( path )
65
+ nsp = NamespacePath.analyze(@channelCelltype.to_s)
66
+ obj = Namespace.find(nsp)
67
+ if !obj.instance_of?(Celltype) && !obj.instance_of?(CompositeCelltype)
68
+ cdl_error("RPCPlugin: channeclCelltype '#{rhs}' not celltype or not found")
69
+ end
70
+ end
71
+
72
+ #=== プラグイン引数 TDRCelltype のチェック
73
+ def set_TDRCelltype(rhs)
74
+ @TDRCelltype = rhs.to_sym
75
+ # path = [ "::", @TDRCelltype ]
76
+ # obj = Namespace.find( path )
77
+ nsp = NamespacePath.analyze(@TDRCelltype.to_s)
78
+ obj = Namespace.find(nsp)
79
+ if !obj.instance_of?(Celltype) && !obj.instance_of?(CompositeCelltype)
80
+ cdl_error("RPCPlugin: TDRCelltype '#{rhs}' not celltype or not found")
81
+ end
82
+ end
83
+
84
+ #=== プラグイン引数 channelCellName のチェック
85
+ def set_channelCellName(rhs)
86
+ @channelCellName = rhs
87
+ if @channelCellName =~ /\A[a-zA-Z_]\w*/
88
+ # OK
89
+ else
90
+ cdl_error("RPCPlugin: channeclCellName '#{rhs}' unsuitable for identifier")
91
+ end
92
+ end
93
+
94
+ #=== プラグイン引数 PPAllocatorSize のチェック
95
+ def set_PPAllocatorSize(rhs)
96
+ @PPAllocatorSize = rhs
97
+ end
98
+
99
+ #=== marshaler のセルタイプ名を設定する
100
+ def initialize_transparent_marshaler(cell_name)
101
+ @task_priority = 8
102
+ @channelCelltype = "tDataqueueOWChannel"
103
+ @TDRCelltype = "tTDR"
104
+ @channelCellName = "#{cell_name}_Channel"
105
+ @PPAllocatorSize = nil
106
+
107
+ @marshaler_celltype_name = "tMarshaler_#{@signature.get_global_name}"
108
+ @unmarshaler_celltype_name = "tUnmarshaler_#{@signature.get_global_name}"
109
+ @marshaler_celltype_file_name = "#{$gen}/#{@marshaler_celltype_name}.cdl"
110
+ end
111
+
112
+ def gen_marshaler_celltype
113
+ if @PPAllocatorSize
114
+ alloc_call_port = " call sPPAllocator cPPAllocator;\n"
115
+ else
116
+ alloc_call_port = ""
117
+ end
118
+
119
+ f = CFile.open(@marshaler_celltype_file_name, "w")
120
+ # 同じ内容を二度書く可能性あり (AppFile は不可)
121
+
122
+ f.print <<EOT
123
+
124
+ celltype #{@marshaler_celltype_name} {
125
+ entry #{@signature.get_namespace_path} eClientEntry;
126
+ call sTDR cTDR;
127
+ call sEventflag cEventflag;
128
+ [optional]
129
+ call sSemaphore cLockChannel; // this port is eliminated by optimize
130
+ };
131
+ celltype #{@unmarshaler_celltype_name} {
132
+ call #{@signature.get_namespace_path} cServerCall;
133
+ call sTDR cTDR;
134
+ call sEventflag cEventflag;
135
+ entry sUnmarshalerMain eUnmarshalAndCallFunction;
136
+ #{alloc_call_port}};
137
+ EOT
138
+ f.close
139
+ end
140
+
141
+ #=== 受け口関数の本体コードを生成(頭部と末尾は別途出力)
142
+ # ct_name:: Symbol (through プラグインで生成された) セルタイプ名 .Symbol として送られてくる(らしい)
143
+ 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)
144
+ # unmarshaler クラスか?
145
+ if ct_name == @unmarshaler_celltype_name.to_sym
146
+ gen_ep_func_body_unmarshal(file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params)
147
+ else
148
+ gen_ep_func_body_marshal(file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params)
149
+ end
150
+ end
151
+
152
+ #=== marshal コードの生成
153
+ def gen_ep_func_body_marshal(file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params)
154
+ b_void = false
155
+ b_ret_er = false
156
+
157
+ # 関数の戻り値の元の型を得る(typedef されている場合)
158
+ type = func_type.get_type.get_original_type
159
+
160
+ # 戻り値記憶用の変数を出力(void 型の関数では出力しない)
161
+ if !type.is_void?
162
+ if func_type.get_type.is_a?(DefinedType) && (func_type.get_type.get_type_str == "ER" || func_type.get_type.get_type_str == "ER_INT")
163
+ file.print(" #{func_type.get_type.get_type_str} retval_ = E_OK;\n")
164
+ b_ret_er = true
165
+ else
166
+ file.print(" #{func_type.get_type.get_type_str} retval_;\n")
167
+ end
168
+ else
169
+ b_void = true
170
+ end
171
+
172
+ file.print(" ER ercd_;\n")
173
+ file.print(" FLGPTN flgptn;\n")
174
+
175
+ # 呼び先の signature を取り出す
176
+ signature = @signature
177
+
178
+ # 関数 ID (整数値)
179
+ func_id = signature.get_id_from_func_name(func_name)
180
+ file.print(" int16_t func_id_ = #{func_id}; /* id of #{func_name}: #{func_id} */\n")
181
+
182
+ # シングルトンでないか?
183
+ if !b_singleton
184
+
185
+ # singleton でなければ p_cellcb 取得コードを出力
186
+ file.print <<EOT
187
+ #{ct_name}_CB *p_cellcb;
188
+
189
+ if( VALID_IDX( idx ) ){
190
+ p_cellcb = GET_CELLCB(idx);
191
+ EOT
192
+
193
+ # エラーを返すか?
194
+ if b_ret_er
195
+ file.print <<EOT
196
+ }else{
197
+ return ERCD( E_RPC, E_ID );
198
+ }
199
+ EOT
200
+ else
201
+ file.print <<EOT
202
+ }else{
203
+ /* エラー処理コードをここに記述 */
204
+ }
205
+ EOT
206
+ end
207
+ end
208
+
209
+ # channel lock コード
210
+ file.print <<EOT
211
+ /* Channel Lock */
212
+ if( is_cLockChannel_joined() )
213
+ cLockChannel_wait();
214
+
215
+ EOT
216
+
217
+ # SOP を送信
218
+ file.print " /* SOPの送出 */\n"
219
+ file.print " if( ( ercd_ = cTDR_sendSOP( true ) ) != E_OK )\n"
220
+ file.print " goto error_reset;\n"
221
+
222
+ # func_id を送信
223
+ file.print " /* 関数 id の送出 */\n"
224
+ file.print " if( ( ercd_ = cTDR_putInt16( func_id_ ) ) != E_OK )\n"
225
+ file.print " goto error_reset;\n"
226
+
227
+ # p "celltype_name, sig_name, func_name, func_global_name"
228
+ # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
229
+
230
+ b_get = false # marshal なら put
231
+ b_marshal = true # marshal
232
+
233
+ # in 方向の入出力を出力
234
+ file.print " /* 入力引数送出 */\n"
235
+ print_params(params, file, 1, b_marshal, b_get, true, func_type.is_oneway?)
236
+ print_params(params, file, 1, b_marshal, b_get, false, func_type.is_oneway?)
237
+ if !b_void && !func_type.is_oneway?
238
+ ret_ptr_type = PtrType.new(func_type.get_type)
239
+ print_param_nc("retval_", ret_ptr_type, file, 1, :RETURN, "&", nil, b_get)
240
+ end
241
+
242
+ file.print " /* EOPの送出(パケットの掃きだし) */\n"
243
+ if !func_type.is_oneway?
244
+ b_continue = "true"
245
+ else
246
+ b_continue = "false"
247
+ end
248
+ file.print " if( (ercd_=cTDR_sendEOP(#{b_continue})) != E_OK )\n"
249
+ file.print " goto error_reset;\n\n"
250
+
251
+ if !func_type.is_oneway?
252
+ file.print <<EOT
253
+ if( (ercd_=cEventflag_wait( 0x01, TWF_ANDW, &flgptn )) != E_OK ){
254
+ ercd_ = ERCD(E_RPC,ercd_);
255
+ goto error_reset;
256
+ }
257
+ if( (ercd_=cEventflag_clear( 0x00 ) ) != E_OK ){
258
+ ercd_ = ERCD(E_RPC,ercd_);
259
+ goto error_reset;
260
+ }
261
+ EOT
262
+ end # ! func_type.is_oneway?
263
+
264
+ file.print <<EOT
265
+ /* Channel Lock */
266
+ if( is_cLockChannel_joined() )
267
+ cLockChannel_signal();
268
+ EOT
269
+
270
+ if b_void == false
271
+ # 呼び元に戻り値をリターン
272
+ file.print(" return retval_;\n")
273
+ else
274
+ file.print(" return;\n")
275
+ end
276
+
277
+ file.print <<EOT
278
+
279
+ error_reset:
280
+ if( ercd_ != ERCD( E_RPC, E_RESET ) )
281
+ (void)cTDR_reset();
282
+ EOT
283
+
284
+ # channel lock コード
285
+ file.print <<EOT
286
+ /* Channel Lock */
287
+ if( is_cLockChannel_joined() )
288
+ cLockChannel_signal();
289
+
290
+ EOT
291
+
292
+ if b_ret_er != false
293
+ # 呼び元に戻り値をリターン
294
+ file.print(" return ercd_;\n")
295
+ else
296
+ file.print(" return;\n")
297
+ end
298
+ end
299
+
300
+ #=== unmarshal コードの生成
301
+ def gen_ep_func_body_unmarshal(file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params)
302
+ # b_ret_er = true
303
+ b_ret_er = false
304
+
305
+ # func_id を得るコードを生成
306
+ file.print <<EOT
307
+
308
+ int16_t func_id_;
309
+ ER ercd_;
310
+
311
+ #{ct_name}_CB *p_cellcb;
312
+
313
+ if( VALID_IDX( idx ) ){
314
+ p_cellcb = GET_CELLCB(idx);
315
+ EOT
316
+
317
+ if b_ret_er
318
+ file.print <<EOT
319
+ }else{
320
+ return ERCD( E_RPC, E_ID );
321
+ }
322
+ EOT
323
+ else
324
+ file.print <<EOT
325
+ }else{
326
+ /* エラー処理コードをここに記述 */
327
+ }
328
+ EOT
329
+ end
330
+
331
+ file.print <<EOT
332
+
333
+ /* SOPのチェック */
334
+ if( (ercd_=cTDR_receiveSOP( false )) != E_OK )
335
+ goto error_reset;
336
+ /* func_id の取得 */
337
+ if( (ercd_=cTDR_getInt16( &func_id_ )) != E_OK )
338
+ goto error_reset;
339
+
340
+ #ifdef RPC_DEBUG
341
+ syslog(LOG_INFO, "unmarshaler task: func_id: %d", func_id_ );
342
+ #endif
343
+ switch( func_id_ ){
344
+ EOT
345
+
346
+ # 呼び先の signature を取り出す
347
+ # port = @celltype.find( @next_cell_port_name )
348
+ # signature = port.get_signature
349
+ signature = @signature
350
+
351
+ # through の signature に含まれる すべての関数について
352
+ signature.get_function_head_array.each {|f|
353
+ f_name = f.get_name
354
+ f_type = f.get_declarator.get_type
355
+ id = signature.get_id_from_func_name(f_name)
356
+
357
+ # 関数は返り値を持つか?
358
+ if f_type.get_type.is_void?
359
+ b_void = true
360
+ else
361
+ b_void = false
362
+ end
363
+
364
+ # パケットの終わりをチェック(未受け取りのデータが残っていないかチェック)
365
+ file.print " case #{id}: /*** #{f_name} ***/ \n"
366
+ file.print " if( tTransparentUnmarshaler_#{@signature.get_global_name}_#{f_name}() != E_OK )\n"
367
+ file.print " goto error_reset;\n"
368
+ file.print " break;\n"
369
+
370
+ } #
371
+
372
+ if @PPAllocatorSize
373
+ ppallocator_dealloc_str = " /* PPAllocator のすべてを解放 */\n cPPAllocator_dealloc_all();"
374
+ else
375
+ ppallocator_dealloc_str = ""
376
+ end
377
+
378
+
379
+ file.print <<EOT
380
+ default:
381
+ syslog(LOG_INFO, "unmarshaler task: ERROR: unknown func_id: %d", func_id_ );
382
+ };
383
+ #{ppallocator_dealloc_str}
384
+ return E_OK;
385
+
386
+ error_reset:
387
+ if( ercd_ != ERCD( E_RPC, E_RESET ) )
388
+ (void)cTDR_reset();
389
+ #{ppallocator_dealloc_str}
390
+ return E_OK;
391
+ EOT
392
+ end
393
+
394
+ # IN b_marshal, b_get
395
+ # b_marshal = true && b_get == false : マーシャラで入力引数送出
396
+ # b_marshal = true && b_get == true : マーシャラで出力引数受取
397
+ # b_marshal = false && b_get == true : アンマーシャラで入力引数受取
398
+ # b_marshal = false && b_get == get : アンマーシャラで出力引数送出
399
+ def print_params(params, file, nest, b_marshal, b_get, b_referenced, b_oneway = false)
400
+ params.each{|param|
401
+ # p "#{param.get_name}: b_marshal: #{b_marshal} b_get: #{b_get}"
402
+ if !(b_referenced == param.is_referenced?)
403
+ next
404
+ end
405
+
406
+ dir = param.get_direction
407
+ type = param.get_type
408
+ if b_oneway && dir == :IN && type.get_original_type.is_a?(PtrType) || type.get_original_type.is_a?(ArrayType)
409
+ # oneway, in, PtrType の場合コピー
410
+ alloc_cp = "cPPAllocator_alloc"
411
+ alloc_cp_extra = nil
412
+ print_param(param.get_name, type, file, nest, dir, nil, nil, b_marshal, b_get, alloc_cp, alloc_cp_extra)
413
+ else
414
+ if b_get == false && b_marshal == true || b_get == true && b_marshal == false
415
+ case dir
416
+ # when :IN, :INOUT, :SEND
417
+ when :IN, :INOUT, :OUT, :SEND, :RECEIVE
418
+ print_param_nc(param.get_name, type, file, nest, b_marshal, nil, nil, b_get)
419
+ end
420
+ else
421
+ # case dir
422
+ # when :OUT, :INOUT, :RECEIVE
423
+ # when :RECEIVE
424
+ # print_param_nc( param.get_name, type, file, nest, b_marshal, nil, nil, b_get )
425
+ # end
426
+ end
427
+ end
428
+ }
429
+ end
430
+
431
+ #=== コピーしない引数渡しコードの出力
432
+ def print_param_nc(name, type, file, nest, b_marshal, outer, outer2, b_get)
433
+ indent = " " * (nest + 1)
434
+
435
+ case type
436
+ when DefinedType
437
+ print_param_nc(name, type.get_type, file, nest, b_marshal, outer, outer2, b_get)
438
+ when BoolType, IntType, FloatType, PtrType, ArrayType
439
+ case type
440
+ when BoolType
441
+ type_str = "Int8"
442
+ cast_str = "int8_t"
443
+ when IntType
444
+ bit_size = type.get_bit_size
445
+ case type.get_sign
446
+ when :UNSIGNED
447
+ signC = "U"
448
+ sign = "u"
449
+ when :SIGNED
450
+ if bit_size == -1 || bit_size == -11
451
+ # signed char の場合、signed を指定する
452
+ signC = "S"
453
+ sign = "s"
454
+ else
455
+ signC = ""
456
+ sign = ""
457
+ end
458
+ else
459
+ signC = ""
460
+ sign = ""
461
+ end
462
+
463
+ # p "pn:: #{name} #{bit_size} #{type.get_type_str}"
464
+ case bit_size
465
+ when -1, -11 # -1: char_t, -11: char
466
+ type_str = "#{signC}Char"
467
+ cast_str = "#{sign}char_t"
468
+ when -2
469
+ type_str = "#{signC}Short"
470
+ cast_str = "#{sign}short_t"
471
+ when -3
472
+ type_str = "#{signC}Int"
473
+ cast_str = "#{sign}int_t"
474
+ when -4
475
+ type_str = "#{signC}Long"
476
+ cast_str = "#{sign}long_t"
477
+ when -5
478
+ type_str = "Intptr"
479
+ cast_str = "intptr_t"
480
+ when 8, 16, 32, 64, 128
481
+ type_str = "#{signC}Int#{bit_size}"
482
+ cast_str = "#{sign}int#{bit_size}_t"
483
+ else
484
+ raise "unknown bit_size '#{bit_size}' for int type "
485
+ end
486
+
487
+ when FloatType
488
+ bit_size = type.get_bit_size
489
+ if bit_size == 32
490
+ type_str = "Float32"
491
+ cast_str = "float32_t"
492
+ else
493
+ type_str = "Double64"
494
+ cast_str = "double64_t"
495
+ end
496
+
497
+ when PtrType
498
+ type_str = "Intptr"
499
+ cast_str = "intptr_t"
500
+ when ArrayType
501
+ type_str = "Intptr"
502
+ cast_str = "intptr_t"
503
+ end
504
+
505
+ if type.get_type_str == cast_str
506
+ cast_str = ""
507
+ else
508
+ cast_str = "(" + cast_str + ")"
509
+ end
510
+
511
+ if b_get
512
+ cast_str.gsub!(/\)$/, "*)")
513
+ file.print " " * nest
514
+ file.print "if( ( ercd_ = cTDR_get#{type_str}( #{cast_str}&(#{outer}#{name}#{outer2}) ) ) != E_OK )\n"
515
+ file.print " " * nest
516
+ file.print " goto error_reset;\n"
517
+ else
518
+ file.print " " * nest
519
+ file.print "if( ( ercd_ = cTDR_put#{type_str}( #{cast_str}#{outer}#{name}#{outer2} ) ) != E_OK )\n"
520
+ file.print " " * nest
521
+ file.print " goto error_reset;\n"
522
+ end
523
+
524
+ when StructType
525
+ members_decl = type.get_members_decl
526
+ members_decl.get_items.each {|m|
527
+ if m.is_referenced?
528
+ print_param_nc(m.get_name, m.get_type, file, nest, b_marshal, "#{outer}#{name}#{outer2}.", nil, b_get)
529
+ end
530
+ }
531
+ members_decl.get_items.each {|m|
532
+ if !m.is_referenced?
533
+ print_param_nc(m.get_name, m.get_type, file, nest, b_marshal, "#{outer}#{name}#{outer2}.", nil, b_get)
534
+ end
535
+ }
536
+
537
+ when VoidType
538
+ when EnumType # mikan EnumType
539
+ when FuncType # mikan FuncType
540
+ end
541
+ end
542
+
543
+ #=== PREAMBLE 部のコード生成
544
+ # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
545
+ def gen_preamble(file, b_singleton, ct_name, global_name)
546
+ if ct_name != @unmarshaler_celltype_name.to_sym
547
+ return
548
+ end
549
+
550
+ file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
551
+ # signature に含まれる すべての関数について
552
+ @signature.get_function_head_array.each {|f|
553
+ f_name = f.get_name
554
+ f_type = f.get_declarator.get_type
555
+ id = @signature.get_id_from_func_name(f_name)
556
+ file.print "static ER tTransparentUnmarshaler_#{@signature.get_global_name}_#{f_name}();\t/* func_id: #{id} */\n"
557
+ }
558
+ file.print "\n"
559
+ end
560
+
561
+ #=== POSTAMBLE 部のコード生成
562
+ # アンマーシャラセルタイプの場合、アンマーシャラ関数の生成
563
+ def gen_postamble(file, b_singleton, ct_name, global_name)
564
+ if ct_name != @unmarshaler_celltype_name.to_sym
565
+ return
566
+ end
567
+
568
+ file.print "\n/*** アンマーシャラ関数 ***/\n\n"
569
+ @signature.get_function_head_array.each {|f|
570
+ f_name = f.get_name
571
+ f_type = f.get_declarator.get_type
572
+ id = @signature.get_id_from_func_name(f_name)
573
+
574
+ # 関数は返り値を持つか?
575
+ if f_type.get_type.is_void?
576
+ b_void = true
577
+ else
578
+ b_void = false
579
+ end
580
+
581
+ file.print <<EOT
582
+ /*
583
+ * name: #{f_name}
584
+ * func_id: #{id}
585
+ */
586
+ EOT
587
+ file.print "static ER\n"
588
+ file.print "tTransparentUnmarshaler_#{@signature.get_global_name}_#{f_name}()\n"
589
+ file.print "{\n"
590
+ file.print " ER ercd_;\n"
591
+ file.print " CELLCB *p_cellcb;\n"
592
+
593
+ # 引数を受取る変数の定義
594
+ param_list = f.get_declarator.get_type.get_paramlist.get_items
595
+ # FuncHead-> Decl-> FuncType->ParamList
596
+ param_list.each{|par|
597
+ name = par.get_name
598
+ type = par.get_type
599
+ if type.is_a? ArrayType
600
+ type = type.get_type
601
+ aster = "(*"
602
+ aster2 = ")"
603
+ else
604
+ aster = ""
605
+ aster2 = ""
606
+ end
607
+
608
+ type_str = type.get_type_str.gsub(/\bconst\b */, "") # "const" を外す
609
+
610
+ file.printf(" %-12s %s%s%s%s;\n", type_str, aster, name, aster2, type.get_type_str_post)
611
+ }
612
+
613
+ # 戻り値を受け取る変数の定義
614
+ if !b_void
615
+ if f.is_oneway?
616
+ retval_ptr = "" # oneway の場合、受け取るが捨てられる
617
+ else
618
+ retval_ptr = "*"
619
+ end
620
+ file.printf(" %-12s #{retval_ptr}retval_%s;\n", f_type.get_type.get_type_str, f_type.get_type.get_type_str_post)
621
+ end
622
+
623
+ # in 方向の入出力を入力
624
+ file.print "\n /* 入力引数受取 */\n"
625
+ b_get = true # unmarshal では get
626
+ b_marshal = false
627
+ print_params(param_list, file, 1, b_marshal, b_get, true, f.is_oneway?)
628
+ print_params(param_list, file, 1, b_marshal, b_get, false, f.is_oneway?)
629
+ if !b_void && !f.is_oneway?
630
+ ret_ptr_type = PtrType.new(f_type.get_type)
631
+ print_param_nc("retval_", ret_ptr_type, file, 2, :RETURN, nil, nil, b_get)
632
+ end
633
+
634
+ # パケットの受信完了
635
+ # mikan 本当は、対象関数を呼出す後に実施したい.呼出しパケットの使用終わりを宣言する目的として
636
+ file.print " /* パケット終わりをチェック */\n"
637
+ if !f.is_oneway?
638
+ b_continue = "true"
639
+ else
640
+ b_continue = "false"
641
+ end
642
+ file.print " if( (ercd_=cTDR_receiveEOP(#{b_continue})) != E_OK )\n"
643
+ file.print " goto error_reset;\n\n"
644
+
645
+ # 対象関数を呼出す
646
+ file.print " /* 対象関数の呼出し */\n"
647
+ if b_void
648
+ file.print(" cServerCall_#{f_name}(")
649
+ else
650
+ file.print(" #{retval_ptr}retval_ = cServerCall_#{f_name}(")
651
+ end
652
+
653
+ delim = " "
654
+ param_list.each{|par|
655
+ file.print delim
656
+ delim = ", "
657
+ file.print par.get_name.to_s
658
+ }
659
+ file.print(" );\n")
660
+
661
+ # 戻り値、出力引数の受取コードの生成
662
+
663
+ # oneway の場合出力、戻り値が無く、受取を待たない(非同期な呼出し)
664
+ if !f.is_oneway?
665
+ file.print <<EOT
666
+ /* 関数処理の終了を通知 */
667
+ if( ( ercd_ = cEventflag_set( 0x01 ) ) != E_OK ){
668
+ goto error_reset;
669
+ }
670
+ EOT
671
+ end # ! f.is_oneway?
672
+ file.print <<EOT
673
+ return E_OK;
674
+ error_reset:
675
+ return ercd_;
676
+ }
677
+
678
+ EOT
679
+
680
+ }
681
+ end
682
+
683
+ end