main shrub/shrubtools / shared / subgetopt.c
 1/* Public domain. */
 2
 3#define SUBGETOPTNOSHORT
 4#include "subgetopt.h"
 5
 6#define sgopt subgetopt
 7#define optind subgetoptind
 8#define optpos subgetoptpos
 9#define optarg subgetoptarg
10#define optproblem subgetoptproblem
11#define optdone subgetoptdone
12
13int optind = 1;
14int optpos = 0;
15const char *optarg = 0;
16int optproblem = 0;
17int optdone = SUBGETOPTDONE;
18
19int sgopt(int argc,const char *const *argv,const char *opts)
20{
21  int c;
22  const char *s;
23
24  optarg = 0;
25  if (!argv || (optind >= argc) || !argv[optind]) return optdone;
26  if (optpos && !argv[optind][optpos]) {
27    ++optind;
28    optpos = 0;
29    if ((optind >= argc) || !argv[optind]) return optdone;
30  }
31  if (!optpos) {
32    if (argv[optind][0] != '-') return optdone;
33    ++optpos;
34    c = argv[optind][1];
35    if ((c == '-') || (c == 0)) {
36      if (c) ++optind;
37      optpos = 0;
38      return optdone;
39    }
40    /* otherwise c is reassigned below */
41  }
42  c = argv[optind][optpos];
43  ++optpos;
44  s = opts;
45  while (*s) {
46    if (c == *s) {
47      if (s[1] == ':') {
48        optarg = argv[optind] + optpos;
49        ++optind;
50        optpos = 0;
51        if (!*optarg) {
52          optarg = argv[optind];
53          if ((optind >= argc) || !optarg) { /* argument past end */
54            optproblem = c;
55            return '?';
56          }
57	  ++optind;
58        }
59      }
60      return c;
61    }
62    ++s;
63    if (*s == ':') ++s;
64  }
65  optproblem = c;
66  return '?';
67}