diff options
Diffstat (limited to 'pw.c')
-rw-r--r-- | pw.c | 34 |
1 files changed, 25 insertions, 9 deletions
@@ -314,7 +314,7 @@ static void drawstatus(unsigned hist, int columns, unsigned stat, char *cmd) ptr += snprintf(ptr, end - ptr, ", "); if (i > 0) ptr += snprintf(ptr, end - ptr, "[%d]", i + 1); - ptr += snprintf(ptr, end - ptr, "%s", gr->pat); + ptr += snprintf(ptr, end - ptr, "%s%s", gr->inv ? "!" : "", gr->pat); first = 0; } } @@ -758,9 +758,12 @@ int main(int argc, char **argv) int trig = 1; 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 (gr) { + int match = regexec(&gr->rx, circbuf[i], 0, NULL, 0) == 0; + if (match == gr->inv) { + trig = 0; + break; + } } } if (trig) @@ -769,9 +772,12 @@ int main(int argc, char **argv) int trig = 1; for (int j = nlines - 1, i = 0; j >= 0 && i < maxtrig; j--, i++) { grep *gr = triglist[i]; - if (gr && regexec(&gr->rx, circbuf[j], 0, NULL, 0) != 0) { - trig = 0; - break; + if (gr) { + int match = regexec(&gr->rx, circbuf[j], 0, NULL, 0) == 0; + if (match == gr->inv) { + trig = 0; + break; + } } } if (trig) @@ -1083,9 +1089,19 @@ int main(int argc, char **argv) } } else if (kbd_state == kbd_trig && (int) trig < maxlines && trig < maxtrig) { int err; - char *pat = dsdup(cmdbuf + 1); + char *rx = cmdbuf + 1; + int inv = 0; regex_t regex; + if (strncmp(rx, "\\!", 2) == 0) { + rx++; + } else if (rx[0] == '!') { + rx++; + inv = 1; + } + + char *pat = dsdup(rx); + if (*pat && (err = regcomp(®ex, pat, regex_flags | REG_NOSUB))) { regerror(err, ®ex, cmdbuf, sizeof cmdbuf); if (columns < (int) sizeof cmdbuf - 1) @@ -1121,7 +1137,7 @@ int main(int argc, char **argv) regfree(®ex); regcomp(&gr->rx, pat, regex_flags | REG_NOSUB); gr->pat = dsdup(pat); - gr->inv = 0; + gr->inv = inv; triglist[trig] = gr; } } |