mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* instruby.rb, rubytest.rb, runruby.rb, bcc32/Makefile.sub, ext/extmk.rb, ext/dl/extconf.rb, ext/iconv/charset_alias.rb, lib/mkmf.rb, lib/rdoc/ri/ri_paths.rb, lib/webrick/httpservlet/cgihandler.rb, test/dbm/test_dbm.rb, test/gdbm/test_gdbm.rb, test/ruby/envutil.rb, test/soap/calc/test_calc_cgi.rb, test/soap/header/test_authheader_cgi.rb, test/soap/ssl/test_ssl.rb, win32/mkexports.rb, win32/resource.rb: Use RbConfig instead of Config. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9970 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			103 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
#! /usr/bin/ruby
 | 
						|
# :stopdoc:
 | 
						|
require 'rbconfig'
 | 
						|
require 'optparse'
 | 
						|
 | 
						|
# http://www.ctan.org/tex-archive/macros/texinfo/texinfo/intl/config.charset
 | 
						|
# Fri, 30 May 2003 00:09:00 GMT'
 | 
						|
 | 
						|
OS = RbConfig::CONFIG["target_os"]
 | 
						|
SHELL = RbConfig::CONFIG['SHELL']
 | 
						|
 | 
						|
class Hash::Ordered < Hash
 | 
						|
  def [](key)
 | 
						|
    val = super and val.last
 | 
						|
  end
 | 
						|
  def []=(key, val)
 | 
						|
    ary = fetch(key) {return super(key, [self.size, key, val])} and
 | 
						|
      ary << val
 | 
						|
  end
 | 
						|
  def sort
 | 
						|
    values.sort.collect {|i, *rest| rest}
 | 
						|
  end
 | 
						|
  def each(&block)
 | 
						|
    sort.each(&block)
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
def charset_alias(config_charset, mapfile, target = OS)
 | 
						|
  map = Hash::Ordered.new
 | 
						|
  comments = []
 | 
						|
  open(config_charset) do |input|
 | 
						|
    input.find {|line| /^case "\$os" in/ =~ line} or break
 | 
						|
    input.find {|line|
 | 
						|
      /^\s*([-\w\*]+(?:\s*\|\s*[-\w\*]+)*)(?=\))/ =~ line and
 | 
						|
      $&.split('|').any? {|pattern| File.fnmatch?(pattern.strip, target)}
 | 
						|
    } or break
 | 
						|
    input.find do |line|
 | 
						|
      case line
 | 
						|
      when /^\s*echo "(?:\$\w+\.)?([-\w*]+)\s+([-\w]+)"/
 | 
						|
        sys, can = $1, $2
 | 
						|
        can.downcase!
 | 
						|
        map[can] = sys
 | 
						|
        false
 | 
						|
      when /^\s*;;/
 | 
						|
        true
 | 
						|
      else
 | 
						|
        false
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
  case target
 | 
						|
  when /linux|-gnu/
 | 
						|
    # map.delete('ascii')
 | 
						|
  when /cygwin|os2-emx/
 | 
						|
    # get rid of tilde/yen problem.
 | 
						|
    map['shift_jis'] = 'cp932'
 | 
						|
  end
 | 
						|
  st = Hash.new(0)
 | 
						|
  map = map.sort.collect do |can, *sys|
 | 
						|
    if sys.grep(/^en_us(?=.|$)/i) {break true} == true
 | 
						|
      noen = %r"^(?!en_us)\w+_\w+#{Regexp.new($')}$"i #"
 | 
						|
      sys.reject! {|s| noen =~ s}
 | 
						|
    end
 | 
						|
    sys = sys.first
 | 
						|
    st[sys] += 1
 | 
						|
    [can, sys]
 | 
						|
  end
 | 
						|
  st.delete_if {|sys, i| i == 1}.empty?
 | 
						|
  st.keys.each {|sys| st[sys] = nil}
 | 
						|
  st.default = nil
 | 
						|
  writer = proc do |f|
 | 
						|
    f.puts("require 'iconv.so'")
 | 
						|
    f.puts
 | 
						|
    f.puts(comments)
 | 
						|
    f.puts("class Iconv")
 | 
						|
    i = 0
 | 
						|
    map.each do |can, sys|
 | 
						|
      if s = st[sys]
 | 
						|
        sys = s
 | 
						|
      elsif st.key?(sys)
 | 
						|
        sys = (st[sys] = "sys#{i+=1}") + " = '#{sys}'.freeze"
 | 
						|
      else
 | 
						|
        sys = "'#{sys}'.freeze"
 | 
						|
      end
 | 
						|
      f.puts("  charset_map['#{can}'] = #{sys}")
 | 
						|
    end
 | 
						|
    f.puts("end")
 | 
						|
  end
 | 
						|
  if mapfile
 | 
						|
    open(mapfile, "w", &writer)
 | 
						|
  else
 | 
						|
    writer[STDOUT]
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
target = OS
 | 
						|
opt = nil
 | 
						|
ARGV.options do |opt|
 | 
						|
  opt.banner << " config.status map.rb"
 | 
						|
  opt.on("--target OS") {|t| target = t}
 | 
						|
  opt.parse! and (1..2) === ARGV.size
 | 
						|
end or abort opt.to_s
 | 
						|
charset_alias(ARGV[0], ARGV[1], target)
 |