[#11952] NORETURN — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

24 messages 2001/01/10
[#11956] Re: NORETURN — WATANABE Hirofumi <eban@...> 2001/01/10

わたなべです.

[#11957] Re: NORETURN — matz@... (Yukihiro Matsumoto) 2001/01/10

まつもと ゆきひろです

[#11958] Re: NORETURN — WATANABE Hirofumi <eban@...> 2001/01/10

わたなべです.

[#11959] CVS branches (Re: Re: NORETURN) — matz@... (Yukihiro Matsumoto) 2001/01/10

[#12087] string#index, gsub, []= のバグ? — Beyond <beyond@...>

18 messages 2001/01/27
[#12091] Re: string#index, gsub, []= のバグ? — matz@... (Yukihiro Matsumoto) 2001/01/27

まつもと ゆきひろです

[ruby-dev:11988] [PATCH] mswin32 system problem

From: "U.Nakamura" <usa@...>
Date: 2001-01-11 20:39:18 UTC
List: ruby-dev #11988
こんにちは、なかむら(う)です。

[ruby-list:27090] の問題を(ある程度)解消するパッチです。

Windows2000 の cmd.exe での " の扱いはちょっと面白いですね。
  C:\>d"i"r
とすると dir.exe を実行するとか。
command.exe はどうなのかなぁ? (いま手元にない)
# このパッチではそこまでは再現してません。

あと、[ruby-list:26930] のパッチも含んでいます。
悪い副作用はないと思っているんですが、どうでしょう?


--- current/win32/win32.c	Thu Dec 28 15:47:18 2000
+++ mytree/win32/win32.c	Fri Jan 12 05:27:20 2001
@@ -357,7 +357,7 @@ isInternalCmd(char *cmd)
         int vecc = NtMakeCmdVector(cmd, &vec, FALSE);
 
         for( i = 0; szInternalCmds[i] ; i++){
-	    if(!strcmp(szInternalCmds[i], vec[0])){
+	    if(!strcasecmp(szInternalCmds[i], vec[0])){
 		fRet = 1;
 		break;
 	    }
@@ -735,6 +735,8 @@ char *cmd;
     int status = -1;
     char *shell, *cmd2;
     int mode = NtSyncProcess ? P_WAIT : P_NOWAIT;
+    char quote;
+    char *exec;
 
     /* save an extra exec if possible */
     if ((shell = getenv("RUBYSHELL")) != 0) {
@@ -778,20 +780,46 @@ char *cmd;
     a = argv;
     for (s = cmd2; *s;) {
 	while (*s && isspace(*s)) s++;
-	if (*s)
+	if (*s == '"') {
+	    quote = *s;
+	    *(a++) = s++;
+	    while (*s) {
+		if (*s == '\\' && *(s + 1) == quote) {
+		    memmove(s, s + 1, strlen(s) + 1);
+		    s++;
+		}
+		else if (*s == quote) {
+		    s++;
+		    break;
+		}
+		s++;
+	    }
+	}
+	else if (*s) {
 	    *(a++) = s;
-	while (*s && !isspace(*s)) s++;
+	    while (*s && !isspace(*s)) s++;
+	}
 	if (*s)
 	    *s++ = '\0';
     }
     *a = NULL;
     if (argv[0]) {
-	if ((status = spawnvpe(mode, argv[0], argv, environ)) == -1) {
+	exec = ALLOC_N(char, (strlen(argv[0]) + 1));
+	if (argv[0][0] == '"' && argv[0][strlen(argv[0]) - 1] == '"') {
+	    strcpy(exec, &argv[0][1]);
+	    exec[strlen(exec) - 1] = '\0';
+	}
+	else {
+	    strcpy(exec, argv[0]);
+	}
+	if ((status = spawnvpe(mode, exec, argv, environ)) == -1) {
+	    free(exec);
 	    free(argv);
 	    free(cmd2);
 	    return -1;
 	}
     }
+    free(exec);
     free(cmd2);
     free(argv);
     return (int)((status & 0xff) << 8);


それでは。

--
U.Nakamura <usa@osb.att.ne.jp>

In This Thread

Prev Next