1 /* 2 * Copyright (c) 1987, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 4. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 #include "unifdef.h" 31 32 int opterr = 1, /* if error message should be printed */ 33 optind = 1, /* index into parent argv vector */ 34 optopt, /* character checked for validity */ 35 optreset; /* reset getopt */ 36 char *optarg; /* argument associated with option */ 37 38 #define BADCH (int)'?' 39 #define BADARG (int)':' 40 41 static char EMSG[] = ""; 42 43 /* 44 * getopt -- 45 * Parse argc/argv argument vector. 46 */ 47 int 48 getopt(int nargc, char *nargv[], const char *ostr) 49 { 50 static char *place = EMSG; /* option letter processing */ 51 const char *oli; /* option letter list index */ 52 53 if (optreset || *place == 0) { /* update scanning pointer */ 54 optreset = 0; 55 place = nargv[optind]; 56 if (optind >= nargc || *place++ != '-') { 57 /* Argument is absent or is not an option */ 58 place = EMSG; 59 return (-1); 60 } 61 optopt = *place++; 62 if (optopt == '-' && *place == 0) { 63 /* "--" => end of options */ 64 ++optind; 65 place = EMSG; 66 return (-1); 67 } 68 if (optopt == 0) { 69 /* Solitary '-', treat as a '-' option 70 if the program (eg su) is looking for it. */ 71 place = EMSG; 72 if (strchr(ostr, '-') == NULL) 73 return (-1); 74 optopt = '-'; 75 } 76 } else 77 optopt = *place++; 78 79 /* See if option letter is one the caller wanted... */ 80 if (optopt == ':' || (oli = strchr(ostr, optopt)) == NULL) { 81 if (*place == 0) 82 ++optind; 83 if (opterr && *ostr != ':') 84 (void)fprintf(stderr, 85 "%s: illegal option -- %c\n", _getprogname(), 86 optopt); 87 return (BADCH); 88 } 89 90 /* Does this option need an argument? */ 91 if (oli[1] != ':') { 92 /* don't need argument */ 93 optarg = NULL; 94 if (*place == 0) 95 ++optind; 96 } else { 97 /* Option-argument is either the rest of this argument or the 98 entire next argument. */ 99 if (*place) 100 optarg = place; 101 else if (nargc > ++optind) 102 optarg = nargv[optind]; 103 else { 104 /* option-argument absent */ 105 place = EMSG; 106 if (*ostr == ':') 107 return (BADARG); 108 if (opterr) 109 (void)fprintf(stderr, 110 "%s: option requires an argument -- %c\n", 111 _getprogname(), optopt); 112 return (BADCH); 113 } 114 place = EMSG; 115 ++optind; 116 } 117 return (optopt); /* return option letter */ 118 } 119