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