summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2017-06-21 16:15:32 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2017-06-21 16:22:40 +0300
commit6878eb8044703a339cb948d94acb0e06102506f7 (patch)
treeed1ae589237724e010f5aeb7a7c6311ce5e39149
parenta0c5483c864ab26f5060aa23ffb08194dd979ac3 (diff)
downloadmailutils-6878eb8044703a339cb948d94acb0e06102506f7.tar.gz
mailutils-6878eb8044703a339cb948d94acb0e06102506f7.tar.bz2
mh: determine output width automatically
* mh/fmtcheck.c: Take file name as optional argument. Run format on it, if supplied * mh/mh.h (mh_width): New proto. * mh/inc.c: Don't initialize width. * mh/mh_format.c (mh_format): Use mh_width, if width is 0. * mh/mh_list.c (mhl_format_run): Use mh_width, if width is 0. * mh/mh_init.c (mh_width): New function. * mh/repl.c: Likewise. * mh/scan.c: Likewise. * mh/sortm.c: Likewise. New option -width
-rw-r--r--include/mailutils/list.h2
-rw-r--r--mh/fmtcheck.c66
-rw-r--r--mh/inc.c2
-rw-r--r--mh/mh.h2
-rw-r--r--mh/mh_format.c4
-rw-r--r--mh/mh_init.c10
-rw-r--r--mh/mh_list.c2
-rw-r--r--mh/repl.c2
-rw-r--r--mh/scan.c2
-rw-r--r--mh/sortm.c6
10 files changed, 76 insertions, 22 deletions
diff --git a/include/mailutils/list.h b/include/mailutils/list.h
index 6dc85449a..df6a30815 100644
--- a/include/mailutils/list.h
+++ b/include/mailutils/list.h
@@ -61,7 +61,7 @@ int mu_list_get_comparator (mu_list_t _list, mu_list_comparator_t *_pcmp);
By default, it is not set. */
typedef mu_deallocator_t mu_list_destroy_item_t;
- /* An often used destroy function. It simply calls free(3) over the
+ /* An often used destroy function. It simply calls free(3) on the
_item. */
void mu_list_free_item (void *_item);
diff --git a/mh/fmtcheck.c b/mh/fmtcheck.c
index 33f703aa9..585eb8ce1 100644
--- a/mh/fmtcheck.c
+++ b/mh/fmtcheck.c
@@ -20,11 +20,15 @@
#include <mh.h>
static char prog_doc[] = N_("Check MH format string");
+static char args_doc[] = N_("[FILE]");
-char *format_str;
+static char *format_str;
static mh_format_t format;
-int dump_option;
-int debug_option;
+static int dump_option;
+static int debug_option;
+static char *input_file;
+static size_t width;
+static size_t msgno;
static struct mu_option options[] = {
{ "form", 0, N_("FILE"), MU_OPTION_DEFAULT,
@@ -40,31 +44,63 @@ static struct mu_option options[] = {
{ "debug", 0, NULL, MU_OPTION_DEFAULT,
N_("enable parser debugging output"),
mu_c_bool, &debug_option },
+ { "width", 0, N_("NUMBER"), MU_OPTION_DEFAULT,
+ N_("set output width"),
+ mu_c_size, &width },
+ { "msgno", 0, N_("NUMBER"), MU_OPTION_DEFAULT,
+ N_("set message number"),
+ mu_c_size, &msgno },
MU_OPTION_END
};
-static int
-action_dump (void)
+static void
+run (void)
{
- if (!format_str)
- {
- mu_error (_("Format string not specified"));
- return 1;
- }
- mh_format_dump (&format);
- return 0;
+ mu_message_t msg = mh_file_to_message (NULL, input_file);
+ char *output;
+
+ mh_format (&format, msg, msgno, width, &output);
+
+ mu_printf ("%s\n", output);
}
int
main (int argc, char **argv)
{
- mh_getopt (&argc, &argv, options, 0, NULL, prog_doc, NULL);
+ mh_getopt (&argc, &argv, options, 0, args_doc, prog_doc, NULL);
+ switch (argc)
+ {
+ case 0:
+ dump_option = 1;
+ break;
+
+ case 1:
+ input_file = argv[0];
+ break;
+
+ default:
+ mu_error (_("too many arguments"));
+ return 1;
+ }
+
mh_format_debug (debug_option);
- if (format_str && mh_format_parse (format_str, &format))
+ if (!format_str)
+ {
+ mu_error (_("Format string not specified"));
+ return 1;
+ }
+ if (mh_format_parse (format_str, &format))
{
mu_error (_("Bad format string"));
exit (1);
}
- return action_dump ();
+
+ if (dump_option)
+ mh_format_dump (&format);
+
+ if (input_file)
+ run ();
+
+ return 0;
}
diff --git a/mh/inc.c b/mh/inc.c
index 9ae0abde4..6acd5f339 100644
--- a/mh/inc.c
+++ b/mh/inc.c
@@ -28,7 +28,7 @@ static char extra_doc[] = N_("Debug flags are:\n\
l - sieve action logs");
static char *format_str = mh_list_format;
-static int width = 80;
+static int width;
static mu_list_t input_file_list;
static char *audit_file;
static FILE *audit_fp;
diff --git a/mh/mh.h b/mh/mh.h
index b91a2c51f..9153d1c9e 100644
--- a/mh/mh.h
+++ b/mh/mh.h
@@ -242,6 +242,8 @@ void mh_install (char *name, int automode);
mu_property_t mh_read_property_file (char *name, int ro);
void mh_property_merge (mu_property_t dst, mu_property_t src);
+int mh_width (void);
+
#define mh_global_profile_get(name, defval) \
mu_mhprop_get_value (mu_mh_profile, name, defval)
#define mh_global_profile_set(name, value) \
diff --git a/mh/mh_format.c b/mh/mh_format.c
index 492a2b8de..8980c1add 100644
--- a/mh/mh_format.c
+++ b/mh/mh_format.c
@@ -487,7 +487,9 @@ mh_format (mh_format_t *fmt, mu_message_t msg, size_t msgno,
mach.message = msg;
mach.msgno = msgno;
-
+
+ if (width == 0)
+ width = mh_width ();
mach.width = width - 1; /* Count the newline */
mach.pc = 1;
mu_opool_create (&mach.pool, MU_OPOOL_ENOMEMABRT);
diff --git a/mh/mh_init.c b/mh/mh_init.c
index 714c06781..a8939c112 100644
--- a/mh/mh_init.c
+++ b/mh/mh_init.c
@@ -29,6 +29,7 @@
#include <errno.h>
#include <fcntl.h>
#include <fnmatch.h>
+#include <sys/ioctl.h>
char mh_list_format[] =
"%4(msg)"
@@ -1058,4 +1059,13 @@ mh_safe_make_file_name (const char *dir, const char *file)
return name;
}
+int
+mh_width (void)
+{
+ struct winsize ws;
+ ws.ws_col = ws.ws_row = 0;
+ if ((ioctl(1, TIOCGWINSZ, (char *) &ws) < 0) || ws.ws_col == 0)
+ return 80; /* FIXME: Should we exit()/abort() if col <= 0 ? */
+ return ws.ws_col;
+}
diff --git a/mh/mh_list.c b/mh/mh_list.c
index 1adf55d89..16cf3cc05 100644
--- a/mh/mh_list.c
+++ b/mh/mh_list.c
@@ -843,7 +843,7 @@ mhl_format_run (mu_list_t fmt,
env.bvar[B_NEWLINE] = 1;
mu_list_create (&env.printed_fields);
mu_list_set_comparator (env.printed_fields, _comp_name);
- env.ivar[I_WIDTH] = width;
+ env.ivar[I_WIDTH] = width ? width : mh_width ();
env.ivar[I_LENGTH] = length;
env.bvar[B_CLEARSCREEN] = flags & MHL_CLEARSCREEN;
env.bvar[B_BELL] = flags & MHL_BELL;
diff --git a/mh/repl.c b/mh/repl.c
index 169f977c0..dd17ebb94 100644
--- a/mh/repl.c
+++ b/mh/repl.c
@@ -27,7 +27,7 @@ static char args_doc[] = N_("[MESSAGE]");
static char *format_str = NULL;
static mh_format_t format;
-static int width = 80;
+static int width;
struct mh_whatnow_env wh_env = { 0 };
static int initial_edit = 1;
diff --git a/mh/scan.c b/mh/scan.c
index 8129d3afe..f1cdcc419 100644
--- a/mh/scan.c
+++ b/mh/scan.c
@@ -32,7 +32,7 @@ static char args_doc[] = N_("[MSGLIST]");
static int clear;
static char *format_str = mh_list_format;
-static int width = 80;
+static int width;
static int reverse;
static int header;
diff --git a/mh/sortm.c b/mh/sortm.c
index faa103d65..333634601 100644
--- a/mh/sortm.c
+++ b/mh/sortm.c
@@ -27,6 +27,7 @@ static char args_doc[] = N_("[MSGLIST]");
static int limit;
static int verbose;
+static int width;
static mu_mailbox_t mbox;
static const char *mbox_path;
@@ -133,6 +134,9 @@ set_algo_quicksort (struct mu_parseopt *po, struct mu_option *opt,
}
static struct mu_option options[] = {
+ { "width", 0, N_("NUMBER"), MU_OPTION_DEFAULT,
+ N_("set output width (for -list)"),
+ mu_c_int, &width },
MU_OPTION_GROUP (N_("Setting sort keys:")),
{ "datefield", 0, N_("STRING"), MU_OPTION_DEFAULT,
N_("sort on the date field (default `Date:')"),
@@ -440,7 +444,7 @@ list_message (size_t num)
mu_message_t msg = NULL;
char *buffer;
mu_mailbox_get_message (mbox, num, &msg);
- mh_format (&format, msg, num, 76, &buffer);
+ mh_format (&format, msg, num, width, &buffer);
printf ("%s\n", buffer);
free (buffer);
}

Return to:

Send suggestions and report system problems to the System administrator.