Split command expansion functionality from execsh() for reuse in the
read and write commands. Adjust getfname() to leave the command in the
input buffer for extraction by the new expandcmd().
---
ed.c | 95 +++++++++++++++++++++++++++++++++---------------------------
1 file changed, 52 insertions(+), 43 deletions(-)
diff --git a/ed.c b/ed.c
index fa1b758..59101d3 100644
--- a/ed.c
+++ b/ed.c
@@ -751,6 +751,51 @@ chksignals(void)
}
}
+static const char *
+expandcmd(void)
+{
+ static String cmd;
+ char *p;
+ int c, repl = 0;
+
+ skipblank();
+ if ((c = input()) != '!') {
+ back(c);
+ string(&cmd);
+ } else if (cmd.siz) {
+ --cmd.siz;
+ repl = 1;
+ } else {
+ error("no previous command");
+ }
+
+ while ((c = input()) != '\0') {
+ switch (c) {
+ case '%':
+ if (savfname[0] == '\0')
+ error("no current filename");
+ repl = 1;
+ for (p = savfname; *p; ++p)
+ addchar(*p, &cmd);
+ break;
+ case '\\':
+ c = input();
+ if (c != '%') {
+ back(c);
+ c = '\\';
+ }
+ default:
+ addchar(c, &cmd);
+ }
+ }
+ addchar('\0', &cmd);
+
+ if (repl)
+ puts(cmd.str);
+
+ return cmd.str;
+}
+
static void
dowrite(const char *fname, int trunc)
{
@@ -768,8 +813,7 @@ dowrite(const char *fname, int trunc)
if(fname[0] == '!') {
sh = 1;
- fname++;
- if((fp = popen(fname, "w")) == NULL)
+ if((fp = popen(expandcmd(), "w")) == NULL)
error("bad exec");
} else {
sh = 0;
@@ -822,8 +866,7 @@ doread(const char *fname)
if(fname[0] == '!') {
sh = 1;
- fname++;
- if((fp = popen(fname, "r")) == NULL)
+ if((fp = popen(expandcmd(), "r")) == NULL)
error("bad exec");
} else if ((fp = fopen(fname, "r")) == NULL) {
error("cannot open input file");
@@ -931,6 +974,10 @@ getfname(int comm)
static char fname[FILENAME_MAX];
skipblank();
+ if ((c = input()) == '!') {
+ return strcpy(fname, "!");
+ }
+ back(c);
for (bp = fname; bp < &fname[FILENAME_MAX]; *bp++ = c) {
if ((c = input()) == '\0')
break;
@@ -1076,45 +1123,7 @@ copy(int where)
static void
execsh(void)
{
- static String cmd;
- char *p;
- int c, repl = 0;
-
- skipblank();
- if ((c = input()) != '!') {
- back(c);
- string(&cmd);
- } else if (cmd.siz) {
- --cmd.siz;
- repl = 1;
- } else {
- error("no previous command");
- }
-
- while ((c = input()) != '\0') {
- switch (c) {
- case '%':
- if (savfname[0] == '\0')
- error("no current filename");
- repl = 1;
- for (p = savfname; *p; ++p)
- addchar(*p, &cmd);
- break;
- case '\\':
- c = input();
- if (c != '%') {
- back(c);
- c = '\\';
- }
- default:
- addchar(c, &cmd);
- }
- }
- addchar('\0', &cmd);
-
- if (repl)
- puts(cmd.str);
- system(cmd.str);
+ system(expandcmd());
if (optdiag)
puts("!");
}
--
2.42.0