78 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
Newsgroups: mod.std.unix
 | 
						|
Subject: public domain AT&T getopt source
 | 
						|
Date: 3 Nov 85 19:34:15 GMT
 | 
						|
 | 
						|
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.
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
/*LINTLIBRARY*/
 | 
						|
#define NULL	0
 | 
						|
#define EOF	(-1)
 | 
						|
#define ERR(s, c)	if(opterr){\
 | 
						|
	extern int strlen(), write();\
 | 
						|
	char errbuf[2];\
 | 
						|
	errbuf[0] = c; errbuf[1] = '\n';\
 | 
						|
	(void) write(2, argv[0], (unsigned)strlen(argv[0]));\
 | 
						|
	(void) write(2, s, (unsigned)strlen(s));\
 | 
						|
	(void) write(2, errbuf, 2);}
 | 
						|
 | 
						|
extern int strcmp();
 | 
						|
extern char *strchr();
 | 
						|
 | 
						|
int	opterr = 1;
 | 
						|
int	optind = 1;
 | 
						|
int	optopt;
 | 
						|
char	*optarg;
 | 
						|
 | 
						|
int
 | 
						|
getopt(argc, argv, opts)
 | 
						|
int	argc;
 | 
						|
char	**argv, *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], "--") == NULL) {
 | 
						|
			optind++;
 | 
						|
			return(EOF);
 | 
						|
		}
 | 
						|
	optopt = c = argv[optind][sp];
 | 
						|
	if(c == ':' || (cp=strchr(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);
 | 
						|
}
 |