[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00145] Re: %M expansion



 しらいです。

In Message-Id <86of324qm8.wl%knu@iDaemons.org>
        "Akinori MUSHA" <knu@iDaemons.org>さんwrites:
>  適当なファイルにカーソルを置いた状態で、 h を押して
> 
> 	echo hello > hello-%M
> 
> を実行すると、「hello-\377\202」というファイルに出力されます。

 同様な現象が %T でも起こっていたと思います。あと、redirect
以外の箇所では、関数定義の中身とか shell 変数展開の ${:?} の
後半部とか、要するに command の引数以外の様々な箇所で生じて
いた筈です。
 取り敢えず、redirect に関しては下記 patch で直るかと思いま
すが、それ以外の箇所に関してはどういう仕様にすべきなのか検討
中ですので、暫くお待ち下さい。

 因みに redirect に用いた場合、
	%T -> 空文字列に
	%M -> マークファイルの回数分だけループ
という仕様にしてあります。利用者の意図するところと一致するか
否かは疑問ですが、全く不自然な仕様でもないと思います。
 但し、一行の中に複数の %T, %M を記述した場合の挙動について
は、本家『FD』でも対応出来ていないようで、FDclone の仕様で
も期待通りの挙動を示しているかどうかは判りません。構文構造に
より微妙に挙動が異なることになるので、色々試してみて下さい。

---- Cut Here ----
diff -u ../old/FD-2.03a/shell.c ./shell.c
--- ../old/FD-2.03a/shell.c	Tue Apr 15 00:00:00 2003
+++ ./shell.c	Tue Apr 22 00:00:00 2003
@@ -752,6 +752,11 @@
 	*argcp = argc = argc2;
 	*argvp = argv = argv2;
 
+	if (iscomm < 0) {
+		free(buf);
+		return(ret);
+	}
+
 	min = -1;
 	for (next = lastptr; next < maxfile; next++)
 	if (isarg(&(filelist[next]))) {
@@ -767,7 +772,7 @@
 			if (!isneedmark(argv[n], i)) buf[j++] = argv[n][i];
 			else {
 				flags = argv[n][++i];
-				cp = (iscomm < 0 || n) ? arg : NULL;
+				cp = (!env || n) ? arg : NULL;
 				if (min >= 0 && next < maxfile) ret++;
 
 				len = setarg(&buf, j, &size, NULL, cp, flags);
diff -u ../old/FD-2.03a/system.c ./system.c
--- ../old/FD-2.03a/system.c	Tue Apr 15 00:00:00 2003
+++ ./system.c	Tue Apr 22 00:00:00 2003
@@ -3926,7 +3926,11 @@
 	char *tmp;
 	int type;
 
-	if (rp -> next && (errp = doredirect(rp -> next))) return(errp);
+	rp -> type &= ~MD_REST;
+	if (rp -> next) {
+		if ((errp = doredirect(rp -> next))) return(errp);
+		if (((rp -> next) -> type) & MD_REST) rp -> type |= MD_REST;
+	}
 
 	type = rp -> type;
 	if (!(rp -> filename)) tmp = NULL;
@@ -3940,6 +3944,25 @@
 		tmp = NULL;
 		type &= ~MD_FILEDESC;
 	}
+#ifdef	FD
+	else {
+		char **argv;
+		int n, argc;
+
+		argv = (char **)malloc2(2 * sizeof(char *));
+		argv[0] = tmp;
+		argv[1] = NULL;
+		argc = 1;
+		n = replaceargs(&argc, &argv, NULL, 0);
+		tmp = argv[0];
+		free(argv);
+		if (n < 0) {
+			free(tmp);
+			return(rp);
+		}
+		if (n) rp -> type |= MD_REST;
+	}
+#endif	/* FD */
 
 	if (!tmp);
 	else if (type & MD_HEREDOC) {
@@ -7230,7 +7253,6 @@
 		}
 		else for (i = 0; i < argc; i++) stripquote(argv[i], 1);
 #ifdef	FD
-		replaceargs(NULL, NULL, NULL, 0);
 		if (replaceargs(&argc, &argv, NULL, -1) < 0) {
 			freevar(argv);
 			return(-1);
@@ -9558,9 +9580,6 @@
 		fflush(stderr);
 	}
 
-#ifdef	FD
-	replaceargs(NULL, NULL, NULL, 0);
-#endif
 	for (;;) {
 #ifdef	FD
 		char **dupargv;
@@ -9806,6 +9825,10 @@
 		return(-1);
 #endif
 
+#ifdef	FD
+	replaceargs(NULL, NULL, NULL, 0);
+#endif
+
 	if (!(trp -> comm) || pipein > 0L) {
 #if	!MSDOS && !defined (NOJOB)
 		if (pipein > 0L) stackjob(pipein, 0, trp);
@@ -9822,7 +9845,7 @@
 #endif
 		ret_status = (ret >= 0) ? ret : RET_FAIL;
 	}
-	else {
+	else for (;;) {
 		if (!(errp = doredirect((trp -> comm) -> redp)))
 #if	MSDOS || defined (USEFAKEPIPE)
 			ret = exec_process(trp);
@@ -9854,6 +9877,11 @@
 		}
 		closeredirect((trp -> comm) -> redp);
 		ret_status = (ret >= 0) ? ret : RET_FAIL;
+#ifdef	FD
+		if (!errp && ((trp -> comm) -> redp) -> type & MD_REST)
+			continue;
+#endif
+		break;
 	}
 	trp = tmptr;
 
diff -u ../old/FD-2.03a/system.h ./system.h
--- ../old/FD-2.03a/system.h	Tue Apr 15 00:00:00 2003
+++ ./system.h	Tue Apr 22 00:00:00 2003
@@ -185,6 +185,7 @@
 #define	MD_WITHERR	0020
 #define	MD_HEREDOC	0040
 #define	MD_FORCED	0100
+#define	MD_REST		0200
 
 typedef struct _command_t {
 	hashlist *hash;
---- Cut Here ----

                                               しらい たかし