mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 683400f427
			
		
	
	
		683400f427
		
	
	
	
	
		
			
			memory leaks. use string object for buffering instead. [ruby-dev:24738] * dir.c (join_path): ditto. * io.c (io_read): external input buffer may be modified even after rb_str_locktmp(). [ruby-dev:24735] * dir.c (fnmatch): p or s may be NULL. [ruby-dev:24749] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7242 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			60 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| #
 | |
| # shellwords.rb: Split text into an array of tokens a la UNIX shell
 | |
| #
 | |
| 
 | |
| #
 | |
| # 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)
 | |
|     line = String.new(line) rescue
 | |
|       raise(ArgumentError, "Argument must be a string")
 | |
|     line.lstrip!
 | |
|     words = []
 | |
|     until line.empty?
 | |
|       field = ''
 | |
|       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
 | |
| 	  snippet = $1
 | |
| 	elsif line =~ /\A'/ then
 | |
| 	  raise ArgumentError, "Unmatched single quote: #{line}"
 | |
| 	elsif line.sub!(/\A\\(.)?/, '') then
 | |
| 	  snippet = $1 || '\\'
 | |
| 	elsif line.sub!(/\A([^\s\\'"]+)/, '') then
 | |
| 	  snippet = $1
 | |
| 	else
 | |
| 	  line.lstrip!
 | |
| 	  break
 | |
| 	end
 | |
| 	field.concat(snippet)
 | |
|       end
 | |
|       words.push(field)
 | |
|     end
 | |
|     words
 | |
|   end
 | |
| 
 | |
|   module_function :shellwords
 | |
| end
 |