|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T g
Length: 2152 (0x868)
Types: TextFile
Names: »getopt.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec1/elm/src/getopt.c«
/** 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]);
}