download argmatch.c
Language: C
License: GPL
Copyright: (C) 1990, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007
LOC: 163
Project Info
gnulib - portability library(gnulib)
Server: Savannah GNU
Type: cvs
...g\gnulib\gnulib\gnulib\lib\
   .cppi-disable
   .cvsignore
   __fpending.c
   __fpending.h
   acl-internal.h
   acl.c
   acl.h
   acl_entries.c
   acosl.c
   alloca.c
   alloca_.h
   arcfour.c
   arcfour.h
   arctwo.c
   arctwo.h
   areadlink-with-size.c
   areadlink.h
   argmatch.c
   argmatch.h
   argp-ba.c
   argp-eexst.c
   argp-fmtstream.c
   argp-fmtstream.h
   argp-fs-xinl.c
   argp-help.c
   argp-namefrob.h
   argp-parse.c
   argp-pin.c
   argp-pv.c
   argp-pvh.c
   argp-xinl.c
   argp.h
   argz.c
   argz_.h
   asinl.c
   asnprintf.c
   asprintf.c
   at-func.c
   atanl.c
   atexit.c
   backupfile.c
   backupfile.h
   base64.c
   base64.h
   basename.c
   bcopy.c
   binary-io.h
   byteswap_.h
   c-ctype.c
   c-ctype.h
   c-stack.c
   c-stack.h
   c-strcase.h
   c-strcasecmp.c
   c-strcaseeq.h
   c-strcasestr.c
   c-strcasestr.h
   c-strncasecmp.c
   c-strstr.c
   c-strstr.h
   c-strtod.c
   c-strtod.h
   c-strtold.c
   calloc.c
   canon-host.c
   canon-host.h
   canonicalize-lgpl.c
   canonicalize.c
   canonicalize.h
   ceill.c
   chdir-long.c
   chdir-long.h
   chdir-safer.c
   chdir-safer.h
   check-version.c
   check-version.h
   chown.c
   classpath.c
   classpath.h
   clean-temp.c
   clean-temp.h
   cloexec.c
   cloexec.h
   close-stream.c
   close-stream.h
   closein.c
   closein.h
   closeout.c
   closeout.h
   concat-filename.c
   config.charset
   copy-file.c
   copy-file.h
   cosl.c
   count-one-bits.h
   crc.c
   crc.h
   creat-safer.c
   csharpcomp.c
   csharpcomp.h
   csharpexec.c
   csharpexec.h
   cycle-check.c
   cycle-check.h
   des.c
   des.h
   dev-ino.h
   diacrit.c
   diacrit.h
   diffseq.h
   dirchownmod.c
   dirchownmod.h
   dirent_.h
   dirfd.c
   dirfd.h
   dirname.c
   dirname.h
   dummy.c
   dup-safer.c
   dup2.c
   eealloc.h
   error.c
   error.h
   euidaccess.c
   euidaccess.h
   exclude.c
   exclude.h
   execute.c
   execute.h
   exitfail.c
   exitfail.h
   expl.c
   fatal-signal.c
   fatal-signal.h
   fbufmode.c
   fbufmode.h
   fchdir.c
   fchmodat.c
   fchown-stub.c
   fchownat.c
   fcntl--.h
   fcntl-safer.h
   fcntl_.h
   fd-safer.c
   fflush.c
   file-has-acl.c
   file-type.c
   file-type.h
   fileblocks.c
   filemode.c
   filemode.h
   filename.h
   filenamecat.c
   filenamecat.h
   findprog.c
   findprog.h
   float+.h
   float_.h
   floorl.c
   fnmatch.c
   fnmatch_.h
   fnmatch_loop.c
   fopen-safer.c
   fprintf.c
   fprintftime.c
   fprintftime.h
   fpucw.h
   fpurge.c
   fpurge.h
   freadable.c
   freadable.h
   freadahead.c
   freadahead.h
   freading.c
   freading.h
   free.c
   frexp.c
   frexpl.c
   fseek.c
   fseeko.c
   fseterr.c
   fseterr.h
   fstatat.c
   fstrcmp.c
   fstrcmp.h
   fsusage.c
   fsusage.h
   ftell.c
   ftello.c
   ftruncate.c
   fts-cycle.c
   fts.c
   fts_.h
   full-read.c
   full-read.h
   full-write.c
   full-write.h
   fwritable.c
   fwritable.h
   fwriteerror.c
   fwriteerror.h
   fwriting.c
   fwriting.h
   gai_strerror.c
   gc-gnulib.c
   gc-libgcrypt.c
   gc-pbkdf2-sha1.c
   gc.h
   gcd.c
   gcd.h
   getaddrinfo.c
   getaddrinfo.h
   getcwd.c
   getdate.h
   getdate.y
   getdelim.c
   getdomainname.c
   getdomainname.h
   getgroups.c
   gethostname.c
   gethrxtime.c
   gethrxtime.h
   getline.c
   getloadavg.c
   getlogin_r.c
   getndelim2.c
   getndelim2.h
   getnline.c
   getnline.h
   getopt.c
   getopt_.h
   getopt_int.h
   getopt1.c
   getpagesize.h
   getpass.c
   getpass.h
   getsubopt.c
   gettext.h
   gettime.c
   gettimeofday.c
   getugroups.c
   getugroups.h
   getusershell.c
   gl_anyavltree_list1.h
   gl_anyavltree_list2.h
   gl_anyhash_list1.h
   gl_anyhash_list2.h
   gl_anylinked_list1.h
   gl_anylinked_list2.h
   gl_anyrbtree_list1.h
   gl_anyrbtree_list2.h
   gl_anytree_list1.h
   gl_anytree_list2.h
   gl_anytree_oset.h
   gl_anytreehash_list1.h
   gl_anytreehash_list2.h
   gl_array_list.c
   gl_array_list.h
   gl_array_oset.c
   gl_array_oset.h
   gl_avltree_list.c
   gl_avltree_list.h
   gl_avltree_oset.c
   gl_avltree_oset.h
   gl_avltreehash_list.c
   gl_avltreehash_list.h
   gl_carray_list.c
   gl_carray_list.h
   gl_linked_list.c
   gl_linked_list.h
   gl_linkedhash_list.c
   gl_linkedhash_list.h
   gl_list.c
   gl_list.h
   gl_oset.c
   gl_oset.h
   gl_rbtree_list.c
   gl_rbtree_list.h
   gl_rbtree_oset.c
   gl_rbtree_oset.h
   gl_rbtreehash_list.c
   gl_rbtreehash_list.h
   gl_sublist.c
   gl_sublist.h
   glob-libc.h
   glob.c
   glob_.h
   group-member.c
   group-member.h
   hard-locale.c
   hard-locale.h
   hash-pjw.c
   hash-pjw.h
   hash.c
   hash.h
   hmac-md5.c
   hmac-sha1.c
   hmac.h
   human.c
   human.h
   i-ring-test.c
   i-ring.c
   i-ring.h
   iconv_.h
   iconv_open-aix.gperf
   iconv_open-hpux.gperf
   iconv_open-irix.gperf
   iconv_open-osf.gperf
   iconv_open.c
   idcache.c
   idcache.h
   imaxabs.c
   imaxdiv.c
   imaxtostr.c
   inet_ntop.c
   inet_ntop.h
   inet_pton.c
   inet_pton.h
   intprops.h
   inttostr.c
   inttostr.h
   inttypes_.h
   isapipe.c
   isapipe.h
   isdir.c
   isnan.c
   isnan.h
   isnanf.c
   isnanf.h
   isnanl-nolibm.h
   isnanl.c
   isnanl.h
   javacomp.c
   javacomp.h
   javaexec.c
   javaexec.h
   javaversion.c
   javaversion.h
   javaversion.java
   lbrkprop.h
   lchmod.h
   lchown.c
   ldexpl.c
   linebreak.c
   linebreak.h
   linebuffer.c
   linebuffer.h
   localcharset.c
   localcharset.h
   locale_.h
   localename.c
   localename.h
   lock.c
   lock.h
   logl.c
   long-options.c
   long-options.h
   lseek.c
   lstat.c
   lstat.h
   malloc.c
   malloca.c
   malloca.h
   malloca.valgrind
   math_.h
   mbchar.c
   mbchar.h
   mbfile.h
   mbiter.h
   mbscasecmp.c
   mbscasestr.c
   mbschr.c
   mbscspn.c
   mbslen.c
   mbsncasecmp.c
   mbsnlen.c
   mbspbrk.c
   mbspcasecmp.c
   mbsrchr.c
   mbssep.c
   mbsspn.c
   mbsstr.c
   mbstok_r.c
   mbswidth.c
   mbswidth.h
   mbuiter.h
   md2.c
   md2.h
   md4.c
   md4.h
   md5.c
   md5.h
   memcasecmp.c
   memcasecmp.h
   memchr.c
   memcmp.c
   memcoll.c
   memcoll.h
   memcpy.c
   memmem.c
   memmove.c
   mempcpy.c
   memrchr.c
   memset.c
   memxor.c
   memxor.h
   minmax.h
   mkancesdirs.c
   mkancesdirs.h
   mkdir-p.c
   mkdir-p.h
   mkdir.c
   mkdirat.c
   mkdtemp.c
   mkstemp-safer.c
   mkstemp.c
   mktime.c
   modechange.c
   modechange.h
   mountlist.c
   mountlist.h
   mpsort.c
   mpsort.h
   nanosleep.c
   netinet_in_.h
   obstack.c
   obstack.h
   offtostr.c
   open-safer.c
   openat-die.c
   openat-priv.h
   openat-proc.c
   openat.c
   openat.h
   pagealign_alloc.c
   pagealign_alloc.h
   pathmax.h
   physmem.c
   physmem.h
   pipe-safer.c
   pipe.c
   pipe.h
   poll.c
   poll_.h
   posixtm.c
   posixtm.h
   posixver.c
   posixver.h
   printf-args.c
   printf-args.h
   printf-frexp.c
   printf-frexp.h
   printf-frexpl.c
   printf-frexpl.h
   printf-parse.c
   printf-parse.h
   printf.c
   progname.c
   progname.h
   progreloc.c
   putenv.c
   quote.c
   quote.h
   quotearg.c
   quotearg.h
   raise.c
   read-file.c
   read-file.h
   readline.c
   readline.h
   readlink.c
   readtokens.c
   readtokens.h
   readtokens0.c
   readtokens0.h
   readutmp.c
   readutmp.h
   realloc.c
   ref-add.sin
   ref-del.sin
   regcomp.c
   regex.c
   regex.h
   regex_internal.c
   regex_internal.h
   regexec.c
   relocatable.c
   relocatable.h
   relocwrapper.c
   rename-dest-slash.c
   rename.c
   rijndael-alg-fst.c
   rijndael-alg-fst.h
   rijndael-api-fst.c
   rijndael-api-fst.h
   rmdir.c
   rpmatch.c
   safe-read.c
   safe-read.h
   safe-write.c
   safe-write.h
   same-inode.h
   same.c
   same.h
   save-cwd.c
   save-cwd.h
   savedir.c
   savedir.h
   savewd.c
   savewd.h
   search_.h
   setenv.c
   setenv.h
   settime.c
   sh-quote.c
   sh-quote.h
   sha1.c
   sha1.h
   sig2str.c
   sig2str.h
   signal_.h
   signbitd.c
   signbitf.c
   signbitl.c
   sigprocmask.c
   sincosl.c
   sinl.c
   size_max.h
   sleep.c
   snprintf.c
   sprintf.c
   sqrtl.c
   stat-macros.h
   stat-time.h
   stdbool_.h
   stdint_.h
   stdio--.h
   stdio-safer.h
   stdio_.h
   stdlib--.h
   stdlib-safer.h
   stdlib_.h
   stpcpy.c
   stpncpy.c
   strcasecmp.c
   strcasestr.c
   strchrnul.c
   strcspn.c
   strdup.c
   streq.h
   strerror.c
   strftime.c
   strftime.h
   striconv.c
   striconv.h
   striconveh.c
   striconveh.h
   striconveha.c
   striconveha.h
   string_.h
   stripslash.c
   strncasecmp.c
   strndup.c
   strnlen.c
   strnlen1.c
   strnlen1.h
   strpbrk.c
   strptime.c
   strsep.c
   strtod.c
   strtoimax.c
   strtok_r.c
   strtol.c
   strtoll.c
   strtoul.c
   strtoull.c
   strtoumax.c
   strverscmp.c
   strverscmp.h
   sys_select_.h
   sys_socket_.h
   sys_stat_.h
   sys_time_.h
   sysexits_.h
   tanl.c
   tempname.c
   tempname.h
   time_.h
   time_r.c
   timegm.c
   timespec.h
   tls.c
   tls.h
   tmpdir.c
   tmpdir.h
   tmpfile-safer.c
   tmpfile.c
   trigl.c
   trigl.h
   trim.c
   trim.h
   tsearch.c
   uinttostr.c
   umaxtostr.c
   unicodeio.c
   unicodeio.h
   uniconv.h
   uniname.h
   unistd--.h
   unistd-safer.h
   unistd_.h
   unistdio.h
   unistr.h
   unitypes.h
   uniwidth.h
   unlinkdir.c
   unlinkdir.h
   unlocked-io.h
   unsetenv.c
   userspec.c
   userspec.h
   utime.c
   utimecmp.c
   utimecmp.h
   utimens.c
   utimens.h
   vasnprintf.c
   vasnprintf.h
   vasprintf.c
   verify.h
   verror.c
   verror.h
   version-etc-fsf.c
   version-etc.c
   version-etc.h
   vfprintf.c
   vprintf.c
   vsnprintf.c
   vsprintf.c
   w32spawn.h
   wait-process.c
   wait-process.h
   wchar_.h
   wctype_.h
   wcwidth.c
   write-any-file.c
   write-any-file.h
   xalloc-die.c
   xalloc.h
   xasprintf.c
   xgetcwd.c
   xgetcwd.h
   xgetdomainname.c
   xgetdomainname.h
   xgethostname.c
   xgethostname.h
   xmalloc.c
   xmalloca.c
   xmalloca.h
   xmemcoll.c
   xmemcoll.h
   xnanosleep.c
   xnanosleep.h
   xreadlink.c
   xreadlink.h
   xsetenv.c
   xsetenv.h
   xsize.h
   xstriconv.c
   xstriconv.h
   xstrndup.c
   xstrndup.h
   xstrtod.c
   xstrtod.h
   xstrtoimax.c
   xstrtol-error.c
   xstrtol.c
   xstrtol.h
   xstrtold.c
   xstrtoul.c
   xstrtoumax.c
   xtime.h
   xvasprintf.c
   xvasprintf.h
   yesno.c
   yesno.h

/* argmatch.c -- find a match for a string in an array

   Copyright (C) 1990, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007
   Free Software Foundation, Inc.

   This program 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 2, or (at your option)
   any later version.

   This program 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 this program; if not, write to the Free Software Foundation,
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */

/* Written by David MacKenzie <djm@ai.mit.edu>
   Modified by Akim Demaille <demaille@inf.enst.fr> */

#include <config.h>

/* Specification.  */
#include "argmatch.h"

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "gettext.h"
#define _(msgid) gettext (msgid)

#include "error.h"
#include "quotearg.h"
#include "quote.h"

#if USE_UNLOCKED_IO
# include "unlocked-io.h"
#endif

/* When reporting an invalid argument, show nonprinting characters
   by using the quoting style ARGMATCH_QUOTING_STYLE.  Do not use
   literal_quoting_style.  */
#ifndef ARGMATCH_QUOTING_STYLE
# define ARGMATCH_QUOTING_STYLE locale_quoting_style
#endif

/* Non failing version of argmatch call this function after failing. */
#ifndef ARGMATCH_DIE
# include "exitfail.h"
# define ARGMATCH_DIE exit (exit_failure)
#endif

#ifdef ARGMATCH_DIE_DECL
ARGMATCH_DIE_DECL;
#endif

static void
__argmatch_die (void)
{
  ARGMATCH_DIE;
}

/* Used by XARGMATCH and XARGCASEMATCH.  See description in argmatch.h.
   Default to __argmatch_die, but allow caller to change this at run-time. */
argmatch_exit_fn argmatch_die = __argmatch_die;


/* If ARG is an unambiguous match for an element of the
   NULL-terminated array ARGLIST, return the index in ARGLIST
   of the matched element, else -1 if it does not match any element
   or -2 if it is ambiguous (is a prefix of more than one element).

   If VALLIST is none null, use it to resolve ambiguities limited to
   synonyms, i.e., for
     "yes", "yop" -> 0
     "no", "nope" -> 1
   "y" is a valid argument, for `0', and "n" for `1'.  */

ptrdiff_t
argmatch (const char *arg, const char *const *arglist,
	  const char *vallist, size_t valsize)
{
  size_t i;			/* Temporary index in ARGLIST.  */
  size_t arglen;		/* Length of ARG.  */
  ptrdiff_t matchind = -1;	/* Index of first nonexact match.  */
  bool ambiguous = false;	/* If true, multiple nonexact match(es).  */

  arglen = strlen (arg);

  /* Test all elements for either exact match or abbreviated matches.  */
  for (i = 0; arglist[i]; i++)
    {
      if (!strncmp (arglist[i], arg, arglen))
	{
	  if (strlen (arglist[i]) == arglen)
	    /* Exact match found.  */
	    return i;
	  else if (matchind == -1)
	    /* First nonexact match found.  */
	    matchind = i;
	  else
	    {
	      /* Second nonexact match found.  */
	      if (vallist == NULL
		  || memcmp (vallist + valsize * matchind,
			     vallist + valsize * i, valsize))
		{
		  /* There is a real ambiguity, or we could not
		     disambiguate. */
		  ambiguous = true;
		}
	    }
	}
    }
  if (ambiguous)
    return -2;
  else
    return matchind;
}

/* Error reporting for argmatch.
   CONTEXT is a description of the type of entity that was being matched.
   VALUE is the invalid value that was given.
   PROBLEM is the return value from argmatch.  */

void
argmatch_invalid (const char *context, const char *value, ptrdiff_t problem)
{
  char const *format = (problem == -1
			? _("invalid argument %s for %s")
			: _("ambiguous argument %s for %s"));

  error (0, 0, format, quotearg_n_style (0, ARGMATCH_QUOTING_STYLE, value),
	 quote_n (1, context));
}

/* List the valid arguments for argmatch.
   ARGLIST is the same as in argmatch.
   VALLIST is a pointer to an array of values.
   VALSIZE is the size of the elements of VALLIST */
void
argmatch_valid (const char *const *arglist,
		const char *vallist, size_t valsize)
{
  size_t i;
  const char *last_val = NULL;

  /* We try to put synonyms on the same line.  The assumption is that
     synonyms follow each other */
  fprintf (stderr, _("Valid arguments are:"));
  for (i = 0; arglist[i]; i++)
    if ((i == 0)
	|| memcmp (last_val, vallist + valsize * i, valsize))
      {
	fprintf (stderr, "\n  - `%s'", arglist[i]);
	last_val = vallist + valsize * i;
      }
    else
      {
	fprintf (stderr, ", `%s'", arglist[i]);
      }
  putc ('\n', stderr);
}

/* Never failing versions of the previous functions.

   CONTEXT is the context for which argmatch is called (e.g.,
   "--version-control", or "$VERSION_CONTROL" etc.).  Upon failure,
   calls the (supposed never to return) function EXIT_FN. */

ptrdiff_t
__xargmatch_internal (const char *context,
		      const char *arg, const char *const *arglist,
		      const char *vallist, size_t valsize,
		      argmatch_exit_fn exit_fn)
{
  ptrdiff_t res = argmatch (arg, arglist, vallist, valsize);
  if (res >= 0)
    /* Success. */
    return res;

  /* We failed.  Explain why. */
  argmatch_invalid (context, arg, res);
  argmatch_valid (arglist, vallist, valsize);
  (*exit_fn) ();

  return -1; /* To please the compilers. */
}

/* Look for VALUE in VALLIST, an array of objects of size VALSIZE and
   return the first corresponding argument in ARGLIST */
const char *
argmatch_to_argument (const char *value,
		      const char *const *arglist,
		      const char *vallist, size_t valsize)
{
  size_t i;

  for (i = 0; arglist[i]; i++)
    if (!memcmp (value, vallist + valsize * i, valsize))
      return arglist[i];
  return NULL;
}

#ifdef TEST
/*
 * Based on "getversion.c" by David MacKenzie <djm@gnu.ai.mit.edu>
 */
char *program_name;

/* When to make backup files.  */
enum backup_type
{
  /* Never make backups.  */
  no_backups,

  /* Make simple backups of every file.  */
  simple_backups,

  /* Make numbered backups of files that already have numbered backups,
     and simple backups of the others.  */
  numbered_existing_backups,

  /* Make numbered backups of every file.  */
  numbered_backups
};

/* Two tables describing arguments (keys) and their corresponding
   values */
static const char *const backup_args[] =
{
  "no", "none", "off",
  "simple", "never",
  "existing", "nil",
  "numbered", "t",
  0
};

static const enum backup_type backup_vals[] =
{
  no_backups, no_backups, no_backups,
  simple_backups, simple_backups,
  numbered_existing_backups, numbered_existing_backups,
  numbered_backups, numbered_backups
};

int
main (int argc, const char *const *argv)
{
  const char *cp;
  enum backup_type backup_type = no_backups;

  program_name = (char *) argv[0];

  if (argc > 2)
    {
      fprintf (stderr, "Usage: %s [VERSION_CONTROL]\n", program_name);
      exit (1);
    }

  if ((cp = getenv ("VERSION_CONTROL")))
    backup_type = XARGMATCH ("$VERSION_CONTROL", cp,
			     backup_args, backup_vals);

  if (argc == 2)
    backup_type = XARGMATCH (program_name, argv[1],
			     backup_args, backup_vals);

  printf ("The version control is `%s'\n",
	  ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));

  return 0;
}
#endif

About Koders | Resources | Downloads | Support | Black Duck | Submit Project | Terms of Service | DMCA | Privacy Policy | Site Map| Contact Us