summaryrefslogtreecommitdiff
path: root/tool/compile_prelude.rb
diff options
context:
space:
mode:
Diffstat (limited to 'tool/compile_prelude.rb')
-rw-r--r--tool/compile_prelude.rb64
1 files changed, 55 insertions, 9 deletions
diff --git a/tool/compile_prelude.rb b/tool/compile_prelude.rb
index 1012d1fbc2..1f67d4c396 100644
--- a/tool/compile_prelude.rb
+++ b/tool/compile_prelude.rb
@@ -1,33 +1,79 @@
+*preludes, outfile = *ARGV
-prelude, outfile = *ARGV
+C_ESC = {
+ "\\" => "\\\\",
+ '"' => '\"',
+ "\n" => '\n',
+}
+
+0x00.upto(0x1f) {|ch| C_ESC[[ch].pack("C")] ||= "\\x%02x" % ch }
+0x7f.upto(0xff) {|ch| C_ESC[[ch].pack("C")] = "\\x%02x" % ch }
+C_ESC_PAT = Regexp.union(*C_ESC.keys)
+
+def c_esc(str)
+ '"' + str.gsub(C_ESC_PAT) { C_ESC[$&] } + '"'
+end
-lines = File.readlines(prelude).map{|line|
- line.dump
+lines_list = preludes.map {|prelude|
+ lines = []
+ File.readlines(prelude).each {|line|
+ line.gsub!(/RbConfig::CONFIG\["(\w+)"\]/) {
+ require 'rbconfig'
+ if RbConfig::CONFIG.has_key? $1
+ c_esc(RbConfig::CONFIG[$1])
+ else
+ $&
+ end
+ }
+ lines << c_esc(line)
+ }
+ lines
}
open(outfile, 'w'){|f|
- f.puts <<EOS__, <<'EOS__'
+ f.puts <<'EOS__'
#include "ruby/ruby.h"
#include "vm_core.h"
-static const char prelude_name[] = "#{File.basename(prelude)}";
-static const char prelude_code[] =
+EOS__
+
+ preludes.zip(lines_list).each_with_index {|(prelude, lines), i|
+ f.puts <<EOS__
+static const char prelude_name#{i}[] = "#{File.basename(prelude)}";
+static const char prelude_code#{i}[] =
#{lines.join("\n")}
;
EOS__
+ }
+ f.puts <<'EOS__'
void
Init_prelude(void)
{
+EOS__
+ preludes.length.times {|i|
+ f.puts <<EOS__
rb_iseq_eval(rb_iseq_compile(
- rb_str_new(prelude_code, sizeof(prelude_code) - 1),
- rb_str_new(prelude_name, sizeof(prelude_name) - 1),
+ rb_str_new(prelude_code#{i}, sizeof(prelude_code#{i}) - 1),
+ rb_str_new(prelude_name#{i}, sizeof(prelude_name#{i}) - 1),
INT2FIX(1)));
+EOS__
+ }
+ f.puts <<EOS__
#if 0
- printf("%s\n", prelude_code);
+EOS__
+ preludes.length.times {|i|
+ f.puts <<EOS__
+ puts(prelude_code#{i});
+EOS__
+ }
+ f.puts <<EOS__
#endif
+EOS__
+
+ f.puts <<'EOS__'
}
EOS__
}