/*
 * Copyright (c) 1987, 1993, 1994
 *      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. 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.
 */

#if defined(LIBC_SCCS) && !defined(lint)
/*
 * static char sccsid[] = "from: @(#)getopt.c   8.2 (Berkeley) 4/2/94"; 
 */
static char    *rcsid =
    "$Id$";
#endif                          /* LIBC_SCCS and not lint */

#include <net-snmp/net-snmp-config.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <net-snmp/library/getopt.h>

#ifdef _BSD
extern char    *__progname;
#else
#define __progname "getopt"
#endif

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

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

/*
 * getopt --
 *      Parse argc/argv argument vector.
 */
int
getopt(int nargc, char *const *nargv, const char *ostr)
{
    static char    *place = EMSG;       /* option letter processing */
    char           *oli;        /* option letter list index */

    if (optreset || !*place) {  /* update scanning pointer */
        optreset = 0;
        if (optind >= nargc || *(place = nargv[optind]) != '-') {
            place = EMSG;
            return (-1);
        }
        if (place[1] && *++place == '-') {      /* found "--" */
            ++optind;
            place = EMSG;
            return (-1);
        }
    }                           /* option letter okay? */
    if ((optopt = (int) *place++) == (int) ':' ||
        !(oli = strchr(ostr, optopt))) {
        /*
         * if the user didn't specify '-' as an option,
         * assume it means -1.
         */
        if (optopt == (int) '-')
            return (-1);
        if (!*place)
            ++optind;
        if (opterr && *ostr != ':')
            (void) fprintf(stderr,
                           "%s: illegal option -- %c\n", __progname,
                           optopt);
        return (BADCH);
    }
    if (*++oli != ':') {        /* don't need argument */
        optarg = NULL;
        if (!*place)
            ++optind;
    } else {                    /* need an argument */
        if (*place)             /* no white space */
            optarg = place;
        else if (nargc <= ++optind) {   /* no arg */
            place = EMSG;
            if (*ostr == ':')
                return (BADARG);
            if (opterr)
                (void) fprintf(stderr,
                               "%s: option requires an argument -- %c\n",
                               __progname, optopt);
            return (BADCH);
        } else                  /* white space */
            optarg = nargv[optind];
        place = EMSG;
        ++optind;
    }
    return (optopt);            /* dump back option letter */
}
