Tag unstable CGI specs.
[rbx.git] / lib / shellwords.rb
blobe87b9e656bb706164e0b723c86437e8accfa8992
2 # shellwords.rb: Split text into an array of tokens a la UNIX shell
6 # This module is originally a port of shellwords.pl, but modified to
7 # conform to POSIX / SUSv3 (IEEE Std 1003.1-2001).
9 # Examples:
11 #   require 'shellwords'
12 #   words = Shellwords.shellwords(line)
14 # or
16 #   require 'shellwords'
17 #   include Shellwords
18 #   words = shellwords(line)
20 module Shellwords
22   #
23   # Split text into an array of tokens in the same way the UNIX Bourne
24   # shell does.
25   #
26   # See the +Shellwords+ module documentation for an example.
27   #
28   def shellwords(line)
29     line = String.new(line) rescue
30       raise(ArgumentError, "Argument must be a string")
31     line.lstrip!
32     words = []
33     until line.empty?
34       field = ''
35       loop do
36         if line.sub!(/\A"(([^"\\]|\\.)*)"/, '') then
37           snippet = $1.gsub(/\\(.)/, '\1')
38         elsif line =~ /\A"/ then
39           raise ArgumentError, "Unmatched double quote: #{line}"
40         elsif line.sub!(/\A'([^']*)'/, '') then
41           snippet = $1
42         elsif line =~ /\A'/ then
43           raise ArgumentError, "Unmatched single quote: #{line}"
44         elsif line.sub!(/\A\\(.)?/, '') then
45           snippet = $1 || '\\'
46         elsif line.sub!(/\A([^\s\\'"]+)/, '') then
47           snippet = $1
48         else
49           line.lstrip!
50           break
51         end
52         field.concat(snippet)
53       end
54       words.push(field)
55     end
56     words
57   end
59   module_function :shellwords
60 end