"Fossies" - the Fresh Open Source Software archive

Member "mailutils-2.2/doc/texinfo/addr.inc" of archive mailutils-2.2.tar.gz:


@comment   GNU Mailutils -- a suite of utilities for electronic mail
@comment   Copyright (C) 1999, 2000, 2001, 2004, 2005, 2007, 2010 Free Software
@comment   Foundation, Inc.
@comment
@comment   GNU Mailutils is free software; you can redistribute it and/or modify
@comment   it under the terms of the GNU General Public License as published by
@comment   the Free Software Foundation; either version 3, or (at your option)
@comment   any later version.
@comment
@comment   GNU Mailutils is distributed in the hope that it will be useful,
@comment   but WITHOUT ANY WARRANTY; without even the implied warranty of
@comment   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
@comment   GNU General Public License for more details.
@comment
@comment   You should have received a copy of the GNU General Public License
@comment   along with GNU Mailutils; if not, write to the Free Software
@comment   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
@comment   MA 02110-1301 USA 

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <mailutils/address.h>
#include <mailutils/errno.h>
#include <mailutils/kwd.h>
#include <mailutils/mutil.h>

#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_ADDR:
      return &addr->addr;
	  
    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;
@}