1219b2ee8SDavid du Colombier #include <stdlib.h>
2219b2ee8SDavid du Colombier #include <string.h>
3219b2ee8SDavid du Colombier #include <stdio.h>
4219b2ee8SDavid du Colombier #define ERR(str, chr) if(opterr){fprintf(stderr, "%s%s%c\n", argv[0], str, chr);}
5219b2ee8SDavid du Colombier int opterr = 1;
6219b2ee8SDavid du Colombier int optind = 1;
7219b2ee8SDavid du Colombier int optopt;
8219b2ee8SDavid du Colombier char *optarg;
9219b2ee8SDavid du Colombier
10219b2ee8SDavid du Colombier int
getopt(int argc,char ** argv,char * opts)11219b2ee8SDavid du Colombier getopt (int argc, char **argv, char *opts)
12219b2ee8SDavid du Colombier {
13219b2ee8SDavid du Colombier static int sp = 1;
14219b2ee8SDavid du Colombier register c;
15219b2ee8SDavid du Colombier register char *cp;
16219b2ee8SDavid du Colombier
17219b2ee8SDavid du Colombier if (sp == 1)
18219b2ee8SDavid du Colombier if (optind >= argc ||
19219b2ee8SDavid du Colombier argv[optind][0] != '-' || argv[optind][1] == '\0')
20219b2ee8SDavid du Colombier return EOF;
21*f19e7b74SDavid du Colombier else if (strcmp(argv[optind], "--") == 0) {
22219b2ee8SDavid du Colombier optind++;
23219b2ee8SDavid du Colombier return EOF;
24219b2ee8SDavid du Colombier }
25219b2ee8SDavid du Colombier optopt = c = argv[optind][sp];
26219b2ee8SDavid du Colombier if (c == ':' || (cp=strchr(opts, c)) == NULL) {
27219b2ee8SDavid du Colombier ERR (": illegal option -- ", c);
28219b2ee8SDavid du Colombier if (argv[optind][++sp] == '\0') {
29219b2ee8SDavid du Colombier optind++;
30219b2ee8SDavid du Colombier sp = 1;
31219b2ee8SDavid du Colombier }
32219b2ee8SDavid du Colombier return '?';
33219b2ee8SDavid du Colombier }
34219b2ee8SDavid du Colombier if (*++cp == ':') {
35219b2ee8SDavid du Colombier if (argv[optind][sp+1] != '\0')
36219b2ee8SDavid du Colombier optarg = &argv[optind++][sp+1];
37219b2ee8SDavid du Colombier else if (++optind >= argc) {
38219b2ee8SDavid du Colombier ERR (": option requires an argument -- ", c);
39219b2ee8SDavid du Colombier sp = 1;
40219b2ee8SDavid du Colombier return '?';
41219b2ee8SDavid du Colombier } else
42219b2ee8SDavid du Colombier optarg = argv[optind++];
43219b2ee8SDavid du Colombier sp = 1;
44219b2ee8SDavid du Colombier } else {
45219b2ee8SDavid du Colombier if (argv[optind][++sp] == '\0') {
46219b2ee8SDavid du Colombier sp = 1;
47219b2ee8SDavid du Colombier optind++;
48219b2ee8SDavid du Colombier }
49219b2ee8SDavid du Colombier optarg = NULL;
50219b2ee8SDavid du Colombier }
51219b2ee8SDavid du Colombier return c;
52219b2ee8SDavid du Colombier }
53