Changeset View
Changeset View
Standalone View
Standalone View
externals/figlet/getopt.c
- This file was added.
/* | |||||
* * @(#)getopt.c 2.3 (smail) 5/30/87 | |||||
*/ | |||||
/* | |||||
* Here's something you've all been waiting for: the AT&T public domain | |||||
* source for getopt(3). It is the code which was given out at the 1985 | |||||
* UNIFORUM conference in Dallas. I obtained it by electronic mail directly | |||||
* from AT&T. The people there assure me that it is indeed in the public | |||||
* domain. | |||||
* | |||||
* There is no manual page. That is because the one they gave out at UNIFORUM | |||||
* was slightly different from the current System V Release 2 manual page. | |||||
* The difference apparently involved a note about the famous rules 5 and 6, | |||||
* recommending using white space between an option and its first argument, | |||||
* and not grouping options that have arguments. Getopt itself is currently | |||||
* lenient about both of these things White space is allowed, but not | |||||
* mandatory, and the last option in a group can have an argument. That | |||||
* particular version of the man page evidently has no official existence, | |||||
* and my source at AT&T did not send a copy. The current SVR2 man page | |||||
* reflects the actual behavior of this getopt. However, I am not about to | |||||
* post a copy of anything licensed by AT&T. | |||||
*/ | |||||
#ifdef BSD | |||||
#include <strings.h> | |||||
#else | |||||
#define index strchr | |||||
#include <string.h> | |||||
#endif | |||||
/* LINTLIBRARY */ | |||||
#ifndef NULL | |||||
#define NULL 0 | |||||
#endif | |||||
#define EOF (-1) | |||||
#define ERR(s, c) if(opterr){\ | |||||
extern int write(int, void *, unsigned);\ | |||||
char errbuf[2];\ | |||||
errbuf[0] = (char)c; errbuf[1] = '\n';\ | |||||
(void) write(2, strlwr(argv[0]), (unsigned)strlen(argv[0]));\ | |||||
(void) write(2, s, (unsigned)strlen(s));\ | |||||
(void) write(2, errbuf, 2);} | |||||
extern char *index(); | |||||
int opterr = 1; | |||||
int optind = 1; | |||||
int optopt; | |||||
char *optarg; | |||||
int getopt(int argc, char *argv[], char *opts) | |||||
{ | |||||
static int sp = 1; | |||||
register int c; | |||||
register char *cp; | |||||
if (sp == 1) | |||||
{ | |||||
if (optind >= argc || argv[optind][0] != '-' || | |||||
argv[optind][1] == '\0') | |||||
return (EOF); | |||||
else if (strcmp(argv[optind], "--") == 0) | |||||
{ | |||||
optind++; | |||||
return (EOF); | |||||
} | |||||
} | |||||
optopt = c = argv[optind][sp]; | |||||
if (c == ':' || (cp = index(opts, c)) == NULL) | |||||
{ | |||||
ERR(": illegal option -- ", c); | |||||
if (argv[optind][++sp] == '\0') | |||||
{ | |||||
optind++; | |||||
sp = 1; | |||||
} | |||||
return ('?'); | |||||
} | |||||
if (*++cp == ':') | |||||
{ | |||||
if (argv[optind][sp + 1] != '\0') | |||||
optarg = &argv[optind++][sp + 1]; | |||||
else if (++optind >= argc) | |||||
{ | |||||
ERR(": option requires an argument -- ", c); | |||||
sp = 1; | |||||
return ('?'); | |||||
} | |||||
else optarg = argv[optind++]; | |||||
sp = 1; | |||||
} | |||||
else | |||||
{ | |||||
if (argv[optind][++sp] == '\0') | |||||
{ | |||||
sp = 1; | |||||
optind++; | |||||
} | |||||
optarg = NULL; | |||||
} | |||||
return (c); | |||||
} |