home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_300
/
335_04
/
getopt.h
< prev
next >
Wrap
Text File
|
1990-12-04
|
3KB
|
108 lines
/*
HEADER: ;
TITLE: Frankenstein Cross Assemblers;
VERSION: 2.0;
DESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM)
Hex format object records. ";
SYSTEM: UNIX, MS-Dos ;
FILENAME: getopt.h;
WARNINGS: "This is some ancient code I found on a version 7 system
when I was running the original port. Asking for help from
the original authors is not advised. (Especially after
the hack job I did on it. Mark Zenier.) " ;
SEE-ALSO: frasmain.c;
AUTHORS: Keith Bostic, Rich $alz;
*/
/*
** This is a public domain version of getopt(3).
** Bugs, fixes to:
** Keith Bostic
** ARPA: keith@seismo
** UUCP: seismo!keith
** Added NO_STDIO, opterr handling, Rich $alz (mirror!rs).
Framework Cross Assembler
use strchr
remove NO_STDIO code
Mark Zenier Specialized Systems Consultants, Inc.
*/
/*
** Error macro. Maybe we want stdio, maybe we don't.
** The (undocumented?) variable opterr tells us whether or not
** to print errors.
*/
#define tell(s) \
if (opterr) \
(void)fputs(*nargv, stderr), \
(void)fputs(s,stderr), \
(void)fputc(optopt, stderr), \
(void)fputc('\n', stderr)
/* Global variables. */
static char EMSG[] = "";
int opterr = 1; /* undocumented error-suppressor*/
int optind = 1; /* index into argv vector */
int optopt; /* char checked for validity */
char *optarg; /* arg associated with option */
getopt(nargc, nargv, ostr)
int nargc;
char **nargv;
char *ostr;
{
static char *place = EMSG; /* option letter processing */
register char *oli; /* option letter list index */
if (!*place) /* update scanning pointer */
{
if (optind >= nargc || *(place = nargv[optind]) != '-' || !*++place)
return(EOF);
if (*place == '-') /* found "--" */
{
optind++;
return(EOF);
}
}
/* option letter okay? */
if ((optopt = *place++) == ':' || (oli = strchr(ostr, optopt)) == NULL)
{
if (!*place)
optind++;
tell(": illegal option -- ");
goto Bad;
}
if (*++oli != ':') /* don't need argument */
{
optarg = NULL;
if (!*place)
optind++;
}
else /* need an argument */
{
if (*place)
optarg = place; /* no white space */
else
if (nargc <= ++optind)
{
place = EMSG;
tell(": option requires an argument -- ");
goto Bad;
}
else
optarg = nargv[optind]; /* white space */
place = EMSG;
optind++;
}
return(optopt); /* dump back option letter */
Bad:
return('?');
}