* io.c (rb_open_file): encoding in mode string was ignored if perm is
[ruby-svn.git] / ext / iconv / mkwrapper.rb
blob34718507d6ac162b5d492227a846e7319bbdf285
1 #! /usr/bin/ruby
2 require 'rbconfig'
3 require 'optparse'
5 # http://www.ctan.org/tex-archive/macros/texinfo/texinfo/intl/config.charset
6 # Fri, 30 May 2003 00:09:00 GMT'
8 HEADER = <<SRC
9 require 'iconv.so'
11 class Iconv
12   case RUBY_PLATFORM
13 SRC
15 def charset_alias(config_charset, mapfile = nil)
16   found = nil
17   src = [HEADER]
18   open(config_charset) do |input|
19     input.find {|line| /^case "\$os" in/ =~ line} or return
20     input.each do |line|
21       case line
22       when /^\s*([-\w\*]+(?:\s*\|\s*[-\w\*]+)*)(?=\))/
23         (s = "  when ") << $&.split('|').collect {|targ|
24           targ.strip!
25           tail = targ.chomp!("*") ? '' : '\z'
26           head = targ.slice!(/\A\*/) ? '' : '\A'
27           targ.gsub!(/\*/, '.*')
28           "/#{head}#{targ}#{tail}/"
29         }.join(", ")
30         src << s
31         found = {}
32       when /^\s*echo "(?:\$\w+\.)?([-\w*]+)\s+([-\w]+)"/
33         sys, can = $1, $2
34         can.downcase!
35         unless found[can] or (/\Aen_(?!US\z)/ =~ sys && /\ACP437\z/i =~ can)
36           found[can] = true
37           src << "    charset_map['#{can}'] = '#{sys}'.freeze"
38         end
39       when /^\s*;;/
40         found = nil
41       end
42     end
43   end
44   src << "  end" << "end"
45   if mapfile
46     open(mapfile, "wb") {|f| f.puts *src}
47   else
48     puts *src
49   end
50 end
52 (1..2) === ARGV.size or abort "usage: #{$0} config_charset [mapfile]"
53 charset_alias(*ARGV)