summaryrefslogtreecommitdiff
path: root/tool
diff options
context:
space:
mode:
Diffstat (limited to 'tool')
-rw-r--r--tool/generic_erb.rb18
-rwxr-xr-xtool/id2token.rb23
-rwxr-xr-xtool/instruction.rb70
-rw-r--r--tool/vpath.rb79
4 files changed, 100 insertions, 90 deletions
diff --git a/tool/generic_erb.rb b/tool/generic_erb.rb
index b2b988fb3a..344fad46f7 100644
--- a/tool/generic_erb.rb
+++ b/tool/generic_erb.rb
@@ -1,19 +1,11 @@
+# -*- coding: us-ascii -*-
require 'erb'
require 'optparse'
require 'fileutils'
+$:.unshift(File.dirname(__FILE__))
+require 'vpath'
-vpath = ["."]
-def vpath.open(file, *rest)
- find do |dir|
- begin
- path = File.join(dir, file)
- return File.open(path, *rest) {|f| yield(f)}
- rescue Errno::ENOENT
- nil
- end
- end or raise(Errno::ENOENT, file)
-end
-
+vpath = VPath.new
timestamp = nil
output = nil
ifchange = nil
@@ -22,7 +14,7 @@ opt = OptionParser.new do |o|
o.on('-t', '--timestamp[=PATH]') {|v| timestamp = v || true}
o.on('-o', '--output=PATH') {|v| output = v}
o.on('-c', '--[no-]if-change') {|v| ifchange = v}
- o.on('-v', '--vpath=DIR') {|dirs| vpath.concat dirs.split(File::PATH_SEPARATOR)}
+ vpath.def_options(o)
o.order!(ARGV)
end
template = ARGV.shift or abort opt.to_s
diff --git a/tool/id2token.rb b/tool/id2token.rb
index 4c7189c094..191b872c5f 100755
--- a/tool/id2token.rb
+++ b/tool/id2token.rb
@@ -1,27 +1,22 @@
#! /usr/bin/ruby -p
+# -*- coding: us-ascii -*-
BEGIN {
require 'optparse'
- vpath = ["."]
+ $:.unshift(File.dirname(__FILE__))
+ require 'vpath'
+ vpath = VPath.new
header = nil
opt = OptionParser.new do |o|
- o.on('-v', '--vpath=DIR') {|dirs| vpath.concat dirs.split(File::PATH_SEPARATOR)}
+ vpath.def_options(o)
header = o.order!(ARGV).shift
end or abort opt.opt_s
TOKENS = {}
- vpath.find do |dir|
- begin
- h = File.read(File.join(dir, header))
- rescue Errno::ENOENT
- nil
- else
- h.scan(/^#define\s+RUBY_TOKEN_(\w+)\s+(\d+)/) do |token, id|
- TOKENS[token] = id
- end
- true
- end
- end or abort "#{header} not found in #{vpath.inspect}"
+ h = vpath.read(header) rescue abort("#{header} not found in #{vpath.inspect}")
+ h.scan(/^#define\s+RUBY_TOKEN_(\w+)\s+(\d+)/) do |token, id|
+ TOKENS[token] = id
+ end
TOKENS_RE = /\bRUBY_TOKEN\((#{TOKENS.keys.join('|')})\)\s*(?=\s)/
}
diff --git a/tool/instruction.rb b/tool/instruction.rb
index fb07d778bc..4e7a83560a 100755
--- a/tool/instruction.rb
+++ b/tool/instruction.rb
@@ -1,8 +1,11 @@
#!./miniruby
+# -*- coding: us-ascii -*-
#
#
require 'erb'
+$:.unshift(File.dirname(__FILE__))
+require 'vpath'
class RubyVM
class Instruction
@@ -1256,66 +1259,6 @@ class RubyVM
end
end
- module VPATH
- def search(meth, base, *rest)
- begin
- meth.call(base, *rest)
- rescue Errno::ENOENT => error
- each do |dir|
- return meth.call(File.join(dir, base), *rest) rescue nil
- end
- raise error
- end
- end
-
- def process(*args, &block)
- search(File.method(__callee__), *args, &block)
- end
-
- alias stat process
- alias lstat process
-
- def open(*args)
- f = search(File.method(:open), *args)
- if block_given?
- begin
- yield f
- ensure
- f.close unless f.closed?
- end
- else
- f
- end
- end
-
- def read(*args)
- open(*args) {|f| f.read}
- end
-
- def foreach(file, *args, &block)
- open(file) {|f| f.each(*args, &block)}
- end
-
- def self.def_options(opt)
- vpath = []
- path_sep = ':'
-
- opt.on("-I", "--srcdir=DIR", "add a directory to search path") {|dir|
- vpath |= [dir]
- }
- opt.on("-L", "--vpath=PATH LIST", "add directories to search path") {|dirs|
- vpath |= dirs.split(path_sep)
- }
- opt.on("--path-separator=SEP", /\A\W\z/, "separator for vpath") {|sep|
- path_sep = sep
- }
-
- proc {
- vpath.extend(self) unless vpath.empty?
- }
- end
- end
-
class SourceCodeGenerator
Files = { # codes
'vm.inc' => VmBodyGenerator,
@@ -1382,16 +1325,17 @@ class RubyVM
opts[:verbose] = v
}
- vpath = VPATH.def_options(opt)
+ vpath = VPath.new
+ vpath.def_options(opt)
proc {
- opts[:VPATH] = vpath.call
+ opts[:VPATH] = vpath
build opts
}
end
def self.build opts, vpath = ['./']
- opts[:VPATH] = vpath.extend(VPATH) unless opts[:VPATH]
+ opts[:VPATH] ||= VPath.new(*vpath)
self.new InstructionsLoader.new(opts)
end
end
diff --git a/tool/vpath.rb b/tool/vpath.rb
new file mode 100644
index 0000000000..5241d2d544
--- /dev/null
+++ b/tool/vpath.rb
@@ -0,0 +1,79 @@
+# -*- coding: us-ascii -*-
+
+class VPath
+ attr_accessor :separator
+
+ def initialize(*list)
+ @list = list
+ @additional = []
+ @separator = File::PATH_SEPARATOR
+ end
+
+ def inspect
+ list.inspect
+ end
+
+ def search(meth, base, *rest)
+ begin
+ meth.call(base, *rest)
+ rescue Errno::ENOENT => error
+ list.each do |dir|
+ return meth.call(File.join(dir, base), *rest) rescue nil
+ end
+ raise error
+ end
+ end
+
+ def process(*args, &block)
+ search(File.method(__callee__), *args, &block)
+ end
+
+ alias stat process
+ alias lstat process
+
+ def open(*args)
+ f = search(File.method(:open), *args)
+ if block_given?
+ begin
+ yield f
+ ensure
+ f.close unless f.closed?
+ end
+ else
+ f
+ end
+ end
+
+ def read(*args)
+ open(*args) {|f| f.read}
+ end
+
+ def foreach(file, *args, &block)
+ open(file) {|f| f.each(*args, &block)}
+ end
+
+ def def_options(opt)
+ opt.on("-I", "--srcdir=DIR", "add a directory to search path") {|dir|
+ @additional << dir
+ }
+ opt.on("-L", "--vpath=PATH LIST", "add directories to search path") {|dirs|
+ @additional << [dirs]
+ }
+ opt.on("--path-separator=SEP", /\A\W\z/, "separator for vpath") {|sep|
+ @separator = sep
+ }
+ end
+
+ def list
+ @additional.reject! do |dirs|
+ case dirs
+ when String
+ @list << dirs
+ when Array
+ @list.concat(dirs[0].split(@separator))
+ end
+ true
+ end
+ @list
+ end
+end