From af87cde2179e4e7ad51eacd7b21dffc339244997 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Tue, 22 Feb 2022 22:48:29 +0200 Subject: [PATCH] utils/mu-date: remove Remove mu-date.[ch] and convert its last users to use time_to_string instead. --- lib/mu-msg-crypto.cc | 73 ++++++++++++++++---------------- lib/mu-msg-doc.cc | 1 - lib/utils/Makefile.am | 2 - lib/utils/meson.build | 2 - lib/utils/mu-date.c | 91 ---------------------------------------- lib/utils/mu-date.h | 67 ------------------------------ mu/mu-cmd-cfind.cc | 96 +++++++++++++++++++++---------------------- mu/mu-cmd-find.cc | 88 +++++++++++++++++++-------------------- mu/mu-cmd.cc | 7 ++-- 9 files changed, 133 insertions(+), 294 deletions(-) delete mode 100644 lib/utils/mu-date.c delete mode 100644 lib/utils/mu-date.h diff --git a/lib/mu-msg-crypto.cc b/lib/mu-msg-crypto.cc index 5e30a22f..13493a3c 100644 --- a/lib/mu-msg-crypto.cc +++ b/lib/mu-msg-crypto.cc @@ -1,5 +1,5 @@ /* -** Copyright (C) 2012-2020 Dirk-Jan C. Binnema +** Copyright (C) 2012-2022 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 @@ -20,11 +20,12 @@ #include "config.h" #include +#include +#include "gmime/gmime-signature.h" #include "mu-msg.hh" #include "mu-msg-priv.hh" #include "mu-msg-part.hh" -#include "utils/mu-date.h" #include #include @@ -96,12 +97,12 @@ get_cert_data(GMimeCertificate* cert) } return g_strdup_printf("signer:%s, key:%s (%s,%s), trust:%s", - name ? name : "?", - /* email ? email : "?", */ - keyid, - pubkey_algo, - digest_algo, - trust); + name ? name : "?", + /* email ? email : "?", */ + keyid, + pubkey_algo, + digest_algo, + trust); } static char* @@ -134,9 +135,9 @@ get_signature_status(GMimeSignatureStatus status) continue; g_string_append_printf(descr, - "%s%s", - descr->len > 0 ? ", " : "", - status_info[n].name); + "%s%s", + descr->len > 0 ? ", " : "", + status_info[n].name); } return g_string_free(descr, FALSE); @@ -146,26 +147,28 @@ get_signature_status(GMimeSignatureStatus status) static char* get_verdict_report(GMimeSignature* msig) { - time_t t; - const char * created, *expires; - gchar * certdata, *report, *status; - GMimeSignatureStatus sigstat; + gchar * certdata, *report, *status; + GMimeSignatureStatus sigstat; sigstat = g_mime_signature_get_status(msig); status = get_signature_status(sigstat); - t = g_mime_signature_get_created(msig); - created = (t == 0 || t == (time_t)-1) ? "?" : mu_date_str_s("%x", t); + auto date_str = [](time_t t)->std::string { + if (t == 0 || t == static_cast(-1)) + return "?"; + else + return time_to_string("%x", t); + }; - t = g_mime_signature_get_expires(msig); - expires = (t == 0 || t == (time_t)-1) ? "?" : mu_date_str_s("%x", t); + const auto created = date_str(g_mime_signature_get_created(msig)); + const auto expires = date_str(g_mime_signature_get_expires(msig)); certdata = get_cert_data(g_mime_signature_get_certificate(msig)); report = g_strdup_printf("%s; created:%s, expires:%s, %s", - status, - created, - expires, - certdata ? certdata : "?"); + status, + created.c_str(), + expires.c_str(), + certdata ? certdata : "?"); g_free(certdata); g_free(status); @@ -220,15 +223,15 @@ get_status_report(GMimeSignatureList* sigs) status != MU_MSG_PART_SIG_STATUS_ERROR) status = MU_MSG_PART_SIG_STATUS_ERROR; else if ((sigstat & GMIME_SIGNATURE_STATUS_RED) && - status == MU_MSG_PART_SIG_STATUS_GOOD) + status == MU_MSG_PART_SIG_STATUS_GOOD) status = MU_MSG_PART_SIG_STATUS_BAD; rep = get_verdict_report(msig); report = g_strdup_printf("%s%s%d: %s", - report ? report : "", - report ? "; " : "", - i + 1, - rep); + report ? report : "", + report ? "; " : "", + i + 1, + rep); g_free(rep); cert = g_mime_signature_get_certificate(msig); @@ -263,9 +266,9 @@ static inline void tag_with_sig_status(GObject* part, MuMsgPartSigStatusReport* report) { g_object_set_data_full(part, - SIG_STATUS_REPORT, - report, - (GDestroyNotify)mu_msg_part_sig_status_report_destroy); + SIG_STATUS_REPORT, + report, + (GDestroyNotify)mu_msg_part_sig_status_report_destroy); } void @@ -316,10 +319,10 @@ check_decrypt_result(GMimeMultipartEncrypted* part, GMimeDecryptResult* res, GEr GMimeObject* /* this is declared in mu-msg-priv.h */ Mu::mu_msg_crypto_decrypt_part(GMimeMultipartEncrypted* enc, - MuMsgOptions opts, - MuMsgPartPasswordFunc func, - gpointer user_data, - GError** err) + MuMsgOptions opts, + MuMsgPartPasswordFunc func, + gpointer user_data, + GError** err) { GMimeObject* dec; GMimeDecryptResult* res; diff --git a/lib/mu-msg-doc.cc b/lib/mu-msg-doc.cc index c55f2a71..066fb9f8 100644 --- a/lib/mu-msg-doc.cc +++ b/lib/mu-msg-doc.cc @@ -28,7 +28,6 @@ #include "utils/mu-util.h" #include "utils/mu-str.h" -#include "utils/mu-date.h" #include "utils/mu-utils.hh" #include "utils/mu-xapian-utils.hh" diff --git a/lib/utils/Makefile.am b/lib/utils/Makefile.am index 834fdae8..8191b651 100644 --- a/lib/utils/Makefile.am +++ b/lib/utils/Makefile.am @@ -54,8 +54,6 @@ libmu_utils_la_SOURCES= \ mu-async-queue.hh \ mu-command-parser.cc \ mu-command-parser.hh \ - mu-date.c \ - mu-date.h \ mu-error.hh \ mu-logger.cc \ mu-logger.hh \ diff --git a/lib/utils/meson.build b/lib/utils/meson.build index 8c71e6e2..8997873d 100644 --- a/lib/utils/meson.build +++ b/lib/utils/meson.build @@ -19,8 +19,6 @@ lib_mu_utils=static_library('mu-utils', [ 'mu-async-queue.hh', 'mu-command-parser.cc', 'mu-command-parser.hh', - 'mu-date.c', - 'mu-date.h', 'mu-error.hh', 'mu-logger.cc', 'mu-logger.hh', diff --git a/lib/utils/mu-date.c b/lib/utils/mu-date.c deleted file mode 100644 index b8810667..00000000 --- a/lib/utils/mu-date.c +++ /dev/null @@ -1,91 +0,0 @@ -/* -** Copyright (C) 2012 -** -** 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. -** -*/ - -#include -#include -#include - -#include "mu-util.h" -#include "mu-date.h" -#include "mu-str.h" - -const char* -mu_date_str_s (const char* frm, time_t t) -{ - struct tm *tmbuf; - static char buf[128]; - static int is_utf8 = -1; - size_t len; - - if (G_UNLIKELY(is_utf8 == -1)) - is_utf8 = mu_util_locale_is_utf8 () ? 1 : 0; - - g_return_val_if_fail (frm, NULL); - - tmbuf = localtime(&t); -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wformat-nonliteral" - len = strftime (buf, sizeof(buf) - 1, frm, tmbuf); -#pragma GCC diagnostic pop - - if (len == 0) - return ""; /* not necessarily an error... */ - - if (!is_utf8) { - /* charset is _not_ utf8, so we need to convert it, so - * the date could contain locale-specific characters*/ - gchar *conv; - GError *err; - err = NULL; - conv = g_locale_to_utf8 (buf, -1, NULL, NULL, &err); - if (err) { - g_warning ("conversion failed: %s", err->message); - g_error_free (err); - strcpy (buf, ""); - } else { - strncpy (buf, conv, sizeof(buf)-1); - buf[sizeof(buf)-1] = '\0'; - } - - g_free (conv); - } - - return buf; -} - -char* -mu_date_str (const char *frm, time_t t) -{ - return g_strdup (mu_date_str_s(frm, t)); -} - - -const char* -mu_date_display_s (time_t t) -{ - time_t now; - static const time_t SECS_IN_DAY = 24 * 60 * 60; - - now = time (NULL); - - if (ABS(now - t) > SECS_IN_DAY) - return mu_date_str_s ("%x", t); - else - return mu_date_str_s ("%X", t); -} diff --git a/lib/utils/mu-date.h b/lib/utils/mu-date.h deleted file mode 100644 index c7cf6c76..00000000 --- a/lib/utils/mu-date.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -** Copyright (C) 2012-2013 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. -** -*/ - -#include - -#ifndef __MU_DATE_H__ -#define __MU_DATE_H__ - -G_BEGIN_DECLS - - -/** - * @addtogroup MuDate - * Date-related functions - * @{ - */ - -/** - * get a string for a given time_t - * - * mu_date_str_s returns a ptr to a static buffer, - * while mu_date_str returns dynamically allocated - * memory that must be freed after use. - * - * @param frm the format of the string (in strftime(3) format) - * @param t the time as time_t - * - * @return a string representation of the time; see above for what to - * do with it. Length is max. 128 bytes, inc. the ending \0. if the - * format is too long, the value will be truncated. in practice this - * should not happen. - */ -const char* mu_date_str_s (const char* frm, time_t t) G_GNUC_CONST; -char* mu_date_str (const char* frm, time_t t) G_GNUC_WARN_UNUSED_RESULT; - -/** - * get a display string for a given time_t; if the given is less than - * 24h from the current time, we display the time, otherwise the date, - * using the preferred date/time for the current locale - * - * mu_str_display_date_s returns a ptr to a static buffer, - * - * @param t the time as time_t - * - * @return a string representation of the time/date - */ -const char* mu_date_display_s (time_t t); - -G_END_DECLS - -#endif /*__MU_DATE_H__*/ diff --git a/mu/mu-cmd-cfind.cc b/mu/mu-cmd-cfind.cc index a89a6267..14433e84 100644 --- a/mu/mu-cmd-cfind.cc +++ b/mu/mu-cmd-cfind.cc @@ -33,7 +33,6 @@ #include "utils/mu-utils.hh" #include "utils/mu-error.hh" #include "utils/mu-str.h" -#include "utils/mu-date.h" using namespace Mu; @@ -184,7 +183,7 @@ print_header(const MuConfigFormat format) switch (format) { case MU_CONFIG_FORMAT_BBDB: g_print(";; -*-coding: utf-8-emacs;-*-\n" - ";;; file-version: 6\n"); + ";;; file-version: 6\n"); break; case MU_CONFIG_FORMAT_MUTT_AB: g_print("Matching addresses in the mu database:\n"); @@ -197,31 +196,30 @@ print_header(const MuConfigFormat format) static void each_contact_bbdb(const std::string& email, const std::string& name, time_t tstamp) { - char *fname, *lname, *now, *timestamp; + char *fname, *lname; - fname = guess_first_name(name.c_str()); - lname = guess_last_name(name.c_str()); - now = mu_date_str("%Y-%m-%d", time(NULL)); - timestamp = mu_date_str("%Y-%m-%d", tstamp); + fname = guess_first_name(name.c_str()); + lname = guess_last_name(name.c_str()); + + const auto now{time_to_string("%Y-%m-%d", time(NULL))}; + const auto timestamp{time_to_string("%Y-%m-%d", tstamp)}; g_print("[\"%s\" \"%s\" nil nil nil nil (\"%s\") " - "((creation-date . \"%s\") (time-stamp . \"%s\")) nil]\n", - fname, - lname, - email.c_str(), - now, - timestamp); + "((creation-date . \"%s\") (time-stamp . \"%s\")) nil]\n", + fname, + lname, + email.c_str(), + now.c_str(), + timestamp.c_str()); - g_free(now); - g_free(timestamp); g_free(fname); g_free(lname); } static void each_contact_mutt_alias(const std::string& email, - const std::string& name, - GHashTable* nicks) + const std::string& name, + GHashTable* nicks) { if (name.empty()) return; @@ -234,8 +232,8 @@ each_contact_mutt_alias(const std::string& email, static void each_contact_wl(const std::string& email, - const std::string& name, - GHashTable* nicks) + const std::string& name, + GHashTable* nicks) { if (name.empty()) return; @@ -287,9 +285,9 @@ each_contact(const Mu::MessageContact& ci, ECData& ecdata) if (ecdata.rx && !g_regex_match(ecdata.rx, ci.email.c_str(), (GRegexMatchFlags)0, NULL) && !g_regex_match(ecdata.rx, - ci.name.empty() ? "" : ci.name.c_str(), - (GRegexMatchFlags)0, - NULL)) + ci.name.empty() ? "" : ci.name.c_str(), + (GRegexMatchFlags)0, + NULL)) return; ++ecdata.n; @@ -305,26 +303,26 @@ each_contact(const Mu::MessageContact& ci, ECData& ecdata) case MU_CONFIG_FORMAT_ORG_CONTACT: if (!ci.name.empty()) mu_util_print_encoded("* %s\n:PROPERTIES:\n:EMAIL: %s\n:END:\n\n", - ci.name.c_str(), - ci.email.c_str()); + ci.name.c_str(), + ci.email.c_str()); break; case MU_CONFIG_FORMAT_BBDB: each_contact_bbdb(ci.email, ci.name, ci.message_date); break; case MU_CONFIG_FORMAT_CSV: mu_util_print_encoded("%s,%s\n", - ci.name.empty() ? "" : Mu::quote(ci.name).c_str(), - Mu::quote(ci.email).c_str()); + ci.name.empty() ? "" : Mu::quote(ci.name).c_str(), + Mu::quote(ci.email).c_str()); break; case MU_CONFIG_FORMAT_DEBUG: { char datebuf[32]; strftime(datebuf, sizeof(datebuf), "%F %T", gmtime(&ci.message_date)); g_print("%s\n\tname: %s\n\t%s\n\tpersonal: %s\n\tfreq: %zu\n" - "\tlast-seen: %s\n", - ci.email.c_str(), - ci.name.empty() ? "" : ci.name.c_str(), - ci.display_name().c_str(), - ci.personal ? "yes" : "no", - ci.frequency, - datebuf); + "\tlast-seen: %s\n", + ci.email.c_str(), + ci.name.empty() ? "" : ci.name.c_str(), + ci.display_name().c_str(), + ci.personal ? "yes" : "no", + ci.frequency, + datebuf); } break; default: print_plain(ci.email, ci.name, ecdata.color); } @@ -332,12 +330,12 @@ each_contact(const Mu::MessageContact& ci, ECData& ecdata) static MuError run_cmd_cfind(const Mu::Store& store, - const char* pattern, - gboolean personal, - time_t after, - const MuConfigFormat format, - gboolean color, - GError** err) + const char* pattern, + gboolean personal, + time_t after, + const MuConfigFormat format, + gboolean color, + GError** err) { ECData ecdata{}; @@ -392,7 +390,7 @@ cfind_params_valid(const MuConfig* opts) case MU_CONFIG_FORMAT_DEBUG: break; default: g_printerr("invalid output format %s\n", - opts->formatstr ? opts->formatstr : ""); + opts->formatstr ? opts->formatstr : ""); return FALSE; } @@ -413,20 +411,20 @@ Mu::mu_cmd_cfind(const Mu::Store& store, const MuConfig* opts, GError** err) if (!cfind_params_valid(opts)) throw Mu::Error(Mu::Error::Code::InvalidArgument, - "invalid parameters"); + "invalid parameters"); auto res = run_cmd_cfind(store, - opts->params[1], - opts->personal, - opts->after, - opts->format, - !opts->nocolor, - err); + opts->params[1], + opts->personal, + opts->after, + opts->format, + !opts->nocolor, + err); if (res != MU_OK && res != MU_ERROR_NO_MATCHES) throw Mu::Error(Mu::Error::Code::Internal, - err /*consumes*/, - "error in cfind"); + err /*consumes*/, + "error in cfind"); return res; } diff --git a/mu/mu-cmd-find.cc b/mu/mu-cmd-find.cc index 3b6c94e7..5f191e7d 100644 --- a/mu/mu-cmd-find.cc +++ b/mu/mu-cmd-find.cc @@ -37,9 +37,9 @@ #include "utils/mu-util.h" #include "utils/mu-str.h" -#include "utils/mu-date.h" #include "mu-cmd.hh" +#include "utils/mu-utils.hh" using namespace Mu; @@ -58,10 +58,10 @@ using OutputFunc = std::functionbookmark); if (!val) g_set_error(err, - MU_ERROR_DOMAIN, - MU_ERROR_NO_MATCHES, - "bookmark '%s' not found", - opts->bookmark); + MU_ERROR_DOMAIN, + MU_ERROR_NO_MATCHES, + "bookmark '%s' not found", + opts->bookmark); else val = g_strdup(val); @@ -305,7 +305,7 @@ flags_s(MessageFlags flags) return buf; } -static const char* +static std::string display_field(MuMsg* msg, MuMsgFieldId mfid) { gint64 val; @@ -328,9 +328,8 @@ display_field(MuMsg* msg, MuMsgFieldId mfid) return mu_msg_get_field_string(msg, mfid); case MU_MSG_FIELD_TYPE_TIME_T: - val = mu_msg_get_field_numeric(msg, mfid); - return mu_date_str_s("%c", (time_t)val); - + return time_to_string( + "%c", static_cast<::time_t>(mu_msg_get_field_numeric(msg, mfid))); case MU_MSG_FIELD_TYPE_BYTESIZE: val = mu_msg_get_field_numeric(msg, mfid); return mu_str_size_s((unsigned)val); @@ -391,8 +390,8 @@ thread_indent(const QueryMatch& info, const MuConfig* opts) else ::fputs(" ", stdout); ::fputs(empty_parent ? "*> " : is_dup ? "=> " - : "-> ", - stdout); + : "-> ", + stdout); } } @@ -414,7 +413,8 @@ output_plain_fields(MuMsg* msg, const char* fields, gboolean color, gboolean thr else { ansi_color_maybe(mfid, color); - nonempty += mu_util_fputs_encoded(display_field(msg, mfid), stdout); + nonempty += mu_util_fputs_encoded(display_field(msg, mfid).c_str(), + stdout); ansi_reset_maybe(mfid, color); } } @@ -482,7 +482,7 @@ to_string(const Mu::Sexp& sexp, bool color, size_t level = 0) break; case Sexp::Type::Symbol: sstrm << (col.fg(sexp.value().at(0) == ':' ? Color::BrightGreen - : Color::BrightBlue)) + : Color::BrightBlue)) << sexp.value() << col.reset(); break; default: throw std::logic_error("invalid type"); @@ -517,8 +517,8 @@ output_json(MuMsg* msg, const OutputInfo& info, const MuConfig* opts, GError** e } g_print("%s%s\n", - msg_to_sexp(msg, info.docid, MU_MSG_OPTION_HEADERS_ONLY).to_json_string().c_str(), - info.last ? "" : ","); + msg_to_sexp(msg, info.docid, MU_MSG_OPTION_HEADERS_ONLY).to_json_string().c_str(), + info.last ? "" : ","); return true; } @@ -601,13 +601,13 @@ output_query_results(const QueryResults& qres, const MuConfig* opts, GError** er continue; rv = output_func(msg, - {item.doc_id(), - false, - false, - n == qres.size(), /* last? */ - item.query_match()}, - opts, - err); + {item.doc_id(), + false, + false, + n == qres.size(), /* last? */ + item.query_match()}, + opts, + err); if (!rv) break; } @@ -660,16 +660,16 @@ format_params_valid(const MuConfig* opts, GError** err) case MU_CONFIG_FORMAT_MQUERY: if (opts->exec) { mu_util_g_set_error(err, - MU_ERROR_IN_PARAMETERS, - "--exec and --format cannot be combined"); + MU_ERROR_IN_PARAMETERS, + "--exec and --format cannot be combined"); return FALSE; } break; default: mu_util_g_set_error(err, - MU_ERROR_IN_PARAMETERS, - "invalid output format %s", - opts->formatstr ? opts->formatstr : ""); + MU_ERROR_IN_PARAMETERS, + "invalid output format %s", + opts->formatstr ? opts->formatstr : ""); return FALSE; } @@ -680,8 +680,8 @@ format_params_valid(const MuConfig* opts, GError** err) if (opts->linksdir && opts->format != MU_CONFIG_FORMAT_LINKS) { mu_util_g_set_error(err, - MU_ERROR_IN_PARAMETERS, - "--linksdir is only valid with --format=links"); + MU_ERROR_IN_PARAMETERS, + "--linksdir is only valid with --format=links"); return FALSE; } @@ -703,9 +703,9 @@ query_params_valid(const MuConfig* opts, GError** err) return TRUE; mu_util_g_set_error(err, - MU_ERROR_FILE_CANNOT_READ, - "'%s' is not a readable Xapian directory", - xpath); + MU_ERROR_FILE_CANNOT_READ, + "'%s' is not a readable Xapian directory", + xpath); return FALSE; } diff --git a/mu/mu-cmd.cc b/mu/mu-cmd.cc index 5aa492cf..800c7e8d 100644 --- a/mu/mu-cmd.cc +++ b/mu/mu-cmd.cc @@ -38,7 +38,6 @@ #include "utils/mu-util.h" #include "utils/mu-str.h" -#include "utils/mu-date.h" #include "utils/mu-error.hh" @@ -164,8 +163,10 @@ view_msg_plain(MuMsg* msg, const MuConfig* opts) print_field("Bcc", mu_msg_get_bcc(msg), color); print_field("Subject", mu_msg_get_subject(msg), color); - if ((date = mu_msg_get_date(msg))) - print_field("Date", mu_date_str_s("%c", date), color); + if ((date = mu_msg_get_date(msg))) { + const auto dstr{time_to_string("%c", date)}; + print_field("Date", dstr.c_str(), color); + } if ((lst = mu_msg_get_tags(msg))) { gchar* tags;