* centralize formatstr parsing, cleanup

This commit is contained in:
Dirk-Jan C. Binnema
2011-07-27 08:20:06 +03:00
parent 63076fe222
commit 0a6161a71c
5 changed files with 222 additions and 174 deletions

View File

@ -31,52 +31,15 @@
#include "mu-contacts.h"
#include "mu-runtime.h"
enum _OutputFormat {
FORMAT_PLAIN,
FORMAT_MUTT_ALIAS,
FORMAT_MUTT_AB, /* mutt external address book */
FORMAT_WL,
FORMAT_BBDB,
FORMAT_CSV,
FORMAT_ORG_CONTACT,
FORMAT_NONE
};
typedef enum _OutputFormat OutputFormat;
static OutputFormat
get_output_format (const char *formatstr)
{
int i;
struct {
const char* name;
OutputFormat format;
} formats [] = {
{MU_CONFIG_FORMAT_PLAIN, FORMAT_PLAIN},
{MU_CONFIG_FORMAT_MUTT_ALIAS, FORMAT_MUTT_ALIAS},
{MU_CONFIG_FORMAT_MUTT_AB, FORMAT_MUTT_AB},
{MU_CONFIG_FORMAT_WL, FORMAT_WL},
{MU_CONFIG_FORMAT_BBDB, FORMAT_BBDB},
{MU_CONFIG_FORMAT_CSV, FORMAT_CSV},
{MU_CONFIG_FORMAT_ORG_CONTACT, FORMAT_ORG_CONTACT}
};
for (i = 0; i != G_N_ELEMENTS(formats); i++)
if (g_strcmp0 (formats[i].name, formatstr) == 0)
return formats[i].format;
return FORMAT_NONE;
}
static void
print_header (OutputFormat format)
print_header (MuConfigFormat format)
{
switch (format) {
case FORMAT_BBDB:
case MU_CONFIG_FORMAT_BBDB:
g_print (";; -*-coding: utf-8-emacs;-*-\n"
";;; file-version: 6\n");
break;
case FORMAT_MUTT_AB:
case MU_CONFIG_FORMAT_MUTT_AB:
g_print ("Matching addresses in the mu database:\n");
break;
default:
@ -84,8 +47,6 @@ print_header (OutputFormat format)
}
}
static void
each_contact_bbdb (const char *email, const char *name, time_t tstamp)
{
@ -110,28 +71,31 @@ each_contact_bbdb (const char *email, const char *name, time_t tstamp)
static void
each_contact_mutt_alias (const char *email, const char *name)
{
if (name) {
gchar *nick;
gchar *nick;
if (!name)
return;
nick = mu_str_guess_nick (name);
mu_util_print_encoded ("alias %s %s <%s>\n",
nick, name, email);
g_free (nick);
nick = mu_str_guess_nick (name);
mu_util_print_encoded ("alias %s %s <%s>\n",
nick, name, email);
g_free (nick);
}
}
static void
each_contact_wl (const char *email, const char *name)
{
if (name) {
gchar *nick;
nick = mu_str_guess_nick (name);
mu_util_print_encoded ("%s \"%s\" \"%s\"\n",
email, nick, name);
g_free (nick);
}
gchar *nick;
if (!name)
return;
nick = mu_str_guess_nick (name);
mu_util_print_encoded ("%s \"%s\" \"%s\"\n",
email, nick, name);
g_free (nick);
}
@ -153,14 +117,19 @@ print_plain (const char *email, const char *name, gboolean color)
fputs (" ", stdout);
}
if (color) fputs (MU_COLOR_GREEN, stdout);
if (color)
fputs (MU_COLOR_GREEN, stdout);
mu_util_fputs_encoded (email, stdout);
if (color) fputs (MU_COLOR_DEFAULT, stdout);
if (color)
fputs (MU_COLOR_DEFAULT, stdout);
fputs ("\n", stdout);
}
struct _ECData {
OutputFormat format;
MuConfigFormat format;
gboolean color;
};
typedef struct _ECData ECData;
@ -171,14 +140,23 @@ each_contact (const char *email, const char *name, time_t tstamp,
ECData *ecdata)
{
switch (ecdata->format) {
case FORMAT_MUTT_ALIAS: each_contact_mutt_alias (email, name); break;
case FORMAT_MUTT_AB:
case MU_CONFIG_FORMAT_MUTT_ALIAS:
each_contact_mutt_alias (email, name);
break;
case MU_CONFIG_FORMAT_MUTT_AB:
mu_util_print_encoded ("%s\t%s\t\n",
email, name ? name : ""); break;
case FORMAT_WL: each_contact_wl (email, name); break;
case FORMAT_ORG_CONTACT: each_contact_org_contact (email, name); break;
case FORMAT_BBDB: each_contact_bbdb (email, name, tstamp); break;
case FORMAT_CSV:
email, name ? name : "");
break;
case MU_CONFIG_FORMAT_WL:
each_contact_wl (email, name);
break;
case MU_CONFIG_FORMAT_ORG_CONTACT:
each_contact_org_contact (email, name);
break;
case MU_CONFIG_FORMAT_BBDB:
each_contact_bbdb (email, name, tstamp);
break;
case MU_CONFIG_FORMAT_CSV:
mu_util_print_encoded ("%s,%s\n", name ? name : "", email);
break;
default:
@ -188,7 +166,7 @@ each_contact (const char *email, const char *name, time_t tstamp,
static MuExitCode
run_cmd_cfind (const char* pattern, OutputFormat format,
run_cmd_cfind (const char* pattern, MuConfigFormat format,
gboolean color)
{
gboolean rv;
@ -219,17 +197,19 @@ run_cmd_cfind (const char* pattern, OutputFormat format,
}
MuExitCode
mu_cmd_cfind (MuConfig *opts)
static gboolean
cfind_params_valid (MuConfig *opts)
{
OutputFormat format;
g_return_val_if_fail (opts, MU_EXITCODE_ERROR);
g_return_val_if_fail (opts->cmd == MU_CONFIG_CMD_CFIND,
MU_EXITCODE_ERROR);
format = get_output_format (opts->formatstr);
if (format == FORMAT_NONE) {
switch (opts->format) {
case MU_CONFIG_FORMAT_PLAIN:
case MU_CONFIG_FORMAT_MUTT_ALIAS:
case MU_CONFIG_FORMAT_MUTT_AB:
case MU_CONFIG_FORMAT_WL:
case MU_CONFIG_FORMAT_BBDB:
case MU_CONFIG_FORMAT_CSV:
case MU_CONFIG_FORMAT_ORG_CONTACT:
break;
default:
g_warning ("invalid output format %s",
opts->formatstr ? opts->formatstr : "<none>");
return FALSE;
@ -238,9 +218,23 @@ mu_cmd_cfind (MuConfig *opts)
/* only one pattern allowed */
if (opts->params[1] && opts->params[2]) {
g_warning ("usage: mu cfind [options] [<ptrn>]");
return MU_EXITCODE_ERROR;
return FALSE;
}
return run_cmd_cfind (opts->params[1], format, opts->color);
return TRUE;
}
MuExitCode
mu_cmd_cfind (MuConfig *opts)
{
g_return_val_if_fail (opts, MU_EXITCODE_ERROR);
g_return_val_if_fail (opts->cmd == MU_CONFIG_CMD_CFIND,
MU_EXITCODE_ERROR);
if (!cfind_params_valid (opts))
return MU_EXITCODE_ERROR;
return run_cmd_cfind (opts->params[1], opts->format, opts->color);
}