summaryrefslogtreecommitdiff
path: root/ext/iconv/mkwrapper.rb
blob: 34718507d6ac162b5d492227a846e7319bbdf285 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#! /usr/bin/ruby
require 'rbconfig'
require 'optparse'

# http://www.ctan.org/tex-archive/macros/texinfo/texinfo/intl/config.charset
# Fri, 30 May 2003 00:09:00 GMT'

HEADER = <<SRC
require 'iconv.so'

class Iconv
  case RUBY_PLATFORM
SRC

def charset_alias(config_charset, mapfile = nil)
  found = nil
  src = [HEADER]
  open(config_charset) do |input|
    input.find {|line| /^case "\$os" in/ =~ line} or return
    input.each do |line|
      case line
      when /^\s*([-\w\*]+(?:\s*\|\s*[-\w\*]+)*)(?=\))/
        (s = "  when ") << $&.split('|').collect {|targ|
          targ.strip!
          tail = targ.chomp!("*") ? '' : '\z'
          head = targ.slice!(/\A\*/) ? '' : '\A'
          targ.gsub!(/\*/, '.*')
          "/#{head}#{targ}#{tail}/"
        }.join(", ")
        src << s
        found = {}
      when /^\s*echo "(?:\$\w+\.)?([-\w*]+)\s+([-\w]+)"/
        sys, can = $1, $2
        can.downcase!
        unless found[can] or (/\Aen_(?!US\z)/ =~ sys && /\ACP437\z/i =~ can)
          found[can] = true
          src << "    charset_map['#{can}'] = '#{sys}'.freeze"
        end
      when /^\s*;;/
        found = nil
      end
    end
  end
  src << "  end" << "end"
  if mapfile
    open(mapfile, "wb") {|f| f.puts *src}
  else
    puts *src
  end
end

(1..2) === ARGV.size or abort "usage: #{$0} config_charset [mapfile]"
charset_alias(*ARGV)