summaryrefslogtreecommitdiff
path: root/enc
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-01-17 14:56:22 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-01-17 14:56:22 +0000
commit0052259d5e9934de20411943ce2077909e82d1d3 (patch)
tree9e2431ca530dfcd75581508ee8f21fb9e569154b /enc
parenta0029e3adc2760bf9e617f6cc1e3ecc88c13779c (diff)
* common.mk (encdb.h): give output file name to make_encdb.rb.
* encoding.c (enc_table): simplified. * encoding.c (enc_register_at): lazy loading. [ruby-dev:33013] * regenc.h (ENC_DUMMY): added. * enc/make_encdb.rb: now emits macros only. * enc/iso_2022_jp.h: split from encoding.c. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'enc')
-rw-r--r--enc/iso_2022_jp.h6
-rwxr-xr-xenc/make_encdb.rb83
2 files changed, 49 insertions, 40 deletions
diff --git a/enc/iso_2022_jp.h b/enc/iso_2022_jp.h
new file mode 100644
index 0000000000..8155bdcd54
--- /dev/null
+++ b/enc/iso_2022_jp.h
@@ -0,0 +1,6 @@
+#include "regenc.h"
+/* dummy for unsupported, statefull encoding */
+ENC_DUMMY("ISO-2022-JP");
+ENC_ALIAS("ISO2022-JP", "ISO-2022-JP");
+ENC_REPLICATE("ISO-2022-JP-2", "ISO-2022-JP");
+ENC_ALIAS("ISO2022-JP2", "ISO-2022-JP-2");
diff --git a/enc/make_encdb.rb b/enc/make_encdb.rb
index c140007f67..15d5f3af3c 100755
--- a/enc/make_encdb.rb
+++ b/enc/make_encdb.rb
@@ -15,56 +15,59 @@ def check_duplication(encs, name, fn, line)
end
end
+count = 0
+lines = []
encodings = []
-replicas = {}
-aliases = {}
encdir = ARGV[0]
-Dir.open(encdir) {|d| d.grep(/.+\.c\z/)}.sort.each do |fn|
+outhdr = ARGV[1] || 'encdb.h'
+Dir.open(encdir) {|d| d.grep(/.+\.[ch]\z/)}.sort.each do |fn|
open(File.join(encdir,fn)) do |f|
orig = nil
name = nil
encs = []
f.each_line do |line|
- break if /^OnigEncodingDefine/o =~ line
- end
- f.each_line do |line|
- break if /"(.*?)"/ =~ line
- end
- if $1
- check_duplication(encs, $1, fn, $.)
- encs << $1.upcase
- encodings << $1
- f.each_line do |line|
- if /^ENC_REPLICATE\(\s*"([^"]+)"\s*,\s*"([^"]+)"/o =~ line
- raise ArgumentError,
- '%s:%d: ENC_REPLICATE: %s is not defined yet. (replica %s)' %
- [fn, $., $2, $1] unless encs.include?($2.upcase)
- check_duplication(encs, $1, fn, $.)
- encs << $1.upcase
- encodings << $1
- replicas[$1] = $2
- elsif /^ENC_ALIAS\(\s*"([^"]+)"\s*,\s*"([^"]+)"/o =~ line
- raise ArgumentError,
- '%s:%d: ENC_ALIAS: %s is not defined yet. (alias %s)' %
- [fn, $., $2, $1] unless encs.include?($2.upcase)
- check_duplication(encs, $1, fn, $.)
- encodings << $1
- aliases[$1] = $2
- end
+ if (/^OnigEncodingDefine/ =~ line)..(/"(.*?)"/ =~ line)
+ if $1
+ check_duplication(encs, $1, fn, $.)
+ encs << $1.upcase
+ encodings << $1
+ count += 1
+ end
+ else
+ case line
+ when /^\s*rb_enc_register\(\s*"([^"]+)"/
+ count += 1
+ line = nil
+ when /^ENC_REPLICATE\(\s*"([^"]+)"\s*,\s*"([^"]+)"/
+ raise ArgumentError,
+ '%s:%d: ENC_REPLICATE: %s is not defined yet. (replica %s)' %
+ [fn, $., $2, $1] unless encs.include?($2.upcase)
+ count += 1
+ when /^ENC_ALIAS\(\s*"([^"]+)"\s*,\s*"([^"]+)"/
+ raise ArgumentError,
+ '%s:%d: ENC_ALIAS: %s is not defined yet. (alias %s)' %
+ [fn, $., $2, $1] unless encs.include?($2.upcase)
+ when /^ENC_DUMMY\(\s*"([^"]+)"/
+ count += 1
+ else
+ next
+ end
+ check_duplication(encs, $1, fn, $.)
+ encs << $1.upcase
+ lines << line.sub(/;.*/m, ";\n") if line
end
end
end
end
-open('encdb.h', 'wb') do |f|
- f.puts 'static const char *const enc_name_list[] = {'
- encodings.each {|name| f.puts' "%s",' % name}
- f.puts('};', '', 'static void', 'enc_init_db(void)', '{')
- replicas.each_pair {|name, orig|
- f.puts ' ENC_REPLICATE("%s", "%s");' % [name, orig]
- }
- aliases.each_pair {|name, orig|
- f.puts ' ENC_ALIAS("%s", "%s");' % [name, orig]
- }
- f.puts '}'
+result = encodings.map {|e| %[ENC_DEFINE("#{e}");\n]}.join + lines.join +
+ "\n#define ENCODING_COUNT #{count}\n"
+mode = IO::RDWR|IO::CREAT
+mode |= IO::BINARY if defined?(IO::BINARY)
+open(outhdr, mode) do |f|
+ unless f.read == result
+ f.rewind
+ f.truncate(0)
+ f.print result
+ end
end