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