[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00145] Re: %M expansion
- Subject: [FDclone-users:00145] Re: %M expansion
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Tue, 22 Apr 2003 22:09:12 +0900
しらいです。
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 ----
しらい たかし