/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 1999-2021 Free Software Foundation, Inc.
GNU Mailutils 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.
GNU Mailutils 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 GNU Mailutils. If not, see . */
#ifdef HAVE_CONFIG_H
# include
#endif
#include
#include
#include
#include
#include
#include
#include
#define EPARSE MU_ERR_NOENT
struct mu_address hint;
int hflags;
static int
parse (const char *str)
{
size_t no = 0;
size_t pcount = 0;
int status;
const char *buf;
mu_address_t address = NULL;
status = mu_address_create_hint (&address, str, &hint, hflags);
mu_address_get_count (address, &pcount);
if (status)
{
printf ("%s=> error %s\n\n", str, mu_errname (status));
return 0;
}
else
{
printf ("%s=> pcount %lu\n", str, (unsigned long) pcount);
}
for (no = 1; no <= pcount; no++)
{
int isgroup;
mu_address_is_group (address, no, &isgroup);
printf ("%lu ", (unsigned long) no);
if (isgroup)
{
mu_address_sget_personal (address, no, &buf);
printf ("group <%s>\n", buf);
}
else
{
mu_address_sget_email (address, no, &buf);
printf ("email <%s>\n", buf);
}
if (mu_address_sget_personal (address, no, &buf) == 0 && buf && !isgroup)
printf (" personal <%s>\n", buf);
if (mu_address_sget_comments (address, no, &buf) == 0 && buf)
printf (" comments <%s>\n", buf);
if (mu_address_sget_local_part (address, no, &buf) == 0 && buf)
{
printf (" local-part <%s>", buf);
if (mu_address_sget_domain (address, no, &buf) == 0 && buf)
printf (" domain <%s>", buf);
printf ("\n");
}
if (mu_address_sget_route (address, no, &buf) == 0 && buf)
printf (" route <%s>\n", buf);
}
mu_address_destroy (&address);
printf ("\n");
return 0;
}
struct mu_kwd hintnames[] = {
{ "comments", MU_ADDR_HINT_COMMENTS },
{ "personal", MU_ADDR_HINT_PERSONAL },
{ "email", MU_ADDR_HINT_EMAIL },
{ "local", MU_ADDR_HINT_LOCAL },
{ "domain", MU_ADDR_HINT_DOMAIN },
{ "route", MU_ADDR_HINT_ROUTE },
{ NULL }
};
static char **
addr_fieldptr_by_mask (mu_address_t addr, int mask)
{
switch (mask)
{
case MU_ADDR_HINT_PRINTABLE:
return &addr->printable;
case MU_ADDR_HINT_COMMENTS:
return &addr->comments;
case MU_ADDR_HINT_PERSONAL:
return &addr->personal;
case MU_ADDR_HINT_EMAIL:
return &addr->email;
case MU_ADDR_HINT_LOCAL:
return &addr->local_part;
case MU_ADDR_HINT_DOMAIN:
return &addr->domain;
case MU_ADDR_HINT_ROUTE:
return &addr->route;
}
return NULL;
}
void
sethint (char *str)
{
int mask;
char *p = strchr (str, '=');
if (!p)
{
printf ("%s=> bad assignment\n\n", str);
return;
}
*p++ = 0;
if (mu_kwd_xlat_name (hintnames, str, &mask) == 0)
{
char **fptr = addr_fieldptr_by_mask (&hint, mask);
if (*p == 0)
hflags &= ~mask;
else
{
*fptr = strdup (p);
hflags |= mask;
}
}
else
printf ("%s=> unknown hint name\n\n", str);
}
static int
parseinput (void)
{
char buf[BUFSIZ];
while (fgets (buf, sizeof (buf), stdin) != 0)
{
buf[strlen (buf) - 1] = 0;
if (buf[0] == '\\')
sethint (buf + 1);
else
parse (buf);
}
return 0;
}
int
main (int argc, char *argv[])
{
int i;
hint.domain = "localhost";
hflags = MU_ADDR_HINT_DOMAIN;
if (argc == 1)
return parseinput ();
for (i = 1; i < argc; i++)
{
if (strcmp (argv[i], "-") == 0)
parseinput ();
else if (strncmp (argv[i], "-v", 2) == 0)
sethint (argv[i] + 2);
else
parse (argv[i]);
}
return 0;
}