|
9 | 9 |
|
10 | 10 | def generate_data
|
11 | 11 | generate_encoding_list
|
| 12 | + generate_transcoder_list |
12 | 13 | generate_transoder_data
|
13 | 14 | generate_coderange_data
|
14 | 15 | generate_coderange_list
|
@@ -79,6 +80,34 @@ def generate_encoding_list
|
79 | 80 |
|
80 | 81 | end
|
81 | 82 |
|
| 83 | +def generate_transcoder_list |
| 84 | + generic_list = [] |
| 85 | + transcoder_list = [] |
| 86 | + |
| 87 | + Dir["#{REPO_PATH}/enc/trans/*.c"].reject{|f| f =~ /transdb/}.each do |trans_file| |
| 88 | + name = trans_file[/(\w+)\.c/, 1].split('_').map{|e| e.capitalize}.join("") |
| 89 | + trans_src = open(trans_file){|f|f.read} |
| 90 | + |
| 91 | + trans_src.scan(/static\s+const\s+rb_transcoder.*?(\w+)\s+=\s+\{(.+?)\};/m) do |t_name, body| |
| 92 | + n = t_name.split('_') |
| 93 | + t_name = n[1].capitalize |
| 94 | + t_name += '_' + n[2..-1].join('_') unless n[2..-1].empty? |
| 95 | + body = body.gsub(/(\/\*.*?\*\/)/, "").split(',').map{|e|e.strip} |
| 96 | + src, dst, tree_start, table_info, iul, max_in, max_out, conv, state_size, state_init, state_fini, *funcs = body |
| 97 | + tree_start = trans_src[/#define\s+#{tree_start}\s+WORDINDEX2INFO\((\d+)\)/, 1].to_i << 2 |
| 98 | + state_size = "0" if state_size == "sizeof(struct from_utf8_mac_status)" |
| 99 | + |
| 100 | + generic_list << [src, dst, tree_start, "\"#{name}\"", iul, max_in, max_out, "AsciiCompatibility.#{conv.split('_').last.upcase}", state_size] |
| 101 | + transcoder_list << [src, dst, t_name, !funcs.all?{|f|f == "NULL"}] |
| 102 | + end |
| 103 | + |
| 104 | + end |
| 105 | + open("#{SRC_DIR}/transcode/TranscoderList.java", "wb") << open("TranscoderListTemplate.java", "rb"){|f|f.read}. |
| 106 | + sub(/%\{list\}/, transcoder_list.map{|src, dst, cls, specific| "#{INDENT*2}TranscoderDB.declare(#{src}, #{dst}, #{specific ? '"' + cls + '"' : 'null /*' + cls + '*/'});"}.join("\n")). |
| 107 | + sub(/%\{generic\}/, generic_list.map{|g| "#{INDENT*2}new GenericTranscoderEntry(#{g.join(', ')})"}.join(",\n")) |
| 108 | + |
| 109 | +end |
| 110 | + |
82 | 111 | def generate_transoder_data
|
83 | 112 | Dir["#{REPO_PATH}/enc/trans/*.c"].reject{|f| f =~ /transdb/}.each do |trans_file|
|
84 | 113 | # next unless trans_file =~ /utf8/
|
|
0 commit comments