diff --git a/Makefile.local b/Makefile.local index a602ed08..66ccd6d1 100644 --- a/Makefile.local +++ b/Makefile.local @@ -249,7 +249,8 @@ notmuch_client_srcs = \ notmuch-time.c \ query-string.c \ show-message.c \ - json.c + json.c \ + xutil.c notmuch_client_modules = $(notmuch_client_srcs:.c=.o) diff --git a/lib/database-private.h b/lib/database-private.h index bd72f670..e42b8bb8 100644 --- a/lib/database-private.h +++ b/lib/database-private.h @@ -34,6 +34,8 @@ #include +#pragma GCC visibility push(hidden) + struct _notmuch_database { notmuch_bool_t exception_reported; @@ -65,4 +67,6 @@ notmuch_tags_t * _notmuch_convert_tags (void *ctx, Xapian::TermIterator &i, Xapian::TermIterator &end); +#pragma GCC visibility pop + #endif diff --git a/lib/libsha1.h b/lib/libsha1.h index b4dca93b..c1c848fc 100644 --- a/lib/libsha1.h +++ b/lib/libsha1.h @@ -43,6 +43,8 @@ extern "C" #include +#pragma GCC visibility push(hidden) + /* Size of SHA1 digest */ #define SHA1_DIGEST_SIZE 20 @@ -60,6 +62,8 @@ void sha1_hash(const unsigned char data[], unsigned long len, sha1_ctx ctx[1]); void sha1_end(unsigned char hval[], sha1_ctx ctx[1]); void sha1(unsigned char hval[], const unsigned char data[], unsigned long len); +#pragma GCC visibility pop + #if defined(__cplusplus) } #endif diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index 5a0cf925..5b32f84a 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -48,6 +48,8 @@ NOTMUCH_BEGIN_DECLS #include "xutil.h" +#pragma GCC visibility push(hidden) + #ifdef DEBUG # define DEBUG_DATABASE_SANITY 1 # define DEBUG_QUERY 1 @@ -442,6 +444,8 @@ _notmuch_tags_add_tag (notmuch_tags_t *tags, const char *tag); void _notmuch_tags_prepare_iterator (notmuch_tags_t *tags); +#pragma GCC visibility pop + NOTMUCH_END_DECLS #endif diff --git a/lib/xutil.h b/lib/xutil.h index b973f7dc..fd77f733 100644 --- a/lib/xutil.h +++ b/lib/xutil.h @@ -25,6 +25,8 @@ #include #include +#pragma GCC visibility push(hidden) + /* xutil.c */ void * xcalloc (size_t nmemb, size_t size); @@ -48,4 +50,6 @@ 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 new file mode 100644 index 00000000..5f98f3f7 --- /dev/null +++ b/xutil.c @@ -0,0 +1,138 @@ +/* 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; +}