Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 69F2F431FD0 for ; Sun, 23 Oct 2011 08:19:09 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: -2.3 X-Spam-Level: X-Spam-Status: No, score=-2.3 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_MED=-2.3] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id jAMzopR-sJUp for ; Sun, 23 Oct 2011 08:19:07 -0700 (PDT) Received: from tempo.its.unb.ca (tempo.its.unb.ca [131.202.1.21]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id A86DC431FB6 for ; Sun, 23 Oct 2011 08:19:07 -0700 (PDT) Received: from zancas.localnet (fctnnbsc36w-156034064058.pppoe-dynamic.High-Speed.nb.bellaliant.net [156.34.64.58]) (authenticated bits=0) by tempo.its.unb.ca (8.13.8/8.13.8) with ESMTP id p9NFJ0iS008916 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO); Sun, 23 Oct 2011 12:19:02 -0300 Received: from bremner by zancas.localnet with local (Exim 4.76) (envelope-from ) id 1RHzpD-0002sY-NH; Sun, 23 Oct 2011 12:18:59 -0300 From: David Bremner To: notmuch@notmuchmail.org Subject: [PATCH] xutil.c: remove duplicate copies, create new library libutil.a to contain xutil. Date: Sun, 23 Oct 2011 12:18:53 -0300 Message-Id: <1319383133-11006-1-git-send-email-david@tethera.net> X-Mailer: git-send-email 1.7.6.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: David Bremner X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 23 Oct 2011 15:19:09 -0000 From: David Bremner 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. --- This turned out to be more disruptive than I thought. On the other hand, having two copies of xutil.c seems like a recipe for disaster. I wanted to factor out the logic in xregcomp so I could use it in situations where miscompilation is not an internal error, but more likely a user error. Makefile | 2 +- Makefile.local | 7 +-- lib/Makefile.local | 5 +- lib/database.cc | 15 ----- lib/notmuch-private.h | 20 +------- lib/xutil.c | 134 ----------------------------------------------- lib/xutil.h | 55 ------------------- util/Makefile | 5 ++ util/Makefile.local | 11 ++++ util/error_util.c | 41 +++++++++++++++ util/error_util.h | 45 ++++++++++++++++ util/xutil.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++ util/xutil.h | 55 +++++++++++++++++++ xutil.c | 138 ------------------------------------------------- 14 files changed, 300 insertions(+), 369 deletions(-) delete mode 100644 lib/xutil.c delete mode 100644 lib/xutil.h create mode 100644 util/Makefile create mode 100644 util/Makefile.local create mode 100644 util/error_util.c create mode 100644 util/error_util.h create mode 100644 util/xutil.c create mode 100644 util/xutil.h delete mode 100644 xutil.c diff --git a/Makefile b/Makefile index 11e3a3d..2fb2a61 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 38f6c17..e31defa 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) @@ -288,12 +288,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 ea20b2b..f148661 100644 --- a/lib/Makefile.local +++ b/lib/Makefile.local @@ -49,8 +49,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 \ @@ -66,7 +65,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: lib/notmuch.h $(libnotmuch_modules) sh lib/gen-version-script.sh $< $(libnotmuch_modules) > $@ diff --git a/lib/database.cc b/lib/database.cc index e77fd53..88be939 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 d319530..0d3cc27 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/lib/xutil.c b/lib/xutil.c deleted file mode 100644 index 268225b..0000000 diff --git a/lib/xutil.h b/lib/xutil.h deleted file mode 100644 index fd77f73..0000000 diff --git a/util/Makefile b/util/Makefile new file mode 100644 index 0000000..fa25832 --- /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 0000000..2ff42b3 --- /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 0000000..630d228 --- /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 0000000..0f1e5ef --- /dev/null +++ b/util/error_util.h @@ -0,0 +1,45 @@ +/* error_util.h - Internal interfaces 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 + */ + +#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/util/xutil.c b/util/xutil.c new file mode 100644 index 0000000..15ff765 --- /dev/null +++ b/util/xutil.c @@ -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 + */ + +#include +#include + +#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 index 0000000..fd77f73 --- /dev/null +++ b/util/xutil.h @@ -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 + */ + +#ifndef NOTMUCH_XUTIL_H +#define NOTMUCH_XUTIL_H + +#include +#include +#include + +#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 index 5f98f3f..0000000 -- 1.7.6.3