summaryrefslogtreecommitdiff
path: root/mail/mailvar.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2010-12-11 18:33:10 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2010-12-11 19:49:34 +0200
commita52aac19b2a9f3c5b890160052376bed1a3b69f7 (patch)
tree70dd7960edcfe2aa8c05bfddb52bb30566986f54 /mail/mailvar.c
parentb8c5000a532587e60eb857aa1a36e2723eb2d34f (diff)
downloadmailutils-a52aac19b2a9f3c5b890160052376bed1a3b69f7.tar.gz
mailutils-a52aac19b2a9f3c5b890160052376bed1a3b69f7.tar.bz2
mail: rewrite using MU streams.
* libmailutils/base/spawnvp.c (mu_spawnvp): Use fork and _exit, unconditionally. * libmailutils/stdstream/basestr.c (mu_stdstream_setup): Borrow descriptors 0, 1, 2. * mail/mail.h (compose_env) <filename, file, ofile>: Remove. <compstr>: New member. * mail/alias.c: Use MU streams instead of stdlib. * mail/alt.c: Likewise. * mail/copy.c: Likewise. * mail/decode.c: Likewise. * mail/echo.c: Likewise. * mail/envelope.c: Likewise. * mail/eq.c: Likewise. * mail/escape.c: Likewise. * mail/followup.c: Likewise. * mail/from.c: Likewise. * mail/inc.c: Likewise. * mail/mail.c: Likewise. * mail/mailline.c: Likewise. * mail/mailvar.c: Likewise. * mail/msgset.y: Likewise. * mail/print.c: Likewise. * mail/quit.c: Likewise. * mail/reply.c: Likewise. * mail/retain.c: Likewise. * mail/send.c: Likewise. * mail/setenv.c: Likewise. * mail/shell.c: Likewise. * mail/size.c: Likewise. * mail/source.c: Likewise. * mail/summary.c: Likewise. * mail/top.c: Likewise. * mail/unset.c: Likewise. * mail/util.c: Likewise. * mail/version.c: Likewise. * mail/write.c: Likewise. * mail/z.c: Likewise.
Diffstat (limited to 'mail/mailvar.c')
-rw-r--r--mail/mailvar.c108
1 files changed, 58 insertions, 50 deletions
diff --git a/mail/mailvar.c b/mail/mailvar.c
index 2edbd2ecd..b66d2af4a 100644
--- a/mail/mailvar.c
+++ b/mail/mailvar.c
@@ -285,21 +285,27 @@ find_mailvar_symbol (const char *var)
}
static void
-print_descr (FILE *out, const char *s, int n,
+print_descr (mu_stream_t out, const char *s, int n,
int doc_col, int rmargin, char *pfx)
{
+ mu_stream_stat_buffer stat;
+
if (!s)
return;
+
+ mu_stream_set_stat (out, MU_STREAM_STAT_MASK (MU_STREAM_STAT_OUT),
+ stat);
+ stat[MU_STREAM_STAT_OUT] = n;
do
{
const char *p;
const char *space = NULL;
- if (n == 1 && pfx)
- n += fprintf (out, "%s", pfx);
+ if (stat[MU_STREAM_STAT_OUT] && pfx)
+ mu_stream_printf (out, "%s", pfx);
- for (; n < doc_col; n++)
- fputc (' ', out);
+ while (stat[MU_STREAM_STAT_OUT] < doc_col)
+ mu_stream_write (out, " ", 1, NULL);
for (p = s; *p && p < s + (rmargin - doc_col); p++)
if (mu_isspace (*p))
@@ -307,20 +313,21 @@ print_descr (FILE *out, const char *s, int n,
if (!space || p < s + (rmargin - doc_col))
{
- fprintf (out, "%s", s);
+ mu_stream_printf (out, "%s", s);
s += strlen (s);
}
else
{
for (; s < space; s++)
- fputc (*s, out);
+ mu_stream_write (out, s, 1, NULL);
for (; *s && mu_isspace (*s); s++)
;
}
- fputc ('\n', out);
- n = 1;
+ mu_stream_printf (out, "\n");
+ stat[MU_STREAM_STAT_OUT] = 1;
}
while (*s);
+ mu_stream_set_stat (out, 0, NULL);
}
/* Functions for dealing with internal mailvar_list variables */
@@ -680,17 +687,15 @@ void
mailvar_print (int set)
{
struct mailvar_variable **vartab;
- FILE *out = ofile;
+ mu_stream_t out;
size_t i, count;
- int pagelines = util_get_crt ();
int width = util_getcols ();
int prettyprint = mailvar_get (NULL, "variable-pretty-print",
mailvar_type_boolean, 0) == 0;
vartab = mailvar_make_array (set, &count);
- if (pagelines && count > pagelines)
- out = popen (getenv ("PAGER"), "w");
+ out = open_pager (count);
for (i = 0; i < count; i++)
{
@@ -704,40 +709,41 @@ mailvar_print (int set)
if (sym->flags & MAILVAR_HIDDEN)
continue;
if (sym->flags & MAILVAR_RDONLY)
- fprintf (out, "# %s:\n", _("Read-only variable"));
+ mu_stream_printf (out, "# %s:\n", _("Read-only variable"));
print_descr (out, gettext (sym->descr), 1, 3, width - 1, "# ");
}
}
switch (vartab[i]->type)
{
case mailvar_type_number:
- fprintf (out, "%s=%d", vartab[i]->name, vartab[i]->value.number);
+ mu_stream_printf (out, "%s=%d",
+ vartab[i]->name, vartab[i]->value.number);
break;
case mailvar_type_string:
- fprintf (out, "%s=\"%s\"", vartab[i]->name, vartab[i]->value.string);
+ mu_stream_printf (out, "%s=\"%s\"",
+ vartab[i]->name, vartab[i]->value.string);
break;
case mailvar_type_boolean:
if (!vartab[i]->value.bool)
- fprintf (out, "no");
- fprintf (out, "%s", vartab[i]->name);
+ mu_stream_printf (out, "no");
+ mu_stream_printf (out, "%s", vartab[i]->name);
break;
case mailvar_type_whatever:
- fprintf (out, "%s %s", vartab[i]->name, _("oops?"));
+ mu_stream_printf (out, "%s %s", vartab[i]->name, _("oops?"));
}
- fprintf (out, "\n");
+ mu_stream_printf (out, "\n");
}
free (vartab);
- if (out != ofile)
- pclose (out);
+ mu_stream_unref (out);
}
void
-mailvar_variable_format (FILE *fp,
+mailvar_variable_format (mu_stream_t stream,
const struct mailvar_variable *var,
const char *defval)
{
@@ -745,20 +751,20 @@ mailvar_variable_format (FILE *fp,
switch (var->type)
{
case mailvar_type_string:
- fprintf (fp, "%s", var->value.string);
+ mu_stream_printf (stream, "%s", var->value.string);
break;
case mailvar_type_number:
- fprintf (fp, "%d", var->value.number);
+ mu_stream_printf (stream, "%d", var->value.number);
break;
case mailvar_type_boolean:
- fprintf (fp, "%s", var->set ? "yes" : "no");
+ mu_stream_printf (stream, "%s", var->set ? "yes" : "no");
break;
default:
if (defval)
- fprintf (fp, "%s", defval);
+ mu_stream_printf (stream, "%s", defval);
break;
}
}
@@ -773,45 +779,51 @@ static char *typestr[] =
};
static void
-describe_symbol (FILE *out, int width, const struct mailvar_symbol *sym)
+describe_symbol (mu_stream_t out, int width, const struct mailvar_symbol *sym)
{
- int n;
int i, t;
const struct mailvar_symbol *ali;
+ mu_stream_stat_buffer stat;
- n = fprintf (out, "%s", sym->var.name);
+ mu_stream_set_stat (out, MU_STREAM_STAT_MASK (MU_STREAM_STAT_OUT),
+ stat);
+ mu_stream_printf (out, "%s", sym->var.name);
for (ali = sym + 1; ali->var.name && ali->flags & MAILVAR_ALIAS; ali++)
{
size_t len = strlen (ali->var.name) + 2;
- if (n + len > width)
- n = fprintf (out, "\n%s", ali->var.name);
+ if (stat[MU_STREAM_STAT_OUT] + len > width)
+ {
+ stat[MU_STREAM_STAT_OUT] = 0;
+ mu_stream_printf (out, "\n%s", ali->var.name);
+ }
else
- n = fprintf (out, ", %s", ali->var.name);
+ mu_stream_printf (out, ", %s", ali->var.name);
}
- fputc ('\n', out);
+ mu_stream_printf (out, "\n");
+ mu_stream_set_stat (out, 0, NULL);
- fprintf (out, _("Type: "));
+ mu_stream_printf (out, _("Type: "));
for (i = 0, t = 0; i < sizeof (typestr) / sizeof (typestr[0]); i++)
if (sym->flags & MAILVAR_TYPEMASK (i))
{
if (t++)
- fprintf (out, " %s ", _("or"));
- fprintf (out, "%s", gettext (typestr[i]));
+ mu_stream_printf (out, " %s ", _("or"));
+ mu_stream_printf (out, "%s", gettext (typestr[i]));
}
if (!t)
- fprintf (out, "%s", gettext (typestr[0]));
- fputc ('\n', out);
+ mu_stream_printf (out, "%s", gettext (typestr[0]));
+ mu_stream_printf (out, "\n");
- fprintf (out, "%s", _("Current value: "));
+ mu_stream_printf (out, "%s", _("Current value: "));
mailvar_variable_format (out, &sym->var, _("[not set]"));
if (sym->flags & MAILVAR_RDONLY)
- fprintf (out, " [%s]", _("read-only"));
- fputc ('\n', out);
+ mu_stream_printf (out, " [%s]", _("read-only"));
+ mu_stream_printf (out, "\n");
print_descr (out, gettext (sym->descr ? sym->descr : N_("Not documented")),
1, 1, width - 1, NULL);
- fputc ('\n', out);
+ mu_stream_printf (out, "\n");
}
int
@@ -819,10 +831,7 @@ mail_variable (int argc, char **argv)
{
int pagelines = util_get_crt ();
int width = util_getcols ();
- FILE *out = ofile;
-
- if (pagelines)
- out = popen (getenv ("PAGER"), "w");
+ mu_stream_t out = open_pager (pagelines + 1);
if (argc == 1)
{
@@ -840,13 +849,12 @@ mail_variable (int argc, char **argv)
{
struct mailvar_symbol *sym = find_mailvar_symbol (argv[i]);
if (!sym)
- fprintf (out, "%s: unknown\n", argv[i]);
+ mu_stream_printf (out, "%s: unknown\n", argv[i]);
else
describe_symbol (out, width, sym);
}
}
- if (out != ofile)
- pclose (out);
+ mu_stream_unref (out);
return 0;
}

Return to:

Send suggestions and report system problems to the System administrator.