This commit is contained in:
Nobuyoshi Nakada 2021-07-27 09:11:23 +09:00
Родитель 13f8521c63
Коммит 0754cc4888
2 изменённых файлов: 51 добавлений и 10 удалений

Просмотреть файл

@ -138,6 +138,21 @@ class KeywordError < RuntimeError
end
end
def id2varname(token, prefix = nil)
if /#/ =~ token
token = "_#{token.gsub(/\W+/, '_')}"
else
token = token.sub(/\?/, 'P')
token = prefix + token if prefix
token.sub!(/\A[a-z]/) {$&.upcase}
token.sub!(/\A\$/, "_G_")
token.sub!(/\A@@/, "_C_")
token.sub!(/\A@/, "_I_")
token.gsub!(/\W+/, "")
end
token
end
predefined_ids = {}
preserved_ids = []
local_ids = []
@ -153,16 +168,7 @@ predefined.split(/^/).each_with_index do |line, num|
line.sub!(/\s+#.*/, '')
name, token = line.split
next unless name
token ||= name
if /#/ =~ token
token = "_#{token.gsub(/\W+/, '_')}"
else
token = token.sub(/\?/, 'P').sub(/\A[a-z]/) {$&.upcase}
token.sub!(/\A\$/, "_G_")
token.sub!(/\A@@/, "_C_")
token.sub!(/\A@/, "_I_")
token.gsub!(/\W+/, "")
end
token = id2varname(token || name)
if name == '-'
preserved_ids << token
next

35
tool/intern_ids.rb Executable file
Просмотреть файл

@ -0,0 +1,35 @@
#!/usr/bin/ruby -sp
# $ ruby -i tool/intern_ids.rb -prefix=_ foo.c
BEGIN {
$prefix ||= nil
defs = File.join(File.dirname(__dir__), "defs/id.def")
ids = eval(File.read(defs), binding, defs)
table = {}
ids[:predefined].each {|v, t| table[t] = "id#{v}"}
ids[:token_op].each {|v, t, *| table[t] = "id#{v}"}
predefined = table.keys
}
$_.gsub!(/rb_intern\("([^\"]+)"\)/) do
token = $1
table[token] ||= "id" + id2varname(token, $prefix)
end
END {
predefined.each {|t| table.delete(t)}
unless table.empty?
table = table.sort_by {|t, v| v}
# Append at the last, then edit and move appropriately.
puts
puts "==== defs"
table.each {|t, v| puts "static ID #{v};"}
puts ">>>>"
puts
puts "==== init"
table.each {|t, v|puts "#{v} = rb_intern_const(\"#{t}\");"}
puts ">>>>"
end
}