* transcode_data.h (rb_transcoder_stateful_type_t): defined.
[ruby-svn.git] / enc / make_encdb.rb
blob5a420aed32b48324e15f535a1aad84df4f169aa0
2 # OnigEncodingDefine(foo, Foo) = {
3 #   ..
4 #   "Shift_JIS", /* Canonical Name */
5 #   ..
6 # };
7 # ENC_ALIAS("SJIS", "Shift_JIS")
8 # ENC_REPLICATE("Windows-31J", "Shift_JIS")
9 # ENC_ALIAS("CP932", "Windows-31J")
12 def check_duplication(defs, name, fn, line)
13   if defs[name]
14     raise ArgumentError, "%s:%d: encoding %s is already registered(%s:%d)" %
15       [fn, line, name, *defs[name]]
16   else
17     defs[name.upcase] = [fn,line]
18   end
19 end
21 count = 0
22 lines = []
23 encodings = []
24 defs = {}
25 encdirs = ARGV.dup
26 outhdr = encdirs.shift || 'encdb.h'
27 encdirs << 'enc' if encdirs.empty?
28 files = {}
29 encdirs.each do |encdir|
30   next unless File.directory?(encdir)
31   Dir.open(encdir) {|d| d.grep(/.+\.[ch]\z/)}.sort_by {|e|
32     e.scan(/(\d+)|(\D+)/).map {|n,a| a||[n.size,n.to_i]}.flatten
33   }.each do |fn|
34     next if files[fn]
35     files[fn] = true
36     open(File.join(encdir,fn)) do |f|
37       orig = nil
38       name = nil
39       f.each_line do |line|
40         if (/^OnigEncodingDefine/ =~ line)..(/"(.*?)"/ =~ line)
41           if $1
42             check_duplication(defs, $1, fn, $.)
43             encodings << $1
44             count += 1
45           end
46         else
47           case line
48           when /^\s*rb_enc_register\(\s*"([^"]+)"/
49             count += 1
50             line = nil
51           when /^ENC_REPLICATE\(\s*"([^"]+)"\s*,\s*"([^"]+)"/
52             raise ArgumentError,
53             '%s:%d: ENC_REPLICATE: %s is not defined yet. (replica %s)' %
54               [fn, $., $2, $1] unless defs[$2.upcase]
55             count += 1
56           when /^ENC_ALIAS\(\s*"([^"]+)"\s*,\s*"([^"]+)"/
57             raise ArgumentError,
58             '%s:%d: ENC_ALIAS: %s is not defined yet. (alias %s)' %
59               [fn, $., $2, $1] unless defs[$2.upcase]
60           when /^ENC_DUMMY\(\s*"([^"]+)"/
61             count += 1
62           else
63             next
64           end
65           check_duplication(defs, $1, fn, $.)
66           lines << line.sub(/;.*/m, "").chomp + ";\n" if line
67         end
68       end
69     end
70   end
71 end
73 result = encodings.map {|e| %[ENC_DEFINE("#{e}");\n]}.join + lines.join + 
74   "\n#define ENCODING_COUNT #{count}\n"
75 open(outhdr, 'wb') do |f|
76   f.print result
77 end