/**********************************************************************/
/*                                                                    */
/* 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. 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.                                                       */
/*                                                                    */
/**********************************************************************/

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

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

#ifndef __CGETOP_
extern char *optarg;
extern int opterr, optind, optopt;
int getopt (int, char * const *, const char *);
char *group_from_gid (unsigned long, int);
char *user_from_uid (unsigned long, int);
extern int optreset;
#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                         */

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

/**********************************************************************/
/*                                                                    */
/*   getopt --                                                        */
/*       Parse argc/argv argument vector.                             */
/*                                                                    */
/**********************************************************************/
int
getopt(nargc, nargv, ostr)
  int nargc;
  char * const *nargv;
  const char *ostr;
{
  /* removed -- BSD2TPF -- crt0 does not create __progname on TPF     */
  /* extern char *__progname;                                         */
  /* end of removed -- BSD2TPF                                        */

  static char *place = EMSG;        /* option letter processing       */
  char *oli;                        /* option letter list index       */

  /* added -- BSD2TPF -- emulate BSD crt0 function to set __progname  */
  char empty = '\0';
  char *__progname = &empty;
  if (nargv[0]) {
    if ((__progname = strrchr(nargv[0], '/')) == NULL) {
      __progname = nargv[0];
    }
    else {
      ++__progname;
    }
  }
  /* end of added -- BSD2TPF                                          */

  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 it means EOF.           */
    if (optopt == (int)'-')
      return (EOF);
    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        */
}