diff --git a/guile/Makefile.am b/guile/Makefile.am index a37d44dc..64055cad 100644 --- a/guile/Makefile.am +++ b/guile/Makefile.am @@ -28,17 +28,23 @@ AM_CPPFLAGS= \ # don't use -Werror, as it might break on other compilers # use -Wno-unused-parameters, because some callbacks may not # really need all the params they get -AM_CFLAGS=$(ASAN_CFLAGS) ${WARN_CFLAGS} -AM_CXXFLAGS=$(ASAN_CXXFLAGS) ${WARN_CXXFLAGS} +AM_CFLAGS= \ + $(ASAN_CFLAGS) \ + ${WARN_CFLAGS} \ + -Wno-suggest-attribute=noreturn \ + -Wno-missing-prototypes \ + -Wno-missing-declarations lib_LTLIBRARIES= \ libguile-mu.la libguile_mu_la_SOURCES= \ - mu-guile.c \ - mu-guile.h \ - mu-guile-message.c \ - mu-guile-message.h + mu-guile.cc \ + mu-guile.hh \ + mu-guile-message.cc \ + mu-guile-message.hh + +libguile_mu_la_CFLAGS=$(AM_CFLAGS) libguile_mu_la_LIBADD= \ ${top_builddir}/lib/libmu.la \ @@ -61,10 +67,13 @@ mu_guile_TEXINFOS= \ BUILT_SOURCES=$(XFILES) -snarfcppopts= $(DEFS) $(AM_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) $(AM_CPPFLAGS) +snarfcppopts= $(DEFS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) SUFFIXES = .x .doc .c.x: - $(GUILE_SNARF) -o $@ $< $(snarfcppopts) + $(AM_V_GEN) $(GUILE_SNARF) -o $@ $< $(snarfcppopts) +.cc.x: + $(AM_V_GEN) $(GUILE_SNARF) -o $@ $< $(snarfcppopts) + # FIXME: GUILE_SITEDIR would be better, but that # breaks 'make distcheck' diff --git a/guile/mu-guile-message.c b/guile/mu-guile-message.cc similarity index 93% rename from guile/mu-guile-message.c rename to guile/mu-guile-message.cc index c081f33f..ef58e988 100644 --- a/guile/mu-guile-message.c +++ b/guile/mu-guile-message.cc @@ -16,21 +16,20 @@ ** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ** */ - -#if HAVE_CONFIG_H +#include "mu-guile-message.hh" #include -#endif /*HAVE_CONFIG_H*/ - -#include "mu-guile-message.h" #include +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wredundant-decls" #include +#pragma GCC diagnostic pop -#include "mu-guile.h" +#include "mu-guile.hh" #include #include -#include +#include #include #include @@ -42,7 +41,7 @@ static SCM SYMB_PRIO_LOW, SYMB_PRIO_NORMAL, SYMB_PRIO_HIGH; static SCM SYMB_FLAG_NEW, SYMB_FLAG_PASSED, SYMB_FLAG_REPLIED, SYMB_FLAG_SEEN, SYMB_FLAG_TRASHED, SYMB_FLAG_DRAFT, SYMB_FLAG_FLAGGED, SYMB_FLAG_SIGNED, SYMB_FLAG_ENCRYPTED, - SYMB_FLAG_HAS_ATTACH, SYMB_FLAG_UNREAD; + SYMB_FLAG_HAS_ATTACH, SYMB_FLAG_UNREAD, SYMB_FLAG_LIST; static SCM SYMB_CONTACT_TO, SYMB_CONTACT_CC, SYMB_CONTACT_BCC, SYMB_CONTACT_FROM; @@ -66,7 +65,7 @@ mu_guile_msg_to_scm (MuMsg *msg) g_return_val_if_fail (msg, SCM_UNDEFINED); - msgwrap = scm_gc_malloc (sizeof (MuMsgWrapper), "msg"); + msgwrap = (MuMsgWrapper*)scm_gc_malloc (sizeof (MuMsgWrapper), "msg"); msgwrap->_msg = msg; msgwrap->_unrefme = FALSE; @@ -82,10 +81,11 @@ typedef struct _FlagData FlagData; #define MU_GUILE_INITIALIZED_OR_ERROR \ do { if (!(mu_guile_initialized())) \ - return mu_guile_error (FUNC_NAME, 0, \ + mu_guile_error (FUNC_NAME, 0, \ "mu not initialized; call mu:initialize", \ SCM_UNDEFINED); \ - } while (0) + return SCM_UNSPECIFIED; \ + } while (0) static void @@ -97,6 +97,7 @@ check_flag (MuFlags flag, FlagData *fdata) return; switch (flag) { + case MU_FLAG_NONE: break; case MU_FLAG_NEW: flag_scm = SYMB_FLAG_NEW; break; case MU_FLAG_PASSED: flag_scm = SYMB_FLAG_PASSED; break; case MU_FLAG_REPLIED: flag_scm = SYMB_FLAG_REPLIED; break; @@ -108,6 +109,7 @@ check_flag (MuFlags flag, FlagData *fdata) case MU_FLAG_ENCRYPTED: flag_scm = SYMB_FLAG_ENCRYPTED; break; case MU_FLAG_HAS_ATTACH: flag_scm = SYMB_FLAG_HAS_ATTACH; break; case MU_FLAG_UNREAD: flag_scm = SYMB_FLAG_UNREAD; break; + case MU_FLAG_LIST: flag_scm = SYMB_FLAG_LIST; break; default: flag_scm = SCM_UNDEFINED; } @@ -297,10 +299,11 @@ SCM_DEFINE (get_contacts, "mu:c:get-contacts", 2, 0, 0, ecdata.ctype = MU_MSG_CONTACT_TYPE_BCC; else if (scm_is_eq (CONTACT_TYPE, SYMB_CONTACT_FROM)) ecdata.ctype = MU_MSG_CONTACT_TYPE_FROM; - else - return mu_guile_error (FUNC_NAME, 0, - "invalid contact type", + else { + mu_guile_error (FUNC_NAME, 0, "invalid contact type", SCM_UNDEFINED); + return SCM_UNSPECIFIED; + } } ecdata.lst = SCM_EOL; @@ -428,14 +431,12 @@ call_func (SCM FUNC, MuMsgIter *iter, const char* func_name) static MuMsgIter* -get_query_iter (MuQuery *query, const char* expr, int maxnum) +get_query_iter (Mu::Query& query, const char* expr, int maxnum) { - MuMsgIter *iter; - GError *err; - - err = NULL; - iter = mu_query_run (query, expr, MU_MSG_FIELD_ID_NONE, maxnum, - MU_QUERY_FLAG_NONE, &err); + GError *err{}; + auto iter = query.run (expr, MU_MSG_FIELD_ID_NONE, + Mu::Query::Flags::None, maxnum, + &err); if (!iter) { mu_guile_g_error ("", err); g_clear_error (&err); @@ -472,7 +473,7 @@ SCM_DEFINE (for_each_message, "mu:c:for-each-message", 3, 0, 0, else expr = scm_to_utf8_string(EXPR); - iter = get_query_iter (mu_guile_instance()->query, expr, + iter = get_query_iter (mu_guile_query(), expr, scm_to_int(MAXNUM)); free (expr); if (!iter) @@ -525,6 +526,8 @@ define_symbols (void) SYMB_FLAG_ENCRYPTED = register_symbol ("mu:flag:encrypted"); SYMB_FLAG_HAS_ATTACH = register_symbol ("mu:flag:has-attach"); SYMB_FLAG_UNREAD = register_symbol ("mu:flag:unread"); + + SYMB_FLAG_LIST = register_symbol ("mu:flag:list"); } diff --git a/guile/mu-guile-message.h b/guile/mu-guile-message.hh similarity index 86% rename from guile/mu-guile-message.h rename to guile/mu-guile-message.hh index bde81293..066d8079 100644 --- a/guile/mu-guile-message.h +++ b/guile/mu-guile-message.hh @@ -17,12 +17,8 @@ ** */ -#ifndef __MU_GUILE_MESSAGE_H__ -#define __MU_GUILE_MESSAGE_H__ - -#include - -G_BEGIN_DECLS +#ifndef MU_GUILE_MESSAGE_H__ +#define MU_GUILE_MESSAGE_H__ /** * Initialize this mu guile module. @@ -33,6 +29,4 @@ G_BEGIN_DECLS */ void* mu_guile_message_init (void *data); -G_END_DECLS - -#endif /*__MU_GUILE_MESSAGE_H__*/ +#endif /*MU_GUILE_MESSAGE_HH__*/ diff --git a/guile/mu-guile.c b/guile/mu-guile.cc similarity index 83% rename from guile/mu-guile.c rename to guile/mu-guile.cc index 4c3422fd..f1b10a47 100644 --- a/guile/mu-guile.c +++ b/guile/mu-guile.cc @@ -17,9 +17,10 @@ ** */ +#include "mu-guile.hh" + #include #include - #include #pragma GCC diagnostic push @@ -27,16 +28,11 @@ #include #pragma GCC diagnostic pop -#include -#include #include #include -#include +#include #include -#include "mu-guile.h" - - SCM mu_guile_scm_from_str (const char *str) { @@ -47,7 +43,6 @@ mu_guile_scm_from_str (const char *str) SCM_FAILED_CONVERSION_QUESTION_MARK); } - SCM mu_guile_error (const char *func_name, int status, const char *fmt, SCM args) @@ -75,68 +70,46 @@ mu_guile_g_error (const char *func_name, GError *err) /* there can be only one */ -static MuGuile *_singleton = NULL; +static std::unique_ptr QuerySingleton; static gboolean -mu_guile_init_instance (const char *muhome) +mu_guile_init_instance (const char *muhome) try { - MuStore *store; - MuQuery *query; - GError *err; - setlocale (LC_ALL, ""); - if (!mu_runtime_init (muhome, "guile", FALSE)) return FALSE; - err = NULL; - store = mu_store_new_readable - (mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB), - &err); - if (!store) - goto errexit; - - query = mu_query_new (store, &err); - mu_store_unref (store); - if (!query) - goto errexit; - - _singleton = g_new0 (MuGuile, 1); - _singleton->query = query; + Mu::Store store{mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB)}; + QuerySingleton = std::make_unique(store); return TRUE; -errexit: - mu_guile_g_error (__func__, err); - g_clear_error (&err); - return FALSE; +} catch (...) { + return FALSE; } static void -mu_guile_uninit_instance (void) +mu_guile_uninit_instance () { - g_return_if_fail (_singleton); - - mu_query_destroy (_singleton->query); - g_free (_singleton); - - _singleton = NULL; + QuerySingleton.reset(); mu_runtime_uninit (); } -MuGuile* -mu_guile_instance (void) +Mu::Query& +mu_guile_query () { - g_return_val_if_fail (_singleton, NULL); - return _singleton; + if (!QuerySingleton) + g_error("mu guile not initialized"); + + return *QuerySingleton.get(); } gboolean -mu_guile_initialized (void) +mu_guile_initialized () { - return _singleton != NULL; + return !!QuerySingleton; } @@ -212,7 +185,7 @@ SCM_DEFINE (log_func, "mu:c:log", 1, 0, 1, (SCM LEVEL, SCM FRM, SCM ARGS), return SCM_UNSPECIFIED; output = scm_to_utf8_string (str); - g_log (G_LOG_DOMAIN, level, "%s", output); + g_log (G_LOG_DOMAIN, (GLogLevelFlags)level, "%s", output); free (output); return SCM_UNSPECIFIED; diff --git a/guile/mu-guile.h b/guile/mu-guile.hh similarity index 84% rename from guile/mu-guile.h rename to guile/mu-guile.hh index fd230a51..d2b72ef3 100644 --- a/guile/mu-guile.h +++ b/guile/mu-guile.hh @@ -1,5 +1,5 @@ /* -** Copyright (C) 2011-2013 Dirk-Jan C. Binnema +** Copyright (C) 2011-2020 Dirk-Jan C. Binnema ** ** 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 @@ -21,22 +21,14 @@ #define __MU_GUILE_H__ #include -#include +#include +#include -G_BEGIN_DECLS - - -struct _MuGuile { - MuQuery *query; -}; -typedef struct _MuGuile MuGuile; /** - * get the single MuGuile instance - * - * @return the instance or NULL in case of error + * get the singleton Query instance */ -MuGuile *mu_guile_instance (void); +Mu::Query& mu_guile_query (void); /** @@ -44,7 +36,7 @@ MuGuile *mu_guile_instance (void); * * @return TRUE if MuGuile is Initialized, FALSE otherwise */ -gboolean mu_guile_initialized (void); +gboolean mu_guile_initialized (); /** @@ -83,7 +75,6 @@ SCM mu_guile_error (const char *func_name, int status, */ SCM mu_guile_scm_from_str (const char *str); - /** * Initialize this mu guile module. * @@ -93,7 +84,4 @@ SCM mu_guile_scm_from_str (const char *str); */ void* mu_guile_init (void *data); - -G_END_DECLS - #endif /*__MU_GUILE_H__*/ diff --git a/guile/tests/Makefile.am b/guile/tests/Makefile.am index 8df87fbb..005a9d24 100644 --- a/guile/tests/Makefile.am +++ b/guile/tests/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2008-2013 Dirk-Jan C. Binnema +# Copyright (C) 2008-2020 Dirk-Jan C. Binnema ## ## 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 @@ -21,9 +21,9 @@ AM_CPPFLAGS=$(XAPIAN_CXXFLAGS) \ $(GLIB_CFLAGS) \ -I${top_srcdir} \ -I${top_srcdir}/lib \ - -DMU_TESTMAILDIR=\"${top_srcdir}/lib/testdir\" \ - -DMU_TESTMAILDIR2=\"${top_srcdir}/lib/testdir2\" \ - -DMU_TESTMAILDIR3=\"${top_srcdir}/lib/testdir3\" \ + -DMU_TESTMAILDIR=\"${abs_top_srcdir}/lib/testdir\" \ + -DMU_TESTMAILDIR2=\"${abs_top_srcdir}/lib/testdir2\" \ + -DMU_TESTMAILDIR3=\"${abs_top_srcdir}/lib/testdir3\" \ -DMU_PROGRAM=\"${abs_top_builddir}/mu/mu\" \ -DMU_GUILE_MODULE_PATH=\"${abs_top_srcdir}/guile/\" \ -DMU_GUILE_LIBRARY_PATH=\"${abs_top_builddir}/guile/.libs\" \ @@ -39,14 +39,8 @@ AM_LDFLAGS=$(ASAN_LDFLAGS) noinst_PROGRAMS= $(TEST_PROGS) -TEST_PROGS += test-mu-guile -test_mu_guile_SOURCES= test-mu-guile.c dummy.cc -test_mu_guile_LDADD=${top_builddir}/lib/libtestmucommon.la +# TEST_PROGS += test-mu-guile +# test_mu_guile_SOURCES= test-mu-guile.cc +# test_mu_guile_LDADD=${top_builddir}/lib/libtestmucommon.la -# we need to use dummy.cc to enforce c++ linking... -BUILT_SOURCES= \ - dummy.cc -dummy.cc: - touch dummy.cc - -EXTRA_DIST=test-mu-guile.scm +EXTRA_DIST=test-mu-guile.scm test-mu-guile.cc diff --git a/guile/tests/test-mu-guile.c b/guile/tests/test-mu-guile.c deleted file mode 100644 index 50199eb8..00000000 --- a/guile/tests/test-mu-guile.c +++ /dev/null @@ -1,134 +0,0 @@ -/* -** Copyright (C) 2012-2020 Dirk-Jan C. Binnema -** -** 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, 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, write to the Free Software Foundation, -** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -** -*/ - -#if HAVE_CONFIG_H -#include "config.h" -#endif /*HAVE_CONFIG_H*/ - -#include -#include - -#include -#include -#include -#include - -#include "test-mu-common.h" -#include - - -/* tests for the command line interface, uses testdir2 */ - -static gchar* -fill_database (void) -{ - gchar *cmdline, *tmpdir; - GError *err; - - tmpdir = test_mu_common_get_random_tmpdir(); - cmdline = g_strdup_printf ( - "/bin/sh -c '" - "%s init --muhome=%s --maildir=%s --quiet; " - "%s index --muhome=%s --quiet'", - MU_PROGRAM, tmpdir, MU_TESTMAILDIR2, - MU_PROGRAM, tmpdir); - - if (g_test_verbose()) - g_print ("%s\n", cmdline); - - err = NULL; - if (!g_spawn_command_line_sync (cmdline, NULL, NULL, - NULL, &err)) { - g_printerr ("Error: %s\n", err ? err->message : "?"); - g_assert (0); - } - - g_free (cmdline); - return tmpdir; -} - - -static void -test_something (const char *what) -{ - char *dir, *cmdline; - gint result; - - dir = fill_database (); - cmdline = g_strdup_printf ( - "LD_LIBRARY_PATH=%s %s -q -L %s -e main %s/test-mu-guile.scm " - "--muhome=%s --test=%s", - MU_GUILE_LIBRARY_PATH, - GUILE_BINARY, - MU_GUILE_MODULE_PATH, - ABS_SRCDIR, - dir, - what); - - if (g_test_verbose ()) - g_print ("cmdline: %s\n", cmdline); - - result = system (cmdline); - g_assert (result == 0); - - g_free (dir); - g_free (cmdline); -} - -static void -test_mu_guile_queries (void) -{ - test_something ("queries"); -} - -static void -test_mu_guile_messages (void) -{ - test_something ("message"); -} - -static void -test_mu_guile_stats (void) -{ - test_something ("stats"); -} - - -int -main (int argc, char *argv[]) -{ - int rv; - g_test_init (&argc, &argv, NULL); - - if (!set_en_us_utf8_locale()) - return 0; /* don't error out... */ - - g_test_add_func ("/guile/queries", test_mu_guile_queries); - g_test_add_func ("/guile/message", test_mu_guile_messages); - g_test_add_func ("/guile/stats", test_mu_guile_stats); - - g_log_set_handler (NULL, - G_LOG_LEVEL_MASK | G_LOG_LEVEL_WARNING| - G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION, - (GLogFunc)black_hole, NULL); - - rv = g_test_run (); - - return rv; -}