diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-04-30 13:23:56 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-04-30 13:23:56 -0700 |
commit | 76d200dd7f1266bb274d5d792d7645b456bc581a (patch) | |
tree | 4ae9ada2b9ca207754d50f740d5f4f7489449a4a /pw.c | |
parent | a8983b3aa2ba431f58466bb205add96de7284f4f (diff) | |
download | pw-76d200dd7f1266bb274d5d792d7645b456bc581a.tar.gz pw-76d200dd7f1266bb274d5d792d7645b456bc581a.tar.bz2 pw-76d200dd7f1266bb274d5d792d7645b456bc581a.zip |
Triggers: switch implementation to grep structs.
Diffstat (limited to 'pw.c')
-rw-r--r-- | pw.c | 52 |
1 files changed, 32 insertions, 20 deletions
@@ -51,6 +51,7 @@ typedef struct grep { #define cmdsize 256 #define maxgrep 64 +#define maxtrig 100 typedef struct dstr { int refs; @@ -67,13 +68,11 @@ static int regex_flags = 0; static char **snapshot; static int snaplines; -#define maxtrig 100 -static char *trigpat[maxtrig]; -static regex_t trigex[maxtrig]; - static grep grepstack[maxgrep]; static int ngrep; +static grep *triglist[maxtrig]; + static char **cmdhist; static unsigned ncmdhist; @@ -304,12 +303,13 @@ static void drawstatus(int columns, unsigned stat, char *cmd) ptr += snprintf(ptr, end - ptr, "TRIG%c (", (stat & stat_htmode) ? '/' : '?'); for (int i = 0, first = 1; i < maxtrig; i++) { - if (trigpat[i]) { + grep *gr = triglist[i]; + if (gr) { if (!first) ptr += snprintf(ptr, end - ptr, ", "); if (i > 0) ptr += snprintf(ptr, end - ptr, "[%d]", i + 1); - ptr += snprintf(ptr, end - ptr, "%s", trigpat[i]); + ptr += snprintf(ptr, end - ptr, "%s", gr->pat); first = 0; } } @@ -739,17 +739,20 @@ int main(int argc, char **argv) if ((stat & stat_ttmode)) { int lim = min(maxtrig, nlines); int trig = 1; - for (int i = 0; i < lim; i++) - if (trigpat[i] && regexec(&trigex[i], circbuf[i], 0, NULL, 0) != 0) { + for (int i = 0; i < lim; i++) { + grep *gr = triglist[i]; + if (gr && regexec(&gr->rx, circbuf[i], 0, NULL, 0) != 0) { trig = 0; break; } + } if (trig) stat |= stat_trgrd; } else if ((stat & stat_htmode)) { int trig = 1; for (int j = nlines - 1, i = 0; j >= 0 && i < maxtrig; j--, i++) { - if (trigpat[i] && regexec(&trigex[i], circbuf[j], 0, NULL, 0) != 0) { + grep *gr = triglist[i]; + if (gr && regexec(&gr->rx, circbuf[j], 0, NULL, 0) != 0) { trig = 0; break; } @@ -1018,24 +1021,33 @@ int main(int argc, char **argv) (cmdbuf[0] == '?' && (stat & stat_htmode))) { for (int i = 0; i < maxtrig; i++) { - if (trigpat[i]) { - regfree(&trigex[i]); - dsdrop(trigpat[i]); - trigpat[i] = 0; + grep *gr = triglist[i]; + if (gr) { + regfree(&gr->rx); + dsdrop(gr->pat); + free(gr); + triglist[i] = 0; } } } - if (trigpat[trig]) { - regfree(&trigex[trig]); - dsdrop(trigpat[trig]); - trigpat[trig] = 0; + { + grep *gr = triglist[trig]; + + if (gr) { + regfree(&gr->rx); + dsdrop(gr->pat); + } + triglist[trig] = 0; } if (*pat) { + grep *gr = malloc(sizeof *gr); regfree(®ex); - regcomp(&trigex[trig], pat, regex_flags | REG_NOSUB); - trigpat[trig] = dsdup(pat); + regcomp(&gr->rx, pat, regex_flags | REG_NOSUB); + gr->pat = dsdup(pat); + gr->inv = 0; + triglist[trig] = gr; } } dsdrop(pat); @@ -1044,7 +1056,7 @@ int main(int argc, char **argv) if (kbd_state == kbd_trig) { stat &= ~(stat_htmode | stat_ttmode); for (int i = 0; i < maxtrig; i++) { - if (trigpat[i]) { + if (triglist[i]) { stat |= (cmdbuf[0] == '/' ? stat_htmode : stat_ttmode); break; } |