You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.4 KiB
72 lines
1.4 KiB
/* LINTLIBRARY */
|
|
|
|
#include <stdio.h>
|
|
#include "util.h"
|
|
|
|
|
|
/* File : getopt.c
|
|
* Author : Henry Spencer, University of Toronto
|
|
* Updated: 28 April 1984
|
|
*
|
|
* Changes: (R Rudell)
|
|
* changed index() to strchr();
|
|
* added getopt_reset() to reset the getopt argument parsing
|
|
*
|
|
* Purpose: get option letter from argv.
|
|
*/
|
|
|
|
char *util_optarg; /* Global argument pointer. */
|
|
int util_optind = 0; /* Global argv index. */
|
|
static char *scan;
|
|
|
|
|
|
void
|
|
util_getopt_reset()
|
|
{
|
|
util_optarg = 0;
|
|
util_optind = 0;
|
|
scan = 0;
|
|
}
|
|
|
|
|
|
|
|
int
|
|
util_getopt(int argc, char *argv[], char *optstring)
|
|
{
|
|
register int c;
|
|
register char *place;
|
|
|
|
util_optarg = NIL(char);
|
|
|
|
if (scan == NIL(char) || *scan == '\0') {
|
|
if (util_optind == 0) util_optind++;
|
|
if (util_optind >= argc) return EOF;
|
|
place = argv[util_optind];
|
|
if (place[0] != '-' || place[1] == '\0') return EOF;
|
|
util_optind++;
|
|
if (place[1] == '-' && place[2] == '\0') return EOF;
|
|
scan = place+1;
|
|
}
|
|
|
|
c = *scan++;
|
|
place = strchr(optstring, c);
|
|
if (place == NIL(char) || c == ':') {
|
|
(void) fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
|
|
return '?';
|
|
}
|
|
if (*++place == ':') {
|
|
if (*scan != '\0') {
|
|
util_optarg = scan;
|
|
scan = NIL(char);
|
|
} else {
|
|
if (util_optind >= argc) {
|
|
(void) fprintf(stderr, "%s: %c requires an argument\n",
|
|
argv[0], c);
|
|
return '?';
|
|
}
|
|
util_optarg = argv[util_optind];
|
|
util_optind++;
|
|
}
|
|
}
|
|
return c;
|
|
}
|