[rubygems/rubygems] Use a constant empty tar header to avoid extra allocations
[ruby.git] / tool / enc-emoji-citrus-gen.rb
blob0b37e48d3f54909d76a766dcfed199839bab5916
1 require File.expand_path('../lib/jisx0208', __FILE__)
3 ENCODES = [
4   {
5     :name => "SHIFT_JIS-DOCOMO",
6     :src_zone => [0xF8..0xFC, 0x40..0xFC, 8],
7     :dst_ilseq => 0xFFFE,
8     :map => [
9       [0xE63E..0xE757, JISX0208::Char.from_sjis(0xF89F)],
10     ],
11   },
12   {
13     :name => "ISO-2022-JP-KDDI",
14     :src_zone => [0x21..0x7E, 0x21..0x7E, 8],
15     :dst_ilseq => 0xFFFE,
16     :map => [
17       [0xE468..0xE5B4, JISX0208::Char.new(0x7521)],
18       [0xE5B5..0xE5CC, JISX0208::Char.new(0x7867)],
19       [0xE5CD..0xE5DF, JISX0208::Char.new(0x7921)],
20       [0xEA80..0xEAFA, JISX0208::Char.new(0x7934)],
21       [0xEAFB..0xEB0D, JISX0208::Char.new(0x7854)],
22       [0xEB0E..0xEB8E, JISX0208::Char.new(0x7A51)],
23     ],
24   },
25   {
26     :name => "SHIFT_JIS-KDDI",
27     :src_zone => [0xF3..0xFC, 0x40..0xFC, 8],
28     :dst_ilseq => 0xFFFE,
29     :map => [
30       [0xE468..0xE5B4, JISX0208::Char.from_sjis(0xF640)],
31       [0xE5B5..0xE5CC, JISX0208::Char.from_sjis(0xF7E5)],
32       [0xE5CD..0xE5DF, JISX0208::Char.from_sjis(0xF340)],
33       [0xEA80..0xEAFA, JISX0208::Char.from_sjis(0xF353)],
34       [0xEAFB..0xEB0D, JISX0208::Char.from_sjis(0xF7D2)],
35       [0xEB0E..0xEB8E, JISX0208::Char.from_sjis(0xF3CF)],
36     ],
37   },
38   {
39     :name => "SHIFT_JIS-SOFTBANK",
40     :src_zone => [0xF3..0xFC, 0x40..0xFC, 8],
41     :dst_ilseq => 0xFFFE,
42     :map => [
43       [0xE001..0xE05A, JISX0208::Char.from_sjis(0xF941)],
44       [0xE101..0xE15A, JISX0208::Char.from_sjis(0xF741)],
45       [0xE201..0xE25A, JISX0208::Char.from_sjis(0xF7A1)],
46       [0xE301..0xE34D, JISX0208::Char.from_sjis(0xF9A1)],
47       [0xE401..0xE44C, JISX0208::Char.from_sjis(0xFB41)],
48       [0xE501..0xE53E, JISX0208::Char.from_sjis(0xFBA1)],
49     ],
50   },
53 def zone(*args)
54   bits = args.pop
55   [*args.map{|range| "0x%02X-0x%02X" % [range.begin, range.end] }, bits].join(' / ')
56 end
58 def header(params)
59   (<<END_HEADER_TEMPLATE % [params[:name], zone(*params[:src_zone]), params[:dst_ilseq]])
60 # DO NOT EDIT THIS FILE DIRECTLY
62 TYPE            ROWCOL
63 NAME            %s
64 SRC_ZONE        %s
65 OOB_MODE        ILSEQ
66 DST_ILSEQ       0x%04X
67 DST_UNIT_BITS   16
68 END_HEADER_TEMPLATE
69 end
71 def generate_to_ucs(params, pairs)
72   pairs.sort_by! {|u, c| c }
73   name = "EMOJI_#{params[:name]}%UCS"
74   File.open("#{name}.src", "w") do |io|
75     io.print header(params.merge(name: name.tr('%', '/')))
76     io.puts
77     io.puts  "BEGIN_MAP"
78     io.print pairs.inject("") {|acc, uc| acc += "0x%04X = 0x%04X\n" % uc.reverse }
79     io.puts  "END_MAP"
80   end
81 end
83 def generate_from_ucs(params, pairs)
84   pairs.sort_by! {|u, c| u }
85   name = "UCS%EMOJI_#{params[:name]}"
86   File.open("#{name}.src", "w") do |io|
87     io.print header(params.merge(name: name.tr('%', '/')))
88     io.puts
89     io.puts  "BEGIN_MAP"
90     io.print pairs.inject("") {|acc, uc| acc += "0x%04X = 0x%04X\n" % uc }
91     io.puts  "END_MAP"
92   end
93 end
95 def make_pairs(code_map)
96   code_map.inject([]) {|acc, (range, ch)|
97     acc += range.map{|uni| pair = [uni, Integer(ch)]; ch = ch.succ; next pair }
98   }
99 end
101 ENCODES.each do |params|
102   pairs = make_pairs(params[:map], &params[:conv])
103   generate_to_ucs(params, pairs)
104   generate_from_ucs(params, pairs)
107 # generate KDDI-UNDOC for Shift_JIS-KDDI
108 kddi_sjis_map = ENCODES.select{|enc| enc[:name] == "SHIFT_JIS-KDDI"}.first[:map]
109 pairs = kddi_sjis_map.inject([]) {|acc, (range, ch)|
110   acc += range.map{|uni| pair = [ch.to_sjis - 0x700, Integer(ch)]; ch = ch.succ; next pair }
112 params = {
113   :name => "SHIFT_JIS-KDDI-UNDOC",
114   :src_zone => [0xF3..0xFC, 0x40..0xFC, 8],
115   :dst_ilseq => 0xFFFE,
117 generate_from_ucs(params, pairs)
118 generate_to_ucs(params, pairs)
120 # generate KDDI-UNDOC for ISO-2022-JP-KDDI
121 kddi_2022_map = ENCODES.select{|enc| enc[:name] == "ISO-2022-JP-KDDI"}.first[:map]
122 pairs = kddi_2022_map.each_with_index.inject([]) {|acc, ((range, ch), i)|
123   sjis = kddi_sjis_map[i][1]
124   acc += range.map{|uni| pair = [sjis.to_sjis - 0x700, Integer(ch)]; ch = ch.succ; sjis = sjis.succ; next pair }
126 params = {
127   :name => "ISO-2022-JP-KDDI-UNDOC",
128   :src_zone => [0x21..0x7E, 0x21..0x7E, 8],
129   :dst_ilseq => 0xFFFE,
131 generate_from_ucs(params, pairs)