diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-05-07 15:40:23 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-05-07 15:40:23 -0700 |
commit | b45105b94ee7d712a4d7b2a1c9054fd95e715093 (patch) | |
tree | 27ec874399d879d58f8853bb9c48fe1841ee6f79 /pw.c | |
parent | 9bca1d12fca1dba3528c67c581ed77a23004ca17 (diff) | |
download | pw-b45105b94ee7d712a4d7b2a1c9054fd95e715093.tar.gz pw-b45105b94ee7d712a4d7b2a1c9054fd95e715093.tar.bz2 pw-b45105b94ee7d712a4d7b2a1c9054fd95e715093.zip |
Move trigger setting into execute function.
Diffstat (limited to 'pw.c')
-rw-r--r-- | pw.c | 198 |
1 files changed, 99 insertions, 99 deletions
@@ -88,7 +88,7 @@ typedef enum execode { typedef struct pwstate { char **circbuf; - int nlines; + int nlines, maxlines; int hpos; int vsplit1, vsplit2, vs2pos; int hist; @@ -654,14 +654,15 @@ static int getms(const char *str, char **err) return msec; } -static execode execute(pwstate *pw, const char *cmd, char *resbuf, size_t size) +static execode execute(pwstate *pw, const char *cmd, char *resbuf, + size_t size, int count) { execode res = exec_failed; const char *arg = cmd + 2 + strspn(cmd + 2, " \t"); clrline(0); - switch (cmd[1]) { + if (cmd[0] == ':') switch (cmd[1]) { case 'w': case 'a': if (arg[0] == 0) { snprintf(resbuf, size, "file name required!"); @@ -812,9 +813,62 @@ static execode execute(pwstate *pw, const char *cmd, char *resbuf, size_t size) res = exec_ok; } break; + case 0: + res = exec_ok; + break; default: snprintf(resbuf, size, "bad command"); break; + } else { + int trig = count; + + if (trig < pw->maxlines && trig < maxtrig) + { + const char *rx = cmd + 1; + int inv = 0; + grep *gr = 0; + + if (strncmp(rx, "\\!", 2) == 0) { + rx++; + } else if (rx[0] == '!') { + rx++; + inv = 1; + } + + char *pat = dsdup(rx); + + if (*pat && (gr = grnew(dsref(pat), inv, dsdrop), + grerr(gr) != 0)) + { + grerrstr(gr, resbuf, size); + grfree(gr); + } else { + if ((cmd[0] == '/' && (pw->stat & stat_ttmode)) || + (cmd[0] == '?' && (pw->stat & stat_htmode))) + { + for (int i = 0; i < maxtrig; i++) { + grfree(triglist[i]); + triglist[i] = 0; + } + } + + grfree(triglist[trig]); + triglist[trig] = gr; + res = exec_ok; + } + dsdrop(pat); + } + + if (res == exec_ok) { + pw->stat &= ~(stat_htmode | stat_ttmode); + for (int i = 0; i < maxtrig; i++) { + if (triglist[i]) { + pw->stat |= (cmd[0] == '/' + ? stat_htmode : stat_ttmode); + break; + } + } + } } return res; @@ -875,10 +929,10 @@ void clipsplits(pwstate *pw) int main(int argc, char **argv) { - struct pwstate pw = { .columns = 80 }; + struct pwstate pw = { .columns = 80, .maxlines = 15 }; char *line = 0; FILE *tty = fopen("/dev/tty", "r+"); - int maxlines = 15, maxed = 0; + int maxed = 0; size_t maxlen = 2047; int opt; int ifd = fileno(stdin); @@ -887,7 +941,7 @@ int main(int argc, char **argv) struct winsize ws = { 0 }; enum kbd_state { kbd_cmd, kbd_esc, kbd_bkt, kbd_exit, - kbd_colon, kbd_result, kbd_trig + kbd_lcmd, kbd_result }; int auto_quit = 1; int quit_count = 1, quit_countdown = quit_count; @@ -919,7 +973,7 @@ int main(int argc, char **argv) case 'n': { char *err; - if ((maxlines = getzp(optarg, &err)) < 0) { + if ((pw.maxlines = getzp(optarg, &err)) < 0) { error("-%c option: %s\n", opt, err); return EXIT_FAILURE; } @@ -1040,19 +1094,19 @@ int main(int argc, char **argv) } } - if (maxlines <= 0 || maxlines > 1000) { - error("%d is an unreasonable number of lines to display\n", maxlines); + if (pw.maxlines <= 0 || pw.maxlines > 1000) { + error("%d is an unreasonable number of lines to display\n", pw.maxlines); return EXIT_FAILURE; } - if ((pw.circbuf = calloc(sizeof *pw.circbuf, maxlines)) == 0) + if ((pw.circbuf = calloc(sizeof *pw.circbuf, pw.maxlines)) == 0) panic("out of memory"); - if ((snapshot[0] = calloc(sizeof *snapshot[0], maxlines)) == 0) + if ((snapshot[0] = calloc(sizeof *snapshot[0], pw.maxlines)) == 0) panic("out of memory"); if (ioctl(ttyfd, TIOCGWINSZ, &ws) == 0 && ws.ws_row != 0) { - if (maxlines >= ws.ws_row) { - maxlines = ws.ws_row - 1; + if (pw.maxlines >= ws.ws_row) { + pw.maxlines = ws.ws_row - 1; maxed = 1; } pw.columns = ws.ws_col; @@ -1130,7 +1184,7 @@ int main(int argc, char **argv) } } if (line) { - if (pw.nlines == maxlines) { + if (pw.nlines == pw.maxlines) { int trig = 0; dsdrop(pw.circbuf[0]); memmove(pw.circbuf, pw.circbuf + 1, @@ -1196,24 +1250,24 @@ int main(int argc, char **argv) if (ioctl(ttyfd, TIOCGWINSZ, &ws) == 0) { if (maxed) { pw.hist = 0; - pw.circbuf = resizebuf(pw.circbuf, maxlines, ws.ws_row - 1); - snapshot[0] = resizebuf(snapshot[0], maxlines, ws.ws_row - 1); + pw.circbuf = resizebuf(pw.circbuf, pw.maxlines, ws.ws_row - 1); + snapshot[0] = resizebuf(snapshot[0], pw.maxlines, ws.ws_row - 1); for (int i = 1; i < snhistsize; i++) { freebuf(snapshot[i], snaplines[i]); free(snapshot[i]); snapshot[i] = 0; } } else { - if (maxlines >= ws.ws_row) { - maxlines = ws.ws_row - 1; + if (pw.maxlines >= ws.ws_row) { + pw.maxlines = ws.ws_row - 1; maxed = 1; } } - if (pw.nlines > maxlines) - pw.nlines = maxlines; - if (snaplines[0] > maxlines) - snaplines[0] = maxlines; + if (pw.nlines > pw.maxlines) + pw.nlines = pw.maxlines; + if (snaplines[0] > pw.maxlines) + snaplines[0] = pw.maxlines; pw.columns = ws.ws_col; @@ -1262,7 +1316,7 @@ int main(int argc, char **argv) gettimeofday(&tv, NULL); now = tv.tv_sec % 1000000 * 1000 + tv.tv_usec / 1000; if (lasttime == -1 || now - lasttime > long_interval) { - if ((pw.stat & stat_dirty) && pw.nlines == maxlines) + if ((pw.stat & stat_dirty) && pw.nlines == pw.maxlines) force = 1; lasttime = now; } @@ -1274,7 +1328,7 @@ int main(int argc, char **argv) if (poll(pe, nfds, pollms) <= 0) { if (pollms) { - if ((pw.stat & stat_dirty) && pw.nlines == maxlines) + if ((pw.stat & stat_dirty) && pw.nlines == pw.maxlines) redraw(&pw); if (kbd_state == kbd_esc) { kbd_state = kbd_cmd; @@ -1404,15 +1458,8 @@ int main(int argc, char **argv) kbd_prev = kbd_state; kbd_state = kbd_esc; break; - case ':': - kbd_state = kbd_colon; - histpos = 0; - pw.cmdbuf[0] = ch; - pw.cmdbuf[1] = 0; - pw.curcmd = pw.cmdbuf; - break; - case '/': case '?': - kbd_state = kbd_trig; + case ':': case '/': case '?': + kbd_state = kbd_lcmd; histpos = 0; pw.cmdbuf[0] = ch; pw.cmdbuf[1] = 0; @@ -1447,20 +1494,20 @@ int main(int argc, char **argv) } break; case '+': - if (pw.hist > 0 || (ws.ws_row && maxlines >= ws.ws_row - 1)) { + if (pw.hist > 0 || (ws.ws_row && pw.maxlines >= ws.ws_row - 1)) { break; } else { int count = (cmdcount == INT_MAX) ? 1 : cmdcount; - maxlines += count; + pw.maxlines += count; - if (maxlines >= ws.ws_row - 1) { + if (pw.maxlines >= ws.ws_row - 1) { maxed = 1; - maxlines = ws.ws_row - 1; + pw.maxlines = ws.ws_row - 1; } - pw.circbuf = resizebuf(pw.circbuf, maxlines, maxlines + 1); - snapshot[0] = resizebuf(snapshot[0], maxlines, maxlines + 1); + pw.circbuf = resizebuf(pw.circbuf, pw.maxlines, pw.maxlines + 1); + snapshot[0] = resizebuf(snapshot[0], pw.maxlines, pw.maxlines + 1); for (int i = 1; i < snhistsize; i++) { freebuf(snapshot[i], snaplines[i]); free(snapshot[i]); @@ -1551,8 +1598,7 @@ int main(int argc, char **argv) goto fakecmd; } break; - case kbd_trig: - case kbd_colon: + case kbd_lcmd: switch (ch) { case ESC: kbd_prev = kbd_state; @@ -1560,12 +1606,12 @@ int main(int argc, char **argv) break; case CR: case ctrl('c'): if (ch == CR) { - int trig = (cmdcount == INT_MAX || cmdcount == 0 + int count = (cmdcount == INT_MAX || cmdcount == 0 ? 0 : cmdcount - 1); if (pw.cmdbuf[1]) { - int *pnhist = (kbd_state == kbd_colon ? &ncmdhist : &npathist); + int *pnhist = (kbd_state == kbd_lcmd ? &ncmdhist : &npathist); int nhist = *pnhist; - char ***hist = (kbd_state == kbd_colon ? + char ***hist = (kbd_state == kbd_lcmd ? &cmdhist : &pathist); if (nhist == 0 || strcmp(pw.cmdbuf, (*hist)[0]) != 0) { @@ -1577,59 +1623,13 @@ int main(int argc, char **argv) } } - if (kbd_state == kbd_colon && pw.cmdbuf[1]) { - if (execute(&pw, pw.cmdbuf, pw.cmdbuf, cmdsize) != exec_ok) { - kbd_state = kbd_result; - break; - } - } else if (kbd_state == kbd_trig && - (int) trig < maxlines && trig < maxtrig) + if (execute(&pw, pw.cmdbuf, pw.cmdbuf, + cmdsize, count) != exec_ok) { - char *rx = pw.cmdbuf + 1; - int inv = 0; - grep *gr = 0; - - if (strncmp(rx, "\\!", 2) == 0) { - rx++; - } else if (rx[0] == '!') { - rx++; - inv = 1; - } - - char *pat = dsdup(rx); - - if (*pat && (gr = grnew(dsref(pat), inv, dsdrop), - grerr(gr) != 0)) - { - grerrstr(gr, pw.cmdbuf, - min(pw.columns, (int) sizeof pw.cmdbuf)); - grfree(gr); - kbd_state = kbd_result; - } else { - if ((pw.cmdbuf[0] == '/' && (pw.stat & stat_ttmode)) || - (pw.cmdbuf[0] == '?' && (pw.stat & stat_htmode))) - { - for (int i = 0; i < maxtrig; i++) { - grfree(triglist[i]); - triglist[i] = 0; - } - } - - grfree(triglist[trig]); - triglist[trig] = gr; - } - dsdrop(pat); - } - - if (kbd_state == kbd_trig) { - pw.stat &= ~(stat_htmode | stat_ttmode); - for (int i = 0; i < maxtrig; i++) { - if (triglist[i]) { - pw.stat |= (pw.cmdbuf[0] == '/' - ? stat_htmode : stat_ttmode); - break; - } - } + if (pw.columns < cmdsize) + pw.cmdbuf[pw.columns] = 0; + kbd_state = kbd_result; + break; } } @@ -1666,8 +1666,8 @@ int main(int argc, char **argv) case ctrl('p'): case ctrl('n'): { - int nhist = (kbd_state == kbd_colon ? ncmdhist : npathist); - char ***hist = (kbd_state == kbd_colon ? &cmdhist : &pathist); + int nhist = (kbd_state == kbd_lcmd ? ncmdhist : npathist); + char ***hist = (kbd_state == kbd_lcmd ? &cmdhist : &pathist); if (ch == ctrl('p')) { if (histpos == 0) { @@ -1717,7 +1717,7 @@ int main(int argc, char **argv) if ((pw.stat & (stat_dirty | stat_force))) { redraw(&pw); } else switch (kbd_state) { - case kbd_colon: case kbd_trig: case kbd_result: case kbd_cmd: + case kbd_lcmd: case kbd_result: case kbd_cmd: clrline(pw.stat); drawstatus(&pw); } |