From: David Bremner <bremner@debian.org> This pushes the error handling up one step, but makes the function more flexible. Running out of memory still triggers an internal error, in the spirit of other xutils functions. --- And here is the promised modification of xregcomp. One issue I thought about is that we now have a(nother) place where a library routine is writing to stderr, not necessarily in the process of shutting down. notmuch-restore.c | 7 ++++--- util/xutil.c | 7 +++++-- util/xutil.h | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/notmuch-restore.c b/notmuch-restore.c index ff1ebab..13b4325 100644 --- a/notmuch-restore.c +++ b/notmuch-restore.c @@ -88,9 +88,10 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[]) * non-space characters for the message-id, then one or more * spaces, then a list of space-separated tags as a sequence of * characters within literal '(' and ')'. */ - xregcomp (®ex, - "^([^ ]+) \\(([^)]*)\\)$", - REG_EXTENDED); + if ( xregcomp (®ex, + "^([^ ]+) \\(([^)]*)\\)$", + REG_EXTENDED) ) + INTERNAL_ERROR("compile time constant regex failed."); while ((line_len = getline (&line, &line_size, input)) != -1) { regmatch_t match[3]; diff --git a/util/xutil.c b/util/xutil.c index 15ff765..ac496da 100644 --- a/util/xutil.c +++ b/util/xutil.c @@ -99,7 +99,7 @@ xstrndup (const char *s, size_t n) return ret; } -void +int xregcomp (regex_t *preg, const char *regex, int cflags) { int rerr; @@ -110,9 +110,12 @@ xregcomp (regex_t *preg, const char *regex, int cflags) char *error = xmalloc (error_size); regerror (rerr, preg, error, error_size); - INTERNAL_ERROR ("compiling regex %s: %s\n", + fprintf (stderr, "compiling regex %s: %s\n", regex, error); + free (error); + return 1; } + return 0; } int diff --git a/util/xutil.h b/util/xutil.h index fd77f73..9299256 100644 --- a/util/xutil.h +++ b/util/xutil.h @@ -43,7 +43,8 @@ xstrdup (const char *s); char * xstrndup (const char *s, size_t n); -void +/* Returns 0 for successful compilation, 1 otherwise */ +int xregcomp (regex_t *preg, const char *regex, int cflags); int -- 1.7.6.3