Mercurial > hg > octave-kai > gnulib-hg
annotate lib/argmatch.c @ 1647:af020f6709a9
s/argmatch_exit_failure/argmatch_die/
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Sat, 16 Jan 1999 15:21:52 +0000 |
parents | 0f8f202484fb |
children | d8cb69b80232 |
rev | line source |
---|---|
5 | 1 /* argmatch.c -- find a match for a string in an array |
1608
132b836eb4f8
Remove definition of setlocale.
Jim Meyering <jim@meyering.net>
parents:
1590
diff
changeset
|
2 Copyright (C) 1990, 1998, 1999 Free Software Foundation, Inc. |
5 | 3 |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
15 along with this program; if not, write to the Free Software Foundation, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
5 | 17 |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
18 /* Written by David MacKenzie <djm@ai.mit.edu> |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
19 Modified by Akim Demaille <demaille@inf.enst.fr> */ |
422
3c2a459abb69
(argmatch): Include sys/types.h and declare length argument with type size_t.
Jim Meyering <jim@meyering.net>
parents:
5
diff
changeset
|
20 |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
21 #include "argmatch.h" |
422
3c2a459abb69
(argmatch): Include sys/types.h and declare length argument with type size_t.
Jim Meyering <jim@meyering.net>
parents:
5
diff
changeset
|
22 |
5 | 23 #include <stdio.h> |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
24 #ifdef STDC_HEADERS |
699 | 25 # include <string.h> |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
26 #endif |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
27 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
28 #if HAVE_LOCALE_H |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
29 # include <locale.h> |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
30 #endif |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
31 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
32 #if ENABLE_NLS |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
33 # include <libintl.h> |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
34 # define _(Text) gettext (Text) |
922
9cb09b60925d
Update from FSF via patch-2.2.93.
Jim Meyering <jim@meyering.net>
parents:
699
diff
changeset
|
35 #else |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
36 # define _(Text) Text |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
37 #endif |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
38 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
39 #include "quotearg.h" |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
40 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
41 /* When reporting a failing argument, make sure to show invisible |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
42 characters hidden using the quoting style |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
43 ARGMATCH_QUOTING_STYLE. literal_quoting_style is not good. */ |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
44 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
45 #ifndef ARGMATCH_QUOTING_STYLE |
1632
f6217175922c
(ARGMATCH_QUOTING_STYLE): Change from c_quoting_style to escape_quoting_style.
Jim Meyering <jim@meyering.net>
parents:
1619
diff
changeset
|
46 # define ARGMATCH_QUOTING_STYLE escape_quoting_style |
5 | 47 #endif |
48 | |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
49 extern char *program_name; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
50 |
1646 | 51 /* The following test is to work around the gross typo in |
52 systems like Sony NEWS-OS Release 4.0C, whereby EXIT_FAILURE | |
53 is defined to 0, not 1. */ | |
54 #if !EXIT_FAILURE | |
55 # undef EXIT_FAILURE | |
56 # define EXIT_FAILURE 1 | |
57 #endif | |
58 | |
1644
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
59 /* Non failing version of argmatch call this function after failing. */ |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
60 #ifndef ARGMATCH_DIE |
1646 | 61 # define ARGMATCH_DIE exit (EXIT_FAILURE) |
1644
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
62 #endif |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
63 |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
64 static void |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
65 __argmatch_die (void) |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
66 { |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
67 ARGMATCH_DIE; |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
68 } |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
69 |
1647
af020f6709a9
s/argmatch_exit_failure/argmatch_die/
Jim Meyering <jim@meyering.net>
parents:
1646
diff
changeset
|
70 argmatch_exit_fn argmatch_die = __argmatch_die; |
1644
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
71 |
5 | 72 /* If ARG is an unambiguous match for an element of the |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
73 null-terminated array ARGLIST, return the index in ARGLIST |
5 | 74 of the matched element, else -1 if it does not match any element |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
75 or -2 if it is ambiguous (is a prefix of more than one element). |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
76 If SENSITIVE, comparison is case sensitive. |
5 | 77 |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
78 If VALLIST is none null, use it to resolve ambiguities limited to |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
79 synonyms, i.e., for |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
80 "yes", "yop" -> 0 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
81 "no", "nope" -> 1 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
82 "y" is a valid argument, for `0', and "n" for `1'. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
83 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
84 static int |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
85 __argmatch_internal (const char *arg, const char *const *arglist, |
1588 | 86 const char *vallist, size_t valsize, |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
87 int case_sensitive) |
5 | 88 { |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
89 int i; /* Temporary index in ARGLIST. */ |
422
3c2a459abb69
(argmatch): Include sys/types.h and declare length argument with type size_t.
Jim Meyering <jim@meyering.net>
parents:
5
diff
changeset
|
90 size_t arglen; /* Length of ARG. */ |
5 | 91 int matchind = -1; /* Index of first nonexact match. */ |
92 int ambiguous = 0; /* If nonzero, multiple nonexact match(es). */ | |
422
3c2a459abb69
(argmatch): Include sys/types.h and declare length argument with type size_t.
Jim Meyering <jim@meyering.net>
parents:
5
diff
changeset
|
93 |
5 | 94 arglen = strlen (arg); |
422
3c2a459abb69
(argmatch): Include sys/types.h and declare length argument with type size_t.
Jim Meyering <jim@meyering.net>
parents:
5
diff
changeset
|
95 |
5 | 96 /* Test all elements for either exact match or abbreviated matches. */ |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
97 for (i = 0; arglist[i]; i++) |
5 | 98 { |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
99 if (case_sensitive |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
100 ? !strncmp (arglist[i], arg, arglen) |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
101 : !strncasecmp (arglist[i], arg, arglen)) |
5 | 102 { |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
103 if (strlen (arglist[i]) == arglen) |
5 | 104 /* Exact match found. */ |
105 return i; | |
106 else if (matchind == -1) | |
107 /* First nonexact match found. */ | |
108 matchind = i; | |
109 else | |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
110 { |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
111 /* Second nonexact match found. */ |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
112 if (vallist == NULL |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
113 || memcmp (vallist + valsize * matchind, |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
114 vallist + valsize * i, valsize)) |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
115 { |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
116 /* There is a real ambiguity, or we could not |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
117 disambiguate. */ |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
118 ambiguous = 1; |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
119 } |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
120 } |
5 | 121 } |
122 } | |
123 if (ambiguous) | |
124 return -2; | |
125 else | |
126 return matchind; | |
127 } | |
128 | |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
129 /* argmatch - case sensitive version */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
130 int |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
131 argmatch (const char *arg, const char *const *arglist, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
132 const char *vallist, size_t valsize) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
133 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
134 return __argmatch_internal (arg, arglist, vallist, valsize, 1); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
135 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
136 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
137 /* argcasematch - case insensitive version */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
138 int |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
139 argcasematch (const char *arg, const char *const *arglist, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
140 const char *vallist, size_t valsize) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
141 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
142 return __argmatch_internal (arg, arglist, vallist, valsize, 0); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
143 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
144 |
5 | 145 /* Error reporting for argmatch. |
1644
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
146 CONTEXT is a description of the type of entity that was being matched. |
5 | 147 VALUE is the invalid value that was given. |
148 PROBLEM is the return value from argmatch. */ | |
149 | |
150 void | |
1644
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
151 argmatch_invalid (const char *context, const char *value, int problem) |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
152 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
153 enum quoting_style saved_quoting_style; |
1619
22cb405d7c5a
(argmatch_invalid): Remove double quotes from the
Jim Meyering <jim@meyering.net>
parents:
1611
diff
changeset
|
154 char const *format; |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
155 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
156 /* Make sure to have a good quoting style to report errors. |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
157 literal is insane here. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
158 saved_quoting_style = get_quoting_style (NULL); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
159 set_quoting_style (NULL, ARGMATCH_QUOTING_STYLE); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
160 |
1619
22cb405d7c5a
(argmatch_invalid): Remove double quotes from the
Jim Meyering <jim@meyering.net>
parents:
1611
diff
changeset
|
161 format = (problem == -1 |
22cb405d7c5a
(argmatch_invalid): Remove double quotes from the
Jim Meyering <jim@meyering.net>
parents:
1611
diff
changeset
|
162 ? _("%s: invalid argument `%s' for `%s'\n") |
22cb405d7c5a
(argmatch_invalid): Remove double quotes from the
Jim Meyering <jim@meyering.net>
parents:
1611
diff
changeset
|
163 : _("%s: ambiguous argument `%s' for `%s'\n")); |
22cb405d7c5a
(argmatch_invalid): Remove double quotes from the
Jim Meyering <jim@meyering.net>
parents:
1611
diff
changeset
|
164 |
1644
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
165 fprintf (stderr, format, program_name, quotearg (value), context); |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
166 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
167 set_quoting_style (NULL, saved_quoting_style); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
168 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
169 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
170 /* List the valid arguments for argmatch. |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
171 ARGLIST is the same as in argmatch. |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
172 VALLIST is a pointer to an array of values. |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
173 VALSIZE is the size of the elements of VALLIST */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
174 void |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
175 argmatch_valid (const char *const *arglist, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
176 const char *vallist, size_t valsize) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
177 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
178 int i; |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
179 const char *last_val = NULL; |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
180 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
181 /* We try to put synonyms on the same line. The assumption is that |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
182 synonyms follow each other */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
183 fprintf (stderr, _("Valid arguments are:")); |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
184 for (i = 0; arglist[i]; i++) |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
185 if ((i == 0) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
186 || memcmp (last_val, vallist + valsize * i, valsize)) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
187 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
188 fprintf (stderr, "\n - `%s'", arglist[i]); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
189 last_val = vallist + valsize * i; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
190 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
191 else |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
192 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
193 fprintf (stderr, ", `%s'", arglist[i]); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
194 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
195 putc ('\n', stderr); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
196 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
197 |
1644
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
198 /* Never failing versions of the previous functions. |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
199 |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
200 CONTEXT is the context for which argmatch is called (e.g., |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
201 "--version-control", or "$VERSION_CONTROL" etc.). Upon failure, |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
202 calls the (supposed never to return) function EXIT_FN. */ |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
203 |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
204 int |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
205 __xargmatch_internal (const char *context, |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
206 const char *arg, const char *const *arglist, |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
207 const char *vallist, size_t valsize, |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
208 int case_sensitive, |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
209 argmatch_exit_fn exit_fn) |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
210 { |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
211 int res = __argmatch_internal (arg, arglist, |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
212 vallist, valsize, |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
213 case_sensitive); |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
214 if (res >= 0) |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
215 /* Success. */ |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
216 return res; |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
217 |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
218 /* We failed. Explain why. */ |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
219 argmatch_invalid (context, arg, res); |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
220 argmatch_valid (arglist, vallist, valsize); |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
221 (*exit_fn) (); |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
222 |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
223 return -1; /* To please the compilers. */ |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
224 } |
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
225 |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
226 /* Look for VALUE in VALLIST, an array of objects of size VALSIZE and |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
227 return the first corresponding argument in ARGLIST */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
228 const char * |
1611
124c0cb70d04
(__xargmatch_internal): Remove now-unused function.
Jim Meyering <jim@meyering.net>
parents:
1608
diff
changeset
|
229 argmatch_to_argument (const char *value, |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
230 const char *const *arglist, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
231 const char *vallist, size_t valsize) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
232 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
233 int i; |
1588 | 234 |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
235 for (i = 0; arglist[i]; i++) |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
236 if (!memcmp (value, vallist + valsize * i, valsize)) |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
237 return arglist[i]; |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
238 return NULL; |
5 | 239 } |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
240 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
241 #ifdef TEST |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
242 /* |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
243 * Based on "getversion.c" by David MacKenzie <djm@gnu.ai.mit.edu> |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
244 */ |
1644
47cbac954273
(ARGMATCH_DIE): Provide default.
Jim Meyering <jim@meyering.net>
parents:
1632
diff
changeset
|
245 char *program_name; |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
246 extern const char *getenv (); |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
247 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
248 /* When to make backup files. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
249 enum backup_type |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
250 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
251 /* Never make backups. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
252 none, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
253 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
254 /* Make simple backups of every file. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
255 simple, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
256 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
257 /* Make numbered backups of files that already have numbered backups, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
258 and simple backups of the others. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
259 numbered_existing, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
260 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
261 /* Make numbered backups of every file. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
262 numbered |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
263 }; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
264 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
265 /* Two tables describing arguments (keys) and their corresponding |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
266 values */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
267 static const char *const backup_args[] = |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
268 { |
1588 | 269 "no", "none", "off", |
270 "simple", "never", | |
271 "existing", "nil", | |
272 "numbered", "t", | |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
273 0 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
274 }; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
275 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
276 static const enum backup_type backup_vals[] = |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
277 { |
1588 | 278 none, none, none, |
279 simple, simple, | |
280 numbered_existing, numbered_existing, | |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
281 numbered, numbered |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
282 }; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
283 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
284 int |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
285 main (int argc, const char *const *argv) |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
286 { |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
287 const char *cp; |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
288 enum backup_type backup_type = none; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
289 |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
290 program_name = (char *) argv[0]; |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
291 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
292 if (argc > 2) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
293 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
294 fprintf (stderr, "Usage: %s [VERSION_CONTROL]\n", program_name); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
295 exit (1); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
296 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
297 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
298 if ((cp = getenv ("VERSION_CONTROL"))) |
1588 | 299 backup_type = XARGCASEMATCH ("$VERSION_CONTROL", cp, |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
300 backup_args, backup_vals); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
301 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
302 if (argc == 2) |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
303 backup_type = XARGCASEMATCH (program_name, argv[1], |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
304 backup_args, backup_vals); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
305 |
1588 | 306 printf ("The version control is `%s'\n", |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
307 ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals)); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
308 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
309 return 0; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
310 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
311 #endif |