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