/* @(#)getopt.c	2.1 88/08/01 4.0 RPCSRC */

/* this is a public domain version of getopt */


#include<unistd.h>
#include<sys/types.h>
#include<stddef.h>
#include<stdio.h>
#include<string.h>


#define ERR(s, c)	if(opterr){\
	char errbuf[2];\
	errbuf[0] = c; errbuf[1] = '\n';\
	(void) write(2, argv[0], strlen(argv[0]));\
	(void) write(2, s, strlen(s));\
	(void) write(2, errbuf, 2);}


int opterr = 1;
int optind = 1;
int optopt;
char *optarg;


int getopt(int argc,char *const argv[],const char *opts)
{
	static int sp = 1;
	int c;
	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=strchr(opts, c)) == NULL)
	{
		ERR(": unknown option, -", c);
		if(argv[optind][++sp] == '\0')
		{
			optind++;
			sp = 1;
		}
		return ('?');
	}

	if(*++cp == ':')
	{
		if(argv[optind][sp+1] != '\0')
			optarg = (char*)&argv[optind++][sp+1];
		else if(++optind >= argc)
		{
			ERR(": argument missing for -", c);
			sp = 1;
			return ('?');
		}
		else optarg = (char*)argv[optind++];
		sp = 1;
	}
	else
	{
		if(argv[optind][++sp] == '\0')
		{
			sp = 1;
			optind++;
		}
		optarg = NULL;
	}

	return(c);
}
