aboutsummaryrefslogtreecommitdiffstats
path: root/pw.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-05-07 15:10:39 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-05-07 15:10:39 -0700
commitb36ee5ceeb5ab953690fd6d48c5959e3f29f5e2c (patch)
tree6b0704311c663ee5db820be6d1a66aacbe66c839 /pw.c
parenta9484ec7c9e91a28d13db7351f5db6970433a857 (diff)
downloadpw-b36ee5ceeb5ab953690fd6d48c5959e3f29f5e2c.tar.gz
pw-b36ee5ceeb5ab953690fd6d48c5959e3f29f5e2c.tar.bz2
pw-b36ee5ceeb5ab953690fd6d48c5959e3f29f5e2c.zip
Change execute function's interface.
Diffstat (limited to 'pw.c')
-rw-r--r--pw.c97
1 files changed, 57 insertions, 40 deletions
diff --git a/pw.c b/pw.c
index 260a07d..f270587 100644
--- a/pw.c
+++ b/pw.c
@@ -82,6 +82,10 @@ enum status_flags {
stat_oneshot = 0x0800, // running in the background
};
+typedef enum execode {
+ exec_ok, exec_msg, exec_failed
+} execode;
+
typedef struct pwstate {
char **circbuf;
int nlines;
@@ -205,7 +209,7 @@ static char *dsensure(char *str)
return dsgrow(0, 0);
}
-static char *dsdup(char *str)
+static char *dsdup(const char *str)
{
size_t len = strlen(str);
char *copy = dsgrow(0, len);
@@ -650,63 +654,64 @@ static int getms(const char *str, char **err)
return msec;
}
-static void execute(pwstate *pw, char *cmd)
+static execode execute(pwstate *pw, const char *cmd, char *resbuf, size_t size)
{
- char *arg = cmd + 2 + strspn(cmd + 2, " \t");
+ execode res = exec_failed;
+ const char *arg = cmd + 2 + strspn(cmd + 2, " \t");
clrline(0);
- cmd[0] = 0;
switch (cmd[1]) {
case 'w': case 'a':
if (arg[0] == 0) {
- sprintf(cmd, "file name required!");
+ snprintf(resbuf, size, "file name required!");
break;
} else {
FILE *f = fopen(arg, cmd[1] == 'w' ? "w" : "a");
- int ok = 1;
if (!f) {
- sprintf(cmd, "unable to open file");
+ snprintf(resbuf, size, "unable to open file");
break;
}
- for (int i = 0; ok && i < snaplines[pw->hist]; i++)
+ res = exec_msg;
+
+ for (int i = 0; res == exec_msg && i < snaplines[pw->hist]; i++)
if (fprintf(f, "%s\n", snapshot[pw->hist][i]) < 0) {
- sprintf(cmd, "write error!");
- ok = 0;
+ snprintf(resbuf, size, "write error!");
+ res = exec_failed;
break;
}
fclose(f);
- if (ok)
- sprintf(cmd, "saved!");
+ if (res == exec_msg)
+ snprintf(resbuf, size, "saved!");
}
break;
case '!':
if (arg[0] == 0) {
- sprintf(cmd, "command required!");
+ snprintf(resbuf, size, "command required!");
break;
} else {
FILE *p = popen(arg, "w");
- int ok = 1;
if (!p) {
- sprintf(cmd, "unable to open command");
- fflush(stdout);
+ snprintf(resbuf, size, "unable to open command");
break;
}
- for (int i = 0; i < snaplines[pw->hist] && ok; i++)
+ res = exec_msg;
+
+ for (int i = 0; i < snaplines[pw->hist] && res == exec_msg; i++)
if (fprintf(p, "%s\n", snapshot[pw->hist][i]) < 0) {
- sprintf(cmd, "write error!");
- ok = 0;
+ snprintf(resbuf, size, "write error!");
+ res = exec_failed;
break;
}
pclose(p);
- if (ok)
- sprintf(cmd, "piped!");
+ if (res == exec_msg)
+ snprintf(resbuf, size, "piped!");
}
break;
case 'g':
@@ -715,23 +720,25 @@ static void execute(pwstate *pw, char *cmd)
grep *gr = &grepstack[ngrep];
if (arg[0] == 0) {
- sprintf(cmd, "pattern required!");
+ snprintf(resbuf, size, "pattern required!");
break;
}
if (ngrep >= maxgrep) {
- sprintf(cmd, "too many greps");
+ snprintf(resbuf, size, "too many greps");
break;
}
if ((grinit(gr, dsdup(arg), cmd[1] == 'v', dsdrop)) != 0) {
- grerrstr(gr, cmd, cmdsize);
+ grerrstr(gr, resbuf, size);
grclean(gr);
break;
}
if (ngrep++ == 0)
pw->stat |= stat_grep;
+
+ res = exec_ok;
}
break;
case 'r':
@@ -744,27 +751,34 @@ static void execute(pwstate *pw, char *cmd)
}
if (ngrep == 0)
pw->stat &= ~stat_grep;
+ res = exec_ok;
break;
case 'i': case 'l':
{
char *err = 0;
int interval = getms(arg, &err);
- if (interval < 0)
- snprintf(cmd, cmdsize, "%s", err);
- else if (cmd[1] == 'i')
+ if (interval < 0) {
+ snprintf(resbuf, size, "%s", err);
+ break;
+ }
+
+ if (cmd[1] == 'i')
poll_interval = interval;
else
long_interval = interval;
dsdrop(err);
+ res = exec_ok;
}
break;
case 'E':
regex_flags = REG_EXTENDED;
+ res = exec_ok;
break;
case 'B':
regex_flags = 0;
+ res = exec_ok;
break;
case 'c':
if (arg[0] == 0) {
@@ -772,34 +786,38 @@ static void execute(pwstate *pw, char *cmd)
} else {
char *err = 0;
int val = getznn(arg, &err);
- if (val < 0)
- snprintf(cmd, cmdsize, "bad trigger count: %s", err);
- else
- sncount = val;
+ if (val < 0) {
+ snprintf(resbuf, size, "bad trigger count: %s", err);
+ break;
+ }
+ sncount = val;
dsdrop(err);
+ res = exec_ok;
}
break;
case 'f':
if (arg[0] == 0) {
- sprintf(cmd, "frequency argument required!");
+ snprintf(resbuf, size, "frequency argument required!");
break;
}
{
char *err = 0;
int val = getznn(arg, &err);
- if (val < 0)
- snprintf(cmd, cmdsize, "bad trigger freq: %s", err);
- else
- tfreq = val;
+ if (val < 0) {
+ snprintf(resbuf, size, "bad trigger freq: %s", err);
+ break;
+ }
+ tfreq = val;
dsdrop(err);
+ res = exec_ok;
}
break;
default:
- sprintf(cmd, "bad command");
+ snprintf(resbuf, size, "bad command");
break;
}
- fflush(stdout);
+ return res;
}
static void ttyset(int fd, struct termios *tty)
@@ -1560,8 +1578,7 @@ int main(int argc, char **argv)
}
if (kbd_state == kbd_colon && pw.cmdbuf[1]) {
- execute(&pw, pw.cmdbuf);
- if (pw.cmdbuf[0] != 0) {
+ if (execute(&pw, pw.cmdbuf, pw.cmdbuf, cmdsize) != exec_ok) {
kbd_state = kbd_result;
break;
}