|
|
1.1 root 1: /* got this off net.sources */
2: #include <stdio.h>
3: #include <string.h>
4: #include "getopt.h"
5:
6: /*
7: * get option letter from argument vector
8: */
9: int
10: opterr = 1, // should error messages be printed?
11: optind = 1, // index into parent argv vector
12: optopt; // character checked for validity
13: char
14: *optarg; // argument associated with option
15:
16: #define EMSG ""
17:
18: char *progname; // may also be defined elsewhere
19:
20: static void
21: error(char *pch)
22: {
23: if (!opterr) {
24: return; // without printing
25: }
26: fprintf(stderr, "%s: %s: %c\n",
27: (NULL != progname) ? progname : "getopt", pch, optopt);
28: }
29:
30: int
31: getopt(int argc, char **argv, char *ostr)
32: {
33: static char *place = EMSG; /* option letter processing */
34: register char *oli; /* option letter list index */
35:
36: if (!*place) {
37: // update scanning pointer
38: if (optind >= argc || *(place = argv[optind]) != '-' || !*++place) {
39: return EOF;
40: }
41: if (*place == '-') {
42: // found "--"
43: ++optind;
44: return EOF;
45: }
46: }
47:
48: /* option letter okay? */
49: if ((optopt = (int)*place++) == (int)':'
50: || !(oli = strchr(ostr, optopt))) {
51: if (!*place) {
52: ++optind;
53: }
54: error("illegal option");
55: return BADCH;
56: }
57: if (*++oli != ':') {
58: /* don't need argument */
59: optarg = NULL;
60: if (!*place)
61: ++optind;
62: } else {
63: /* need an argument */
64: if (*place) {
65: optarg = place; /* no white space */
66: } else if (argc <= ++optind) {
67: /* no arg */
68: place = EMSG;
69: error("option requires an argument");
70: return BADCH;
71: } else {
72: optarg = argv[optind]; /* white space */
73: }
74: place = EMSG;
75: ++optind;
76: }
77: return optopt; // return option letter
78: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.