ruby-changes:16799
From: nobu <ko1@a...>
Date: Fri, 30 Jul 2010 08:06:57 +0900 (JST)
Subject: [ruby-changes:16799] Ruby:r28794 (trunk, ruby_1_8): * util.c (ruby_add_suffix): fixed a bug returning uninitialized
nobu 2010-07-30 07:59:54 +0900 (Fri, 30 Jul 2010) New Revision: 28794 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28794 Log: * util.c (ruby_add_suffix): fixed a bug returning uninitialized value. Added directories: branches/ruby_1_8/ext/-test-/ branches/ruby_1_8/ext/-test-/add_suffix/ branches/ruby_1_8/test/-ext-/ trunk/ext/-test-/add_suffix/ Added files: branches/ruby_1_8/ext/-test-/add_suffix/bug.c branches/ruby_1_8/ext/-test-/add_suffix/depend branches/ruby_1_8/ext/-test-/add_suffix/extconf.rb branches/ruby_1_8/ext/-test-/add_suffix/io.h branches/ruby_1_8/test/-ext-/test_add_suffix.rb trunk/ext/-test-/add_suffix/bug.c trunk/ext/-test-/add_suffix/depend trunk/ext/-test-/add_suffix/extconf.rb trunk/test/-ext-/test_add_suffix.rb Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/util.c trunk/ChangeLog trunk/include/ruby/intern.h trunk/util.c Index: include/ruby/intern.h =================================================================== --- include/ruby/intern.h (revision 28793) +++ include/ruby/intern.h (revision 28794) @@ -381,6 +381,8 @@ VALUE rb_file_directory_p(VALUE,VALUE); VALUE rb_str_encode_ospath(VALUE); int rb_is_absolute_path(const char *); +const char *ruby_find_basename(const char *name, long *baselen, long *alllen); +const char *ruby_find_extname(const char *name, long *len); /* gc.c */ void ruby_set_stack_size(size_t); NORETURN(void rb_memerror(void)); Index: ChangeLog =================================================================== --- ChangeLog (revision 28793) +++ ChangeLog (revision 28794) @@ -1,3 +1,8 @@ +Fri Jul 30 07:59:53 2010 Nobuyoshi Nakada <nobu@r...> + + * util.c (ruby_add_suffix): fixed a bug returning uninitialized + value. + Fri Jul 30 07:48:04 2010 Hidetoshi NAGAI <nagai@a...> * ext/tk/extconf.rb: use TK_XINCLUDES on tkConfig.sh when not empty, Index: util.c =================================================================== --- util.c (revision 28793) +++ util.c (revision 28794) @@ -234,8 +234,9 @@ * suffix = ".bak" (style 1) * foo.bar => foo.bak * foo.bak => foo.$$$ (fallback) + * makefile => makefile.bak + * suffix = ".$$$" (style 1) * foo.$$$ => foo.~~~ (fallback) - * makefile => makefile.bak * * suffix = "~" (style 2) * foo.c => foo.c~ @@ -291,7 +292,10 @@ if (*suffix == '.') { /* Style 1 */ if (ext) { - if (strEQ(ext, suffix)) goto fallback; + if (strEQ(ext, suffix)) { + extlen = sizeof(suffix1) - 1; /* suffix2 must be same length */ + suffix = strEQ(suffix, suffix1) ? suffix2 : suffix1; + } slen = ext - name; } rb_str_resize(str, slen); @@ -306,12 +310,13 @@ p += slen; p[len] = '\0'; if (suffix[1] == '\0') { /* Style 2 */ + q = (char *)ruby_find_basename(buf, &baselen, 0); if (len <= 3) { + if (len == 0 && baselen >= 8 && p + 3 <= buf + sizeof(buf)) p[len++] = '.'; /* DOSISH */ p[len] = *suffix; p[++len] = '\0'; } - else if ((q = (char *)ruby_find_basename(buf, &baselen, 0)) && - baselen < 8) { + else if (q && baselen < 8) { q += baselen; *q++ = *suffix; if (ext) { @@ -332,9 +337,9 @@ fallback: (void)memcpy(p, !ext || strEQ(ext, suffix1) ? suffix2 : suffix1, 5); } + rb_str_resize(str, strlen(buf)); + memcpy(RSTRING_PTR(str), buf, RSTRING_LEN(str)); } - rb_str_resize(str, strlen(buf)); - memcpy(RSTRING_PTR(str), buf, RSTRING_LEN(str)); } static int Index: ext/-test-/add_suffix/depend =================================================================== --- ext/-test-/add_suffix/depend (revision 0) +++ ext/-test-/add_suffix/depend (revision 28794) @@ -0,0 +1 @@ +bug.o: $(hdrdir)/ruby/util.h $(top_srcdir)/util.c Property changes on: ext/-test-/add_suffix/depend ___________________________________________________________________ Added: svn:eol-style + LF Index: ext/-test-/add_suffix/extconf.rb =================================================================== --- ext/-test-/add_suffix/extconf.rb (revision 0) +++ ext/-test-/add_suffix/extconf.rb (revision 28794) @@ -0,0 +1,4 @@ +unless have_func("ruby_add_suffix", "ruby/util.h") + $INCFLAGS << " -I$(top_srcdir)" +end +create_makefile("-test-/add_suffix/bug") Property changes on: ext/-test-/add_suffix/extconf.rb ___________________________________________________________________ Added: svn:eol-style + LF Index: ext/-test-/add_suffix/bug.c =================================================================== --- ext/-test-/add_suffix/bug.c (revision 0) +++ ext/-test-/add_suffix/bug.c (revision 28794) @@ -0,0 +1,21 @@ +#include "ruby.h" +#include "ruby/defines.h" +#ifndef HAVE_RUBY_ADD_SUFFIX +#define _WIN32 1 +#include "util.c" +#endif + +static VALUE +add_suffix(VALUE self, VALUE path, VALUE suffix) +{ + StringValueCStr(path); + ruby_add_suffix(path, StringValueCStr(suffix)); + return path; +} + +void +Init_bug(void) +{ + VALUE mBug = rb_define_module("Bug"); + rb_define_module_function(mBug, "add_suffix", add_suffix, 2); +} Property changes on: ext/-test-/add_suffix/bug.c ___________________________________________________________________ Added: svn:eol-style + LF Index: test/-ext-/test_add_suffix.rb =================================================================== --- test/-ext-/test_add_suffix.rb (revision 0) +++ test/-ext-/test_add_suffix.rb (revision 28794) @@ -0,0 +1,47 @@ +require 'test/unit' +require_relative '../ruby/envutil' +require "-test-/add_suffix/bug" + +class Test_AddSuffix < Test::Unit::TestCase + Dir = "/dev/null/".freeze + Style_1 = (Dir+"foo").freeze + + def test_style_0 + assert_equal("a.x.y", Bug.add_suffix("a.x", ".y")) + end + + def test_style_1 + assert_equal(Style_1+".y", Bug.add_suffix(Style_1+".c", ".y")) + suffix = ".bak".freeze + assert_equal(Style_1+suffix, Bug.add_suffix(Style_1.dup, suffix)) + assert_equal(Style_1+suffix, Bug.add_suffix(Style_1+".bar", suffix)) + assert_equal(Style_1+".$$$", Bug.add_suffix(Style_1+suffix, suffix)) + assert_equal(Style_1+suffix, Bug.add_suffix(Style_1+".$$$", suffix)) + assert_equal(Style_1+".~~~", Bug.add_suffix(Style_1+".$$$", ".$$$")) + assert_equal(Dir+"makefile"+suffix, Bug.add_suffix(Dir+"makefile", suffix)) + end + + def test_style_2 + suffix = "~" + assert_equal(Style_1+"~", Bug.add_suffix(Style_1.dup, suffix)) + assert_equal(Style_1+".c~", Bug.add_suffix(Style_1+".c", suffix)) + assert_equal(Style_1+".c~~", Bug.add_suffix(Style_1+".c~", suffix)) + assert_equal(Style_1+"~.c~~", Bug.add_suffix(Style_1+".c~~", suffix)) + assert_equal(Style_1+"~~.c~~", Bug.add_suffix(Style_1+"~.c~~", suffix)) + assert_equal(Style_1+"~~~~~.cc~", Bug.add_suffix(Style_1+"~~~~~.ccc", suffix)) + assert_equal(Style_1+"~~~~~.$$$", Bug.add_suffix(Style_1+"~~~~~.c~~", suffix)) + assert_equal(Dir+"foo~.pas", Bug.add_suffix(Dir+"foo.pas", suffix)) + assert_equal(Dir+"makefile.~", Bug.add_suffix(Dir+"makefile", suffix)) + assert_equal(Dir+"longname.fi~", Bug.add_suffix(Dir+"longname.fil", suffix)) + assert_equal(Dir+"longnam~.fi~", Bug.add_suffix(Dir+"longname.fi~", suffix)) + assert_equal(Dir+"longnam~.$$$", Bug.add_suffix(Dir+"longnam~.fi~", suffix)) + end + + def test_style_3 + base = "a"*1000 + suffix = "-"+"b"*1000 + assert_equal(base+".~~~", Bug.add_suffix(base, suffix)) + assert_equal(base+".~~~", Bug.add_suffix(base+".$$$", suffix)) + assert_equal(base+".$$$", Bug.add_suffix(base+".~~~", suffix)) + end +end Property changes on: test/-ext-/test_add_suffix.rb ___________________________________________________________________ Added: svn:eol-style + LF Index: ruby_1_8/util.c =================================================================== --- ruby_1_8/util.c (revision 28793) +++ ruby_1_8/util.c (revision 28794) @@ -163,9 +163,8 @@ void ruby_add_suffix(VALUE str, const char *suffix) { - int baselen; - int extlen = strlen(suffix); - char *p, *q; + long baselen; + long extlen = strlen(suffix); long slen; char buf[1024]; const char *name; @@ -189,26 +188,31 @@ if (*suffix == '.') { /* Style 1 */ if (ext) { - if (strEQ(ext, suffix)) goto fallback; + if (strEQ(ext, suffix)) { + extlen = sizeof(suffix1) - 1; /* suffix2 must be same length */ + suffix = strEQ(suffix, suffix1) ? suffix2 : suffix1; + } slen = ext - name; } rb_str_resize(str, slen); rb_str_cat(str, suffix, extlen); } else { + char *p = buf, *q; strncpy(buf, name, slen); if (ext) - p = buf + (ext - name); + p += (ext - name); else - p = buf + slen; + p += slen; p[len] = '\0'; if (suffix[1] == '\0') { /* Style 2 */ + q = (char *)ruby_find_basename(buf, &baselen, 0); if (len <= 3) { + if (len == 0 && baselen >= 8 && p + 3 <= buf + sizeof(buf)) p[len++] = '.'; /* DOSISH */ p[len] = *suffix; p[++len] = '\0'; } - else if ((q = (char *)ruby_find_basename(buf, &baselen, 0)) && - baselen < 8) { + else if (q && baselen < 8) { q += baselen; *q++ = *suffix; if (ext) { @@ -229,9 +233,9 @@ fallback: (void)memcpy(p, !ext || strEQ(ext, suffix1) ? suffix2 : suffix1, 5); } + rb_str_resize(str, strlen(buf)); + memcpy(RSTRING_PTR(str), buf, RSTRING_LEN(str)); } - rb_str_resize(str, strlen(buf)); - memcpy(RSTRING_PTR(str), buf, RSTRING_LEN(str)); } #if defined(__CYGWIN32__) || defined(_WIN32) Index: ruby_1_8/ext/-test-/add_suffix/depend =================================================================== --- ruby_1_8/ext/-test-/add_suffix/depend (revision 0) +++ ruby_1_8/ext/-test-/add_suffix/depend (revision 28794) @@ -0,0 +1 @@ +bug.o: $(hdrdir)/util.h $(top_srcdir)/util.c io.h Property changes on: ruby_1_8/ext/-test-/add_suffix/depend ___________________________________________________________________ Added: svn:eol-style + LF Index: ruby_1_8/ext/-test-/add_suffix/extconf.rb =================================================================== --- ruby_1_8/ext/-test-/add_suffix/extconf.rb (revision 0) +++ ruby_1_8/ext/-test-/add_suffix/extconf.rb (revision 28794) @@ -0,0 +1,4 @@ +unless have_func("ruby_add_suffix", "ruby/util.h") + $INCFLAGS << " -I$(top_srcdir)" +end +create_makefile("-test-/add_suffix/bug") Property changes on: ruby_1_8/ext/-test-/add_suffix/extconf.rb ___________________________________________________________________ Added: svn:eol-style + LF Index: ruby_1_8/ext/-test-/add_suffix/io.h =================================================================== --- ruby_1_8/ext/-test-/add_suffix/io.h (revision 0) +++ ruby_1_8/ext/-test-/add_suffix/io.h (revision 28794) @@ -0,0 +1,3 @@ +#define _open open +#define _close close +#define _unlink unlink Property changes on: ruby_1_8/ext/-test-/add_suffix/io.h ___________________________________________________________________ Added: svn:eol-style + LF Index: ruby_1_8/ext/-test-/add_suffix/bug.c =================================================================== --- ruby_1_8/ext/-test-/add_suffix/bug.c (revision 0) +++ ruby_1_8/ext/-test-/add_suffix/bug.c (revision 28794) @@ -0,0 +1,21 @@ +#include "ruby.h" +#include "ruby/defines.h" +#ifndef HAVE_RUBY_ADD_SUFFIX +#define _WIN32 1 +#include "util.c" +#endif + +static VALUE +add_suffix(VALUE self, VALUE path, VALUE suffix) +{ + StringValueCStr(path); + ruby_add_suffix(path, StringValueCStr(suffix)); + return path; +} + +void +Init_bug(void) +{ + VALUE mBug = rb_define_module("Bug"); + rb_define_module_function(mBug, "add_suffix", add_suffix, 2); +} Property changes on: ruby_1_8/ext/-test-/add_suffix/bug.c ___________________________________________________________________ Added: svn:eol-style + LF Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 28793) +++ ruby_1_8/ChangeLog (revision 28794) @@ -1,3 +1,8 @@ +Fri Jul 30 07:59:53 2010 Nobuyoshi Nakada <nobu@r...> + + * util.c (ruby_add_suffix): fixed a bug returning uninitialized + value. + Fri Jul 30 07:48:04 2010 Hidetoshi NAGAI <nagai@a...> * ext/tk/extconf.rb: use TK_XINCLUDES on tkConfig.sh when not empty, Index: ruby_1_8/test/-ext-/test_add_suffix.rb =================================================================== --- ruby_1_8/test/-ext-/test_add_suffix.rb (revision 0) +++ ruby_1_8/test/-ext-/test_add_suffix.rb (revision 28794) @@ -0,0 +1,46 @@ +require 'test/unit' +require "-test-/add_suffix/bug" + +class Test_AddSuffix < Test::Unit::TestCase + Dir = "/dev/null/".freeze + Style_1 = (Dir+"foo").freeze + + def test_style_0 + assert_equal("a.x.y", Bug.add_suffix("a.x", ".y")) + end + + def test_style_1 + assert_equal(Style_1+".y", Bug.add_suffix(Style_1+".c", ".y")) + suffix = ".bak".freeze + assert_equal(Style_1+suffix, Bug.add_suffix(Style_1.dup, suffix)) + assert_equal(Style_1+suffix, Bug.add_suffix(Style_1+".bar", suffix)) + assert_equal(Style_1+".$$$", Bug.add_suffix(Style_1+suffix, suffix)) + assert_equal(Style_1+suffix, Bug.add_suffix(Style_1+".$$$", suffix)) + assert_equal(Style_1+".~~~", Bug.add_suffix(Style_1+".$$$", ".$$$")) + assert_equal(Dir+"makefile"+suffix, Bug.add_suffix(Dir+"makefile", suffix)) + end + + def test_style_2 + suffix = "~" + assert_equal(Style_1+"~", Bug.add_suffix(Style_1.dup, suffix)) + assert_equal(Style_1+".c~", Bug.add_suffix(Style_1+".c", suffix)) + assert_equal(Style_1+".c~~", Bug.add_suffix(Style_1+".c~", suffix)) + assert_equal(Style_1+"~.c~~", Bug.add_suffix(Style_1+".c~~", suffix)) + assert_equal(Style_1+"~~.c~~", Bug.add_suffix(Style_1+"~.c~~", suffix)) + assert_equal(Style_1+"~~~~~.cc~", Bug.add_suffix(Style_1+"~~~~~.ccc", suffix)) + assert_equal(Style_1+"~~~~~.$$$", Bug.add_suffix(Style_1+"~~~~~.c~~", suffix)) + assert_equal(Dir+"foo~.pas", Bug.add_suffix(Dir+"foo.pas", suffix)) + assert_equal(Dir+"makefile.~", Bug.add_suffix(Dir+"makefile", suffix)) + assert_equal(Dir+"longname.fi~", Bug.add_suffix(Dir+"longname.fil", suffix)) + assert_equal(Dir+"longnam~.fi~", Bug.add_suffix(Dir+"longname.fi~", suffix)) + assert_equal(Dir+"longnam~.$$$", Bug.add_suffix(Dir+"longnam~.fi~", suffix)) + end + + def test_style_3 + base = "a"*1000 + suffix = "-"+"b"*1000 + assert_equal(base+".~~~", Bug.add_suffix(base, suffix)) + assert_equal(base+".~~~", Bug.add_suffix(base+".$$$", suffix)) + assert_equal(base+".$$$", Bug.add_suffix(base+".~~~", suffix)) + end +end Property changes on: ruby_1_8/test/-ext-/test_add_suffix.rb ___________________________________________________________________ Added: svn:eol-style + LF -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/