Pristine Ack-5.5
[Ack-5.5.git] / lang / cem / libcc.ansi / misc / getopt.c
1 /*
2  * getopt - parse command-line options
3  */
4 /* $Id: getopt.c,v 1.2 1994/06/24 11:45:15 ceriel Exp $ */
5
6 #include        <stdio.h>
7 #include        <string.h>
8
9 #define ERR(s, c)       if(opterr){\
10         fputs(argv[0], stderr);\
11         fputs(s, stderr);\
12         fputc(c, stderr);\
13         fputc('\n', stderr);}
14
15 int     opterr = 1;
16 int     optind = 1;
17 int     optopt;
18 char    *optarg;
19
20 int
21 getopt(int argc, char **argv, char *opts)
22 {
23         static int sp = 1;
24         register c;
25         register char *cp;
26
27         if (sp == 1)
28                 if (optind >= argc ||
29                    argv[optind][0] != '-' || argv[optind][1] == '\0')
30                         return EOF;
31                 else if (!strcmp(argv[optind], "--")) {
32                         optind++;
33                         return EOF;
34                 }
35         optopt = c = argv[optind][sp];
36         if (c == ':' || (cp=strchr(opts, c)) == NULL) {
37                 ERR (": illegal option -- ", c);
38                 if (argv[optind][++sp] == '\0') {
39                         optind++;
40                         sp = 1;
41                 }
42                 return '?';
43         }
44         if (*++cp == ':') {
45                 if (argv[optind][sp+1] != '\0')
46                         optarg = &argv[optind++][sp+1];
47                 else if (++optind >= argc) {
48                         ERR (": option requires an argument -- ", c);
49                         sp = 1;
50                         return '?';
51                 } else
52                         optarg = argv[optind++];
53                 sp = 1;
54         } else {
55                 if (argv[optind][++sp] == '\0') {
56                         sp = 1;
57                         optind++;
58                 }
59                 optarg = NULL;
60         }
61         return c;
62 }