mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Cheetah
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Cheetah
		
	
	
	
	
	
| <%
 | |
| #
 | |
| # OnigEncodingDefine(foo, Foo) = {
 | |
| #   ..
 | |
| #   "Shift_JIS", /* Canonical Name */
 | |
| #   ..
 | |
| # };
 | |
| # ENC_ALIAS("SJIS", "Shift_JIS")
 | |
| # ENC_REPLICATE("Windows-31J", "Shift_JIS")
 | |
| # ENC_ALIAS("CP932", "Windows-31J")
 | |
| #
 | |
| 
 | |
| def check_duplication(defs, name, fn, line)
 | |
|   if defs[name]
 | |
|     raise ArgumentError, "%s:%d: encoding %s is already registered(%s:%d)" %
 | |
|       [fn, line, name, *defs[name]]
 | |
|   else
 | |
|     defs[name.upcase] = [fn,line]
 | |
|   end
 | |
| end
 | |
| 
 | |
| lines = []
 | |
| BUILTIN_ENCODINGS = {
 | |
|   'ASCII-8BIT' => 0,
 | |
|   'UTF-8' => 1,
 | |
|   'US-ASCII' => 2,
 | |
| }
 | |
| encodings = %w[ASCII-8BIT UTF-8 US-ASCII] # BUILTIN_ENCODINGS.keys is not available on cross compiling and used ruby 1.8
 | |
| count = encodings.size
 | |
| defs = {}
 | |
| encdirs = ARGV.dup
 | |
| encdirs << 'enc' if encdirs.empty?
 | |
| files = {}
 | |
| encdirs.each do |encdir|
 | |
|   next unless File.directory?(encdir)
 | |
|   Dir.open(encdir) {|d| d.grep(/.+\.[ch]\z/)}.sort_by {|e|
 | |
|     e.scan(/(\d+)|(\D+)/).map {|n,a| a||[n.size,n.to_i]}.flatten
 | |
|   }.each do |fn|
 | |
|     next if files[fn]
 | |
|     files[fn] = true
 | |
|     open(File.join(encdir,fn)) do |f|
 | |
|       name = nil
 | |
|       skip_ifndef_ruby = false
 | |
|       encoding_def = false
 | |
|       f.each_line do |line|
 | |
|         case line
 | |
|         when /^#ifndef RUBY/
 | |
|           skip_ifndef_ruby = true
 | |
|         when /^#endif/
 | |
|           skip_ifndef_ruby = false
 | |
|         end
 | |
|         next if skip_ifndef_ruby
 | |
|         encoding_def = true if /^OnigEncodingDefine/ =~ line
 | |
|         if encoding_def && /"(.*?)"/ =~ line
 | |
|           encoding_def = false
 | |
|           if name
 | |
|             lines << %[ENC_SET_BASE("#$1", "#{name}");]
 | |
|           else
 | |
|             name = $1
 | |
|           end
 | |
|           check_duplication(defs, $1, fn, f.lineno)
 | |
|           next if BUILTIN_ENCODINGS[name]
 | |
|           encodings << $1
 | |
|           count += 1
 | |
|         else
 | |
|           case line
 | |
|           when /^\s*rb_enc_register\(\s*"([^"]+)"/
 | |
|             count += 1
 | |
|             line = nil
 | |
|             encodings << $1
 | |
|           when /^ENC_REPLICATE\(\s*"([^"]+)"\s*,\s*"([^"]+)"/
 | |
|             raise ArgumentError,
 | |
|             '%s:%d: ENC_REPLICATE: %s is not defined yet. (replica %s)' %
 | |
|               [fn, f.lineno, $2, $1] unless defs[$2.upcase]
 | |
|             count += 1
 | |
|           when /^ENC_ALIAS\(\s*"([^"]+)"\s*,\s*"([^"]+)"/
 | |
|             raise ArgumentError,
 | |
|             '%s:%d: ENC_ALIAS: %s is not defined yet. (alias %s)' %
 | |
|               [fn, f.lineno, $2, $1] unless defs[$2.upcase]
 | |
|           when /^ENC_DUMMY\w*\(\s*"([^"]+)"/
 | |
|             count += 1
 | |
|           else
 | |
|             next
 | |
|           end
 | |
|           check_duplication(defs, $1, fn, f.lineno)
 | |
|           lines << line.sub(/;.*/m, "").chomp + ";" if line
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | |
| encodings.each_with_index do |e, i|
 | |
| %>ENC_DEFINE("<%=e%>");
 | |
| % end
 | |
| % encidx = encodings.size - 1
 | |
| % lines.each do |line|
 | |
| <%=line%>
 | |
| % end
 | |
| 
 | |
| #define ENCODING_COUNT <%=count%>
 | 
