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

ruby-changes:15935

From: usa <ko1@a...>
Date: Wed, 19 May 2010 10:47:04 +0900 (JST)
Subject: [ruby-changes:15935] Ruby:r27875 (ruby_1_9_2): merge from trunk (r27862)

usa	2010-05-19 10:46:51 +0900 (Wed, 19 May 2010)

  New Revision: 27875

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27875

  Log:
    merge from trunk (r27862)
    
    * win32/win32.c (argv_size): merged into join_argv() to maintain the
      agreement with it.  removed code has a calclulation bug.
      fixed [Bug#2388]
    
    * win32/win32.c (join_argv): calc and return the length of joined
      argv.
      the cause of the original bug was clarified by Masaya TARUI
      <tarui AT prx.jp> and the solution was suggested by him, too.

  Modified files:
    branches/ruby_1_9_2/ChangeLog
    branches/ruby_1_9_2/win32/win32.c

Index: ruby_1_9_2/ChangeLog
===================================================================
--- ruby_1_9_2/ChangeLog	(revision 27874)
+++ ruby_1_9_2/ChangeLog	(revision 27875)
@@ -1,3 +1,14 @@
+Wed May 19 10:46:05 2010  NAKAMURA Usaku  <usa@r...>
+
+	* win32/win32.c (argv_size): merged into join_argv() to maintain the
+	  agreement with it.  removed code has a calclulation bug.
+	  fixed [Bug#2388]
+
+	* win32/win32.c (join_argv): calc and return the length of joined
+	  argv.
+	  the cause of the original bug was clarified by Masaya TARUI
+	  <tarui AT prx.jp> and the solution was suggested by him, too.
+
 Mon May 17 11:09:58 2010  NAKAMURA Usaku  <usa@r...>
 
 	* lib/fileutils.rb (FileUtils::Entry_#entries): returns pathname in
Index: ruby_1_9_2/win32/win32.c
===================================================================
--- ruby_1_9_2/win32/win32.c	(revision 27874)
+++ ruby_1_9_2/win32/win32.c	(revision 27875)
@@ -864,53 +864,19 @@
 }
 
 static int
-argv_size(char *const *argv, BOOL escape)
-{
-    const char *p;
-    char *const *t;
-    int len, n, bs, quote;
-
-    for (t = argv, len = 0; *t; t++) {
-	for (p = *t, n = quote = bs = 0; *p; ++p) {
-	    switch (*p) {
-	      case '\\':
-		++bs;
-		break;
-	      case '<': case '>': case '|': case '^':
-		bs = 0;
-		if (escape && !quote) n++;
-		break;
-	      case '"':
-		n += bs + 1; bs = 0;
-		quote = 1;
-		break;
-	      case ' ': case '\t':
-		quote = 1;
-	      default:
-		bs = 0;
-		p = CharNext(p) - 1;
-		break;
-	    }
-	}
-	len += p - *t + n + 1;
-	if (p - *t == 0 || quote) len += 2;
-    }
-    return len;
-}
-
-static char *
 join_argv(char *cmd, char *const *argv, BOOL escape)
 {
     const char *p, *s;
     char *q, *const *t;
-    int n, bs, quote;
+    int len, n, bs, quote;
 
-    for (t = argv, q = cmd; p = *t; t++) {
+    for (t = argv, q = cmd, len = 0; p = *t; t++) {
 	quote = 0;
 	s = p;
 	if (!*p || strpbrk(p, " \t\"'")) {
 	    quote = 1;
-	    *q++ = '"';
+	    len++;
+	    if (q) *q++ = '"';
 	}
 	for (bs = 0; *p; ++p) {
 	    switch (*p) {
@@ -918,13 +884,28 @@
 		++bs;
 		break;
 	      case '"':
-		memcpy(q, s, n = p - s); q += n; s = p;
-		memset(q, '\\', ++bs); q += bs; bs = 0;
+		len += n = p - s;
+		if (q) {
+		    memcpy(q, s, n);
+		    q += n;
+		}
+		s = p;
+		len += ++bs;
+		if (q) {
+		    memset(q, '\\', bs);
+		    q += bs;
+		}
+		bs = 0;
 		break;
 	      case '<': case '>': case '|': case '^':
 		if (escape && !quote) {
-		    memcpy(q, s, n = p - s); q += n; s = p;
-		    *q++ = '^';
+		    len += (n = p - s) + 1;
+		    if (q) {
+			memcpy(q, s, n);
+			q += n;
+			*q++ = '^';
+		    }
+		    s = p;
 		    break;
 		}
 	      default:
@@ -933,14 +914,21 @@
 		break;
 	    }
 	}
-	memcpy(q, s, n = p - s);
-	q += n;
-	if (quote) *q++ = '"';
-	*q++ = ' ';
+	len += (n = p - s) + 1;
+	if (quote) len++;
+	if (q) {
+	    memcpy(q, s, n);
+	    q += n;
+	    if (quote) *q++ = '"';
+	    *q++ = ' ';
+	}
     }
-    if (q > cmd) --q;
-    *q = '\0';
-    return cmd;
+    if (q > cmd) --len;
+    if (q) {
+	if (q > cmd) --q;
+	*q = '\0';
+    }
+    return len;
 }
 
 #ifdef HAVE_SYS_PARAM_H
@@ -1204,10 +1192,10 @@
 	char *progs[2];
 	progs[0] = (char *)prog;
 	progs[1] = NULL;
-	len = argv_size(progs, ntcmd);
+	len = join_argv(NULL, progs, ntcmd);
 	if (c_switch) len += 3;
 	else ++argv;
-	if (argv[0]) len += argv_size(argv, ntcmd);
+	if (argv[0]) len += join_argv(NULL, argv, ntcmd);
 	cmd = ALLOCA_N(char, len);
 	join_argv(cmd, progs, ntcmd);
 	if (c_switch) strlcat(cmd, " /c", len);
@@ -1215,7 +1203,7 @@
 	prog = c_switch ? shell : 0;
     }
     else {
-	len = argv_size(argv, FALSE);
+	len = join_argv(NULL, argv, FALSE);
 	cmd = ALLOCA_N(char, len);
 	join_argv(cmd, argv, FALSE);
     }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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