1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

tool/prelude.c.tmpl: use RubyVM::CEscape

Do not repeat yourself.
This commit is contained in:
卜部昌平 2020-08-11 11:40:37 +09:00
parent b0eb5aa344
commit acd8ee8dbc
Notes: git 2020-08-11 16:51:33 +09:00
2 changed files with 8 additions and 20 deletions

View file

@ -5,24 +5,12 @@
# Since $(BASERUBY) may be older than Ruby 1.9,
# Ruby 1.9 feature should not be used.
require_relative '../tool/ruby_vm/helpers/c_escape'
class Prelude
include RubyVM::CEscape
LINE_LIMIT = 509 # by C89
C_ESC = {
"/*" => "/\\*",
"*/" => "*\\/",
"\\" => "\\\\",
'"' => '\"',
"\n" => '\n',
}
0x00.upto(0x1f) {|ch| C_ESC[[ch].pack("C")] ||= "\\%03o" % ch }
0x7f.upto(0xff) {|ch| C_ESC[[ch].pack("C")] = "\\%03o" % ch }
C_ESC_PAT = Regexp.union(*C_ESC.keys)
def c_esc(str)
str.gsub(C_ESC_PAT) { C_ESC[$&] }
end
def prelude_base(filename)
filename.chomp(".rb")
end
@ -97,7 +85,7 @@ Prelude.new(output, ARGV, vpath).instance_eval do
% preludes.each {|i, prelude, lines, sub|
% name = prelude_name(*prelude)
static const char prelude_name<%=i%><%=%>[] = "<%=c_esc(name)%>";
static const char prelude_name<%=i%><%=%>[] = <%=rstring2cstr(name)%>;
static const struct {
% size = beg = 0
% lines.each_with_index {|(line, comment), n|
@ -114,15 +102,15 @@ static const struct {
% end
} prelude_code<%=i%><%=%> = {
% size = 0
#line 1 "<%=c_esc(prelude)%>"
#line 1 <%=rstring2cstr(prelude)%>
% lines.each_with_index {|(line, comment), n|
% if size + line.size >= Prelude::LINE_LIMIT
% size = 0
,
#line <%=n+1%> "<%=c_esc(prelude)%>"
#line <%=n+1%> <%=rstring2cstr(prelude)%>
% end
% size += line.size
"<%=c_esc(line)%>"<%if comment%>/* <%=c_esc(comment)%> */<%end%>
<%=rstring2cstr(line)%><%if comment%><%=commentify(comment)%><%end%>
% }
#line <%=_erbout.count("\n")+2%> "<%=@output%>"
};

View file

@ -17,7 +17,7 @@ module RubyVM::CEscape
# generate comment, with escaps.
def commentify str
return "/* #{str.strip.b.gsub '*/', '*\\/'} */"
return "/* #{str.b.gsub '*/', '*\\/'} */"
end
# Mimic gensym of CL.