diff options
Diffstat (limited to 'jni/ruby/lib/shell/filter.rb')
-rw-r--r-- | jni/ruby/lib/shell/filter.rb | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/jni/ruby/lib/shell/filter.rb b/jni/ruby/lib/shell/filter.rb new file mode 100644 index 0000000..6960217 --- /dev/null +++ b/jni/ruby/lib/shell/filter.rb @@ -0,0 +1,137 @@ +# +# shell/filter.rb - +# $Release Version: 0.7 $ +# $Revision: 44221 $ +# by Keiju ISHITSUKA(keiju@ruby-lang.org) +# +# -- +# +# +# + +class Shell #:nodoc: + # Any result of command execution is a Filter. + # + # This class includes Enumerable, therefore a Filter object can use all + # Enumerable + # facilities. + # + class Filter + include Enumerable + + def initialize(sh) + @shell = sh # parent shell + @input = nil # input filter + end + + attr_reader :input + + def input=(filter) + @input = filter + end + + # call-seq: + # each(record_separator=nil) { block } + # + # Iterates a block for each line. + def each(rs = nil) + rs = @shell.record_separator unless rs + if @input + @input.each(rs){|l| yield l} + end + end + + # call-seq: + # < source + # + # Inputs from +source+, which is either a string of a file name or an IO + # object. + def < (src) + case src + when String + cat = Cat.new(@shell, src) + cat | self + when IO + self.input = src + self + else + Shell.Fail Error::CantApplyMethod, "<", to.class + end + end + + # call-seq: + # > source + # + # Outputs from +source+, which is either a string of a file name or an IO + # object. + def > (to) + case to + when String + dst = @shell.open(to, "w") + begin + each(){|l| dst << l} + ensure + dst.close + end + when IO + each(){|l| to << l} + else + Shell.Fail Error::CantApplyMethod, ">", to.class + end + self + end + + # call-seq: + # >> source + # + # Appends the output to +source+, which is either a string of a file name + # or an IO object. + def >> (to) + begin + Shell.cd(@shell.pwd).append(to, self) + rescue CantApplyMethod + Shell.Fail Error::CantApplyMethod, ">>", to.class + end + end + + # call-seq: + # | filter + # + # Processes a pipeline. + def | (filter) + filter.input = self + if active? + @shell.process_controller.start_job filter + end + filter + end + + # call-seq: + # filter1 + filter2 + # + # Outputs +filter1+, and then +filter2+ using Join.new + def + (filter) + Join.new(@shell, self, filter) + end + + def to_a + ary = [] + each(){|l| ary.push l} + ary + end + + def to_s + str = "" + each(){|l| str.concat l} + str + end + + def inspect + if @shell.debug.kind_of?(Integer) && @shell.debug > 2 + super + else + to_s + end + end + end +end |