commit 05b99639cceb8d40d8d81c6d42993c273a5040cf
parent 36de02e0658d7ddbf7d63879c812864d984e66a9
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Sun, 31 Mar 2019 13:39:04 +0200
compile all regexes at startup and show an error on failed compilation
Diffstat:
M | noice.c | | | 37 | +++++++++++++++++++++++++------------ |
1 file changed, 25 insertions(+), 12 deletions(-)
diff --git a/noice.c b/noice.c
@@ -45,6 +45,7 @@ struct assoc {
char *regex; /* Regex to match on filename */
char *file;
char *argv[NR_ARGS];
+ regex_t regcomp;
};
struct cpair {
@@ -246,23 +247,16 @@ xgetenv(char *name, char *fallback)
struct assoc *
openwith(char *file)
{
- regex_t regex;
- struct assoc *assoc = NULL;
int i;
for (i = 0; i < LEN(assocs); i++) {
- if (regcomp(®ex, assocs[i].regex,
- REG_NOSUB | REG_EXTENDED | REG_ICASE) != 0)
- continue;
- if (regexec(®ex, file, 0, NULL, 0) == 0) {
- assoc = &assocs[i];
- regfree(®ex);
- break;
+ if (regexec(&assocs[i].regcomp, file, 0, NULL, 0) == 0) {
+ DPRINTF_S(assocs[i].argv[0]);
+ return &assocs[i];
}
- regfree(®ex);
}
- DPRINTF_S(assoc->argv[0]);
- return assoc;
+
+ return NULL;
}
int
@@ -911,6 +905,24 @@ usage(char *argv0)
exit(1);
}
+void
+initassocs(void)
+{
+ char errbuf[256];
+ int i, r;
+
+ for (i = 0; i < LEN(assocs); i++) {
+ r = regcomp(&assocs[i].regcomp, assocs[i].regex,
+ REG_NOSUB | REG_EXTENDED | REG_ICASE);
+ if (r != 0) {
+ regerror(r, &assocs[i].regcomp, errbuf, sizeof(errbuf));
+ fprintf(stderr, "invalid regex assocs[%d]: %s: %s\n",
+ i, assocs[i].regex, errbuf);
+ exit(1);
+ }
+ }
+}
+
int
main(int argc, char *argv[])
{
@@ -948,6 +960,7 @@ main(int argc, char *argv[])
/* Set locale before curses setup */
setlocale(LC_ALL, "");
+ initassocs();
initcurses();
browse(ipath, ifilter);
exitcurses();