blob: 03356603d485217df04319373c1361f36e9c438b [file] [log] [blame]
/**********************************************************************/
/* */
/* Copyright (c) 1987, 1993, 1994 */
/* The Regents of the University of California. All rights reserved. */
/* */
/* Redistribution and use in source and binary forms, with or without */
/* modification, are permitted provided that the following conditions */
/* are met: */
/* */
/* 1. Redistributions of source code must retain the above copyright */
/* notice, this list of conditions and the following disclaimer. */
/* 2. Redistributions in binary form must reproduce the above */
/* copyright notice, this list of conditions and the following */
/* disclaimer in the documentation and/or other materials provided */
/* with the distribution. */
/* 3. All advertising materials mentioning features or use of this */
/* software must display the following acknowledgement: */
/* This product includes software developed by the University of */
/* California, Berkeley and its contributors. */
/* 4. Neither the name of the University nor the names of its */
/* contributors may be used to endorse or promote products derived */
/* from this software without specific prior written permission. */
/* */
/* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS''*/
/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */
/* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A */
/* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS */
/* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF */
/* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND*/
/* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, */
/* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF */
/* SUCH DAMAGE. */
/* */
/**********************************************************************/
/* used only on TPF41 systems */
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getopt.c 8.2 (Berkeley) 4/2/94";
#endif /* LIBC_SCCS and not lint */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef __CGETOP_
extern char *optarg;
extern int opterr, optind, optopt;
int getopt (int, char * const *, const char *);
char *group_from_gid (unsigned long, int);
char *user_from_uid (unsigned long, int);
extern int optreset;
#endif
int opterr = 1, /* if error message should be */
/* printed */
optind = 1, /* index into parent argv vector */
optopt, /* character checked for validity */
optreset; /* reset getopt */
char *optarg; /* argument associated with */
/* option */
#define BADCH (int)'?'
#define BADARG (int)':'
#define EMSG ""
/**********************************************************************/
/* */
/* getopt -- */
/* Parse argc/argv argument vector. */
/* */
/**********************************************************************/
int
getopt(nargc, nargv, ostr)
int nargc;
char * const *nargv;
const char *ostr;
{
/* removed -- BSD2TPF -- crt0 does not create __progname on TPF */
/* extern char *__progname; */
/* end of removed -- BSD2TPF */
static char *place = EMSG; /* option letter processing */
char *oli; /* option letter list index */
/* added -- BSD2TPF -- emulate BSD crt0 function to set __progname */
char empty = '\0';
char *__progname = &empty;
if (nargv[0]) {
if ((__progname = strrchr(nargv[0], '/')) == NULL) {
__progname = nargv[0];
}
else {
++__progname;
}
}
/* end of added -- BSD2TPF */
if (optreset || !*place) { /* update scanning pointer */
optreset = 0;
if (optind >= nargc || *(place = nargv[optind]) != '-') {
place = EMSG;
return (EOF);
}
if (place[1] && *++place == '-') {
/* found "--" */
++optind;
place = EMSG;
return (EOF);
}
} /* option letter okay? */
if ((optopt = (int)*place++) == (int)':' ||
!(oli = strchr(ostr, optopt))) {
/* if the user didn't */
/* specify '-' as an option, */
/* assume it means EOF. */
if (optopt == (int)'-')
return (EOF);
if (!*place)
++optind;
if (opterr && *ostr != ':')
(void)fprintf(stderr,
"%s: illegal option -- %c\n", __progname, optopt);
return (BADCH);
}
if (*++oli != ':') { /* don't need argument */
optarg = NULL;
if (!*place)
++optind;
}
else { /* need an argument */
if (*place) /* no white space */
optarg = place;
else if (nargc <= ++optind) { /* no arg */
place = EMSG;
if (*ostr == ':')
return (BADARG);
if (opterr)
(void)fprintf(stderr,
"%s: option requires an argument -- %c\n",
__progname, optopt);
return (BADCH);
}
else /* white space */
optarg = nargv[optind];
place = EMSG;
++optind;
}
return (optopt); /* dump back option letter */
}