From 9b383bd6cf96e1fe21c41528dec1f3ed508f335b Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 9 Jun 2006 21:20:17 +0000 Subject: * sprintf.c (rb_str_format): allow %c to print one character string (e.g. ?x). * lib/tempfile.rb (Tempfile::make_tmpname): put dot between basename and pid. [ruby-talk:196272] * parse.y (do_block): remove -> style block. * parse.y (parser_yylex): remove tLAMBDA_ARG. * eval.c (rb_call0): binding for the return event hook should have consistent scope. [ruby-core:07928] * eval.c (proc_invoke): return behavior should depend whether it is surrounded by a lambda or a mere block. * eval.c (formal_assign): handles post splat arguments. * eval.c (rb_call0): ditto. * st.c (strhash): use FNV-1a hash. * parse.y (parser_yylex): removed experimental ';;' terminator. * eval.c (rb_node_arity): should be aware of post splat arguments. * eval.c (rb_proc_arity): ditto. * parse.y (f_args): syntax rule enhanced to support arguments after the splat. * parse.y (block_param): ditto for block parameters. * parse.y (f_post_arg): mandatory formal arguments after the splat argument. * parse.y (new_args_gen): generate nodes for mandatory formal arguments after the splat argument. * eval.c (rb_eval): dispatch mandatory formal arguments after the splat argument. * parse.y (args): allow more than one splat in the argument list. * parse.y (method_call): allow aref [] to accept all kind of method argument, including assocs, splat, and block argument. * eval.c (SETUP_ARGS0): prepare block argument as well. * lib/mathn.rb (Integer): remove Integer#gcd2. [ruby-core:07931] * eval.c (error_line): print receivers true/false/nil specially. * eval.c (rb_proc_yield): handles parameters in yield semantics. * eval.c (nil_yield): gives LocalJumpError to denote no block error. * io.c (rb_io_getc): now takes one-character string. * string.c (rb_str_hash): use FNV-1a hash from Fowler/Noll/Vo hashing algorithm. * string.c (rb_str_aref): str[0] now returns 1 character string, instead of a fixnum. [Ruby2] * parse.y (parser_yylex): ?c now returns 1 character string, instead of a fixnum. [Ruby2] * string.c (rb_str_aset): no longer support fixnum insertion. * eval.c (umethod_bind): should not update original class. [ruby-dev:28636] * eval.c (ev_const_get): should support constant access from within instance_eval(). [ruby-dev:28327] * time.c (time_timeval): should round for usec floating number. [ruby-core:07896] * time.c (time_add): ditto. * dir.c (sys_warning): should not call a vararg function rb_sys_warning() indirectly. [ruby-core:07886] * numeric.c (flo_divmod): the first element of Float#divmod should be an integer. [ruby-dev:28589] * test/ruby/test_float.rb: add tests for divmod, div, modulo and remainder. * re.c (rb_reg_initialize): should not allow modifying literal regexps. frozen check moved from rb_reg_initialize_m as well. * re.c (rb_reg_initialize): should not modify untainted objects in safe levels higher than 3. * re.c (rb_memcmp): type change from char* to const void*. * dir.c (dir_close): should not close untainted dir stream. * dir.c (GetDIR): add tainted/frozen check for each dir operation. * lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_symbol_arg): typo fixed. a patch from Florian Gross . * eval.c (EXEC_EVENT_HOOK): trace_func may remove itself from event_hooks. no guarantee for arbitrary hook deletion. [ruby-dev:28632] * util.c (ruby_strtod): differ addition to minimize error. [ruby-dev:28619] * util.c (ruby_strtod): should not raise ERANGE when the input string does not have any digits. [ruby-dev:28629] * eval.c (proc_invoke): should restore old ruby_frame->block. thanks to ts . [ruby-core:07833] also fix [ruby-dev:28614] as well. * signal.c (trap): sig should be less then NSIG. Coverity found this bug. a patch from Kevin Tew . [ruby-core:07823] * math.c (math_log2): add new method inspired by [ruby-talk:191237]. * math.c (math_log): add optional base argument to Math::log(). [ruby-talk:191308] * ext/syck/emitter.c (syck_scan_scalar): avoid accessing uninitialized array element. a patch from Pat Eyler . [ruby-core:07809] * array.c (rb_ary_fill): initialize local variables first. a patch from Pat Eyler . [ruby-core:07810] * ext/syck/yaml2byte.c (syck_yaml2byte_handler): need to free type_tag. a patch from Pat Eyler . [ruby-core:07808] * ext/socket/socket.c (make_hostent_internal): accept ai_family check from Sam Roberts . [ruby-core:07691] * util.c (ruby_strtod): should not cut off 18 digits for no reason. [ruby-core:07796] * array.c (rb_ary_fill): internalize local variable "beg" to pacify Coverity. [ruby-core:07770] * pack.c (pack_unpack): now supports CRLF newlines. a patch from . [ruby-dev:28601] * applied code clean-up patch from Stefan Huehner . [ruby-core:07764] * lib/jcode.rb (String::tr_s): should have translated non squeezing character sequence (i.e. a character) as well. thanks to Hiroshi Ichikawa [ruby-list:42090] * ext/socket/socket.c: document update patch from Sam Roberts . [ruby-core:07701] * lib/mathn.rb (Integer): need not to remove gcd2. a patch from NARUSE, Yui . [ruby-dev:28570] * parse.y (arg): too much NEW_LIST() * eval.c (SETUP_ARGS0): remove unnecessary access to nd_alen. * eval.c (rb_eval): use ARGSCAT for NODE_OP_ASGN1. [ruby-dev:28585] * parse.y (arg): use NODE_ARGSCAT for placeholder. * lib/getoptlong.rb (GetoptLong::get): RDoc update patch from mathew . [ruby-core:07738] * variable.c (rb_const_set): raise error when no target klass is supplied. [ruby-dev:28582] * prec.c (prec_prec_f): documentation patch from . [ruby-core:07689] * bignum.c (rb_big_pow): second operand may be too big even if it's a Fixnum. [ruby-talk:187984] * README.EXT: update symbol description. [ruby-talk:188104] * COPYING: explicitly note GPLv2. [ruby-talk:187922] * parse.y: remove some obsolete syntax rules (unparenthesized method calls in argument list). * eval.c (rb_call0): insecure calling should be checked for non NODE_SCOPE method invocations too. * eval.c (rb_alias): should preserve the current safe level as well as method definition. * process.c (rb_f_sleep): remove RDoc description about SIGALRM which is not valid on the current implementation. [ruby-dev:28464] Thu Mar 23 21:40:47 2006 K.Kosako * eval.c (method_missing): should support argument splat in super. a bug in combination of super, splat and method_missing. [ruby-talk:185438] * configure.in: Solaris SunPro compiler -rapth patch from . [ruby-dev:28443] * configure.in: remove enable_rpath=no for Solaris. [ruby-dev:28440] * ext/win32ole/win32ole.c (ole_val2olevariantdata): change behavior of converting OLE Variant object with VT_ARRAY|VT_UI1 and Ruby String object. * ruby.1: a clarification patch from David Lutterkort . [ruby-core:7508] * lib/rdoc/ri/ri_paths.rb (RI::Paths): adding paths from rubygems directories. a patch from Eric Hodel . [ruby-core:07423] * eval.c (rb_clear_cache_by_class): clearing wrong cache. * ext/extmk.rb: use :remove_destination to install extension libraries to avoid SEGV. [ruby-dev:28417] * eval.c (rb_thread_fd_writable): should not re-schedule output from KILLED thread (must be error printing). * array.c (rb_ary_flatten_bang): allow specifying recursion level. [ruby-talk:182170] * array.c (rb_ary_flatten): ditto. * gc.c (add_heap): a heap_slots may overflow. a patch from Stefan Weil . * eval.c (rb_call): use separate cache for fcall/vcall invocation. * eval.c (rb_eval): NODE_FCALL, NODE_VCALL can call local functions. * eval.c (rb_mod_local): a new method to specify newly added visibility "local". * eval.c (search_method): search for local methods which are visible only from the current class. * class.c (rb_class_local_methods): a method to list local methods. * object.c (Init_Object): add BasicObject class as a top level BlankSlate class. * ruby.h (SYM2ID): should not cast to signed long. [ruby-core:07414] * class.c (rb_include_module): allow module duplication. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10235 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/.document | 1 + lib/cgi.rb | 2 + lib/forwardable.rb | 4 +- lib/getoptlong.rb | 196 ++++++++++++++++++++++++++++++++++++------- lib/jcode.rb | 2 +- lib/mathn.rb | 8 -- lib/mkmf.rb | 25 +++--- lib/optparse.rb | 12 +-- lib/rdoc/parsers/parse_rb.rb | 2 +- lib/rdoc/ri/ri_paths.rb | 6 ++ lib/runit/assert.rb | 7 +- lib/runit/testcase.rb | 2 +- lib/tempfile.rb | 2 +- 13 files changed, 209 insertions(+), 60 deletions(-) (limited to 'lib') diff --git a/lib/.document b/lib/.document index 3978aa9347..9374ec7fd5 100644 --- a/lib/.document +++ b/lib/.document @@ -20,6 +20,7 @@ fileutils.rb find.rb forwardable.rb generator.rb +getoptlong.rb logger.rb matrix.rb net diff --git a/lib/cgi.rb b/lib/cgi.rb index c1627cb521..825be5a0a8 100644 --- a/lib/cgi.rb +++ b/lib/cgi.rb @@ -726,6 +726,8 @@ class CGI when /shift_jis/ni content = NKF::nkf('-s', content) options["language"] = "ja" unless options.has_key?("language") + when /utf-8/ni + content = NKF::nkf('-w', content) end end diff --git a/lib/forwardable.rb b/lib/forwardable.rb index 3e979a3155..1889f44109 100644 --- a/lib/forwardable.rb +++ b/lib/forwardable.rb @@ -93,7 +93,7 @@ # array, like this: # # class RecordCollection -# extends Forwardable +# extend Forwardable # def_delegator :@records, :[], :record_number # end # @@ -101,7 +101,7 @@ # all of which delegate to @records, this is how you can do it: # # class RecordCollection -# # extends Forwardable, but we did that above +# # extend Forwardable, but we did that above # def_delegators :@records, :size, :<<, :map # end # f = Foo.new diff --git a/lib/getoptlong.rb b/lib/getoptlong.rb index 8fb302d741..922d25371c 100644 --- a/lib/getoptlong.rb +++ b/lib/getoptlong.rb @@ -1,17 +1,94 @@ -# -*- Ruby -*- -# Copyright (C) 1998, 1999, 2000 Motoyuki Kasahara # -# You may redistribute it and/or modify it under the same license +# GetoptLong for Ruby +# +# Copyright (C) 1998, 1999, 2000 Motoyuki Kasahara. +# +# You may redistribute and/or modify this library under the same license # terms as Ruby. # +# See GetoptLong for documentation. +# +# Additional documents and the latest version of `getoptlong.rb' can be +# found at http://www.sra.co.jp/people/m-kasahr/ruby/getoptlong/ +# The GetoptLong class allows you to parse command line options similarly to +# the GNU getopt_long() C library call. Note, however, that GetoptLong is a +# pure Ruby implementation. # -# Documents and latest version of `getoptlong.rb' are found at: -# http://www.sra.co.jp/people/m-kasahr/ruby/getoptlong/ +# GetoptLong allows for POSIX-style options like --file as well +# as single letter options like -f # - +# The empty option -- (two minus symbols) is used to end option +# processing. This can be particularly important if options have optional +# arguments. # -# Parse command line options just like GNU getopt_long(). +# Here is a simple example of usage: +# +# # == Synopsis +# # +# # hello: greets user, demonstrates command line parsing +# # +# # == Usage +# # +# # hello [OPTION] ... DIR +# # +# # -h, --help: +# # show help +# # +# # --repeat x, -n x: +# # repeat x times +# # +# # --name [name]: +# # greet user by name, if name not supplied default is John +# # +# # DIR: The directory in which to issue the greeting. +# +# require 'getoptlong' +# require 'rdoc/usage' +# +# opts = GetoptLong.new( +# [ '--help', '-h', GetoptLong::NO_ARGUMENT ], +# [ '--repeat', '-n', GetoptLong::REQUIRED_ARGUMENT ], +# [ '--name', GetoptLong::OPTIONAL_ARGUMENT ] +# ) +# +# dir = nil +# name = nil +# repetitions = 1 +# opts.each do |opt, arg| +# case opt +# when '--help' +# RDoc::usage +# when '--repeat' +# repetitions = arg.to_i +# when '--name' +# if arg == '' +# name = 'John' +# else +# name = arg +# end +# end +# end +# +# if ARGV.length != 1 +# puts "Missing dir argument (try --help)" +# exit 0 +# end +# +# dir = ARGV.shift +# +# Dir.chdir(dir) +# for i in (1..repetitions) +# print "Hello" +# if name +# print ", #{name}" +# end +# puts +# end +# +# Example command line: +# +# hello -n 6 --name -- /tmp # class GetoptLong # @@ -40,13 +117,20 @@ class GetoptLong class InvalidOption < Error; end # - # The arguments are passed to new() as an array of arrays. Each - # subarray has a number of option names which carry the same - # meaning, and a ARGUMENT_FLAG, being one of - # GetoptLong::NO_ARGUMENT, GetoptLong::REQUIRED_ARGUMENT or - # GetoptLong::OPTIONAL_ARGUMENT. These determine whether the - # option takes an argument or not, or whether it is optional The - # actual processing is done later with #each(). + # Set up option processing. + # + # The options to support are passed to new() as an array of arrays. + # Each sub-array contains any number of String option names which carry + # the same meaning, and one of the following flags: + # + # GetoptLong::NO_ARGUMENT :: Option does not take an argument. + # + # GetoptLong::REQUIRED_ARGUMENT :: Option always takes an argument. + # + # GetoptLong::OPTIONAL_ARGUMENT :: Option may or may not take an argument. + # + # The first option name is considered to be the preferred (canonical) name. + # Other than that, the elements of each sub-array can be in any order. # def initialize(*arguments) # @@ -109,11 +193,53 @@ class GetoptLong end # - # Set the handling of the ordering of options. The supplied - # argument ordering must be a member of ORDERINGS, i.e one of - # GetoptLong::REQUIRE_ORDER, GetoptLong::PERMUTE, - # GetoptLong::RETURN_IN_ORDER. A RuntimeError is raised if - # option processing has already started. + # Set the handling of the ordering of options and arguments. + # A RuntimeError is raised if option processing has already started. + # + # The supplied value must be a member of GetoptLong::ORDERINGS. It alters + # the processing of options as follows: + # + # REQUIRE_ORDER : + # + # Options are required to occur before non-options. + # + # Processing of options ends as soon as a word is encountered that has not + # been preceded by an appropriate option flag. + # + # For example, if -a and -b are options which do not take arguments, + # parsing command line arguments of '-a one -b two' would result in + # 'one', '-b', 'two' being left in ARGV, and only ('-a', '') being + # processed as an option/arg pair. + # + # This is the default ordering, if the environment variable + # POSIXLY_CORRECT is set. (This is for compatibility with GNU getopt_long.) + # + # PERMUTE : + # + # Options can occur anywhere in the command line parsed. This is the + # default behavior. + # + # Every sequence of words which can be interpreted as an option (with or + # without argument) is treated as an option; non-option words are skipped. + # + # For example, if -a does not require an argument and -b optionally takes + # an argument, parsing '-a one -b two three' would result in ('-a','') and + # ('-b', 'two') being processed as option/arg pairs, and 'one','three' + # being left in ARGV. + # + # If the ordering is set to PERMUTE but the environment variable + # POSIXLY_CORRECT is set, REQUIRE_ORDER is used instead. This is for + # compatibility with GNU getopt_long. + # + # RETURN_IN_ORDER : + # + # All words on the command line are processed as options. Words not + # preceded by a short or long option flag are passed as arguments + # with an option of '' (empty string). + # + # For example, if -a requires an argument but -b does not, a command line + # of '-a one -b two three' would result in option/arg pairs of ('-a', 'one') + # ('-b', ''), ('', 'two'), ('', 'three') being processed. # def ordering=(ordering) # @@ -144,7 +270,9 @@ class GetoptLong attr_reader :ordering # - # Set options + # Set options. Takes the same argument as GetoptLong.new. + # + # Raises a RuntimeError if option processing has already started. # def set_options(*arguments) # @@ -233,7 +361,7 @@ class GetoptLong alias quiet? quiet # - # Terminate option processing. + # Explicitly terminate option processing. # def terminate return nil if @status == STATUS_TERMINATED @@ -253,7 +381,7 @@ class GetoptLong end # - # Examine whether option processing is terminated or not. + # Returns true if option processing has terminated, false otherwise. # def terminated? return @status == STATUS_TERMINATED @@ -286,16 +414,22 @@ class GetoptLong # alias error? error - # - # Return an error message. + # Return the appropriate error message in POSIX-defined format. + # If no error has occurred, returns nil. # def error_message return @error_message end # - # Get next option name and its argument as an array. - # Return nil if the processing is complete (as determined by + # Get next option name and its argument, as an Array of two elements. + # + # The option name is always converted to the first (preferred) + # name given in the original options to GetoptLong.new. + # + # Example: ['--option', 'value'] + # + # Returns nil if the processing is complete (as determined by # STATUS_TERMINATED). # def get @@ -462,9 +596,15 @@ class GetoptLong # alias get_option get + # Iterator version of `get'. + # + # The block is called repeatedly with two arguments: + # The first is the option name. + # The second is the argument which followed it (if any). + # Example: ('--opt', 'value') # - # Iterator version of `get', passes the option and the - # corresponding argument to the supplied block for processing. + # The option name is always converted to the first (preferred) + # name given in the original options to GetoptLong.new. # def each loop do diff --git a/lib/jcode.rb b/lib/jcode.rb index ea90871572..fcf4f04730 100644 --- a/lib/jcode.rb +++ b/lib/jcode.rb @@ -174,7 +174,7 @@ class String def tr_s!(from, to) return self.delete!(from) if to.length == 0 - pattern = SqueezePatternCache[from] ||= /([#{_regex_quote(from)}])\1+/ + pattern = SqueezePatternCache[from] ||= /([#{_regex_quote(from)}])\1*/ if from[0] == ?^ last = /.$/.match(to)[0] self.gsub!(pattern, last) diff --git a/lib/mathn.rb b/lib/mathn.rb index 3108dd2eb7..3dea0afec1 100644 --- a/lib/mathn.rb +++ b/lib/mathn.rb @@ -16,14 +16,6 @@ require "matrix.rb" class Integer - remove_method(:gcd2) - def gcd2(other) - min = self.abs - max = other.abs - min, max = max % min, min while min > 0 - max - end - def Integer.from_prime_division(pd) value = 1 for prime, index in pd diff --git a/lib/mkmf.rb b/lib/mkmf.rb index 421e6c9e71..1d495e8205 100644 --- a/lib/mkmf.rb +++ b/lib/mkmf.rb @@ -786,21 +786,26 @@ def find_executable(bin, path = nil) end end -def arg_config(config, *defaults, &block) - $arg_config << [config, *defaults] - defaults << nil if !block and defaults.empty? +def arg_config(config, default=nil, &block) + $arg_config << [config, default] + defaults = [] + if default + defaults << default + elsif !block + defaults << nil + end $configure_args.fetch(config.tr('_', '-'), *defaults, &block) end -def with_config(config, *defaults) +def with_config(config, default=nil) config = config.sub(/^--with[-_]/, '') val = arg_config("--with-"+config) do if arg_config("--without-"+config) false elsif block_given? - yield(config, *defaults) + yield(config, default) else - break *defaults + break default end end case val @@ -813,15 +818,15 @@ def with_config(config, *defaults) end end -def enable_config(config, *defaults) +def enable_config(config, default=nil) if arg_config("--enable-"+config) true elsif arg_config("--disable-"+config) false elsif block_given? - yield(config, *defaults) + yield(config, default) else - return *defaults + return default end end @@ -1105,7 +1110,7 @@ EXTSTATIC = #{$static || ""} STATIC_LIB = #{staticlib unless $static.nil?} } - install_dirs.each {|d| mfile.print("%-14s= %s\n" % d) if /^[[:upper:]]/ =~ d[0]} + install_dirs.each {|*d| mfile.print("%-14s= %s\n" % d) if /^[[:upper:]]/ =~ d[0]} n = ($extout ? '$(RUBYARCHDIR)/' : '') + '$(TARGET).' mfile.print %{ TARGET_SO = #{($extout ? '$(RUBYARCHDIR)/' : '')}$(DLLIB) diff --git a/lib/optparse.rb b/lib/optparse.rb index 6d1daeb6a0..9c7676f4be 100644 --- a/lib/optparse.rb +++ b/lib/optparse.rb @@ -357,7 +357,7 @@ class OptionParser if conv val = conv.call(*val) else - val = *val + val = val[0] end return arg, block, val else @@ -622,7 +622,7 @@ class OptionParser if list = __send__(id) val = list.fetch(key) {return nil} return val unless block_given? - yield(val) + yield(*val) end end @@ -848,7 +848,7 @@ class OptionParser # :nodoc: def add_officious list = base() - Officious.each_pair do |opt, block| + Officious.each do |opt, block| list.long[opt] ||= block.call(self) end end @@ -1319,7 +1319,7 @@ class OptionParser end begin opt, sw, val = sw.parse(rest, argv) {|*exc| raise(*exc)} - sw.call(val) if sw + sw.call(*val) if sw rescue ParseError raise $!.set_option(arg, rest) end @@ -1458,9 +1458,9 @@ class OptionParser yielded with the found value when succeeded. =end #'#"#`# def search(id, key) - visit(:search, id, key) do |k| + visit(:search, id, key) do |*k| return k unless block_given? - return yield(k) + return yield(*k) end end private :search diff --git a/lib/rdoc/parsers/parse_rb.rb b/lib/rdoc/parsers/parse_rb.rb index fedc67e51f..a297719b80 100644 --- a/lib/rdoc/parsers/parse_rb.rb +++ b/lib/rdoc/parsers/parse_rb.rb @@ -2555,7 +2555,7 @@ module RDoc break when TkCOMMA else - warn("unexpected token: '#{tk2.inspect}'") if $DEBBUG + warn("unexpected token: '#{tk2.inspect}'") if $DEBUG break end end diff --git a/lib/rdoc/ri/ri_paths.rb b/lib/rdoc/ri/ri_paths.rb index c610b6e551..c5526201ea 100644 --- a/lib/rdoc/ri/ri_paths.rb +++ b/lib/rdoc/ri/ri_paths.rb @@ -41,5 +41,11 @@ module RI # This is the search path for 'ri' PATH = [ SYSDIR, SITEDIR, HOMEDIR ].find_all {|p| p && File.directory?(p)} + + begin + require 'rubygems' + Dir["#{Gem.path}/doc/*/ri"].each { |path| RI::Paths::PATH << path } + rescue LoadError + end end end diff --git a/lib/runit/assert.rb b/lib/runit/assert.rb index c752b19a25..f18bb36127 100644 --- a/lib/runit/assert.rb +++ b/lib/runit/assert.rb @@ -6,8 +6,7 @@ require 'test/unit/assertions' require 'runit/error' module RUNIT - module Assert - include Test::Unit::Assertions + module AssertMixin def setup_assert end @@ -70,4 +69,8 @@ module RUNIT /assertions\.rb/.match(caller[1]) end end + module Assert + include Test::Unit::Assertions + include AssertMixin + end end diff --git a/lib/runit/testcase.rb b/lib/runit/testcase.rb index 4576cb8644..9e05a58abe 100644 --- a/lib/runit/testcase.rb +++ b/lib/runit/testcase.rb @@ -10,7 +10,7 @@ require 'test/unit/testcase' module RUNIT class TestCase < Test::Unit::TestCase - include RUNIT::Assert + include RUNIT::AssertMixin def self.suite method_names = instance_methods(true) diff --git a/lib/tempfile.rb b/lib/tempfile.rb index 1b2a889b4a..a033a5b29e 100644 --- a/lib/tempfile.rb +++ b/lib/tempfile.rb @@ -67,7 +67,7 @@ class Tempfile < DelegateClass(File) end def make_tmpname(basename, n) - sprintf('%s%d.%d', basename, $$, n) + sprintf('%s.%d.%d', basename, $$, n) end private :make_tmpname -- cgit v1.2.3