DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T g

⟦06822bd65⟧ TextFile

    Length: 2152 (0x868)
    Types: TextFile
    Names: »getopt.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/elm/src/getopt.c« 

TextFile

/**			getopt.c			**/

/** starting argument parsing routine... 

    (C) Copyright 1986 Dave Taylor
**/

#include "defs.h"

#ifndef NULL
# define NULL		0
#endif

#define DONE		0
#define ERROR		-1

char *optional_arg;			/* optional argument as we go */
int   opt_index;			/* argnum + 1 when we leave   */

/***********************

   Typical usage of this routine is exemplified by;

	register int c;

	while ((c = get_options(argc, argv, "ad:f:")) > 0) {
	   switch (c) {
	     case 'a' : arrow_cursor++;		break;
	     case 'd' : debug = atoi(optional_arg);	break;
	     case 'f' : strcpy(infile, optional_arg); 
	                mbox_specified = 2;  break;
	    }
	 }

	 if (c == ERROR) {
	   printf("Usage: %s [a] [-d level] [-f file] <names>\n\n", argv[0]);
	   exit(1);
	}

***********************/

int  _indx = 1, _argnum = 1;

int
get_options(argc, argv, options)
int argc;
char *argv[], *options;
{
	/** Returns the character argument next, and optionally instantiates 
	    "argument" to the argument associated with the particular option 
	**/
	
	char        *word, *strchr();

	if (_argnum >= argc) {	/* quick check first - no arguments! */
	  opt_index = argc;
	  return(DONE);
	}

	if (_indx >= strlen(argv[_argnum]) && _indx > 1) {
	  _argnum++;
	  _indx = 1;		/* zeroeth char is '-' */
	}

	if (_argnum >= argc) {
	  opt_index = _argnum; /* no more args */
	  return(DONE);
	}

	if (argv[_argnum][0] != '-') {
	  opt_index = _argnum;
	  return(DONE);
	}

        word = strchr(options, argv[_argnum][_indx++]);

	if (word == NULL)
	  return(ERROR);		/* Sun compatibility */

	if (word == NULL || strlen(word) == 0) 
	  return(ERROR);
	
	if (word[1] == ':') {

	  /** Two possibilities - either tailing end of this argument or the 
	      next argument in the list **/

	  if (_indx < strlen(argv[_argnum])) { /* first possibility */
	    optional_arg = (char *) (argv[_argnum] + _indx);
	    _argnum++;
	    _indx = 1;
	  }
	  else {				/* second choice     */
	    if (++_argnum >= argc) 
	      return(ERROR);			/* no argument!!     */

	    optional_arg = (char *) argv[_argnum++];
	    _indx = 1;
	  }
	}

	return((int) word[0]);
}