1c87c5fbaSopenharmony_ci/*
2c87c5fbaSopenharmony_ci * This file was copied from the following newsgroup posting:
3c87c5fbaSopenharmony_ci *
4c87c5fbaSopenharmony_ci * Newsgroups: mod.std.unix
5c87c5fbaSopenharmony_ci * Subject: public domain AT&T getopt source
6c87c5fbaSopenharmony_ci * Date: 3 Nov 85 19:34:15 GMT
7c87c5fbaSopenharmony_ci *
8c87c5fbaSopenharmony_ci * Here's something you've all been waiting for:  the AT&T public domain
9c87c5fbaSopenharmony_ci * source for getopt(3).  It is the code which was given out at the 1985
10c87c5fbaSopenharmony_ci * UNIFORUM conference in Dallas.  I obtained it by electronic mail
11c87c5fbaSopenharmony_ci * directly from AT&T.  The people there assure me that it is indeed
12c87c5fbaSopenharmony_ci * in the public domain.
13c87c5fbaSopenharmony_ci */
14c87c5fbaSopenharmony_ci
15c87c5fbaSopenharmony_ci#include <stdio.h>
16c87c5fbaSopenharmony_ci#include <string.h>
17c87c5fbaSopenharmony_ci
18c87c5fbaSopenharmony_cistatic int optind = 1;
19c87c5fbaSopenharmony_cistatic int optopt;
20c87c5fbaSopenharmony_cistatic char *optarg;
21c87c5fbaSopenharmony_ci
22c87c5fbaSopenharmony_cistatic int
23c87c5fbaSopenharmony_cigetopt(int argc, char *argv[], const char *opts) {
24c87c5fbaSopenharmony_ci  static int sp = 1;
25c87c5fbaSopenharmony_ci  int c;
26c87c5fbaSopenharmony_ci  char *cp;
27c87c5fbaSopenharmony_ci
28c87c5fbaSopenharmony_ci  if (sp == 1) {
29c87c5fbaSopenharmony_ci    if (optind >= argc ||
30c87c5fbaSopenharmony_ci        argv[optind][0] != '-' || argv[optind][1] == '\0')
31c87c5fbaSopenharmony_ci      return EOF;
32c87c5fbaSopenharmony_ci    else if (!strcmp(argv[optind], "--")) {
33c87c5fbaSopenharmony_ci      optind++;
34c87c5fbaSopenharmony_ci      return EOF;
35c87c5fbaSopenharmony_ci    }
36c87c5fbaSopenharmony_ci  }
37c87c5fbaSopenharmony_ci  optopt = c = argv[optind][sp];
38c87c5fbaSopenharmony_ci  if (c == ':' || !(cp = strchr(opts, c))) {
39c87c5fbaSopenharmony_ci    fprintf(stderr, ": illegal option -- %c\n", c);
40c87c5fbaSopenharmony_ci    if (argv[optind][++sp] == '\0') {
41c87c5fbaSopenharmony_ci      optind++;
42c87c5fbaSopenharmony_ci      sp = 1;
43c87c5fbaSopenharmony_ci    }
44c87c5fbaSopenharmony_ci    return '?';
45c87c5fbaSopenharmony_ci  }
46c87c5fbaSopenharmony_ci  if (*++cp == ':') {
47c87c5fbaSopenharmony_ci    if (argv[optind][sp+1] != '\0')
48c87c5fbaSopenharmony_ci      optarg = &argv[optind++][sp+1];
49c87c5fbaSopenharmony_ci    else if (++optind >= argc) {
50c87c5fbaSopenharmony_ci      fprintf(stderr, ": option requires an argument -- %c\n", c);
51c87c5fbaSopenharmony_ci      sp = 1;
52c87c5fbaSopenharmony_ci      return '?';
53c87c5fbaSopenharmony_ci    } else
54c87c5fbaSopenharmony_ci      optarg = argv[optind++];
55c87c5fbaSopenharmony_ci    sp = 1;
56c87c5fbaSopenharmony_ci  } else {
57c87c5fbaSopenharmony_ci    if (argv[optind][++sp] == '\0') {
58c87c5fbaSopenharmony_ci      sp = 1;
59c87c5fbaSopenharmony_ci      optind++;
60c87c5fbaSopenharmony_ci    }
61c87c5fbaSopenharmony_ci    optarg = NULL;
62c87c5fbaSopenharmony_ci  }
63c87c5fbaSopenharmony_ci
64c87c5fbaSopenharmony_ci  return c;
65c87c5fbaSopenharmony_ci}
66