xutil.c: remove duplicate copies, create new library libutil.a to contain xutil.
authorDavid Bremner <bremner@debian.org>
Sun, 23 Oct 2011 15:05:13 +0000 (12:05 -0300)
committerDavid Bremner <bremner@debian.org>
Mon, 31 Oct 2011 02:09:49 +0000 (23:09 -0300)
We keep the lib/xutil.c version. As a consequence, also factor out
_internal_error and associated macros.  It might be overkill to make a
new file error_util.c for this, but _internal_error does not really
belong in database.cc.

14 files changed:
Makefile
Makefile.local
lib/Makefile.local
lib/database.cc
lib/notmuch-private.h
lib/xutil.c [deleted file]
lib/xutil.h [deleted file]
util/Makefile [new file with mode: 0644]
util/Makefile.local [new file with mode: 0644]
util/error_util.c [new file with mode: 0644]
util/error_util.h [new file with mode: 0644]
util/xutil.c [new file with mode: 0644]
util/xutil.h [new file with mode: 0644]
xutil.c [deleted file]

index 11e3a3d96293255e136ed3d06ab99557e7047340..2fb2a61354c7bbd3ca75219150e7ebaf1b0e7944 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 all:
 
 # List all subdirectories here. Each contains its own Makefile.local
-subdirs = compat completion emacs lib test
+subdirs = compat completion emacs lib util test
 
 # We make all targets depend on the Makefiles themselves.
 global_deps = Makefile Makefile.config Makefile.local \
index ec09f953dc8fcd06b62af5f9ada78ecba445065e..6ddef5c883b56a5970a9e96cb25f5e417b5f3ae0 100644 (file)
@@ -39,7 +39,7 @@ PV_FILE=bindings/python/notmuch/version.py
 # Smash together user's values with our extra values
 FINAL_CFLAGS = -DNOTMUCH_VERSION=$(VERSION) $(CFLAGS) $(WARN_CFLAGS) $(CONFIGURE_CFLAGS) $(extra_cflags)
 FINAL_CXXFLAGS = $(CXXFLAGS) $(WARN_CXXFLAGS) $(CONFIGURE_CXXFLAGS) $(extra_cflags) $(extra_cxxflags)
-FINAL_NOTMUCH_LDFLAGS = $(LDFLAGS) -Llib -lnotmuch $(AS_NEEDED_LDFLAGS) $(GMIME_LDFLAGS) $(TALLOC_LDFLAGS)
+FINAL_NOTMUCH_LDFLAGS = $(LDFLAGS) -Lutil -lutil -Llib -lnotmuch $(AS_NEEDED_LDFLAGS) $(GMIME_LDFLAGS) $(TALLOC_LDFLAGS)
 FINAL_NOTMUCH_LINKER = CC
 ifneq ($(LINKER_RESOLVES_LIBRARY_DEPENDENCIES),1)
 FINAL_NOTMUCH_LDFLAGS += $(CONFIGURE_LDFLAGS)
@@ -299,12 +299,11 @@ notmuch_client_srcs =             \
        notmuch-time.c          \
        query-string.c          \
        show-message.c          \
-       json.c                  \
-       xutil.c
+       json.c
 
 notmuch_client_modules = $(notmuch_client_srcs:.c=.o)
 
-notmuch: $(notmuch_client_modules) lib/libnotmuch.a
+notmuch: $(notmuch_client_modules) lib/libnotmuch.a util/libutil.a
        $(call quiet,CXX $(CFLAGS)) $^ $(FINAL_LIBNOTMUCH_LDFLAGS) -o $@
 
 notmuch-shared: $(notmuch_client_modules) lib/$(LINKER_NAME)
index be51eaa1d0fa998b77b4c68ddf57f1513f8fd352..d58552c48fe5c285b7b7299e6a273a8fea772e15 100644 (file)
@@ -54,8 +54,7 @@ libnotmuch_c_srcs =           \
        $(dir)/message-file.c   \
        $(dir)/messages.c       \
        $(dir)/sha1.c           \
-       $(dir)/tags.c           \
-       $(dir)/xutil.c
+       $(dir)/tags.c
 
 libnotmuch_cxx_srcs =          \
        $(dir)/database.cc      \
@@ -71,7 +70,7 @@ $(dir)/libnotmuch.a: $(libnotmuch_modules)
        $(call quiet,AR) rcs $@ $^
 
 $(dir)/$(LIBNAME): $(libnotmuch_modules) notmuch.sym
-       $(call quiet,CXX $(CXXFLAGS)) $(libnotmuch_modules) $(FINAL_LIBNOTMUCH_LDFLAGS) $(LIBRARY_LINK_FLAG) -o $@
+       $(call quiet,CXX $(CXXFLAGS)) $(libnotmuch_modules) $(FINAL_LIBNOTMUCH_LDFLAGS) $(LIBRARY_LINK_FLAG) -o $@ -L$(srcdir)/util -lutil
 
 notmuch.sym: $(srcdir)/$(dir)/notmuch.h $(libnotmuch_modules)
        sh $(srcdir)/$(lib)/gen-version-script.sh $< $(libnotmuch_modules) > $@
index e77fd53674bb6b3dfbf1f1a6f555ef488b0ddf71..88be939138c7e6db51fc2e1fc70313bb170d2a1e 100644 (file)
@@ -209,21 +209,6 @@ static prefix_t PROBABILISTIC_PREFIX[]= {
     { "folder",                        "XFOLDER"}
 };
 
-int
-_internal_error (const char *format, ...)
-{
-    va_list va_args;
-
-    va_start (va_args, format);
-
-    fprintf (stderr, "Internal error: ");
-    vfprintf (stderr, format, va_args);
-
-    exit (1);
-
-    return 1;
-}
-
 const char *
 _find_prefix (const char *name)
 {
index d31953058a276da9fa31f13148ca9ae92fdafd29..0d3cc27e406f0036d9e20c1cc18c93b59760385a 100644 (file)
@@ -47,6 +47,7 @@ NOTMUCH_BEGIN_DECLS
 #include <talloc.h>
 
 #include "xutil.h"
+#include "error_util.h"
 
 #pragma GCC visibility push(hidden)
 
@@ -60,25 +61,6 @@ NOTMUCH_BEGIN_DECLS
 #define STRNCMP_LITERAL(var, literal) \
     strncmp ((var), (literal), sizeof (literal) - 1)
 
-/* There's no point in continuing when we've detected that we've done
- * something wrong internally (as opposed to the user passing in a
- * bogus value).
- *
- * Note that PRINTF_ATTRIBUTE comes from talloc.h
- */
-int
-_internal_error (const char *format, ...) PRINTF_ATTRIBUTE (1, 2);
-
-/* There's no point in continuing when we've detected that we've done
- * something wrong internally (as opposed to the user passing in a
- * bogus value).
- *
- * Note that __location__ comes from talloc.h.
- */
-#define INTERNAL_ERROR(format, ...)                    \
-    _internal_error (format " (%s).\n",                        \
-                    ##__VA_ARGS__, __location__)
-
 #define unused(x) x __attribute__ ((unused))
 
 #ifdef __cplusplus
diff --git a/lib/xutil.c b/lib/xutil.c
deleted file mode 100644 (file)
index 268225b..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-/* xutil.c - Various wrapper functions to abort on error.
- *
- * Copyright © 2009 Carl Worth
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see http://www.gnu.org/licenses/ .
- *
- * Author: Carl Worth <cworth@cworth.org>
- */
-
-#include "notmuch-private.h"
-
-#include <stdio.h>
-
-void *
-xcalloc (size_t nmemb, size_t size)
-{
-    void *ret;
-
-    ret = calloc (nmemb, size);
-    if (ret == NULL) {
-       fprintf (stderr, "Out of memory.\n");
-       exit (1);
-    }
-
-    return ret;
-}
-
-void *
-xmalloc (size_t size)
-{
-    void *ret;
-
-    ret = malloc (size);
-    if (ret == NULL) {
-       fprintf (stderr, "Out of memory.\n");
-       exit (1);
-    }
-
-    return ret;
-}
-
-void *
-xrealloc (void *ptr, size_t size)
-{
-    void *ret;
-
-    ret = realloc (ptr, size);
-    if (ret == NULL) {
-       fprintf (stderr, "Out of memory.\n");
-       exit (1);
-    }
-
-    return ret;
-}
-
-char *
-xstrdup (const char *s)
-{
-    char *ret;
-
-    ret = strdup (s);
-    if (ret == NULL) {
-       fprintf (stderr, "Out of memory.\n");
-       exit (1);
-    }
-
-    return ret;
-}
-
-char *
-xstrndup (const char *s, size_t n)
-{
-    char *ret;
-
-    if (strlen (s) <= n)
-       n = strlen (s);
-
-    ret = malloc (n + 1);
-    if (ret == NULL) {
-       fprintf (stderr, "Out of memory.\n");
-       exit (1);
-    }
-    memcpy (ret, s, n);
-    ret[n] = '\0';
-
-    return ret;
-}
-
-void
-xregcomp (regex_t *preg, const char *regex, int cflags)
-{
-    int rerr;
-
-    rerr = regcomp (preg, regex, cflags);
-    if (rerr) {
-       size_t error_size = regerror (rerr, preg, NULL, 0);
-       char *error = xmalloc (error_size);
-
-       regerror (rerr, preg, error, error_size);
-       INTERNAL_ERROR ("compiling regex %s: %s\n",
-                       regex, error);
-    }
-}
-
-int
-xregexec (const regex_t *preg, const char *string,
-         size_t nmatch, regmatch_t pmatch[], int eflags)
-{
-    unsigned int i;
-    int rerr;
-
-    rerr = regexec (preg, string, nmatch, pmatch, eflags);
-    if (rerr)
-       return rerr;
-
-    for (i = 0; i < nmatch; i++) {
-       if (pmatch[i].rm_so == -1)
-           INTERNAL_ERROR ("matching regex against %s: Sub-match %d not found\n",
-                           string, i);
-    }
-
-    return 0;
-}
diff --git a/lib/xutil.h b/lib/xutil.h
deleted file mode 100644 (file)
index fd77f73..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/* xutil.h - Various wrapper functions to abort on error.
- *
- * Copyright © 2009 Carl Worth
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see http://www.gnu.org/licenses/ .
- *
- * Author: Carl Worth <cworth@cworth.org>
- */
-
-#ifndef NOTMUCH_XUTIL_H
-#define NOTMUCH_XUTIL_H
-
-#include <stdlib.h>
-#include <sys/types.h>
-#include <regex.h>
-
-#pragma GCC visibility push(hidden)
-
-/* xutil.c */
-void *
-xcalloc (size_t nmemb, size_t size);
-
-void *
-xmalloc (size_t size);
-
-void *
-xrealloc (void *ptrr, size_t size);
-
-char *
-xstrdup (const char *s);
-
-char *
-xstrndup (const char *s, size_t n);
-
-void
-xregcomp (regex_t *preg, const char *regex, int cflags);
-
-int
-xregexec (const regex_t *preg, const char *string,
-         size_t nmatch, regmatch_t pmatch[], int eflags);
-
-#pragma GCC visibility pop
-
-#endif
diff --git a/util/Makefile b/util/Makefile
new file mode 100644 (file)
index 0000000..fa25832
--- /dev/null
@@ -0,0 +1,5 @@
+all:
+       $(MAKE) -C .. all
+
+.DEFAULT:
+       $(MAKE) -C .. $@
diff --git a/util/Makefile.local b/util/Makefile.local
new file mode 100644 (file)
index 0000000..2ff42b3
--- /dev/null
@@ -0,0 +1,11 @@
+# -*- makefile -*-
+
+dir := util
+extra_cflags += -I$(srcdir)/$(dir)
+
+libutil_c_srcs := $(dir)/xutil.c $(dir)/error_util.c
+
+libutil_modules := $(libutil_c_srcs:.c=.o)
+
+$(dir)/libutil.a: $(libutil_modules)
+       $(call quiet,AR) rcs $@ $^
diff --git a/util/error_util.c b/util/error_util.c
new file mode 100644 (file)
index 0000000..630d228
--- /dev/null
@@ -0,0 +1,41 @@
+/* error_util.c - internal error utilities for notmuch.
+ *
+ * Copyright © 2009 Carl Worth
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see http://www.gnu.org/licenses/ .
+ *
+ * Author: Carl Worth <cworth@cworth.org>
+ */
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "error_util.h"
+
+int
+_internal_error (const char *format, ...)
+{
+    va_list va_args;
+
+    va_start (va_args, format);
+
+    fprintf (stderr, "Internal error: ");
+    vfprintf (stderr, format, va_args);
+
+    exit (1);
+
+    return 1;
+}
+
diff --git a/util/error_util.h b/util/error_util.h
new file mode 100644 (file)
index 0000000..bb15822
--- /dev/null
@@ -0,0 +1,45 @@
+/* error_util.h - Provide the INTERNAL_ERROR macro
+ *
+ * Copyright © 2009 Carl Worth
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see http://www.gnu.org/licenses/ .
+ *
+ * Author: Carl Worth <cworth@cworth.org>
+ */
+
+#ifndef ERROR_UTIL_H
+#define ERROR_UTIL_H
+
+#include <talloc.h>
+
+/* There's no point in continuing when we've detected that we've done
+ * something wrong internally (as opposed to the user passing in a
+ * bogus value).
+ *
+ * Note that PRINTF_ATTRIBUTE comes from talloc.h
+ */
+int
+_internal_error (const char *format, ...) PRINTF_ATTRIBUTE (1, 2);
+
+/* There's no point in continuing when we've detected that we've done
+ * something wrong internally (as opposed to the user passing in a
+ * bogus value).
+ *
+ * Note that __location__ comes from talloc.h.
+ */
+#define INTERNAL_ERROR(format, ...)                    \
+    _internal_error (format " (%s).\n",                        \
+                    ##__VA_ARGS__, __location__)
+
+#endif
diff --git a/util/xutil.c b/util/xutil.c
new file mode 100644 (file)
index 0000000..15ff765
--- /dev/null
@@ -0,0 +1,136 @@
+/* xutil.c - Various wrapper functions to abort on error.
+ *
+ * Copyright © 2009 Carl Worth
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see http://www.gnu.org/licenses/ .
+ *
+ * Author: Carl Worth <cworth@cworth.org>
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "xutil.h"
+#include "error_util.h"
+
+void *
+xcalloc (size_t nmemb, size_t size)
+{
+    void *ret;
+
+    ret = calloc (nmemb, size);
+    if (ret == NULL) {
+       fprintf (stderr, "Out of memory.\n");
+       exit (1);
+    }
+
+    return ret;
+}
+
+void *
+xmalloc (size_t size)
+{
+    void *ret;
+
+    ret = malloc (size);
+    if (ret == NULL) {
+       fprintf (stderr, "Out of memory.\n");
+       exit (1);
+    }
+
+    return ret;
+}
+
+void *
+xrealloc (void *ptr, size_t size)
+{
+    void *ret;
+
+    ret = realloc (ptr, size);
+    if (ret == NULL) {
+       fprintf (stderr, "Out of memory.\n");
+       exit (1);
+    }
+
+    return ret;
+}
+
+char *
+xstrdup (const char *s)
+{
+    char *ret;
+
+    ret = strdup (s);
+    if (ret == NULL) {
+       fprintf (stderr, "Out of memory.\n");
+       exit (1);
+    }
+
+    return ret;
+}
+
+char *
+xstrndup (const char *s, size_t n)
+{
+    char *ret;
+
+    if (strlen (s) <= n)
+       n = strlen (s);
+
+    ret = malloc (n + 1);
+    if (ret == NULL) {
+       fprintf (stderr, "Out of memory.\n");
+       exit (1);
+    }
+    memcpy (ret, s, n);
+    ret[n] = '\0';
+
+    return ret;
+}
+
+void
+xregcomp (regex_t *preg, const char *regex, int cflags)
+{
+    int rerr;
+
+    rerr = regcomp (preg, regex, cflags);
+    if (rerr) {
+       size_t error_size = regerror (rerr, preg, NULL, 0);
+       char *error = xmalloc (error_size);
+
+       regerror (rerr, preg, error, error_size);
+       INTERNAL_ERROR ("compiling regex %s: %s\n",
+                       regex, error);
+    }
+}
+
+int
+xregexec (const regex_t *preg, const char *string,
+         size_t nmatch, regmatch_t pmatch[], int eflags)
+{
+    unsigned int i;
+    int rerr;
+
+    rerr = regexec (preg, string, nmatch, pmatch, eflags);
+    if (rerr)
+       return rerr;
+
+    for (i = 0; i < nmatch; i++) {
+       if (pmatch[i].rm_so == -1)
+           INTERNAL_ERROR ("matching regex against %s: Sub-match %d not found\n",
+                           string, i);
+    }
+
+    return 0;
+}
diff --git a/util/xutil.h b/util/xutil.h
new file mode 100644 (file)
index 0000000..fd77f73
--- /dev/null
@@ -0,0 +1,55 @@
+/* xutil.h - Various wrapper functions to abort on error.
+ *
+ * Copyright © 2009 Carl Worth
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see http://www.gnu.org/licenses/ .
+ *
+ * Author: Carl Worth <cworth@cworth.org>
+ */
+
+#ifndef NOTMUCH_XUTIL_H
+#define NOTMUCH_XUTIL_H
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <regex.h>
+
+#pragma GCC visibility push(hidden)
+
+/* xutil.c */
+void *
+xcalloc (size_t nmemb, size_t size);
+
+void *
+xmalloc (size_t size);
+
+void *
+xrealloc (void *ptrr, size_t size);
+
+char *
+xstrdup (const char *s);
+
+char *
+xstrndup (const char *s, size_t n);
+
+void
+xregcomp (regex_t *preg, const char *regex, int cflags);
+
+int
+xregexec (const regex_t *preg, const char *string,
+         size_t nmatch, regmatch_t pmatch[], int eflags);
+
+#pragma GCC visibility pop
+
+#endif
diff --git a/xutil.c b/xutil.c
deleted file mode 100644 (file)
index 5f98f3f..0000000
--- a/xutil.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/* xutil.c - Various wrapper functions to abort on error.
- *
- * Copyright © 2009 Carl Worth
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see http://www.gnu.org/licenses/ .
- *
- * Author: Carl Worth <cworth@cworth.org>
- */
-
-#include "notmuch-private.h"
-
-#include <stdio.h>
-
-void *
-xcalloc (size_t nmemb, size_t size)
-{
-    void *ret;
-
-    ret = calloc (nmemb, size);
-    if (ret == NULL) {
-       fprintf (stderr, "Out of memory.\n");
-       exit (1);
-    }
-
-    return ret;
-}
-
-void *
-xmalloc (size_t size)
-{
-    void *ret;
-
-    ret = malloc (size);
-    if (ret == NULL) {
-       fprintf (stderr, "Out of memory.\n");
-       exit (1);
-    }
-
-    return ret;
-}
-
-void *
-xrealloc (void *ptr, size_t size)
-{
-    void *ret;
-
-    ret = realloc (ptr, size);
-    if (ret == NULL) {
-       fprintf (stderr, "Out of memory.\n");
-       exit (1);
-    }
-
-    return ret;
-}
-
-char *
-xstrdup (const char *s)
-{
-    char *ret;
-
-    ret = strdup (s);
-    if (ret == NULL) {
-       fprintf (stderr, "Out of memory.\n");
-       exit (1);
-    }
-
-    return ret;
-}
-
-char *
-xstrndup (const char *s, size_t n)
-{
-    char *ret;
-
-    if (strlen (s) <= n)
-       n = strlen (s);
-
-    ret = malloc (n + 1);
-    if (ret == NULL) {
-       fprintf (stderr, "Out of memory.\n");
-       exit (1);
-    }
-    memcpy (ret, s, n);
-    ret[n] = '\0';
-
-    return ret;
-}
-
-void
-xregcomp (regex_t *preg, const char *regex, int cflags)
-{
-    int rerr;
-
-    rerr = regcomp (preg, regex, cflags);
-    if (rerr) {
-       size_t error_size = regerror (rerr, preg, NULL, 0);
-       char *error = xmalloc (error_size);
-
-       regerror (rerr, preg, error, error_size);
-       fprintf (stderr, "Internal error: compiling regex %s: %s\n",
-                regex, error);
-       exit (1);
-    }
-}
-
-int
-xregexec (const regex_t *preg, const char *string,
-         size_t nmatch, regmatch_t pmatch[], int eflags)
-{
-    unsigned int i;
-    int rerr;
-
-    rerr = regexec (preg, string, nmatch, pmatch, eflags);
-    if (rerr)
-       return rerr;
-
-    for (i = 0; i < nmatch; i++) {
-       if (pmatch[i].rm_so == -1) {
-           fprintf (stderr, "Internal error: matching regex against %s:"
-                    "Sub-match %d not found\n",
-                    string, i);
-           exit (1);
-       }
-    }
-
-    return 0;
-}