OpenCoverage

argmatch.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/argmatch.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* argmatch.c -- find a match for a string in an array-
2-
3 Copyright (C) 1990, 1998-1999, 2001-2007, 2009-2018 Free Software-
4 Foundation, Inc.-
5-
6 This program is free software: you can redistribute it and/or modify-
7 it under the terms of the GNU General Public License as published by-
8 the Free Software Foundation; either version 3 of the License, or-
9 (at your option) any later version.-
10-
11 This program is distributed in the hope that it will be useful,-
12 but WITHOUT ANY WARRANTY; without even the implied warranty of-
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
14 GNU General Public License for more details.-
15-
16 You should have received a copy of the GNU General Public License-
17 along with this program. If not, see <https://www.gnu.org/licenses/>. */-
18-
19/* Written by David MacKenzie <djm@ai.mit.edu>-
20 Modified by Akim Demaille <demaille@inf.enst.fr> */-
21-
22#include <config.h>-
23-
24/* Specification. */-
25#include "argmatch.h"-
26-
27#include <stdbool.h>-
28#include <stdio.h>-
29#include <stdlib.h>-
30#include <string.h>-
31-
32#include "gettext.h"-
33#define _(msgid) gettext (msgid)-
34-
35#include "error.h"-
36#include "quotearg.h"-
37#include "quote.h"-
38#include "getprogname.h"-
39-
40#if USE_UNLOCKED_IO-
41# include "unlocked-io.h"-
42#endif-
43-
44/* When reporting an invalid argument, show nonprinting characters-
45 by using the quoting style ARGMATCH_QUOTING_STYLE. Do not use-
46 literal_quoting_style. */-
47#ifndef ARGMATCH_QUOTING_STYLE-
48# define ARGMATCH_QUOTING_STYLE locale_quoting_style-
49#endif-
50-
51/* Non failing version of argmatch call this function after failing. */-
52#ifndef ARGMATCH_DIE-
53# include "exitfail.h"-
54# define ARGMATCH_DIE exit (exit_failure)-
55#endif-
56-
57#ifdef ARGMATCH_DIE_DECL-
58ARGMATCH_DIE_DECL;-
59#endif-
60-
61static void-
62__argmatch_die (void)-
63{-
64 ARGMATCH_DIE;-
65}
never executed: end of block
0
66-
67/* Used by XARGMATCH and XARGCASEMATCH. See description in argmatch.h.-
68 Default to __argmatch_die, but allow caller to change this at run-time. */-
69argmatch_exit_fn argmatch_die = __argmatch_die;-
70-
71 -
72/* If ARG is an unambiguous match for an element of the-
73 NULL-terminated array ARGLIST, return the index in ARGLIST-
74 of the matched element, else -1 if it does not match any element-
75 or -2 if it is ambiguous (is a prefix of more than one element).-
76-
77 If VALLIST is none null, use it to resolve ambiguities limited to-
78 synonyms, i.e., for-
79 "yes", "yop" -> 0-
80 "no", "nope" -> 1-
81 "y" is a valid argument, for 0, and "n" for 1. */-
82-
83ptrdiff_t-
84argmatch (const char *arg, const char *const *arglist,-
85 const char *vallist, size_t valsize)-
86{-
87 size_t i; /* Temporary index in ARGLIST. */-
88 size_t arglen; /* Length of ARG. */-
89 ptrdiff_t matchind = -1; /* Index of first nonexact match. */-
90 bool ambiguous = false; /* If true, multiple nonexact match(es). */-
91-
92 arglen = strlen (arg);-
93-
94 /* Test all elements for either exact match or abbreviated matches. */-
95 for (i = 0; arglist[i]; i++)
arglist[i]Description
TRUEevaluated 4228 times by 22 tests
Evaluated by:
  • b2sum
  • cp
  • date
  • df
  • dir
  • du
  • ginstall
  • ln
  • ls
  • mv
  • numfmt
  • od
  • ptx
  • rm
  • shred
  • sort
  • stat
  • tail
  • tee
  • touch
  • uniq
  • vdir
FALSEevaluated 232 times by 15 tests
Evaluated by:
  • b2sum
  • cp
  • date
  • df
  • dir
  • du
  • ls
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
232-4228
96 {-
97 if (!strncmp (arglist[i], arg, arglen))
never executed: __result = (((const unsigned char *) (const char *) ( arglist[i] ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( arg ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
! (__extension...g , arglen )))Description
TRUEevaluated 1214 times by 19 tests
Evaluated by:
  • b2sum
  • cp
  • date
  • du
  • ginstall
  • ln
  • ls
  • mv
  • numfmt
  • od
  • ptx
  • rm
  • shred
  • sort
  • stat
  • tail
  • tee
  • uniq
  • vdir
FALSEevaluated 3014 times by 21 tests
Evaluated by:
  • cp
  • date
  • df
  • dir
  • du
  • ginstall
  • ln
  • ls
  • mv
  • numfmt
  • od
  • ptx
  • rm
  • shred
  • sort
  • stat
  • tail
  • tee
  • touch
  • uniq
  • vdir
__builtin_cons...t_p ( arglen )Description
TRUEnever evaluated
FALSEevaluated 4228 times by 22 tests
Evaluated by:
  • b2sum
  • cp
  • date
  • df
  • dir
  • du
  • ginstall
  • ln
  • ls
  • mv
  • numfmt
  • od
  • ptx
  • rm
  • shred
  • sort
  • stat
  • tail
  • tee
  • touch
  • uniq
  • vdir
__builtin_cons...( arglist[i] )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( argli...t) ( arglen ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( arg )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( arg )...t) ( arglen ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-4228
98 {-
99 if (strlen (arglist[i]) == arglen)
strlen (arglist[i]) == arglenDescription
TRUEevaluated 1202 times by 19 tests
Evaluated by:
  • b2sum
  • cp
  • date
  • du
  • ginstall
  • ln
  • ls
  • mv
  • numfmt
  • od
  • ptx
  • rm
  • shred
  • sort
  • stat
  • tail
  • tee
  • uniq
  • vdir
FALSEevaluated 12 times by 4 tests
Evaluated by:
  • b2sum
  • cp
  • date
  • ls
12-1202
100 /* Exact match found. */-
101 return i;
executed 1202 times by 19 tests: return i;
Executed by:
  • b2sum
  • cp
  • date
  • du
  • ginstall
  • ln
  • ls
  • mv
  • numfmt
  • od
  • ptx
  • rm
  • shred
  • sort
  • stat
  • tail
  • tee
  • uniq
  • vdir
1202
102 else if (matchind == -1)
matchind == -1Description
TRUEevaluated 12 times by 4 tests
Evaluated by:
  • b2sum
  • cp
  • date
  • ls
FALSEnever evaluated
0-12
103 /* First nonexact match found. */-
104 matchind = i;
executed 12 times by 4 tests: matchind = i;
Executed by:
  • b2sum
  • cp
  • date
  • ls
12
105 else-
106 {-
107 /* Second nonexact match found. */-
108 if (vallist == NULL
vallist == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
109 || memcmp (vallist + valsize * matchind,
memcmp (vallis... * i, valsize)Description
TRUEnever evaluated
FALSEnever evaluated
0
110 vallist + valsize * i, valsize))
memcmp (vallis... * i, valsize)Description
TRUEnever evaluated
FALSEnever evaluated
0
111 {-
112 /* There is a real ambiguity, or we could not-
113 disambiguate. */-
114 ambiguous = true;-
115 }
never executed: end of block
0
116 }
never executed: end of block
0
117 }-
118 }
executed 3026 times by 22 tests: end of block
Executed by:
  • b2sum
  • cp
  • date
  • df
  • dir
  • du
  • ginstall
  • ln
  • ls
  • mv
  • numfmt
  • od
  • ptx
  • rm
  • shred
  • sort
  • stat
  • tail
  • tee
  • touch
  • uniq
  • vdir
3026
119 if (ambiguous)
ambiguousDescription
TRUEnever evaluated
FALSEevaluated 232 times by 15 tests
Evaluated by:
  • b2sum
  • cp
  • date
  • df
  • dir
  • du
  • ls
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
0-232
120 return -2;
never executed: return -2;
0
121 else-
122 return matchind;
executed 232 times by 15 tests: return matchind;
Executed by:
  • b2sum
  • cp
  • date
  • df
  • dir
  • du
  • ls
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
232
123}-
124-
125/* Error reporting for argmatch.-
126 CONTEXT is a description of the type of entity that was being matched.-
127 VALUE is the invalid value that was given.-
128 PROBLEM is the return value from argmatch. */-
129-
130void-
131argmatch_invalid (const char *context, const char *value, ptrdiff_t problem)-
132{-
133 char const *format = (problem == -1
problem == -1Description
TRUEevaluated 37 times by 11 tests
Evaluated by:
  • cp
  • date
  • dir
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
FALSEnever evaluated
0-37
134 ? _("invalid argument %s for %s")-
135 : _("ambiguous argument %s for %s"));-
136-
137 error (0, 0, format, quotearg_n_style (0, ARGMATCH_QUOTING_STYLE, value),-
138 quote_n (1, context));-
139}
executed 37 times by 11 tests: end of block
Executed by:
  • cp
  • date
  • dir
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
37
140-
141/* List the valid arguments for argmatch.-
142 ARGLIST is the same as in argmatch.-
143 VALLIST is a pointer to an array of values.-
144 VALSIZE is the size of the elements of VALLIST */-
145void-
146argmatch_valid (const char *const *arglist,-
147 const char *vallist, size_t valsize)-
148{-
149 size_t i;-
150 const char *last_val = NULL;-
151-
152 /* We try to put synonyms on the same line. The assumption is that-
153 synonyms follow each other */-
154 fputs (_("Valid arguments are:"), stderr);-
155 for (i = 0; arglist[i]; i++)
arglist[i]Description
TRUEevaluated 163 times by 11 tests
Evaluated by:
  • cp
  • date
  • dir
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
FALSEevaluated 37 times by 11 tests
Evaluated by:
  • cp
  • date
  • dir
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
37-163
156 if ((i == 0)
(i == 0)Description
TRUEevaluated 37 times by 11 tests
Evaluated by:
  • cp
  • date
  • dir
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
FALSEevaluated 126 times by 11 tests
Evaluated by:
  • cp
  • date
  • dir
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
37-126
157 || memcmp (last_val, vallist + valsize * i, valsize))
memcmp (last_v... * i, valsize)Description
TRUEevaluated 113 times by 11 tests
Evaluated by:
  • cp
  • date
  • dir
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
FALSEevaluated 13 times by 3 tests
Evaluated by:
  • dir
  • touch
  • vdir
13-113
158 {-
159 fprintf (stderr, "\n - %s", quote (arglist[i]));-
160 last_val = vallist + valsize * i;-
161 }
executed 150 times by 11 tests: end of block
Executed by:
  • cp
  • date
  • dir
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
150
162 else-
163 {-
164 fprintf (stderr, ", %s", quote (arglist[i]));-
165 }
executed 13 times by 3 tests: end of block
Executed by:
  • dir
  • touch
  • vdir
13
166 putc ('\n', stderr);-
167}
executed 37 times by 11 tests: end of block
Executed by:
  • cp
  • date
  • dir
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
37
168-
169/* Never failing versions of the previous functions.-
170-
171 CONTEXT is the context for which argmatch is called (e.g.,-
172 "--version-control", or "$VERSION_CONTROL" etc.). Upon failure,-
173 calls the (supposed never to return) function EXIT_FN. */-
174-
175ptrdiff_t-
176__xargmatch_internal (const char *context,-
177 const char *arg, const char *const *arglist,-
178 const char *vallist, size_t valsize,-
179 argmatch_exit_fn exit_fn)-
180{-
181 ptrdiff_t res = argmatch (arg, arglist, vallist, valsize);-
182 if (res >= 0)
res >= 0Description
TRUEevaluated 1047 times by 16 tests
Evaluated by:
  • cp
  • date
  • du
  • ginstall
  • ln
  • ls
  • mv
  • numfmt
  • od
  • ptx
  • rm
  • shred
  • sort
  • tail
  • tee
  • uniq
FALSEevaluated 37 times by 11 tests
Evaluated by:
  • cp
  • date
  • dir
  • numfmt
  • od
  • ptx
  • shred
  • sort
  • touch
  • uniq
  • vdir
37-1047
183 /* Success. */-
184 return res;
executed 1047 times by 16 tests: return res;
Executed by:
  • cp
  • date
  • du
  • ginstall
  • ln
  • ls
  • mv
  • numfmt
  • od
  • ptx
  • rm
  • shred
  • sort
  • tail
  • tee
  • uniq
1047
185-
186 /* We failed. Explain why. */-
187 argmatch_invalid (context, arg, res);-
188 argmatch_valid (arglist, vallist, valsize);-
189 (*exit_fn) ();-
190-
191 return -1; /* To please the compilers. */
never executed: return -1;
0
192}-
193-
194/* Look for VALUE in VALLIST, an array of objects of size VALSIZE and-
195 return the first corresponding argument in ARGLIST */-
196const char *-
197argmatch_to_argument (const char *value,-
198 const char *const *arglist,-
199 const char *vallist, size_t valsize)-
200{-
201 size_t i;-
202-
203 for (i = 0; arglist[i]; i++)
arglist[i]Description
TRUEnever evaluated
FALSEnever evaluated
0
204 if (!memcmp (value, vallist + valsize * i, valsize))
!memcmp (value... * i, valsize)Description
TRUEnever evaluated
FALSEnever evaluated
0
205 return arglist[i];
never executed: return arglist[i];
0
206 return NULL;
never executed: return ((void *)0) ;
0
207}-
208-
209#ifdef TEST-
210/*-
211 * Based on "getversion.c" by David MacKenzie <djm@gnu.ai.mit.edu>-
212 */-
213-
214/* When to make backup files. */-
215enum backup_type-
216{-
217 /* Never make backups. */-
218 no_backups,-
219-
220 /* Make simple backups of every file. */-
221 simple_backups,-
222-
223 /* Make numbered backups of files that already have numbered backups,-
224 and simple backups of the others. */-
225 numbered_existing_backups,-
226-
227 /* Make numbered backups of every file. */-
228 numbered_backups-
229};-
230-
231/* Two tables describing arguments (keys) and their corresponding-
232 values */-
233static const char *const backup_args[] =-
234{-
235 "no", "none", "off",-
236 "simple", "never",-
237 "existing", "nil",-
238 "numbered", "t",-
239 0-
240};-
241-
242static const enum backup_type backup_vals[] =-
243{-
244 no_backups, no_backups, no_backups,-
245 simple_backups, simple_backups,-
246 numbered_existing_backups, numbered_existing_backups,-
247 numbered_backups, numbered_backups-
248};-
249-
250int-
251main (int argc, const char *const *argv)-
252{-
253 const char *cp;-
254 enum backup_type backup_type = no_backups;-
255-
256 if (argc > 2)-
257 {-
258 fprintf (stderr, "Usage: %s [VERSION_CONTROL]\n", getprogname ());-
259 exit (1);-
260 }-
261-
262 if ((cp = getenv ("VERSION_CONTROL")))-
263 backup_type = XARGMATCH ("$VERSION_CONTROL", cp,-
264 backup_args, backup_vals);-
265-
266 if (argc == 2)-
267 backup_type = XARGMATCH (getprogname (), argv[1],-
268 backup_args, backup_vals);-
269-
270 printf ("The version control is '%s'\n",-
271 ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));-
272-
273 return 0;-
274}-
275#endif-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2