summaryrefslogtreecommitdiff
path: root/lib/shellwords.rb
diff options
context:
space:
mode:
authorknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-01-26 10:11:30 +0000
committerknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-01-26 10:11:30 +0000
commit8b222cea6bcd69b6a854be03f2362c5961b43a03 (patch)
tree2124a2269263f682fd31d7a6ac1e7d56b8219082 /lib/shellwords.rb
parent91758efa95b07503a880815ce9d108df6df067e0 (diff)
* lib/shellwords.rb: Embed rdoc style comments.
* lib/shellwords.rb (shellwords): Use String#lstrip!. * lib/shellwords.rb (shellwords): Recognize an object that responds to to_str() by using String.new(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3413 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/shellwords.rb')
-rw-r--r--lib/shellwords.rb60
1 files changed, 36 insertions, 24 deletions
diff --git a/lib/shellwords.rb b/lib/shellwords.rb
index 6fb40e8..99c0bf8 100644
--- a/lib/shellwords.rb
+++ b/lib/shellwords.rb
@@ -1,41 +1,52 @@
-# shellwords.rb
-# original is shellwords.pl
#
-# Usage:
-# require 'shellwords'
-# words = Shellwords.shellwords(line)
+# shellwords.rb: Split text into an array of tokens a la UNIX shell
#
-# or
-#
-# require 'shellwords'
-# include Shellwords
-# words = shellwords(line)
+#
+# This module is originally a port of shellwords.pl, but modified to
+# conform to POSIX / SUSv3 (IEEE Std 1003.1-2001).
+#
+# Examples:
+#
+# require 'shellwords'
+# words = Shellwords.shellwords(line)
+#
+# or
+#
+# require 'shellwords'
+# include Shellwords
+# words = shellwords(line)
+#
module Shellwords
+
+ #
+ # Split text into an array of tokens in the same way the UNIX Bourne
+ # shell does.
+ #
+ # See the +Shellwords+ module documentation for an example.
+ #
def shellwords(line)
- unless line.kind_of?(String)
- raise ArgumentError, "Argument must be String class object."
- end
- line = line.sub(/\A\s+/, '')
+ line = String.new(line) rescue
+ raise(ArgumentError, "Argument must be a string")
+ line.lstrip!
words = []
- while line != ''
+ until line.empty?
field = ''
- while true
- if line.sub!(/\A"(([^"\\]|\\.)*)"/, '') then #"
- snippet = $1
- snippet.gsub!(/\\(.)/, '\1')
- elsif line =~ /\A"/ then #"
+ loop do
+ if line.sub!(/\A"(([^"\\]|\\.)*)"/, '') then
+ snippet = $1.gsub(/\\(.)/, '\1')
+ elsif line =~ /\A"/ then
raise ArgumentError, "Unmatched double quote: #{line}"
- elsif line.sub!(/\A'([^']*)'/, '') then #'
+ elsif line.sub!(/\A'([^']*)'/, '') then
snippet = $1
- elsif line =~ /\A'/ then #'
+ elsif line =~ /\A'/ then
raise ArgumentError, "Unmatched single quote: #{line}"
elsif line.sub!(/\A\\(.)/, '') then
snippet = $1
- elsif line.sub!(/\A([^\s\\'"]+)/, '') then #'
+ elsif line.sub!(/\A([^\s\\'"]+)/, '') then
snippet = $1
else
- line.sub!(/\A\s+/, '')
+ line.lstrip!
break
end
field.concat(snippet)
@@ -44,5 +55,6 @@ module Shellwords
end
words
end
+
module_function :shellwords
end