diff --git a/Makefile b/Makefile index 11e3a3d9..2fb2a613 100644 --- 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 \ diff --git a/Makefile.local b/Makefile.local index ec09f953..6ddef5c8 100644 --- a/Makefile.local +++ b/Makefile.local @@ -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) diff --git a/lib/Makefile.local b/lib/Makefile.local index be51eaa1..d58552c4 100644 --- a/lib/Makefile.local +++ b/lib/Makefile.local @@ -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) > $@ diff --git a/lib/database.cc b/lib/database.cc index e77fd536..88be9391 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -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) { diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index d3195305..0d3cc27e 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -47,6 +47,7 @@ NOTMUCH_BEGIN_DECLS #include #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/util/Makefile b/util/Makefile new file mode 100644 index 00000000..fa25832e --- /dev/null +++ b/util/Makefile @@ -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 index 00000000..2ff42b3d --- /dev/null +++ b/util/Makefile.local @@ -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 index 00000000..630d2281 --- /dev/null +++ b/util/error_util.c @@ -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 + */ + +#include +#include +#include + +#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 index 00000000..bb158220 --- /dev/null +++ b/util/error_util.h @@ -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 + */ + +#ifndef ERROR_UTIL_H +#define ERROR_UTIL_H + +#include + +/* 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/lib/xutil.c b/util/xutil.c similarity index 97% rename from lib/xutil.c rename to util/xutil.c index 268225b8..15ff7650 100644 --- a/lib/xutil.c +++ b/util/xutil.c @@ -18,9 +18,11 @@ * Author: Carl Worth */ -#include "notmuch-private.h" - #include +#include + +#include "xutil.h" +#include "error_util.h" void * xcalloc (size_t nmemb, size_t size) diff --git a/lib/xutil.h b/util/xutil.h similarity index 100% rename from lib/xutil.h rename to util/xutil.h diff --git a/xutil.c b/xutil.c deleted file mode 100644 index 5f98f3f7..00000000 --- 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 - */ - -#include "notmuch-private.h" - -#include - -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; -}