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