source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/tecs_lang.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: 12.1 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2014 by TOPPERS Project
7#--
8# 上記著作権者
9は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11# 変・再é…
12å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
13# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15# スコード中に含まれていること.
16# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17# 用できる形で再é…
18å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
19å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
20# 者
21マニュアルなど)に,上記の著作権表示,この利用条件および下記
22# の無保証規定を掲載すること.
23# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24# 用できない形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
26# と.
27# (a) 再é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
29マニュアルなど)に,上記の著
30# 作権表示,この利用条件および下記の無保証規定を掲載すること.
31# (b) 再é…
32å¸ƒã®å½¢æ…
33‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
34# 報告すること.
35# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
36# 害からも,上記著作権者
37およびTOPPERSプロジェクトをå…
38è²¬ã™ã‚‹ã“と.
39# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40# 由に基づく請求からも,上記著作権者
41およびTOPPERSプロジェクトを
42# å…
43è²¬ã™ã‚‹ã“と.
44#
45# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
48# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
49# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
50# の責任を負わない.
51#
52# $Id$
53#++
54
55#== 言語に関する変数を設定
56# メッセージファイルの読み込みも行う (読み込みに失敗した場合、デフォルトの文字コードに変更する)
57class TECS_LANG
58 # ハッシュのタグは case insensitive のため、大文字の文字列とする
59 CHARSET_ALIAS = {
60 "UJIS" => :eucJP,
61 "UTF-8" => :utf8,
62 "EUCJP" => :eucJP, # 以下 case insensitive にするため
63 "SJIS" => :sjis,
64 "UTF8" => :utf8,
65 "ISO8859-1" => :"iso8859-1"
66 }
67 LANG_ALIAS = {
68 "C" => :en_US,
69 "EN_US" => :en_US, # 以下 case insensitive にするため
70 "JA_JP" => :ja_JP
71 }
72 SUITABLE_CHARSET = {
73 :ja_JP => [ :eucJP, :sjis, :utf8 ],
74 :en_US => [ :"iso8859-1", :utf8, nil ]
75 }
76
77 #=== LANG のパース
78 #lang::String "ja_JP.eucJP@cjknarrow", "C" など
79 #RETURN:: [ :ja_JP, :eucJP, :cjknarrow ]
80 def self.parse_lang( lang )
81 lang =~ /([^\.@]*)(\.([^@]*))?(@(.*))?/
82
83 lang_terri = $1.to_sym if $1 != nil && $1 != ""
84 # set_kcode_binary により、C.UTF-8 のみを特別扱いする必
85要がなくなった
86 # if lang_terri == :C then # LANG=C.* は、すべて 1 byte 文字コードとして扱う
87 # codeset = nil
88 # modifier = nil
89 # else
90 codeset = $3.to_sym if $3 != nil && $3 != ""
91 modifier = $5.to_sym if $5 != nil && $5 != ""
92 # end
93 [ lang_terri, codeset, modifier ]
94 end
95
96 #=== lang, charset の別明解決および妥当性のチェック
97 #lang::Symbol : :en_US, :ja_JP など
98 #charset::Symbol : :eucJP, :utf8 など
99 #RETURN:
100 # [ lang, charset, result ]::  result = false の場合 lang, charset は不適切
101 def self.resolve_alias_and_check( lang, charset )
102 if LANG_ALIAS[ lang.to_s.upcase ] then
103 ln = LANG_ALIAS[ lang.to_s.upcase ]
104 else
105 ln = lang
106 end
107
108 if CHARSET_ALIAS[ charset.to_s.upcase ] then
109 cs = CHARSET_ALIAS[ charset.to_s.upcase ]
110 else
111 cs = charset
112 end
113
114 if SUITABLE_CHARSET[ ln ] == nil || SUITABLE_CHARSET[ ln ].index( cs ) == nil
115 res = false
116 else
117 res = true
118 end
119
120 # p ln, cs, res
121 [ ln, cs, res ]
122 end
123
124 #=== codepage を取り出す
125 #codepage は3~5桁の整数として仮定
126 def self.get_win_codepage
127 cmd_pipe = IO.popen('cmd /c chcp','r')
128 cmd_pipe.read =~ /([0-9]{3,5})/
129 cp = $1
130 cmd_pipe.close
131 return cp
132 end
133
134 #=== codepage から LANG の設定文字列に変換
135 def self.codepage_to_lang cp
136 if cp == "932" then
137 "ja_JP.sjis"
138 else
139 "en_US"
140 end
141 end
142
143 #=== 言語、文字コードに関する変数を設定
144 # 以下の順にチェックされ、一番最後に設定された値が採用される
145 # ・デフォルト
146 # ・codepage (exerb 版で TERM 未設定または TERM=cygwin の場合のみ)
147 # ・LANG 環境変数
148 # ・TECSGEN_LANG 環境変数
149 # ・TECSGEN_FILE_LANG 環境変数 (ファイルの文字コードのみ)
150 # ・-k オプション (ファイルの文字コードのみ)
151 def self.set_lang_var
152
153 if $IN_EXERB && ( ENV[ 'TERM' ] == nil || ENV[ 'TERM' ] == "cygwin" ) then
154 # exerb 版で端末 cygwin の時は codepage のみを見る
155 cp = get_win_codepage
156 lang = codepage_to_lang cp
157 $LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang( lang )
158 $LANG_CONSOLE = $LANG_FILE
159 $CHARSET_CONSOLE = $CHARSET_FILE
160
161 elsif ENV[ 'LANG' ]then
162 # 非 exerb 版では LANG 環境変数を見る
163 # cygwin console では codepage に従って出力した方が平和なため
164
165 $LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang( ENV[ 'LANG' ] )
166 $LANG_CONSOLE = $LANG_FILE
167 $CHARSET_CONSOLE = $CHARSET_FILE
168 end
169
170 if ENV[ 'TECSGEN_LANG' ]then
171 $LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang( ENV[ 'TECSGEN_LANG' ] )
172 $LANG_CONSOLE = $LANG_FILE
173 $CHARSET_CONSOLE = $CHARSET_FILE
174 end
175
176 if ENV[ 'TECSGEN_FILE_LANG' ]then
177 $LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang( ENV[ 'TECSGEN_FILE_LANG' ] )
178 end
179
180 self.set_lang_by_option
181 end
182
183 #=== -k オプションからファイル用の言語、文字コード変数を設定
184 def self.set_lang_by_option
185 if $kcode == nil
186 return
187 end
188
189 code = $kcode
190 found = false
191 res = $CODE_TYPE_ARRAY.index( code )
192 if res == nil then
193 print "-k: illegal kcode type #{code}. (#{$CODE_TYPE_ARRAY.join(", ")})\n"
194 exit 1
195 end
196
197 case $kcode
198 when "euc"
199 $CHARSET_FILE = :eucJP
200 $LANG_FILE = :ja_JP
201 when "sjis"
202 $CHARSET_FILE = :sjis
203 $LANG_FILE = :ja_JP
204 when "utf8"
205 $CHARSET_FILE = :utf8
206 $LANG_FILE = :ja_JP
207 when "none"
208 $CHARSET_FILE = nil
209 $LANG_FILE = "en_US"
210 end
211 end
212
213 #=== Kconv クラス用の変数を設定
214 # 言語情
215報から Kconv に関する変数を設定
216 def self.set_kconv_var
217
218 # 文字コードの設定
219 case $CHARSET_FILE # string: "EUC" | "SJIS" | "NONE" | "UTF8"
220 when :eucJP
221 $KCODE_CDL = "EUC"
222 $KCONV_CDL = Kconv::EUC
223 $Ruby19_File_Encode = "ASCII-8BIT"
224 when :sjis
225 $KCODE_CDL = "SJIS"
226 $KCONV_CDL = Kconv::SJIS
227 $Ruby19_File_Encode = "Shift_JIS"
228 when :utf8
229 $KCODE_CDL = "UTF8"
230 $KCONV_CDL = Kconv::UTF8
231 $Ruby19_File_Encode = "ASCII-8BIT"
232 else
233 $KCODE_CDL = "BINARY"
234 $KCONV_CDL = Kconv::BINARY
235 $Ruby19_File_Encode = "ASCII-8BIT"
236 end
237
238 case $CHARSET_CONSOLE
239 when :eucJP
240 $KCODE_CONSOLE = "EUC"
241 $KCONV_CONSOLE = Kconv::EUC
242 when :sjis
243 $KCODE_CONSOLE = "SJIS"
244 $KCONV_CONSOLE = Kconv::SJIS
245 when :utf8
246 $KCODE_CONSOLE = "UTF8"
247 $KCONV_CONSOLE = Kconv::UTF8
248 else
249 $KCODE_CONSOLE = "BINARY"
250 $KCONV_CONSOLE = Kconv::BINARY
251 end
252
253 $KCODE_TECSGEN = "UTF8" # string: "EUC" このファイルの文字コード(オプションではなく定数)
254 $KCONV_TECSGEN = Kconv::UTF8 # const:
255 set_kcode $KCODE_TECSGEN # このファイルの文字コードを設定
256 end
257
258 #=== 一時的に KCODE を BINARY に変更する
259 # EUC を UTF8 で読み込んだ場合に文字区切りを誤る問題の対応
260 # コメントの読み飛ばしを誤る点が問題
261 # ただし、SJIS の場合は、エスケープ文字の問題があるため、変更しない
262 def self.set_kcode_binary
263
264 #2.0
265 if $b_no_kcode then
266 return
267 end
268
269 $KCODE_BACK = $KCODE
270 if $KCODE != "SJIS" then
271 set_kcode "BINARY"
272 end
273 end
274
275 #=== 一時的なあ KCODE の変更をå…
276ƒã«æˆ»ã™
277 def self.reset_kcode
278 set_kcode $KCODE_BACK
279 end
280
281 #####
282 # $LANG_FILE 言語 (C は en_US に変換される)
283 # $LANG_CONSOLE 言語 (C は en_US に変換される)
284 # $CHARSET_FILE ファイルの文字コード
285 # $CHARSET_CONSOLE コンソール文字コード
286
287 # デフォルトの設定(正規化済みのこと)
288 $LANG_FILE_DEFAULT = :en_US
289 $CHARSET_FILE_DEFAULT = nil
290 $LANG_CONSOLE_DEFAULT = :en_US
291 $CHARSET_CONSOLE_DEFAULT = nil
292
293 $LANG_FILE = $LANG_FILE_DEFAULT
294 $CHARSET_FILE = $CHARSET_FILE_DEFAULT
295 $LANG_CONSOLE = $LANG_CONSOLE_DEFAULT
296 $CHARSET_CONSOLE = $CHARSET_CONSOLE_DEFAULT
297
298 # -k で指定可能なコード
299 $CODE_TYPE_ARRAY = [ "euc", "sjis", "none", "utf8" ]
300
301 # 言語を決定する
302 self.set_lang_var
303
304 # 言語、コードのチェックと正規化
305 lang_file, charset_file, res =
306 self.resolve_alias_and_check( $LANG_FILE, $CHARSET_FILE )
307 if res == false then
308 # lang_file, charset_file = lang_file_default, charset_file_default
309 lang_file, charset_file = $LANG_FILE_DEFAULT, $CHARSET_FILE_DEFAULT
310 end
311 lang_console, charset_console, res =
312 self.resolve_alias_and_check( $LANG_CONSOLE, $CHARSET_CONSOLE )
313 if res == false then
314 # lang_console, charset_console = lang_console_default, charset_console_default
315 lang_console, charset_console = $LANG_CONSOLE_DEFAULT, $CHARSET_CONSOLE_DEFAULT
316 end
317
318 # メッセージモジュールをロード
319 if require_tecsgen_lib( "tecslib/messages/messages_console_#{lang_console}.rb", false ) == false then
320 require_tecsgen_lib( "tecslib/messages/messages_console_#{$LANG_CONSOLE_DEFAULT}.rb" )
321 $LANG_CONSOLE, $CHARSET_CONSOLE = $LANG_CONSOLE_DEFAULT, $CHARSET_CONSOLE_DEFAULT
322 else
323 $LANG_CONSOLE, $CHARSET_CONSOLE = lang_console, charset_console
324 end
325 if require_tecsgen_lib( "tecslib/messages/messages_file_#{lang_file}.rb", false ) == false then
326 require_tecsgen_lib( "tecslib/messages/messages_file_#{$LANG_FILE_DEFAULT}.rb" )
327 $LANG_FILE, $CHARSET_FILE = $LANG_FILE_DEFAULT, $CHARSET_FILE_DEFAULT
328 else
329 $LANG_FILE, $CHARSET_FILE = lang_file, charset_file
330 end
331
332 # Kconv クラスのための変数を設定
333 self.set_kconv_var
334
335 dbgPrint "LANG_FILE=#{$LANG_FILE}.#{$CHARSET_FILE}, LANG_CONSOLE=#{$LANG_CONSOLE}.#{$CHARSET_CONSOLE}\n"
336 dbgPrint "KCODE_CDL=#{$KCODE_CDL}(#{$KCONV_CDL}) KCODE_CONSOLE=#{$KCODE_CONSOLE}(#{$KCONV_CONSOLE})\n"
337 dbgPrint "Ruby19_File_Encode=#{$Ruby19_File_Encode}\n"
338
339 #=== 単体テスト実行
340 if $unit_test then
341 print "unit test: set_lang_var\n"
342 require "kconv"
343 self.set_lang_var
344 print "#{$LANG_FILE} #{$LANG_CONSOLE}\n"
345 print "#{$CHARSET_FILE} #{$CHARSET_CONSOLE}\n"
346
347 $LANG_FILE, $CHARSET_FILE, res = self.resolve_alias_and_check( $LANG_FILE, $CHARSET_FILE )
348 print "#{$LANG_FILE} #{$CHARSET_FILE}, #{res}\n"
349 end
350end
351
352#= Console クラス
353# 文字コードを変換する
354class Console
355 def self.print str
356 if $b_no_kcode && $KCONV_CONSOLE == Kconv::BINARY then
357 STDOUT.print str
358 else
359 STDOUT.print str.kconv( $KCONV_CONSOLE, $KCONV_TECSGEN )
360 end
361 end
362 def self.puts str
363 if $b_no_kcode && $KCONV_CONSOLE == Kconv::BINARY then
364 STDOUT.puts str
365 else
366 STDOUT.puts str.kconv( $KCONV_CONSOLE, $KCONV_TECSGEN )
367 end
368 end
369end
Note: See TracBrowser for help on using the repository browser.