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.
      * 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];
 
     return ret;
 }
 
-void
+int
 xregcomp (regex_t *preg, const char *regex, int cflags)
 {
     int rerr;
        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
 
 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