diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-05-07 15:10:39 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-05-07 15:10:39 -0700 |
commit | b36ee5ceeb5ab953690fd6d48c5959e3f29f5e2c (patch) | |
tree | 6b0704311c663ee5db820be6d1a66aacbe66c839 | |
parent | a9484ec7c9e91a28d13db7351f5db6970433a857 (diff) | |
download | pw-b36ee5ceeb5ab953690fd6d48c5959e3f29f5e2c.tar.gz pw-b36ee5ceeb5ab953690fd6d48c5959e3f29f5e2c.tar.bz2 pw-b36ee5ceeb5ab953690fd6d48c5959e3f29f5e2c.zip |
Change execute function's interface.
-rw-r--r-- | pw.c | 97 |
1 files changed, 57 insertions, 40 deletions
@@ -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; } |