diff --git a/lib/mruby/presym.rb b/lib/mruby/presym.rb index 278f7fbb8..8ade2480d 100644 --- a/lib/mruby/presym.rb +++ b/lib/mruby/presym.rb @@ -46,6 +46,18 @@ module MRuby C_STR_LITERAL_RE = /"(?:[^\\\"]|\\.)*"/ + ESCAPE_SEQUENCE_MAP = { + "a" => "\a", + "b" => "\b", + "e" => "\e", + "f" => "\f", + "n" => "\n", + "r" => "\r", + "t" => "\t", + "v" => "\v", + } + ESCAPE_SEQUENCE_MAP.keys.each { |k| ESCAPE_SEQUENCE_MAP[ESCAPE_SEQUENCE_MAP[k]] = k } + def initialize(build) @build = build end @@ -93,7 +105,18 @@ module MRuby f.puts "};" f.puts f.puts "static const char * const presym_name_table[] = {" - presyms.each{|sym| f.puts %| "#{sym.gsub(/[\x01-\x1f\x7f-\xff\"\\]/n) { %(\\x%02x) % _1.ord }}",|} + presyms.each do |sym| + sym = sym.gsub(/([\x01-\x1f\x7f-\xff])|("|\\)/n) { + case + when $1 + e = ESCAPE_SEQUENCE_MAP[$1] + e ? "\\#{e}" : '\\x%02x""' % $1.ord + when $2 + "\\#$2" + end + } + f.puts %| "#{sym}",| + end f.puts "};" end end @@ -122,11 +145,12 @@ module MRuby unless literals.empty? literals = literals.map{|l| l[1..-2]} literals.each do |e| - e.gsub!(/\\x([0-9A-Fa-f]{1,2})|\\0([0-7]{,3})|\\(.)/) do + e.gsub!(/\\x([0-9A-Fa-f]{1,2})|\\(0[0-7]{,3})|\\([abefnrtv])|\\(.)/) do case when $1; $1.hex.chr(Encoding::BINARY) when $2; $2.oct.chr(Encoding::BINARY) - when $3; $3 + when $3; ESCAPE_SEQUENCE_MAP[$3] + when $4; $4 end end end