source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/RepeatJoinPlugin.rb@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 4.9 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2015-2018 by TOPPERS Project
7#
8#--
9# 上記著作権者
10は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
11# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12# 変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
14# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16# スコード中に含まれていること.
17# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18# 用できる形で再é…
19å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
20å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
21# 者
22マニュアルなど)に,上記の著作権表示,この利用条件および下記
23# の無保証規定を掲載すること.
24# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
25# 用できない形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
27# と.
28# (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31# 作権表示,この利用条件および下記の無保証規定を掲載すること.
32# (b) 再é…
33å¸ƒã®å½¢æ…
34‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
35# 報告すること.
36# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37# 害からも,上記著作権者
38およびTOPPERSプロジェクトをå…
39è²¬ã™ã‚‹ã“と.
40# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
41# 由に基づく請求からも,上記著作権者
42およびTOPPERSプロジェクトを
43# å…
44è²¬ã™ã‚‹ã“と.
45#
46# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
49# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
50# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
51# の責任を負わない.
52#
53# $Id$
54#++
55
56class RepeatJoinPlugin < CellPlugin
57
58 RepeatJoinPluginArgProc = {
59 "count" => Proc.new { |obj,rhs| obj.set_count rhs }
60 }
61
62 def initialize( cell, option )
63 super
64 print "RepeatJoinPlugin: #{@cell.get_name}\n"
65 # cell.show_tree 0
66 @plugin_arg_check_proc_tab = RepeatJoinPluginArgProc
67 parse_plugin_arg
68
69 @cell.get_join_list.get_items.each{ |j|
70 # print "Join: #{j.get_name} = #{j.get_rhs.to_s}\n"
71
72 # Join の右辺を解析
73 ret = j.get_rhs.analyze_cell_join_expression
74 if ret == nil then
75 next
76 end
77 rhs_nsp = ret[0]; rhs_subscript = ret[1]; rhs_port_name = ret[2]
78
79 # 呼び口é…
80åˆ—で、添数が 0 の場合にのみカウントアップさせる
81 if j.get_subscript == 0 then
82 rhs_name = rhs_nsp.get_name.to_s
83 if rhs_name =~ /(.*[^0-9])([0-9]+)\z/ then
84 b_rhs_name_count = true
85 rhs_name = $1
86 n_digits = $2.length
87 rhs_count_base = $2.to_i
88 else
89 b_rhs_name_count = false
90 rhs_count_base = 0
91 end
92
93 if rhs_subscript && rhs_subscript == 0 then
94 b_rhs_subscript_count = true
95 else
96 b_rhs_subscript_count = false
97 end
98
99 count = 1
100 while count < @count
101 count_str = (count+rhs_count_base).to_s
102
103 if b_rhs_subscript_count then
104 rhs_subscript = count
105 end
106
107 if b_rhs_name_count then
108 if n_digits - count_str.length > 0 then
109 leading_zero = "0" * ( n_digits - count_str.length )
110 else
111 leading_zero = ""
112 end
113
114 rhs_name_real = rhs_name + leading_zero + count_str
115 else
116 rhs_name_real = rhs_name
117 end
118 rhs_nsp2 = rhs_nsp.change_name_clone rhs_name_real.to_sym
119
120 rhs = Expression.create_cell_join_expression( rhs_nsp2, rhs_subscript, rhs_port_name )
121 j2 = Join.new( j.get_name, count, rhs )
122 cell.new_join j2
123
124 count += 1
125 end
126 end
127 }
128 end
129
130 #=== count オプションの解析
131 def set_count rhs
132 if rhs =~ /\A\d+\z/
133 @count = rhs.to_i
134 else
135 nsp = NamespacePath.new( rhs.to_sym, true )
136 expr = Expression.create_single_identifier( nsp, nil )
137 res = expr.eval_const( nil )
138 if res == nil then
139 cdl_error( "count value ($1): not single identifier or integer number", rhs.to_s )
140 @count = 0
141 else
142 @count = res
143 end
144 end
145 end
146
147end
Note: See TracBrowser for help on using the repository browser.