source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/tecsgen/tecslib/core/tecs_lang.rb@ 352

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

arm向けASP3版ECNLを追加

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