diff options
author | steve <steve@FreeBSD.org> | 1997-06-29 06:55:02 +0000 |
---|---|---|
committer | steve <steve@FreeBSD.org> | 1997-06-29 06:55:02 +0000 |
commit | 4b6324645f7223db0870236240d6e99eb4cda757 (patch) | |
tree | b91e93b575aeb975e736e614eaf2a0d0f8ea461a /contrib/patch/argmatch.c | |
download | FreeBSD-src-4b6324645f7223db0870236240d6e99eb4cda757.zip FreeBSD-src-4b6324645f7223db0870236240d6e99eb4cda757.tar.gz |
Import of GNU patch version 2.4.
Diffstat (limited to 'contrib/patch/argmatch.c')
-rw-r--r-- | contrib/patch/argmatch.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/contrib/patch/argmatch.c b/contrib/patch/argmatch.c new file mode 100644 index 0000000..aa55933 --- /dev/null +++ b/contrib/patch/argmatch.c @@ -0,0 +1,92 @@ +/* argmatch.c -- find a match for a string in an array + Copyright (C) 1990, 1997 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; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by David MacKenzie <djm@gnu.ai.mit.edu> */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <argmatch.h> + +#include <sys/types.h> + +#include <stdio.h> +#if HAVE_STRING_H +# include <string.h> +#else +# include <strings.h> +#endif + +/* If ARG is an unambiguous match for an element of the + null-terminated array OPTLIST, return the index in OPTLIST + 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). */ + +int +argmatch (arg, optlist) + const char *arg; + const char *const *optlist; +{ + int i; /* Temporary index in OPTLIST. */ + size_t arglen; /* Length of ARG. */ + int matchind = -1; /* Index of first nonexact match. */ + int ambiguous = 0; /* If nonzero, multiple nonexact match(es). */ + + arglen = strlen (arg); + + /* Test all elements for either exact match or abbreviated matches. */ + for (i = 0; optlist[i]; i++) + { + if (!strncmp (optlist[i], arg, arglen)) + { + if (strlen (optlist[i]) == arglen) + /* Exact match found. */ + return i; + else if (matchind == -1) + /* First nonexact match found. */ + matchind = i; + else + /* Second nonexact match found. */ + ambiguous = 1; + } + } + if (ambiguous) + return -2; + else + return matchind; +} + +/* Error reporting for argmatch. + KIND 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 +invalid_arg (kind, value, problem) + const char *kind; + const char *value; + int problem; +{ + fprintf (stderr, "%s: ", program_name); + if (problem == -1) + fprintf (stderr, "invalid"); + else /* Assume -2. */ + fprintf (stderr, "ambiguous"); + fprintf (stderr, " %s `%s'\n", kind, value); +} |