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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rubocop.yml +125 -0
- data/.rubocop_todo.yml +188 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +6 -0
- data/LICENSE +46 -0
- data/LICENSE.ja +32 -0
- data/README.ja.md +200 -0
- data/README.md +35 -0
- data/Rakefile +27 -0
- data/bin/tecscde +64 -0
- data/glade/tecscde-cell-property.glade +205 -0
- data/glade/tecscde-celltype-property.glade +172 -0
- data/glade/tecscde-celltype.glade +414 -0
- data/glade/tecscde-export.glade +161 -0
- data/glade/test-cell-plugin.rb +51 -0
- data/glade/test-cell-property.rb +35 -0
- data/glade/test-export.rb +35 -0
- data/glade/test-palette.rb +26 -0
- data/lib/tcflow.rb +148 -0
- data/lib/tecscde.rb +65 -0
- data/lib/tecscde/NewCell.png +0 -0
- data/lib/tecscde/SelectArrow.png +0 -0
- data/lib/tecscde/attr_tree_view.rb +253 -0
- data/lib/tecscde/cell_plugin_dialog.glade +294 -0
- data/lib/tecscde/cell_plugin_dialog.rb +89 -0
- data/lib/tecscde/celltype_tree_view.rb +105 -0
- data/lib/tecscde/change_set_control.rb +35 -0
- data/lib/tecscde/change_set_control/change_set.rb +32 -0
- data/lib/tecscde/change_set_control/change_set_manager.rb +62 -0
- data/lib/tecscde/command.rb +35 -0
- data/lib/tecscde/control.rb +491 -0
- data/lib/tecscde/highlighted_objects.rb +180 -0
- data/lib/tecscde/logger.rb +74 -0
- data/lib/tecscde/main_view_and_model.rb +80 -0
- data/lib/tecscde/palette.glade +553 -0
- data/lib/tecscde/palette.rb +174 -0
- data/lib/tecscde/preferences.glade +117 -0
- data/lib/tecscde/preferences.rb +44 -0
- data/lib/tecscde/tecs_model.rb +1137 -0
- data/lib/tecscde/tecs_model/hbar.rb +68 -0
- data/lib/tecscde/tecs_model/tm_c_port.rb +122 -0
- data/lib/tecscde/tecs_model/tm_c_port_array.rb +98 -0
- data/lib/tecscde/tecs_model/tm_cell.rb +496 -0
- data/lib/tecscde/tecs_model/tm_e_port.rb +126 -0
- data/lib/tecscde/tecs_model/tm_e_port_array.rb +78 -0
- data/lib/tecscde/tecs_model/tm_join.rb +293 -0
- data/lib/tecscde/tecs_model/tm_join_bar.rb +146 -0
- data/lib/tecscde/tecs_model/tm_port.rb +238 -0
- data/lib/tecscde/tecs_model/tm_port_array.rb +246 -0
- data/lib/tecscde/tecs_model/tm_region.rb +107 -0
- data/lib/tecscde/tecs_model/tm_uneditable.rb +68 -0
- data/lib/tecscde/tecs_model/vbar.rb +68 -0
- data/lib/tecscde/templates/_cell_info.cde.erb +15 -0
- data/lib/tecscde/templates/_join_info.cde.erb +28 -0
- data/lib/tecscde/templates/main.cde.erb +49 -0
- data/lib/tecscde/tm_object.rb +91 -0
- data/lib/tecscde/version.rb +4 -0
- data/lib/tecscde/view.rb +58 -0
- data/lib/tecscde/view/cairo_matrix.rb +90 -0
- data/lib/tecscde/view/canvas.rb +59 -0
- data/lib/tecscde/view/constants.rb +114 -0
- data/lib/tecscde/view/main_view.rb +1245 -0
- data/lib/tecsflow.rb +475 -0
- data/lib/tecsflow/C_parser.tab.rb +2471 -0
- data/lib/tecsflow/C_parser.y.rb +1087 -0
- data/lib/tecsflow/classes.rb +421 -0
- data/lib/tecsgen.rb +581 -0
- data/lib/tecsgen/core/C_parser.tab.rb +2477 -0
- data/lib/tecsgen/core/C_parser.y +1032 -0
- data/lib/tecsgen/core/bnf-deb.tab.rb +5193 -0
- data/lib/tecsgen/core/bnf.tab.rb +5193 -0
- data/lib/tecsgen/core/bnf.y +2211 -0
- data/lib/tecsgen/core/componentobj.rb +7901 -0
- data/lib/tecsgen/core/ctypes.rb +226 -0
- data/lib/tecsgen/core/expression.rb +1031 -0
- data/lib/tecsgen/core/gen_xml.rb +374 -0
- data/lib/tecsgen/core/generate.rb +5206 -0
- data/lib/tecsgen/core/location.rb +116 -0
- data/lib/tecsgen/core/messages.rb +101 -0
- data/lib/tecsgen/core/optimize.rb +456 -0
- data/lib/tecsgen/core/plugin.rb +332 -0
- data/lib/tecsgen/core/pluginModule.rb +165 -0
- data/lib/tecsgen/core/syntaxobj.rb +1234 -0
- data/lib/tecsgen/core/tecs_lang.rb +306 -0
- data/lib/tecsgen/core/tecsgen.rb +453 -0
- data/lib/tecsgen/core/tecsinfo.rb +860 -0
- data/lib/tecsgen/core/tool_info.rb +258 -0
- data/lib/tecsgen/core/types.rb +1632 -0
- data/lib/tecsgen/core/unjoin_plugin.rb +218 -0
- data/lib/tecsgen/core/value.rb +650 -0
- data/lib/tecsgen/messages/messages_console_en_US.rb +1171 -0
- data/lib/tecsgen/messages/messages_console_ja_JP.rb +1171 -0
- data/lib/tecsgen/messages/messages_file_en_US.rb +334 -0
- data/lib/tecsgen/messages/messages_file_ja_JP.rb +163 -0
- data/lib/tecsgen/plugin/ATK1AlarmPlugin.rb +196 -0
- data/lib/tecsgen/plugin/ATK1DelayTaskPlugin.rb +106 -0
- data/lib/tecsgen/plugin/ATK1EventPlugin.rb +147 -0
- data/lib/tecsgen/plugin/ATK1ISRPlugin.rb +174 -0
- data/lib/tecsgen/plugin/ATK1KernelPlugin.rb +287 -0
- data/lib/tecsgen/plugin/ATK1ResourcePlugin.rb +124 -0
- data/lib/tecsgen/plugin/ATK1TaskPlugin.rb +220 -0
- data/lib/tecsgen/plugin/C2TECSBridgePlugin.rb +210 -0
- data/lib/tecsgen/plugin/CellPlugin.rb +61 -0
- data/lib/tecsgen/plugin/CelltypePlugin.rb +72 -0
- data/lib/tecsgen/plugin/CompositePlugin.rb +66 -0
- data/lib/tecsgen/plugin/DomainPlugin.rb +89 -0
- data/lib/tecsgen/plugin/HRP2AlarmHandlerPlugin.rb +76 -0
- data/lib/tecsgen/plugin/HRP2Cache.rb +1 -0
- data/lib/tecsgen/plugin/HRP2CyclicHandlerPlugin.rb +75 -0
- data/lib/tecsgen/plugin/HRP2DataqueuePlugin.rb +68 -0
- data/lib/tecsgen/plugin/HRP2EventflagPlugin.rb +68 -0
- data/lib/tecsgen/plugin/HRP2FixedSizeMemoryPoolPlugin.rb +68 -0
- data/lib/tecsgen/plugin/HRP2HandlerPlugin.rb +117 -0
- data/lib/tecsgen/plugin/HRP2KernelObjectPlugin.rb +372 -0
- data/lib/tecsgen/plugin/HRP2ObjectPlugin.rb +94 -0
- data/lib/tecsgen/plugin/HRP2Plugin.rb +140 -0
- data/lib/tecsgen/plugin/HRP2PostHook.rb +111 -0
- data/lib/tecsgen/plugin/HRP2PriorityDataqueuePlugin.rb +66 -0
- data/lib/tecsgen/plugin/HRP2RPCPlugin.rb +319 -0
- data/lib/tecsgen/plugin/HRP2SVCPlugin.rb +473 -0
- data/lib/tecsgen/plugin/HRP2SemaphorePlugin.rb +67 -0
- data/lib/tecsgen/plugin/HRP2TaskPlugin.rb +200 -0
- data/lib/tecsgen/plugin/HRPHandlerPlugin.rb +125 -0
- data/lib/tecsgen/plugin/HRPKernelObjectManager.rb +72 -0
- data/lib/tecsgen/plugin/HRPKernelObjectPlugin.rb +333 -0
- data/lib/tecsgen/plugin/HRPObjectPlugin.rb +93 -0
- data/lib/tecsgen/plugin/HRPPlugin.rb +356 -0
- data/lib/tecsgen/plugin/HRPRPCPlugin.rb +407 -0
- data/lib/tecsgen/plugin/HRPSVCPlugin.rb +859 -0
- data/lib/tecsgen/plugin/HRPTaskPlugin.rb +107 -0
- data/lib/tecsgen/plugin/Mruby2CBridgePlugin.rb +86 -0
- data/lib/tecsgen/plugin/MrubyBridgeCellPlugin.rb +264 -0
- data/lib/tecsgen/plugin/MrubyBridgeCelltypePlugin.rb +293 -0
- data/lib/tecsgen/plugin/MrubyBridgeCompositePlugin.rb +49 -0
- data/lib/tecsgen/plugin/MrubyBridgePlugin.rb +67 -0
- data/lib/tecsgen/plugin/MrubyBridgeSignaturePlugin.rb +1307 -0
- data/lib/tecsgen/plugin/MrubyInfoBridgePlugin.rb +14 -0
- data/lib/tecsgen/plugin/MrubyInfoBridgeSignaturePlugin.rb +994 -0
- data/lib/tecsgen/plugin/MultiPlugin.rb +57 -0
- data/lib/tecsgen/plugin/NotifierPlugin.rb +1217 -0
- data/lib/tecsgen/plugin/OpaqueMarshalerPlugin.rb +81 -0
- data/lib/tecsgen/plugin/OpaqueRPCPlugin.rb +323 -0
- data/lib/tecsgen/plugin/RPCPlugin.rb +266 -0
- data/lib/tecsgen/plugin/RepeatCellPlugin.rb +166 -0
- data/lib/tecsgen/plugin/RepeatJoinPlugin.rb +130 -0
- data/lib/tecsgen/plugin/SharedOpaqueRPCPlugin.rb +357 -0
- data/lib/tecsgen/plugin/SharedRPCPlugin.rb +329 -0
- data/lib/tecsgen/plugin/SignaturePlugin.rb +77 -0
- data/lib/tecsgen/plugin/TECS2CBridgePlugin.rb +178 -0
- data/lib/tecsgen/plugin/TECSInfoPlugin.rb +280 -0
- data/lib/tecsgen/plugin/ThroughPlugin.rb +333 -0
- data/lib/tecsgen/plugin/TracePlugin.rb +484 -0
- data/lib/tecsgen/plugin/lib/GenHRP2Marshaler.rb +761 -0
- data/lib/tecsgen/plugin/lib/GenOpaqueMarshaler.rb +1107 -0
- data/lib/tecsgen/plugin/lib/GenParamCopy.rb +365 -0
- data/lib/tecsgen/plugin/lib/GenTransparentMarshaler.rb +683 -0
- data/lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb +283 -0
- data/lib/tecsgen/plugin/lib/MrubyBridgeSignaturePluginModule.rb +277 -0
- data/lib/tecsgen/version.rb +6 -0
- data/samples/FigureSamples/active/active.cde +104 -0
- data/samples/FigureSamples/active/active.cdl +20 -0
- data/samples/FigureSamples/active/active.pdf +0 -0
- data/samples/FigureSamples/active/active.png +0 -0
- data/samples/FigureSamples/active/gen/tmp_C_src.c +36 -0
- data/samples/FigureSamples/active/gen/tmp_cygwin_tecs.h +1908 -0
- data/samples/FigureSamples/active/gen/tmp_plugin_post_code.cdl +0 -0
- data/samples/FigureSamples/allocator/allocator-internal.png +0 -0
- data/samples/FigureSamples/allocator/allocator.cde +171 -0
- data/samples/FigureSamples/allocator/allocator.cdl +58 -0
- data/samples/FigureSamples/allocator/allocator.png +0 -0
- data/samples/FigureSamples/basic/Makefile +87 -0
- data/samples/FigureSamples/basic/SimpleSample-trace.cdl +50 -0
- data/samples/FigureSamples/basic/SimpleSample.cde +91 -0
- data/samples/FigureSamples/basic/SimpleSample.cdl +47 -0
- data/samples/FigureSamples/basic/basic.cde +93 -0
- data/samples/FigureSamples/basic/basic.cdl +46 -0
- data/samples/FigureSamples/basic/basic.png +0 -0
- data/samples/FigureSamples/callback/callback.cde +130 -0
- data/samples/FigureSamples/callback/callback.cdl +29 -0
- data/samples/FigureSamples/callback/callback.png +0 -0
- data/samples/FigureSamples/carray/carray.cde +144 -0
- data/samples/FigureSamples/carray/carray.cdl +38 -0
- data/samples/FigureSamples/carray/carray.png +0 -0
- data/samples/FigureSamples/cearray/cearray.cde +314 -0
- data/samples/FigureSamples/cearray/cearray.cdl +60 -0
- data/samples/FigureSamples/cearray/cearray.png +0 -0
- data/samples/FigureSamples/composite/composite-internal.png +0 -0
- data/samples/FigureSamples/composite/composite.cde +216 -0
- data/samples/FigureSamples/composite/composite.cdl +95 -0
- data/samples/FigureSamples/composite/composite.png +0 -0
- data/samples/FigureSamples/earray/earray.cde +142 -0
- data/samples/FigureSamples/earray/earray.cdl +38 -0
- data/samples/FigureSamples/earray/earray.png +0 -0
- data/samples/FigureSamples/join/Makefile +87 -0
- data/samples/FigureSamples/join/join.cde +132 -0
- data/samples/FigureSamples/join/join.cdl +40 -0
- data/samples/FigureSamples/join/join.png +0 -0
- data/samples/FigureSamples/relay/Makefile +99 -0
- data/samples/FigureSamples/relay/relay-internal.png +0 -0
- data/samples/FigureSamples/relay/relay.cde +284 -0
- data/samples/FigureSamples/relay/relay.cdl +52 -0
- data/samples/FigureSamples/relay/relay.png +0 -0
- data/samples/FigureSamples/rpc/Makefile +123 -0
- data/samples/FigureSamples/rpc/rpc-expand.png +0 -0
- data/samples/FigureSamples/rpc/rpc.cde +245 -0
- data/samples/FigureSamples/rpc/rpc.png +0 -0
- data/samples/FigureSamples/rpc/rpc_sample.cdl +53 -0
- data/samples/SimpleSample/Makefile +25 -0
- data/samples/SimpleSample/SimpleSample/Makefile +86 -0
- data/samples/SimpleSample/SimpleSample/Makefile-trace +91 -0
- data/samples/SimpleSample/SimpleSample/README.txt +106 -0
- data/samples/SimpleSample/SimpleSample/SimpleSample-trace.cdl +50 -0
- data/samples/SimpleSample/SimpleSample/SimpleSample.cdl +45 -0
- data/samples/SimpleSample/SimpleSample/src/tSample.c +77 -0
- data/samples/SimpleSample/SimpleSample/src/tSimple.c +48 -0
- data/samples/SimpleSample/SimpleSample/src/tecs-types.h +27 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile +51 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile-trace +91 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/README.txt +106 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample-trace.cdl +80 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample.cdl +77 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSample/Makefile +112 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSimple/Makefile +109 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSample.c +80 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSimple.c +47 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tTaskMain.c +66 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tecs-types.h +27 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile +125 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile-trace +130 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample-trace.cdl +54 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample.cdl +53 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSample.c +80 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSimple.c +54 -0
- data/tecscde.gemspec +41 -0
- metadata +353 -0
|
@@ -0,0 +1,306 @@
|
|
|
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: tecs_lang.rb 2061 2014-05-31 22:15:33Z okuma-top $
|
|
37
|
+
#++
|
|
38
|
+
|
|
39
|
+
#== 言語に関する変数を設定
|
|
40
|
+
# メッセージファイルの読み込みも行う (読み込みに失敗した場合、デフォルトの文字コードに変更する)
|
|
41
|
+
class TECS_LANG
|
|
42
|
+
# ハッシュのタグは case insensitive のため、大文字の文字列とする
|
|
43
|
+
CHARSET_ALIAS = {
|
|
44
|
+
"UJIS" => :eucJP,
|
|
45
|
+
"UTF-8" => :utf8,
|
|
46
|
+
"EUCJP" => :eucJP, # 以下 case insensitive にするため
|
|
47
|
+
"SJIS" => :sjis,
|
|
48
|
+
"UTF8" => :utf8,
|
|
49
|
+
"ISO8859-1" => :"iso8859-1"
|
|
50
|
+
}
|
|
51
|
+
LANG_ALIAS = {
|
|
52
|
+
"C" => :en_US,
|
|
53
|
+
"EN_US" => :en_US, # 以下 case insensitive にするため
|
|
54
|
+
"JA_JP" => :ja_JP
|
|
55
|
+
}
|
|
56
|
+
SUITABLE_CHARSET = {
|
|
57
|
+
:ja_JP => [:eucJP, :sjis, :utf8],
|
|
58
|
+
:en_US => [:"iso8859-1", :utf8, nil]
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
#=== LANG のパース
|
|
62
|
+
# lang::String "ja_JP.eucJP@cjknarrow", "C" など
|
|
63
|
+
# RETURN:: [ :ja_JP, :eucJP, :cjknarrow ]
|
|
64
|
+
def self.parse_lang(lang)
|
|
65
|
+
lang =~ /([^\.@]*)(\.([^@]*))?(@(.*))?/
|
|
66
|
+
|
|
67
|
+
lang_terri = $1.to_sym if !$1.nil? && $1 != ""
|
|
68
|
+
# set_kcode_binary により、C.UTF-8 のみを特別扱いする必要がなくなった
|
|
69
|
+
# if lang_terri == :C then # LANG=C.* は、すべて 1 byte 文字コードとして扱う
|
|
70
|
+
# codeset = nil
|
|
71
|
+
# modifier = nil
|
|
72
|
+
# else
|
|
73
|
+
codeset = $3.to_sym if !$3.nil? && $3 != ""
|
|
74
|
+
modifier = $5.to_sym if !$5.nil? && $5 != ""
|
|
75
|
+
# end
|
|
76
|
+
[lang_terri, codeset, modifier]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
#=== lang, charset の別明解決および妥当性のチェック
|
|
80
|
+
# lang::Symbol : :en_US, :ja_JP など
|
|
81
|
+
# charset::Symbol : :eucJP, :utf8 など
|
|
82
|
+
# RETURN:
|
|
83
|
+
# [ lang, charset, result ]:: result = false の場合 lang, charset は不適切
|
|
84
|
+
def self.resolve_alias_and_check(lang, charset)
|
|
85
|
+
if LANG_ALIAS[lang.to_s.upcase]
|
|
86
|
+
ln = LANG_ALIAS[lang.to_s.upcase]
|
|
87
|
+
else
|
|
88
|
+
ln = lang
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
if CHARSET_ALIAS[charset.to_s.upcase]
|
|
92
|
+
cs = CHARSET_ALIAS[charset.to_s.upcase]
|
|
93
|
+
else
|
|
94
|
+
cs = charset
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
if SUITABLE_CHARSET[ln].nil? || SUITABLE_CHARSET[ln].index(cs).nil?
|
|
98
|
+
res = false
|
|
99
|
+
else
|
|
100
|
+
res = true
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# p ln, cs, res
|
|
104
|
+
[ln, cs, res]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
#=== codepage を取り出す
|
|
108
|
+
# codepage は3〜5桁の整数として仮定
|
|
109
|
+
def self.get_win_codepage
|
|
110
|
+
cmd_pipe = IO.popen("cmd /c chcp", "r")
|
|
111
|
+
cmd_pipe.read =~ /([0-9]{3,5})/
|
|
112
|
+
cp = $1
|
|
113
|
+
cmd_pipe.close
|
|
114
|
+
return cp
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
#=== codepage から LANG の設定文字列に変換
|
|
118
|
+
def self.codepage_to_lang(cp)
|
|
119
|
+
if cp == "932"
|
|
120
|
+
"ja_JP.sjis"
|
|
121
|
+
else
|
|
122
|
+
"en_US"
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
#=== 言語、文字コードに関する変数を設定
|
|
127
|
+
# 以下の順にチェックされ、一番最後に設定された値が採用される
|
|
128
|
+
# ・デフォルト
|
|
129
|
+
# ・codepage (exerb 版で TERM 未設定または TERM=cygwin の場合のみ)
|
|
130
|
+
# ・LANG 環境変数
|
|
131
|
+
# ・TECSGEN_LANG 環境変数
|
|
132
|
+
# ・TECSGEN_FILE_LANG 環境変数 (ファイルの文字コードのみ)
|
|
133
|
+
# ・-k オプション (ファイルの文字コードのみ)
|
|
134
|
+
def self.set_lang_var
|
|
135
|
+
if ENV["LANG"]
|
|
136
|
+
# 非 exerb 版では LANG 環境変数を見る
|
|
137
|
+
# cygwin console では codepage に従って出力した方が平和なため
|
|
138
|
+
|
|
139
|
+
$LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang(ENV["LANG"])
|
|
140
|
+
$LANG_CONSOLE = $LANG_FILE
|
|
141
|
+
$CHARSET_CONSOLE = $CHARSET_FILE
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
if ENV["TECSGEN_LANG"]
|
|
145
|
+
$LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang(ENV["TECSGEN_LANG"])
|
|
146
|
+
$LANG_CONSOLE = $LANG_FILE
|
|
147
|
+
$CHARSET_CONSOLE = $CHARSET_FILE
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
if ENV["TECSGEN_FILE_LANG"]
|
|
151
|
+
$LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang(ENV["TECSGEN_FILE_LANG"])
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
self.set_lang_by_option
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
#=== -k オプションからファイル用の言語、文字コード変数を設定
|
|
158
|
+
def self.set_lang_by_option
|
|
159
|
+
if $kcode.nil?
|
|
160
|
+
return
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
code = $kcode
|
|
164
|
+
found = false
|
|
165
|
+
res = $CODE_TYPE_ARRAY.index(code)
|
|
166
|
+
if res.nil?
|
|
167
|
+
print "-k: illegal kcode type #{code}. (#{$CODE_TYPE_ARRAY.join(", ")})\n"
|
|
168
|
+
exit 1
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
case $kcode
|
|
172
|
+
when "euc"
|
|
173
|
+
$CHARSET_FILE = :eucJP
|
|
174
|
+
$LANG_FILE = :ja_JP
|
|
175
|
+
when "sjis"
|
|
176
|
+
$CHARSET_FILE = :sjis
|
|
177
|
+
$LANG_FILE = :ja_JP
|
|
178
|
+
when "utf8"
|
|
179
|
+
$CHARSET_FILE = :utf8
|
|
180
|
+
$LANG_FILE = :ja_JP
|
|
181
|
+
when "none"
|
|
182
|
+
$CHARSET_FILE = nil
|
|
183
|
+
$LANG_FILE = "en_US"
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# 言語情報から Encoding に関する変数を設定
|
|
188
|
+
def self.set_encoding_var
|
|
189
|
+
# 文字コードの設定
|
|
190
|
+
case $CHARSET_FILE # string: "EUC" | "SJIS" | "NONE" | "UTF8"
|
|
191
|
+
when :eucJP
|
|
192
|
+
$ENCODING_CDL = Encoding::EUC_JP
|
|
193
|
+
$Ruby19_File_Encode = "ASCII-8BIT"
|
|
194
|
+
when :sjis
|
|
195
|
+
$ENCODING_CDL = Encoding::Shift_JIS
|
|
196
|
+
$Ruby19_File_Encode = "Shift_JIS"
|
|
197
|
+
when :utf8
|
|
198
|
+
$ENCODING_CDL = Encoding::UTF_8
|
|
199
|
+
$Ruby19_File_Encode = "ASCII-8BIT"
|
|
200
|
+
else
|
|
201
|
+
$ENCODING_CDL = Encoding::BINARY
|
|
202
|
+
$Ruby19_File_Encode = "ASCII-8BIT"
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
case $CHARSET_CONSOLE
|
|
206
|
+
when :eucJP
|
|
207
|
+
$ENCODING_CONSOLE = Encoding::EUC_JP
|
|
208
|
+
when :sjis
|
|
209
|
+
$ENCODING_CONSOLE = Encoding::Shift_JIS
|
|
210
|
+
when :utf8
|
|
211
|
+
$ENCODING_CONSOLE = Encoding::UTF_8
|
|
212
|
+
else
|
|
213
|
+
$ENCODING_CONSOLE = Encoding::BINARY
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
$ENCODING_TECSGEN = Encoding::UTF_8 # const:
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
#####
|
|
220
|
+
# $LANG_FILE 言語 (C は en_US に変換される)
|
|
221
|
+
# $LANG_CONSOLE 言語 (C は en_US に変換される)
|
|
222
|
+
# $CHARSET_FILE ファイルの文字コード
|
|
223
|
+
# $CHARSET_CONSOLE コンソール文字コード
|
|
224
|
+
|
|
225
|
+
# デフォルトの設定(正規化済みのこと)
|
|
226
|
+
$LANG_FILE_DEFAULT = :en_US
|
|
227
|
+
$CHARSET_FILE_DEFAULT = nil
|
|
228
|
+
$LANG_CONSOLE_DEFAULT = :en_US
|
|
229
|
+
$CHARSET_CONSOLE_DEFAULT = nil
|
|
230
|
+
|
|
231
|
+
$LANG_FILE = $LANG_FILE_DEFAULT
|
|
232
|
+
$CHARSET_FILE = $CHARSET_FILE_DEFAULT
|
|
233
|
+
$LANG_CONSOLE = $LANG_CONSOLE_DEFAULT
|
|
234
|
+
$CHARSET_CONSOLE = $CHARSET_CONSOLE_DEFAULT
|
|
235
|
+
|
|
236
|
+
# -k で指定可能なコード
|
|
237
|
+
$CODE_TYPE_ARRAY = ["euc", "sjis", "none", "utf8"]
|
|
238
|
+
|
|
239
|
+
# 言語を決定する
|
|
240
|
+
self.set_lang_var
|
|
241
|
+
|
|
242
|
+
# 言語、コードのチェックと正規化
|
|
243
|
+
lang_file, charset_file, res =
|
|
244
|
+
self.resolve_alias_and_check($LANG_FILE, $CHARSET_FILE)
|
|
245
|
+
if res == false
|
|
246
|
+
# lang_file, charset_file = lang_file_default, charset_file_default
|
|
247
|
+
lang_file, charset_file = $LANG_FILE_DEFAULT, $CHARSET_FILE_DEFAULT
|
|
248
|
+
end
|
|
249
|
+
lang_console, charset_console, res =
|
|
250
|
+
self.resolve_alias_and_check($LANG_CONSOLE, $CHARSET_CONSOLE)
|
|
251
|
+
if res == false
|
|
252
|
+
# lang_console, charset_console = lang_console_default, charset_console_default
|
|
253
|
+
lang_console, charset_console = $LANG_CONSOLE_DEFAULT, $CHARSET_CONSOLE_DEFAULT
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
# メッセージモジュールをロード
|
|
257
|
+
if require("tecsgen/messages/messages_console_#{lang_console}")
|
|
258
|
+
$LANG_CONSOLE, $CHARSET_CONSOLE = lang_console, charset_console
|
|
259
|
+
else
|
|
260
|
+
require("tecsgen/messages/messages_console_#{$LANG_CONSOLE_DEFAULT}")
|
|
261
|
+
$LANG_CONSOLE, $CHARSET_CONSOLE = $LANG_CONSOLE_DEFAULT, $CHARSET_CONSOLE_DEFAULT
|
|
262
|
+
end
|
|
263
|
+
if require("tecsgen/messages/messages_file_#{lang_file}")
|
|
264
|
+
$LANG_FILE, $CHARSET_FILE = lang_file, charset_file
|
|
265
|
+
else
|
|
266
|
+
require("tecslib/messages/messages_file_#{$LANG_FILE_DEFAULT}")
|
|
267
|
+
$LANG_FILE, $CHARSET_FILE = $LANG_FILE_DEFAULT, $CHARSET_FILE_DEFAULT
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
self.set_encoding_var
|
|
271
|
+
|
|
272
|
+
dbgPrint "LANG_FILE=#{$LANG_FILE}.#{$CHARSET_FILE}, LANG_CONSOLE=#{$LANG_CONSOLE}.#{$CHARSET_CONSOLE}\n"
|
|
273
|
+
dbgPrint "ENCODING_CDL=#{$ENCODING_CDL} ENCODING_CONSOLE=#{$ENCODING_CONSOLE}\n"
|
|
274
|
+
dbgPrint "Ruby19_File_Encode=#{$Ruby19_File_Encode}\n"
|
|
275
|
+
|
|
276
|
+
#=== 単体テスト実行
|
|
277
|
+
if $unit_test
|
|
278
|
+
print "unit test: set_lang_var\n"
|
|
279
|
+
self.set_lang_var
|
|
280
|
+
print "#{$LANG_FILE} #{$LANG_CONSOLE}\n"
|
|
281
|
+
print "#{$CHARSET_FILE} #{$CHARSET_CONSOLE}\n"
|
|
282
|
+
|
|
283
|
+
$LANG_FILE, $CHARSET_FILE, res = self.resolve_alias_and_check($LANG_FILE, $CHARSET_FILE)
|
|
284
|
+
print "#{$LANG_FILE} #{$CHARSET_FILE}, #{res}\n"
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
#= Console クラス
|
|
289
|
+
# 文字コードを変換する
|
|
290
|
+
class Console
|
|
291
|
+
def self.print(str)
|
|
292
|
+
if $ENCODING_CONSOLE == Encoding::BINARY
|
|
293
|
+
STDOUT.print(str)
|
|
294
|
+
else
|
|
295
|
+
STDOUT.print(str.encode($ENCODING_CONSOLE))
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def self.puts(str)
|
|
300
|
+
if $ENCODING_CONSOLE == Encoding::BINARY
|
|
301
|
+
STDOUT.puts(str)
|
|
302
|
+
else
|
|
303
|
+
STDOUT.puts(str.encode($ENCODING_CONSOLE))
|
|
304
|
+
end
|
|
305
|
+
end
|
|
306
|
+
end
|
|
@@ -0,0 +1,453 @@
|
|
|
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: tecsgen.rb 2665 2017-07-24 08:59:28Z okuma-top $
|
|
37
|
+
#++
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class TECSGEN
|
|
41
|
+
@@b_post_coded = false # ポストコード生成開始後 true
|
|
42
|
+
|
|
43
|
+
#=== import パス (-I) を末尾に追加
|
|
44
|
+
# 既に登録済みであれば、追加しない
|
|
45
|
+
def self.add_import_path(path)
|
|
46
|
+
if $import_path.index(path).nil?
|
|
47
|
+
dbgPrint "add_import_path: '#{path}'\n"
|
|
48
|
+
$import_path << path
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
#=== $(TECSPATH) への置換
|
|
53
|
+
# path::String : ENV[ 'TECSPATH' ] に一致する部分があれば、 "$(TECSPATH)" に置換
|
|
54
|
+
# b_global::Bool : true なら gsub で置換。false なら sub で置換
|
|
55
|
+
def self.subst_tecspath(path, b_global = false)
|
|
56
|
+
tp = $tecspath.dup
|
|
57
|
+
tp.gsub!(/\\/, "\\\\\\\\")
|
|
58
|
+
pattern = /#{tp}/
|
|
59
|
+
substr = "$(TECSPATH)"
|
|
60
|
+
if b_global
|
|
61
|
+
str = path.gsub(pattern, substr)
|
|
62
|
+
else
|
|
63
|
+
str = path.sub(pattern, substr)
|
|
64
|
+
end
|
|
65
|
+
dbgPrint "subst_tecspath #{path}, #{str}\n"
|
|
66
|
+
return str
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
#=== path は絶対パスか?
|
|
70
|
+
# path:: String :
|
|
71
|
+
# '/' または '$' で始まる場合、絶対パスと判定する
|
|
72
|
+
def self.is_absolute_path?(path)
|
|
73
|
+
pa = path[0..0]
|
|
74
|
+
pa2 = path[0..1]
|
|
75
|
+
if pa == "/" || pa == "$" || pa2 =~ /[A-Za-z]:/
|
|
76
|
+
res = true
|
|
77
|
+
else
|
|
78
|
+
res = false
|
|
79
|
+
end
|
|
80
|
+
dbgPrint "is_absolute( #{path} ) = #{res} #{path[0]}\n"
|
|
81
|
+
return res
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
#=== tecsgen のデフォルトを設定
|
|
85
|
+
def self.set_default_config
|
|
86
|
+
Makefile.set_default_config
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
###
|
|
90
|
+
#== Makefile.templ の出力内容を追加、変更するための操作
|
|
91
|
+
module Makefile
|
|
92
|
+
# 固定されている変数(add_var で変更できない)
|
|
93
|
+
@@fixed_vars = { :INCLUDES => nil, :DEFINES => nil, :TARGET_BASE => nil, :BASE_DIR => nil }
|
|
94
|
+
@@config_mode = false
|
|
95
|
+
|
|
96
|
+
@@vars = { }
|
|
97
|
+
@@vars_default = { }
|
|
98
|
+
@@var_comments = { }
|
|
99
|
+
|
|
100
|
+
@@objs = []
|
|
101
|
+
@@ldflags = ""
|
|
102
|
+
@@search_path = []
|
|
103
|
+
@@pre_tecsgen_target = []
|
|
104
|
+
@@post_tecsgen_target = []
|
|
105
|
+
@@lines = []
|
|
106
|
+
|
|
107
|
+
#=== OTHER_OBJS に追加する
|
|
108
|
+
def self.add_obj(obj)
|
|
109
|
+
@@objs << obj
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
#=== 追加する変数
|
|
113
|
+
# プラグインからは、デフォルト値を変更できる
|
|
114
|
+
# config により
|
|
115
|
+
def self.add_var(var, val, comment = nil)
|
|
116
|
+
if @@fixed_vars[var]
|
|
117
|
+
raise "fixed var '#{var}' cannot be changed"
|
|
118
|
+
end
|
|
119
|
+
if @@config_mode
|
|
120
|
+
@@vars_default[var.to_sym] = val
|
|
121
|
+
@@var_comments_default[var.to_sym] = comment
|
|
122
|
+
else
|
|
123
|
+
@@vars[var.to_sym] = val
|
|
124
|
+
@@var_comments[var.to_sym] = comment
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
#=== LDFLAGS に追加する
|
|
129
|
+
def self.add_ldflag(ldflag)
|
|
130
|
+
@@ldflags += " " + ldflag
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
#=== サーチパスを追加する
|
|
134
|
+
# CFLAGS, vpath に追加する
|
|
135
|
+
def self.add_search_path(path)
|
|
136
|
+
@@search_path << path
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
#=== PRE_TECSGEN_TARGET に追加する
|
|
140
|
+
# PRE_TECSGEN_TARGET に target を追加する
|
|
141
|
+
def self.add_pre_tecsgen_target(target)
|
|
142
|
+
@@pre_tecsgen_target << pre_tecsgen_target
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
#=== POST_TECSGEN_TARGET に追加する
|
|
146
|
+
# POST_TECSGEN_TARGET に target を追加する
|
|
147
|
+
def self.add_post_tecsgen_target(target)
|
|
148
|
+
@@post_tecsgen_target << pre_tecsgen_target
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
#=== 追加する変数
|
|
152
|
+
def self.add_line(line)
|
|
153
|
+
@@lines << line.to_s + "\n"
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def self.get_objs # Array を返す
|
|
157
|
+
return @@objs.uniq
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def self.get_vars # Array を返す
|
|
161
|
+
if RUBY_VERSION >= "1.9"
|
|
162
|
+
return (@@vars.keys + @@vars_default.keys).sort.uniq
|
|
163
|
+
else
|
|
164
|
+
# V1.8 では、Symbol の sort ができないので、一旦 String に置換する
|
|
165
|
+
return (@@vars.keys + @@vars_default.keys).map{|s| s.to_s }.sort.uniq.map!{|s| s.to_sym }
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def self.get_var_val(var)
|
|
170
|
+
return @@vars[var] ? @@vars[var] : @@vars_default[var]
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def self.get_var_comment(var)
|
|
174
|
+
return @@var_comments[var]
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def self.get_ldflags # String を返す
|
|
178
|
+
return @@ldflags
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def self.get_search_path # Array を返す
|
|
182
|
+
return @@search_path.uniq
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def self.get_pre_tecsgen_target # Array を返す
|
|
186
|
+
return @@pre_tecsgen_target.uniq
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def self.get_post_tecsgen_target # Array を返す
|
|
190
|
+
return @@post_tecsgen_target.uniq
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def self.get_lines # 付加する行を得る
|
|
194
|
+
return @@lines.uniq
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
#=== TECSGEN のデフォルト設定を行う
|
|
198
|
+
# Makefile
|
|
199
|
+
# @@fixed_vars で定義されている変数は、変更できず、定数定義されている
|
|
200
|
+
def self.set_default_config
|
|
201
|
+
add_var("TARGET", "$(TARGET_BASE).exe", "default target name")
|
|
202
|
+
add_var("TECSGEN", "tecsgen", "default TECS generator")
|
|
203
|
+
add_var("TIMESTAMP", "$(GEN_DIR)/tecsgen.timestamp", "Time Stamp")
|
|
204
|
+
add_var("CC", "gcc", "default C Compiler")
|
|
205
|
+
add_var("CFLAGS", '$(INCLUDES) $(DEFINES) -D "Inline=static inline"', "default C Compiler options")
|
|
206
|
+
add_var("LD", "gcc", "default Liknker")
|
|
207
|
+
add_var("LDFLAGS", @@ldflags, "default Liknker Options")
|
|
208
|
+
add_var("SRC_DIR", "$(BASE_DIR)/src", "default source directory")
|
|
209
|
+
add_var("_TECS_OBJ_DIR", "$(GEN_DIR)/", "default relocatable object (.o) directory")
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def self.get_argv
|
|
214
|
+
ARGV
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
#------ TECSGEN CDL analyze and generate ------#
|
|
218
|
+
|
|
219
|
+
def syntax_analisys(argv)
|
|
220
|
+
# ルート namespace (region) を生成
|
|
221
|
+
@root_namespace = Region.new("::")
|
|
222
|
+
|
|
223
|
+
#### 構文解析 (post コードを除く) ####
|
|
224
|
+
# すべての cdl を import する
|
|
225
|
+
argv.each{|f|
|
|
226
|
+
dbgPrint("## Import: #{f}\n")
|
|
227
|
+
TECSGEN.add_import_path(File.expand_path(File.dirname(f)))
|
|
228
|
+
Import.new(f, false, false)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
# すべての構文解釈が完了したことの報告
|
|
232
|
+
# 実際には、後からプラグインの生成する CDL のパースが行われる
|
|
233
|
+
# エラー行数の決定方法の変更のために行う
|
|
234
|
+
Generator.end_all_parse
|
|
235
|
+
dbgPrint("## End all parse (except Post Code)\n")
|
|
236
|
+
end # syntax_analisys
|
|
237
|
+
|
|
238
|
+
#=== TECSGEN#semantics_analisys_1
|
|
239
|
+
# semantics check. only cells here
|
|
240
|
+
# other objects (signature, celltype, typedef, etc ) are checked while syntax analisys
|
|
241
|
+
def semantics_analisys_1
|
|
242
|
+
#### 意味解析1 (post コードを除く) ####
|
|
243
|
+
dbgPrint("## Creating reverse join \n")
|
|
244
|
+
Cell.create_reverse_join
|
|
245
|
+
|
|
246
|
+
DescriptorType.check_signature
|
|
247
|
+
Signature.set_descriptor_list
|
|
248
|
+
Celltype.check_dynamic_join
|
|
249
|
+
|
|
250
|
+
# 0 set_definition_join は2回呼び出される(1回目)
|
|
251
|
+
dbgPrint("## Checking all join\n")
|
|
252
|
+
@root_namespace.set_definition_join
|
|
253
|
+
# @root_namespace.set_require_join ### いったん見合わせ。重複エラーを見逃す
|
|
254
|
+
# through プラグインで生成されたセルにも require も生成できる (set_definition_join の後ろで実施)
|
|
255
|
+
|
|
256
|
+
#### post コードの生成と構文解析 ####
|
|
257
|
+
@@b_post_coded = true # ポストコード生成開始後 true
|
|
258
|
+
# 引数がなければ、プラグインのポストコードを出力しない
|
|
259
|
+
if ARGV.length > 0
|
|
260
|
+
dbgPrint("## Generating Post Code\n")
|
|
261
|
+
# プラグインのポストコードの出力と import
|
|
262
|
+
tmp_file_name = "#{$gen}/tmp_plugin_post_code.cdl"
|
|
263
|
+
file = nil
|
|
264
|
+
begin
|
|
265
|
+
file = CFile.open(tmp_file_name, "w")
|
|
266
|
+
rescue
|
|
267
|
+
Generator.error("G9999 fail to create #{tmp_file_name}")
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
if file
|
|
271
|
+
# through プラグインのポストコード生成
|
|
272
|
+
PluginModule.gen_plugin_post_code file
|
|
273
|
+
|
|
274
|
+
begin
|
|
275
|
+
file.close
|
|
276
|
+
rescue
|
|
277
|
+
Generator.error("G9999 fail to close #{tmp_file_name}")
|
|
278
|
+
end
|
|
279
|
+
dbgPrint("## Import Post Code\n")
|
|
280
|
+
Import.new(tmp_file_name.to_s)
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
#### 意味解析1 (post コード) ####
|
|
285
|
+
dbgPrint("## Creating reverse join (for post code) \n")
|
|
286
|
+
Cell.create_reverse_join
|
|
287
|
+
|
|
288
|
+
# Join の定義の設定とチェック
|
|
289
|
+
# 0 # 前方参照対応
|
|
290
|
+
# 0 set_definition_join は2回呼び出される(2回目) post_code で生成された
|
|
291
|
+
dbgPrint("## Checking all join (for cells generated by Post Code\n")
|
|
292
|
+
@root_namespace.set_definition_join
|
|
293
|
+
@root_namespace.set_max_entry_port_inner_cell
|
|
294
|
+
|
|
295
|
+
dbgPrint("## Set require join\n")
|
|
296
|
+
@root_namespace.set_require_join # mikan post の前にも
|
|
297
|
+
# ポストコードで生成されたセルの require のjoin を生成
|
|
298
|
+
# mikan require で through が適用されて、ポストコードが必要となっても出力されない
|
|
299
|
+
end # semantics_analisys_1
|
|
300
|
+
|
|
301
|
+
def semantics_analisys_2
|
|
302
|
+
#### 意味解析2 ####
|
|
303
|
+
Cell.make_cell_list2
|
|
304
|
+
dbgPrint("## Set fixed join\n")
|
|
305
|
+
Cell.create_reverse_require_join
|
|
306
|
+
# create_reverse_require_join は set_detinition_join に埋め込むことができない
|
|
307
|
+
# namespace に依存しない出現順で行う
|
|
308
|
+
# mikan through プラグインが適用されポストコードに影響を与える場合が考慮できていない
|
|
309
|
+
# mikan post code に影響のあるものであれば、早くに reverse_require_join の結合が必要
|
|
310
|
+
dbgPrint("## Setting port reference count\n")
|
|
311
|
+
@root_namespace.set_port_reference_count
|
|
312
|
+
|
|
313
|
+
dbgPrint("## Checking all join\n")
|
|
314
|
+
@root_namespace.check_join
|
|
315
|
+
|
|
316
|
+
# mikan プラグインで生成されたコンポーネントの set_def_and_check_join
|
|
317
|
+
|
|
318
|
+
dbgPrint("## Checking referenced but undefined cell\n")
|
|
319
|
+
@root_namespace.check_ref_but_undef
|
|
320
|
+
end # semantics_analisys_2
|
|
321
|
+
|
|
322
|
+
def optimize_and_generate
|
|
323
|
+
#### Region link root ごとにオプティマイズおよび生成 ####
|
|
324
|
+
Region.get_link_roots.each {|region|
|
|
325
|
+
|
|
326
|
+
n_cells = region.get_n_cells
|
|
327
|
+
|
|
328
|
+
dbgPrint "#{region.get_name} has #{n_cells} cells\n"
|
|
329
|
+
if $verbose
|
|
330
|
+
print "=====================================\n"
|
|
331
|
+
print "=== Region.path_str: #{region.get_namespace_path.get_path_str}\n"
|
|
332
|
+
print "=====================================\n"
|
|
333
|
+
else
|
|
334
|
+
dbgPrint "Region.path_str: #{region.get_namespace_path.get_path_str}\n"
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
if $region_list.length > 0
|
|
338
|
+
if $region_list[region.get_namespace_path.get_path_str]
|
|
339
|
+
$region_list[region.get_namespace_path.get_path_str] = false
|
|
340
|
+
else
|
|
341
|
+
next
|
|
342
|
+
end
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
# セルが一つもなければ生成しない
|
|
346
|
+
# セルの生成がない場合
|
|
347
|
+
if region.get_n_cells == 0
|
|
348
|
+
if $region_list.length > 0
|
|
349
|
+
Generator.warning("W9999 $1: specified to generate but has no cell", region.get_name)
|
|
350
|
+
end
|
|
351
|
+
if region != @root_namespace
|
|
352
|
+
next
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
$generating_region = region
|
|
357
|
+
if Region.get_link_roots.length > 1
|
|
358
|
+
if region.get_name == "::"
|
|
359
|
+
$gen = $gen_base
|
|
360
|
+
else
|
|
361
|
+
$gen = $gen_base + "/" + region.get_global_name.to_s
|
|
362
|
+
begin
|
|
363
|
+
if !File.directory?($gen)
|
|
364
|
+
Dir.mkdir($gen)
|
|
365
|
+
end
|
|
366
|
+
rescue
|
|
367
|
+
print("Cannot mkdir #{$gen}\n")
|
|
368
|
+
exit 1
|
|
369
|
+
end
|
|
370
|
+
end
|
|
371
|
+
else
|
|
372
|
+
$gen = $gen_base
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
dbgPrint("## Unset optimize variables\n")
|
|
376
|
+
@root_namespace.reset_optimize # 最適化をリセットする
|
|
377
|
+
|
|
378
|
+
if Generator.get_n_error == 0
|
|
379
|
+
# エラーが発生していたら、設定しない
|
|
380
|
+
dbgPrint("## Set cell id\n")
|
|
381
|
+
@root_namespace.set_cell_id_and_domain # セルの ID とドメイン情報を設定(linkunit 毎に0からつける)
|
|
382
|
+
|
|
383
|
+
# エラーが発生していたら、最適化は実施しない
|
|
384
|
+
if !$unopt
|
|
385
|
+
dbgPrint("## Optimizing: Link Region=#{@root_namespace.get_name}\n")
|
|
386
|
+
@root_namespace.optimize
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
if $show_tree
|
|
391
|
+
# エラーが発生していても表示(エラー発生時は最適化されていないので注意)
|
|
392
|
+
print "##### show_tree LinkRegion=#{region.get_name} #####\n"
|
|
393
|
+
@root_namespace.show_tree(0)
|
|
394
|
+
print "##### END LinkRegion=#{region.get_name} #####\n\n"
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
# 構文解釈、意味解析でエラー発生していたら、コード生成をしない
|
|
398
|
+
if Generator.get_n_error != 0
|
|
399
|
+
print_report
|
|
400
|
+
exit 1
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
#### コード生成 ####
|
|
404
|
+
begin
|
|
405
|
+
dbgPrint("## Generating: Link Region=#{@root_namespace.get_name}\n")
|
|
406
|
+
@root_namespace.generate
|
|
407
|
+
dbgPrint("## Generating Post: Link Region=#{@root_namespace.get_name}\n")
|
|
408
|
+
@root_namespace.generate_post
|
|
409
|
+
rescue
|
|
410
|
+
# 通常ここへは来ない (generate, generate_post で処置される)
|
|
411
|
+
Generator.error("G9999 fail to generate")
|
|
412
|
+
end
|
|
413
|
+
}
|
|
414
|
+
end # optimize_and_generate
|
|
415
|
+
|
|
416
|
+
def finalize
|
|
417
|
+
dbgPrint("## Generating XML\n")
|
|
418
|
+
# Region.gen_xml @root_namespace
|
|
419
|
+
##
|
|
420
|
+
# Namespace.gen_XML @root_namespace
|
|
421
|
+
|
|
422
|
+
$region_list.each{|region_path_str, val|
|
|
423
|
+
if val == true
|
|
424
|
+
Generator.warning("W9999 $1: not link root, -G ignored", region_path_str)
|
|
425
|
+
end
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
# update する
|
|
429
|
+
# APPFile で生成されたファイルは、もし変化があれば、ここで更新する
|
|
430
|
+
# コード生成段階でエラーが発生すれば、更新しない
|
|
431
|
+
# CFile で生成されたものは、更新されている
|
|
432
|
+
if Generator.get_n_error == 0
|
|
433
|
+
begin
|
|
434
|
+
AppFile.update
|
|
435
|
+
rescue => evar
|
|
436
|
+
Generator.error("G9999 Fail to update. (error occurred while renaming generated files)")
|
|
437
|
+
print_exception(evar)
|
|
438
|
+
end
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
print_report
|
|
442
|
+
if Generator.get_n_error != 0
|
|
443
|
+
STDERR.print "error occurred while generating. some file can be corrupt in #{$gen_base}\n"
|
|
444
|
+
exit 1
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
open("#{$gen_base}/tecsgen.timestamp", "w"){|io| }
|
|
448
|
+
end # finalize
|
|
449
|
+
|
|
450
|
+
def self.post_coded?
|
|
451
|
+
@@b_post_coded
|
|
452
|
+
end
|
|
453
|
+
end # class TECSGEN
|