aboutsummaryrefslogtreecommitdiffstats
path: root/pw.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-05-07 15:40:23 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-05-07 15:40:23 -0700
commitb45105b94ee7d712a4d7b2a1c9054fd95e715093 (patch)
tree27ec874399d879d58f8853bb9c48fe1841ee6f79 /pw.c
parent9bca1d12fca1dba3528c67c581ed77a23004ca17 (diff)
downloadpw-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.c198
1 files changed, 99 insertions, 99 deletions
diff --git a/pw.c b/pw.c
index f3c300c..eec33fc 100644
--- a/pw.c
+++ b/pw.c
@@ -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);
}