1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* argmatch.c -- find a match for a string in an array
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 1990, 1998-1999, 2001-2007, 2009-2012 Free Software
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Foundation, Inc.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3 of the License, or
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is distributed in the hope that it will be useful,
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Written by David MacKenzie <djm@ai.mit.edu>
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Modified by Akim Demaille <demaille@inf.enst.fr> */
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <config.h>
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Specification.  */
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "argmatch.h"
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdbool.h>
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h>
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdlib.h>
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <string.h>
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gettext.h"
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define _(msgid) gettext (msgid)
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "error.h"
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "quotearg.h"
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "quote.h"
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if USE_UNLOCKED_IO
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "unlocked-io.h"
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* When reporting an invalid argument, show nonprinting characters
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   by using the quoting style ARGMATCH_QUOTING_STYLE.  Do not use
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   literal_quoting_style.  */
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef ARGMATCH_QUOTING_STYLE
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define ARGMATCH_QUOTING_STYLE locale_quoting_style
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Non failing version of argmatch call this function after failing. */
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef ARGMATCH_DIE
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "exitfail.h"
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define ARGMATCH_DIE exit (exit_failure)
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef ARGMATCH_DIE_DECL
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectARGMATCH_DIE_DECL;
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__argmatch_die (void)
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ARGMATCH_DIE;
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Used by XARGMATCH and XARGCASEMATCH.  See description in argmatch.h.
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Default to __argmatch_die, but allow caller to change this at run-time. */
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectargmatch_exit_fn argmatch_die = __argmatch_die;
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* If ARG is an unambiguous match for an element of the
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   NULL-terminated array ARGLIST, return the index in ARGLIST
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   of the matched element, else -1 if it does not match any element
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   or -2 if it is ambiguous (is a prefix of more than one element).
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If VALLIST is none null, use it to resolve ambiguities limited to
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   synonyms, i.e., for
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     "yes", "yop" -> 0
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     "no", "nope" -> 1
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   "y" is a valid argument, for 0, and "n" for 1.  */
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectptrdiff_t
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectargmatch (const char *arg, const char *const *arglist,
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          const char *vallist, size_t valsize)
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  size_t i;                     /* Temporary index in ARGLIST.  */
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  size_t arglen;                /* Length of ARG.  */
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  ptrdiff_t matchind = -1;      /* Index of first nonexact match.  */
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  bool ambiguous = false;       /* If true, multiple nonexact match(es).  */
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  arglen = strlen (arg);
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Test all elements for either exact match or abbreviated matches.  */
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; arglist[i]; i++)
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (!strncmp (arglist[i], arg, arglen))
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (strlen (arglist[i]) == arglen)
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang            /* Exact match found.  */
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang            return i;
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          else if (matchind == -1)
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            /* First nonexact match found.  */
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            matchind = i;
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          else
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            {
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              /* Second nonexact match found.  */
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang              if (vallist == NULL
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  || memcmp (vallist + valsize * matchind,
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             vallist + valsize * i, valsize))
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                {
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  /* There is a real ambiguity, or we could not
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                     disambiguate. */
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  ambiguous = true;
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                }
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            }
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (ambiguous)
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return -2;
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return matchind;
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Error reporting for argmatch.
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   CONTEXT is a description of the type of entity that was being matched.
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   VALUE is the invalid value that was given.
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   PROBLEM is the return value from argmatch.  */
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectargmatch_invalid (const char *context, const char *value, ptrdiff_t problem)
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char const *format = (problem == -1
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        ? _("invalid argument %s for %s")
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        : _("ambiguous argument %s for %s"));
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  error (0, 0, format, quotearg_n_style (0, ARGMATCH_QUOTING_STYLE, value),
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang         quote_n (1, context));
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* List the valid arguments for argmatch.
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ARGLIST is the same as in argmatch.
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   VALLIST is a pointer to an array of values.
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   VALSIZE is the size of the elements of VALLIST */
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectargmatch_valid (const char *const *arglist,
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                const char *vallist, size_t valsize)
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t i;
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  const char *last_val = NULL;
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* We try to put synonyms on the same line.  The assumption is that
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     synonyms follow each other */
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fputs (_("Valid arguments are:"), stderr);
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; arglist[i]; i++)
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if ((i == 0)
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        || memcmp (last_val, vallist + valsize * i, valsize))
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        fprintf (stderr, "\n  - %s", quote (arglist[i]));
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        last_val = vallist + valsize * i;
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    else
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        fprintf (stderr, ", %s", quote (arglist[i]));
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  putc ('\n', stderr);
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Never failing versions of the previous functions.
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   CONTEXT is the context for which argmatch is called (e.g.,
171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   "--version-control", or "$VERSION_CONTROL" etc.).  Upon failure,
172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   calls the (supposed never to return) function EXIT_FN. */
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectptrdiff_t
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__xargmatch_internal (const char *context,
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      const char *arg, const char *const *arglist,
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      const char *vallist, size_t valsize,
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      argmatch_exit_fn exit_fn)
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ptrdiff_t res = argmatch (arg, arglist, vallist, valsize);
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (res >= 0)
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    /* Success. */
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return res;
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* We failed.  Explain why. */
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  argmatch_invalid (context, arg, res);
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  argmatch_valid (arglist, vallist, valsize);
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (*exit_fn) ();
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return -1; /* To please the compilers. */
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Look for VALUE in VALLIST, an array of objects of size VALSIZE and
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   return the first corresponding argument in ARGLIST */
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconst char *
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectargmatch_to_argument (const char *value,
19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      const char *const *arglist,
19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      const char *vallist, size_t valsize)
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t i;
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; arglist[i]; i++)
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (!memcmp (value, vallist + valsize * i, valsize))
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return arglist[i];
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return NULL;
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef TEST
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project * Based on "getversion.c" by David MacKenzie <djm@gnu.ai.mit.edu>
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project */
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *program_name;
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* When to make backup files.  */
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum backup_type
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Never make backups.  */
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  no_backups,
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Make simple backups of every file.  */
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  simple_backups,
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Make numbered backups of files that already have numbered backups,
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     and simple backups of the others.  */
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  numbered_existing_backups,
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Make numbered backups of every file.  */
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  numbered_backups
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Two tables describing arguments (keys) and their corresponding
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   values */
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic const char *const backup_args[] =
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "no", "none", "off",
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "simple", "never",
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "existing", "nil",
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "numbered", "t",
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  0
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic const enum backup_type backup_vals[] =
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  no_backups, no_backups, no_backups,
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  simple_backups, simple_backups,
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  numbered_existing_backups, numbered_existing_backups,
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  numbered_backups, numbered_backups
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain (int argc, const char *const *argv)
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  const char *cp;
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  enum backup_type backup_type = no_backups;
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  program_name = (char *) argv[0];
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (argc > 2)
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (stderr, "Usage: %s [VERSION_CONTROL]\n", program_name);
261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      exit (1);
262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if ((cp = getenv ("VERSION_CONTROL")))
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    backup_type = XARGMATCH ("$VERSION_CONTROL", cp,
26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             backup_args, backup_vals);
267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (argc == 2)
269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    backup_type = XARGMATCH (program_name, argv[1],
27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             backup_args, backup_vals);
271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  printf ("The version control is '%s'\n",
27305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));
274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return 0;
276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
278