home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
ncftp-2.3.0-base.tgz
/
ncftp-2.3.0-base.tar
/
contrib
/
ncftp
/
Getopt.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-07
|
2KB
|
75 lines
/* Getopt.c */
#include "Sys.h"
#include "Util.h"
#include "Getopt.h"
int gOptErr = 1; /* if error message should be printed */
int gOptInd = 1; /* index into parent argv vector */
int gOptOpt; /* character checked for validity */
char *gOptArg; /* argument associated with option */
char *gOptPlace = kGetoptErrMsg; /* saved position in an arg */
/* This must be called before each Getopt. */
void GetoptReset(void)
{
gOptInd = 1;
gOptPlace = kGetoptErrMsg;
} /* GetoptReset */
static
char *NextOption(char *ostr)
{
if ((gOptOpt = (int) *gOptPlace++) == (int) ':')
return 0;
return strchr(ostr, gOptOpt);
} /* NextOption */
int Getopt(int nargc, char **nargv, char *ostr)
{
register char *oli; /* Option letter list index */
if (!*gOptPlace) { /* update scanning pointer */
if (gOptInd >= nargc || *(gOptPlace = nargv[gOptInd]) != '-')
return (EOF);
if (gOptPlace[1] && *++gOptPlace == '-') { /* found "--" */
++gOptInd;
return (EOF);
}
} /* Option letter okay? */
oli = NextOption(ostr);
if (oli == NULL) {
if (!*gOptPlace)
++gOptInd;
if (gOptErr)
PrintF("%s%s%c\n", *nargv, ": illegal option -- ", gOptOpt);
return(kGetoptBadChar);
}
if (*++oli != ':') { /* don't need argument */
gOptArg = NULL;
if (!*gOptPlace)
++gOptInd;
} else { /* need an argument */
if (*gOptPlace) /* no white space */
gOptArg = gOptPlace;
else if (nargc <= ++gOptInd) { /* no arg */
gOptPlace = kGetoptErrMsg;
if (gOptErr)
PrintF("%s%s%c\n", *nargv, ": option requires an argument -- ", gOptOpt);
return(kGetoptBadChar);
} else /* white space */
gOptArg = nargv[gOptInd];
gOptPlace = kGetoptErrMsg;
++gOptInd;
}
return (gOptOpt); /* dump back Option letter */
} /* Getopt */
/* eof */