1*3955d011SMarcel Moolenaar /* 2*3955d011SMarcel Moolenaar * Copyright (c) 1987, 1993, 1994 3*3955d011SMarcel Moolenaar * The Regents of the University of California. All rights reserved. 4*3955d011SMarcel Moolenaar * 5*3955d011SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 6*3955d011SMarcel Moolenaar * modification, are permitted provided that the following conditions 7*3955d011SMarcel Moolenaar * are met: 8*3955d011SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 9*3955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 10*3955d011SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 11*3955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 12*3955d011SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 13*3955d011SMarcel Moolenaar * 3. All advertising materials mentioning features or use of this software 14*3955d011SMarcel Moolenaar * must display the following acknowledgement: 15*3955d011SMarcel Moolenaar * This product includes software developed by the University of 16*3955d011SMarcel Moolenaar * California, Berkeley and its contributors. 17*3955d011SMarcel Moolenaar * 4. Neither the name of the University nor the names of its contributors 18*3955d011SMarcel Moolenaar * may be used to endorse or promote products derived from this software 19*3955d011SMarcel Moolenaar * without specific prior written permission. 20*3955d011SMarcel Moolenaar * 21*3955d011SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22*3955d011SMarcel Moolenaar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23*3955d011SMarcel Moolenaar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24*3955d011SMarcel Moolenaar * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25*3955d011SMarcel Moolenaar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26*3955d011SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27*3955d011SMarcel Moolenaar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28*3955d011SMarcel Moolenaar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29*3955d011SMarcel Moolenaar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30*3955d011SMarcel Moolenaar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*3955d011SMarcel Moolenaar * SUCH DAMAGE. 32*3955d011SMarcel Moolenaar */ 33*3955d011SMarcel Moolenaar 34*3955d011SMarcel Moolenaar #ifdef HAVE_CONFIG_H 35*3955d011SMarcel Moolenaar # include "config.h" 36*3955d011SMarcel Moolenaar #endif 37*3955d011SMarcel Moolenaar #if !defined(HAVE_GETOPT) || defined(WANT_GETOPT_LONG) || defined(BROKEN_GETOPT) 38*3955d011SMarcel Moolenaar 39*3955d011SMarcel Moolenaar #if defined(LIBC_SCCS) && !defined(lint) 40*3955d011SMarcel Moolenaar /* static char sccsid[] = "from: @(#)getopt.c 8.2 (Berkeley) 4/2/94"; */ 41*3955d011SMarcel Moolenaar static char *rcsid = "$Id: getopt.c,v 1.3 1999/01/08 02:14:18 sjg Exp $"; 42*3955d011SMarcel Moolenaar #endif /* LIBC_SCCS and not lint */ 43*3955d011SMarcel Moolenaar 44*3955d011SMarcel Moolenaar #include <stdio.h> 45*3955d011SMarcel Moolenaar #include <stdlib.h> 46*3955d011SMarcel Moolenaar #include <string.h> 47*3955d011SMarcel Moolenaar 48*3955d011SMarcel Moolenaar 49*3955d011SMarcel Moolenaar #define BADCH (int)'?' 50*3955d011SMarcel Moolenaar #define BADARG (int)':' 51*3955d011SMarcel Moolenaar #define EMSG "" 52*3955d011SMarcel Moolenaar 53*3955d011SMarcel Moolenaar int opterr = 1, /* if error message should be printed */ 54*3955d011SMarcel Moolenaar optind = 1, /* index into parent argv vector */ 55*3955d011SMarcel Moolenaar optopt = BADCH, /* character checked for validity */ 56*3955d011SMarcel Moolenaar optreset; /* reset getopt */ 57*3955d011SMarcel Moolenaar char *optarg; /* argument associated with option */ 58*3955d011SMarcel Moolenaar 59*3955d011SMarcel Moolenaar /* 60*3955d011SMarcel Moolenaar * getopt -- 61*3955d011SMarcel Moolenaar * Parse argc/argv argument vector. 62*3955d011SMarcel Moolenaar */ 63*3955d011SMarcel Moolenaar int 64*3955d011SMarcel Moolenaar getopt(nargc, nargv, ostr) 65*3955d011SMarcel Moolenaar int nargc; 66*3955d011SMarcel Moolenaar char * const *nargv; 67*3955d011SMarcel Moolenaar const char *ostr; 68*3955d011SMarcel Moolenaar { 69*3955d011SMarcel Moolenaar extern char *__progname; 70*3955d011SMarcel Moolenaar static char *place = EMSG; /* option letter processing */ 71*3955d011SMarcel Moolenaar char *oli; /* option letter list index */ 72*3955d011SMarcel Moolenaar 73*3955d011SMarcel Moolenaar #ifndef BSD4_4 74*3955d011SMarcel Moolenaar if (!__progname) { 75*3955d011SMarcel Moolenaar if (__progname = strrchr(nargv[0], '/')) 76*3955d011SMarcel Moolenaar ++__progname; 77*3955d011SMarcel Moolenaar else 78*3955d011SMarcel Moolenaar __progname = nargv[0]; 79*3955d011SMarcel Moolenaar } 80*3955d011SMarcel Moolenaar #endif 81*3955d011SMarcel Moolenaar 82*3955d011SMarcel Moolenaar if (optreset || !*place) { /* update scanning pointer */ 83*3955d011SMarcel Moolenaar optreset = 0; 84*3955d011SMarcel Moolenaar if (optind >= nargc || *(place = nargv[optind]) != '-') { 85*3955d011SMarcel Moolenaar place = EMSG; 86*3955d011SMarcel Moolenaar return (-1); 87*3955d011SMarcel Moolenaar } 88*3955d011SMarcel Moolenaar if (place[1] && *++place == '-' /* found "--" */ 89*3955d011SMarcel Moolenaar && !place[1]) { /* and not "--foo" */ 90*3955d011SMarcel Moolenaar ++optind; 91*3955d011SMarcel Moolenaar place = EMSG; 92*3955d011SMarcel Moolenaar return (-1); 93*3955d011SMarcel Moolenaar } 94*3955d011SMarcel Moolenaar } /* option letter okay? */ 95*3955d011SMarcel Moolenaar if ((optopt = (int)*place++) == (int)':' || 96*3955d011SMarcel Moolenaar !(oli = strchr(ostr, optopt))) { 97*3955d011SMarcel Moolenaar /* 98*3955d011SMarcel Moolenaar * if the user didn't specify '-' as an option, 99*3955d011SMarcel Moolenaar * assume it means -1. 100*3955d011SMarcel Moolenaar */ 101*3955d011SMarcel Moolenaar if (optopt == (int)'-') 102*3955d011SMarcel Moolenaar return (-1); 103*3955d011SMarcel Moolenaar if (!*place) 104*3955d011SMarcel Moolenaar ++optind; 105*3955d011SMarcel Moolenaar if (opterr && *ostr != ':') 106*3955d011SMarcel Moolenaar (void)fprintf(stderr, 107*3955d011SMarcel Moolenaar "%s: illegal option -- %c\n", __progname, optopt); 108*3955d011SMarcel Moolenaar return (BADCH); 109*3955d011SMarcel Moolenaar } 110*3955d011SMarcel Moolenaar if (*++oli != ':') { /* don't need argument */ 111*3955d011SMarcel Moolenaar optarg = NULL; 112*3955d011SMarcel Moolenaar if (!*place) 113*3955d011SMarcel Moolenaar ++optind; 114*3955d011SMarcel Moolenaar } 115*3955d011SMarcel Moolenaar else { /* need an argument */ 116*3955d011SMarcel Moolenaar if (*place) /* no white space */ 117*3955d011SMarcel Moolenaar optarg = place; 118*3955d011SMarcel Moolenaar else if (nargc <= ++optind) { /* no arg */ 119*3955d011SMarcel Moolenaar place = EMSG; 120*3955d011SMarcel Moolenaar if (*ostr == ':') 121*3955d011SMarcel Moolenaar return (BADARG); 122*3955d011SMarcel Moolenaar if (opterr) 123*3955d011SMarcel Moolenaar (void)fprintf(stderr, 124*3955d011SMarcel Moolenaar "%s: option requires an argument -- %c\n", 125*3955d011SMarcel Moolenaar __progname, optopt); 126*3955d011SMarcel Moolenaar return (BADCH); 127*3955d011SMarcel Moolenaar } 128*3955d011SMarcel Moolenaar else /* white space */ 129*3955d011SMarcel Moolenaar optarg = nargv[optind]; 130*3955d011SMarcel Moolenaar place = EMSG; 131*3955d011SMarcel Moolenaar ++optind; 132*3955d011SMarcel Moolenaar } 133*3955d011SMarcel Moolenaar return (optopt); /* dump back option letter */ 134*3955d011SMarcel Moolenaar } 135*3955d011SMarcel Moolenaar #endif 136*3955d011SMarcel Moolenaar #ifdef MAIN 137*3955d011SMarcel Moolenaar #ifndef BSD4_4 138*3955d011SMarcel Moolenaar char *__progname; 139*3955d011SMarcel Moolenaar #endif 140*3955d011SMarcel Moolenaar 141*3955d011SMarcel Moolenaar int 142*3955d011SMarcel Moolenaar main(argc, argv) 143*3955d011SMarcel Moolenaar int argc; 144*3955d011SMarcel Moolenaar char *argv[]; 145*3955d011SMarcel Moolenaar { 146*3955d011SMarcel Moolenaar int c; 147*3955d011SMarcel Moolenaar char *opts = argv[1]; 148*3955d011SMarcel Moolenaar 149*3955d011SMarcel Moolenaar --argc; 150*3955d011SMarcel Moolenaar ++argv; 151*3955d011SMarcel Moolenaar 152*3955d011SMarcel Moolenaar while ((c = getopt(argc, argv, opts)) != EOF) { 153*3955d011SMarcel Moolenaar switch (c) { 154*3955d011SMarcel Moolenaar case '-': 155*3955d011SMarcel Moolenaar if (optarg) 156*3955d011SMarcel Moolenaar printf("--%s ", optarg); 157*3955d011SMarcel Moolenaar break; 158*3955d011SMarcel Moolenaar case '?': 159*3955d011SMarcel Moolenaar exit(1); 160*3955d011SMarcel Moolenaar break; 161*3955d011SMarcel Moolenaar default: 162*3955d011SMarcel Moolenaar if (optarg) 163*3955d011SMarcel Moolenaar printf("-%c %s ", c, optarg); 164*3955d011SMarcel Moolenaar else 165*3955d011SMarcel Moolenaar printf("-%c ", c); 166*3955d011SMarcel Moolenaar break; 167*3955d011SMarcel Moolenaar } 168*3955d011SMarcel Moolenaar } 169*3955d011SMarcel Moolenaar 170*3955d011SMarcel Moolenaar if (optind < argc) { 171*3955d011SMarcel Moolenaar printf("-- "); 172*3955d011SMarcel Moolenaar for (; optind < argc; ++optind) { 173*3955d011SMarcel Moolenaar printf("%s ", argv[optind]); 174*3955d011SMarcel Moolenaar } 175*3955d011SMarcel Moolenaar } 176*3955d011SMarcel Moolenaar printf("\n"); 177*3955d011SMarcel Moolenaar exit(0); 178*3955d011SMarcel Moolenaar } 179*3955d011SMarcel Moolenaar #endif 180