aboutsummaryrefslogtreecommitdiffstats
path: root/pw.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-04-30 13:23:56 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-04-30 13:23:56 -0700
commit76d200dd7f1266bb274d5d792d7645b456bc581a (patch)
tree4ae9ada2b9ca207754d50f740d5f4f7489449a4a /pw.c
parenta8983b3aa2ba431f58466bb205add96de7284f4f (diff)
downloadpw-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.c52
1 files changed, 32 insertions, 20 deletions
diff --git a/pw.c b/pw.c
index a949617..4c25464 100644
--- a/pw.c
+++ b/pw.c
@@ -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(&regex);
- 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;
}