Mercurial > hg > octave-kai > gnulib-hg
annotate lib/argmatch.c @ 1632:f6217175922c
(ARGMATCH_QUOTING_STYLE): Change from c_quoting_style to escape_quoting_style.
(argmatch_invalid): Now that the quoted quantity is no longer double
quoted, remove the code that removed leading and trailing double quotes.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Mon, 11 Jan 1999 03:10:19 +0000 |
parents | 22cb405d7c5a |
children | 47cbac954273 |
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 |
5 | 51 /* 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
|
52 null-terminated array ARGLIST, return the index in ARGLIST |
5 | 53 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
|
54 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
|
55 If SENSITIVE, comparison is case sensitive. |
5 | 56 |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
57 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
|
58 synonyms, i.e., for |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
59 "yes", "yop" -> 0 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
60 "no", "nope" -> 1 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
61 "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
|
62 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
63 static int |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
64 __argmatch_internal (const char *arg, const char *const *arglist, |
1588 | 65 const char *vallist, size_t valsize, |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
66 int case_sensitive) |
5 | 67 { |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
68 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
|
69 size_t arglen; /* Length of ARG. */ |
5 | 70 int matchind = -1; /* Index of first nonexact match. */ |
71 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
|
72 |
5 | 73 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
|
74 |
5 | 75 /* 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
|
76 for (i = 0; arglist[i]; i++) |
5 | 77 { |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
78 if (case_sensitive |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
79 ? !strncmp (arglist[i], arg, arglen) |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
80 : !strncasecmp (arglist[i], arg, arglen)) |
5 | 81 { |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
82 if (strlen (arglist[i]) == arglen) |
5 | 83 /* Exact match found. */ |
84 return i; | |
85 else if (matchind == -1) | |
86 /* First nonexact match found. */ | |
87 matchind = i; | |
88 else | |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
89 { |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
90 /* Second nonexact match found. */ |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
91 if (vallist == NULL |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
92 || memcmp (vallist + valsize * matchind, |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
93 vallist + valsize * i, valsize)) |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
94 { |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
95 /* 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
|
96 disambiguate. */ |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
97 ambiguous = 1; |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
98 } |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
99 } |
5 | 100 } |
101 } | |
102 if (ambiguous) | |
103 return -2; | |
104 else | |
105 return matchind; | |
106 } | |
107 | |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
108 /* argmatch - case sensitive version */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
109 int |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
110 argmatch (const char *arg, const char *const *arglist, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
111 const char *vallist, size_t valsize) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
112 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
113 return __argmatch_internal (arg, arglist, vallist, valsize, 1); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
114 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
115 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
116 /* argcasematch - case insensitive version */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
117 int |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
118 argcasematch (const char *arg, const char *const *arglist, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
119 const char *vallist, size_t valsize) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
120 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
121 return __argmatch_internal (arg, arglist, vallist, valsize, 0); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
122 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
123 |
5 | 124 /* Error reporting for argmatch. |
125 KIND is a description of the type of entity that was being matched. | |
126 VALUE is the invalid value that was given. | |
127 PROBLEM is the return value from argmatch. */ | |
128 | |
129 void | |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
130 argmatch_invalid (const char *kind, const char *value, int problem) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
131 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
132 enum quoting_style saved_quoting_style; |
1619
22cb405d7c5a
(argmatch_invalid): Remove double quotes from the
Jim Meyering <jim@meyering.net>
parents:
1611
diff
changeset
|
133 char const *format; |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
134 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
135 /* 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
|
136 literal is insane here. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
137 saved_quoting_style = get_quoting_style (NULL); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
138 set_quoting_style (NULL, ARGMATCH_QUOTING_STYLE); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
139 |
1619
22cb405d7c5a
(argmatch_invalid): Remove double quotes from the
Jim Meyering <jim@meyering.net>
parents:
1611
diff
changeset
|
140 format = (problem == -1 |
22cb405d7c5a
(argmatch_invalid): Remove double quotes from the
Jim Meyering <jim@meyering.net>
parents:
1611
diff
changeset
|
141 ? _("%s: invalid argument `%s' for `%s'\n") |
22cb405d7c5a
(argmatch_invalid): Remove double quotes from the
Jim Meyering <jim@meyering.net>
parents:
1611
diff
changeset
|
142 : _("%s: ambiguous argument `%s' for `%s'\n")); |
22cb405d7c5a
(argmatch_invalid): Remove double quotes from the
Jim Meyering <jim@meyering.net>
parents:
1611
diff
changeset
|
143 |
1632
f6217175922c
(ARGMATCH_QUOTING_STYLE): Change from c_quoting_style to escape_quoting_style.
Jim Meyering <jim@meyering.net>
parents:
1619
diff
changeset
|
144 fprintf (stderr, format, program_name, quotearg (value), kind); |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
145 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
146 set_quoting_style (NULL, saved_quoting_style); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
147 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
148 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
149 /* List the valid arguments for argmatch. |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
150 ARGLIST is the same as in argmatch. |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
151 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
|
152 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
|
153 void |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
154 argmatch_valid (const char *const *arglist, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
155 const char *vallist, size_t valsize) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
156 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
157 int i; |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
158 const char *last_val = NULL; |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
159 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
160 /* 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
|
161 synonyms follow each other */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
162 fprintf (stderr, _("Valid arguments are:")); |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
163 for (i = 0; arglist[i]; i++) |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
164 if ((i == 0) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
165 || memcmp (last_val, vallist + valsize * i, valsize)) |
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 fprintf (stderr, "\n - `%s'", arglist[i]); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
168 last_val = vallist + valsize * i; |
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 else |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
171 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
172 fprintf (stderr, ", `%s'", arglist[i]); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
173 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
174 putc ('\n', stderr); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
175 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
176 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
177 /* 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
|
178 return the first corresponding argument in ARGLIST */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
179 const char * |
1611
124c0cb70d04
(__xargmatch_internal): Remove now-unused function.
Jim Meyering <jim@meyering.net>
parents:
1608
diff
changeset
|
180 argmatch_to_argument (const char *value, |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
181 const char *const *arglist, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
182 const char *vallist, size_t valsize) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
183 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
184 int i; |
1588 | 185 |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
186 for (i = 0; arglist[i]; i++) |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
187 if (!memcmp (value, vallist + valsize * i, valsize)) |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
188 return arglist[i]; |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
189 return NULL; |
5 | 190 } |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
191 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
192 #ifdef TEST |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
193 /* |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
194 * 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
|
195 */ |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
196 char *rogram_name; |
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
197 extern const char *getenv (); |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
198 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
199 /* When to make backup files. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
200 enum backup_type |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
201 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
202 /* Never make backups. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
203 none, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
204 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
205 /* Make simple backups of every file. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
206 simple, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
207 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
208 /* 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
|
209 and simple backups of the others. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
210 numbered_existing, |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
211 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
212 /* Make numbered backups of every file. */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
213 numbered |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
214 }; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
215 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
216 /* Two tables describing arguments (keys) and their corresponding |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
217 values */ |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
218 static const char *const backup_args[] = |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
219 { |
1588 | 220 "no", "none", "off", |
221 "simple", "never", | |
222 "existing", "nil", | |
223 "numbered", "t", | |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
224 0 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
225 }; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
226 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
227 static const enum backup_type backup_vals[] = |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
228 { |
1588 | 229 none, none, none, |
230 simple, simple, | |
231 numbered_existing, numbered_existing, | |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
232 numbered, numbered |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
233 }; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
234 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
235 int |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
236 main (int argc, const char *const *argv) |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
237 { |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
238 const char *cp; |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
239 enum backup_type backup_type = none; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
240 |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
241 program_name = (char *) argv[0]; |
1587
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 if (argc > 2) |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
244 { |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
245 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
|
246 exit (1); |
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 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
249 if ((cp = getenv ("VERSION_CONTROL"))) |
1588 | 250 backup_type = XARGCASEMATCH ("$VERSION_CONTROL", cp, |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
251 backup_args, backup_vals); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
252 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
253 if (argc == 2) |
1590
713508d75bc7
(strncasecmp): Move to a separate file.
Jim Meyering <jim@meyering.net>
parents:
1588
diff
changeset
|
254 backup_type = XARGCASEMATCH (program_name, argv[1], |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
255 backup_args, backup_vals); |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
256 |
1588 | 257 printf ("The version control is `%s'\n", |
1587
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
258 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
|
259 |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
260 return 0; |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
261 } |
3f067a341196
lots of changes from Akim Demaille.
Jim Meyering <jim@meyering.net>
parents:
1189
diff
changeset
|
262 #endif |