/* LINTLIBRARY */

#include <stdio.h>
#include "util.h"


/*  File   : getopt.c
 *  Author : Henry Spencer, University of Toronto
 *  Updated: 28 April 1984
 *
 *  Changes: (R Rudell)
 *	changed index() to strchr();
 *	added getopt_reset() to reset the getopt argument parsing
 *
 *  Purpose: get option letter from argv.
 */

char *util_optarg;	/* Global argument pointer. */
int util_optind = 0;	/* Global argv index. */
static char *scan;


void
util_getopt_reset()
{
    util_optarg = 0;
    util_optind = 0;
    scan = 0;
}



int 
util_getopt(int argc, char *argv[], char *optstring)
{
    register int c;
    register char *place;

    util_optarg = NIL(char);

    if (scan == NIL(char) || *scan == '\0') {
	if (util_optind == 0) util_optind++;
	if (util_optind >= argc) return EOF;
	place = argv[util_optind];
	if (place[0] != '-' || place[1] == '\0') return EOF;
	util_optind++;
	if (place[1] == '-' && place[2] == '\0') return EOF;
	scan = place+1;
    }

    c = *scan++;
    place = strchr(optstring, c);
    if (place == NIL(char) || c == ':') {
	(void) fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
	return '?';
    }
    if (*++place == ':') {
	if (*scan != '\0') {
	    util_optarg = scan;
	    scan = NIL(char);
	} else {
	    if (util_optind >= argc) {
		(void) fprintf(stderr, "%s: %c requires an argument\n", 
		    argv[0], c);
		return '?';
	    }
	    util_optarg = argv[util_optind];
	    util_optind++;
	}
    }
    return c;
}
