[comp.os.minix] Minix getopt

lcc.glewis@seas.ucla.edu (07/11/89)

Greetings!

I have seen many comments concerning the availability of a UNIX-style getopt()
function recently. I wrote my own a bit over a year ago which I am posting for
general use. It was originally written for DOS and OS/2, but I have also used
it in other more diverse environments [MetaWare HighC-386? ;)]. I haven't had
time to port it to Minix yet, but here it is. Porting it should be trivial.

-------Cut here-------------------------------------------------------------
/*
 *   GETOPT.C
 *
 *      This subroutine provides the functionality of the UNIX (TM) System
 *   getopt(3c) library routine for MS/PC-DOS and OS/2. Porting getopt() to
 *   Minix should be trivial. Functionality has been extended by the
 *   addition of 'getoptinit()', a function that can be called to
 *   reinitialize for another pass through the options list.
 *
 *   Author: Gerald L. Lewis
 *   Date:   February 18, 1988
 *
 *   I make this version of getopt() freely available to the public domain
 *   with no warranty whatsoever. The only requirement is that the authorship
 *   note and version date remain intact. 
 *
 */

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

char *optarg = NULL;      /* Points to start of argument when : found */
int   optind = 1;         /* Options index (skips over name operand) */
int   opterr = 0;         /* Used to override default error message */

static int off = 1;       /* Internal option list offset */


void getoptinit(void)     /* Resets getopt global variables */
{
  optarg = NULL;
  optind = 1;
  opterr = 0;
  off    = 1;
}
 

int getopt(int argc, char *argv[], char *optstring)
{
  char *cp;
  int   ch;

  optarg = NULL;

  while ( optind < argc )
  {
     if ( argv[optind][0] != '-' )       /* Only interested in options */
     {
        off = 1;
        return(EOF);
     }

     if ( argv[optind][1] == '-' )       /* "--" escapes getopt */
     {
        ++optind;
        off = 1;
        return(EOF);
     }

     if ( (ch = argv[optind][off++]) == '\0' )
     {
        optind++;
        off = 1;
        continue;
     }

     if ( (cp = strchr(optstring, ch)) == NULL)
     {
        if ( !opterr )
           fprintf(stderr, "Unknown option -%c\n", ch);

        return('?');
     }
     else if ( *(cp + 1) != ':' )
        return(ch);

     if ( argv[optind][off] != '\0' )
     {
        optarg = &argv[optind++][off];
        off = 1;
        return(ch);
     }

     ++optind;

     if ( (optind >= argc) || (argv[optind][0] == '-' ) )
     {
        if ( !opterr )
           fprintf(stderr, "Missing argument for option -%c\n", ch);

        return('?');
     }

     optarg = argv[optind++];
     off = 1;
     return(ch);
  }

  return(EOF);
}
-------Cut here-------------------------------------------------------------

Gary Lewis
lcc.glewis@seas.ucla.edu