1511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/* 2511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Copyright (c) 1987, 1993, 1994 3511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * The Regents of the University of California. All rights reserved. 4511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 5511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Redistribution and use in source and binary forms, with or without 6511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * modification, are permitted provided that the following conditions 7511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * are met: 8511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 1. Redistributions of source code must retain the above copyright 9511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * notice, this list of conditions and the following disclaimer. 10511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 2. Redistributions in binary form must reproduce the above copyright 11511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * notice, this list of conditions and the following disclaimer in the 12511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * documentation and/or other materials provided with the distribution. 13511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 3. All advertising materials mentioning features or use of this software 14511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * must display the following acknowledgement: 15511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * This product includes software developed by the University of 16511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * California, Berkeley and its contributors. 17511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 4. Neither the name of the University nor the names of its contributors 18511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * may be used to endorse or promote products derived from this software 19511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * without specific prior written permission. 20511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 21511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * SUCH DAMAGE. 32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if defined(LIBC_SCCS) && !defined(lint) 35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; 36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /* LIBC_SCCS and not lint */ 37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdio.h> 39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdlib.h> 40511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <string.h> 41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 42965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#include "getopt.h" 43965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes 44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallint opterr = 1, /* if error message should be printed */ 45511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall optind = 1, /* index into parent argv vector */ 46511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall optopt, /* character checked for validity */ 47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall optreset; /* reset getopt */ 48511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallchar *optarg; /* argument associated with option */ 49511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 50511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define BADCH (int)'?' 51511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define BADARG (int)':' 52511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define EMSG "" 53511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 54511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/* 55511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * getopt -- 56511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Parse argc/argv argument vector. 57511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 58511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallint 59511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallgetopt(nargc, nargv, ostr) 60511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall int nargc; 61511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall char * const *nargv; 62511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall const char *ostr; 63511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 64965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes char *cp; 65965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes static char *__progname; 66511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall static char *place = EMSG; /* option letter processing */ 67511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall char *oli; /* option letter list index */ 68511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 69965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes if (__progname == NULL) { 70965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes if ((cp = strrchr(nargv[0], '/')) != NULL) 71965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes __progname = cp + 1; 72965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes else 73965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes __progname = nargv[0]; 74965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes } 75511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (optreset || !*place) { /* update scanning pointer */ 76511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall optreset = 0; 77511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (optind >= nargc || *(place = nargv[optind]) != '-') { 78511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall place = EMSG; 79511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (-1); 80511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 81511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (place[1] && *++place == '-') { /* found "--" */ 82511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ++optind; 83511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall place = EMSG; 84511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (-1); 85511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 86511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } /* option letter okay? */ 87511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if ((optopt = (int)*place++) == (int)':' || 88511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall !(oli = strchr(ostr, optopt))) { 89511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* 90511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * if the user didn't specify '-' as an option, 91511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * assume it means -1. 92511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 93511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (optopt == (int)'-') 94511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (-1); 95511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (!*place) 96511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ++optind; 97511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (opterr && *ostr != ':') 98511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall (void)fprintf(stderr, 99511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "%s: illegal option -- %c\n", __progname, optopt); 100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (BADCH); 101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 102511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (*++oli != ':') { /* don't need argument */ 103511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall optarg = NULL; 104511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (!*place) 105511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ++optind; 106511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 107511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall else { /* need an argument */ 108511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (*place) /* no white space */ 109511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall optarg = place; 110511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall else if (nargc <= ++optind) { /* no arg */ 111511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall place = EMSG; 112511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (*ostr == ':') 113511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (BADARG); 114511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (opterr) 115511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall (void)fprintf(stderr, 116511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "%s: option requires an argument -- %c\n", 117511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall __progname, optopt); 118511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (BADCH); 119511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 120511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall else /* white space */ 121511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall optarg = nargv[optind]; 122511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall place = EMSG; 123511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ++optind; 124511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 125511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (optopt); /* dump back option letter */ 126511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 127