[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]