/* Copyright (c) 1987, 1993                                                  */
/* The Regents of the University of California.  All rights reserved.        */
/*                                                                           */
/* Redistribution and use in source and binary forms, with or without        */
/* modification, are permitted provided that the following conditions        */
/* are met:                                                                  */
/* 1. Redistributions of source code must retain the above copyright         */
/*    notice, this list of conditions and the following disclaimer.          */
/* 2. Redistributions in binary form must reproduce the above copyright      */
/*    notice, this list of conditions and the following disclaimer in the    */
/*    documentation and/or other materials provided with the distribution.   */
/* 3. All advertising materials mentioning features or use of this software  */
/*    must display the following acknowledgement:                            */
/*      This product includes software developed by the University of        */
/*      California, Berkeley and its contributors.                           */
/* 4. Neither the name of the University nor the names of its contributors   */
/*    may be used to endorse or promote products derived from this software  */
/*    without specific prior written permission.                             */
/*                                                                           */
/* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND   */
/* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE     */
/* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE*/
/* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE  */
/* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL*/
/* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS   */
/* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)     */
/* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT*/
/* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY */
/* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF    */
/* SUCH DAMAGE.                                                              */

#ifdef SHOW_SCCSIDS
static char sccsid[] = "@(#)getopt.c	8.1 (Berkeley) 6/4/93";
#endif

#include "config.h"

#ifndef HAVE_GETOPT
#ifndef __STDC__
#define const
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Get option letter from argument vector                                    */
int opterr = 1;		/* if error message should be printed                */
int optind = 1;		/* index into parent argv vector                     */
int optopt;		/* character checked for validity                    */
int optreset;		/* reset getopt                                      */
char	*optarg;	/* argument associated with option                   */

#define	BADCH	(int)'?'
#define	BADARG	(int)':'
#define	EMSG	""

int getopt(int nargc, char * const *nargv, const char *ostr) {
    static char *place = EMSG;		/* option letter processing          */
    register char *oli;			/* option letter list index          */
    char *p;
	
    if (optreset || !*place) {		/* update scanning pointer           */
	optreset = 0;
	if (optind >= nargc || *(place = nargv[optind]) != '-') {
	    place = EMSG;
	    return(EOF);
	}
	if (place[1] && *++place == '-') {	/* found "--"                */
	    ++optind;
	    place = EMSG;
	    return(EOF);
	}
    }					/* option letter okay?               */

    if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) {
	/* If the user didn't specify '-' as an option, assume EOF.          */
	if (optopt == (int)'-') return(EOF);
	if (!*place) ++optind;

	if (opterr && *ostr != ':') {
	    if (!(p = strrchr(*nargv, '/'))) p = *nargv;
	    else ++p;

	    fprintf(stderr, "%s: illegal option -- %c\n", p, optopt);
	}

	return(BADCH);
    }

    if (*++oli != ':') {			/* don't need argument       */
	optarg = NULL;
	if (!*place) ++optind;
    } else {					/* need an argument          */
	if (*place) optarg = place;		/* no white space            */
	else if (nargc <= ++optind) {	        /* no arg                    */
	    place = EMSG;
	    if (!(p = strrchr(*nargv, '/'))) p = *nargv;
	    else ++p;

	    if (*ostr == ':') return(BADARG);

	    if (opterr) fprintf(stderr, "%s: option requires an argument -- %c\n", p, optopt);
	    return(BADCH);
	} else optarg = nargv[optind];		/* white space               */

	place = EMSG;
	++optind;
    }

    return(optopt);				/* dump back option letter   */
}
#endif
