diff options
| author | Patrick Simianer <p@simianer.de> | 2012-03-13 09:24:47 +0100 | 
|---|---|---|
| committer | Patrick Simianer <p@simianer.de> | 2012-03-13 09:24:47 +0100 | 
| commit | c3a9ea64251605532c7954959662643a6a927bb7 (patch) | |
| tree | fed6048a5acdaf3834740107771c2bc48f26fd4d /klm/util/getopt.c | |
| parent | 867bca3e5fa0cdd63bf032e5859fb5092d9a4ca1 (diff) | |
| parent | a45af4a3704531a8382cd231f6445b3a33b598a3 (diff) | |
merge with upstream
Diffstat (limited to 'klm/util/getopt.c')
| -rw-r--r-- | klm/util/getopt.c | 78 | 
1 files changed, 78 insertions, 0 deletions
| diff --git a/klm/util/getopt.c b/klm/util/getopt.c new file mode 100644 index 00000000..992c96b0 --- /dev/null +++ b/klm/util/getopt.c @@ -0,0 +1,78 @@ +/* +POSIX getopt for Windows + +AT&T Public License + +Code given out at the 1985 UNIFORUM conference in Dallas.   +*/ + +#ifndef __GNUC__ + +#include "getopt.hh" +#include <stdio.h> +#include <string.h> + +#define NULL	0 +#define EOF	(-1) +#define ERR(s, c)	if(opterr){\ +	char errbuf[2];\ +	errbuf[0] = c; errbuf[1] = '\n';\ +	fputs(argv[0], stderr);\ +	fputs(s, stderr);\ +	fputc(c, stderr);} +	//(void) write(2, argv[0], (unsigned)strlen(argv[0]));\ +	//(void) write(2, s, (unsigned)strlen(s));\ +	//(void) write(2, errbuf, 2);} + +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); +} + +#endif  /* __GNUC__ */ | 
