Merge commit 'crater/master'
[dragonfly.git] / contrib / top / getopt.c
blobe6afaaaaa30d67b674101c236cba32f85cf08c79
1 /*
2 * "getopt" routine customized for top.
3 */
5 /*
6 * Many modern-day Unix implementations already have this function
7 * in libc. The standard "getopt" is perfectly sufficient for top's
8 * needs. If such a function exists in libc then you certainly don't
9 * need to compile this one in. To prevent this function from being
10 * compiled, define "HAVE_GETOPT". This is usually done in the "CFLAGS"
11 * line of the corresponding machine module.
15 * This empty declaration exists solely to placate overexhuberant C
16 * compilers that like to warn you about content-free files.
18 static void __empty();
20 #ifndef HAVE_GETOPT
22 /*LINTLIBRARY*/
24 #include "os.h"
25 #ifndef NULL
26 #define NULL 0
27 #endif
28 #ifndef EOF
29 #define EOF (-1)
30 #endif
31 #define ERR(s, c) if(opterr){\
32 extern int write();\
33 char errbuf[2];\
34 errbuf[0] = c; errbuf[1] = '\n';\
35 (void) write(2, argv[0], strlen(argv[0]));\
36 (void) write(2, s, strlen(s));\
37 (void) write(2, errbuf, 2);}
40 int opterr = 1;
41 int optind = 1;
42 int optopt;
43 char *optarg;
45 int
46 getopt(argc, argv, opts)
47 int argc;
48 char **argv, *opts;
50 static int sp = 1;
51 register int c;
52 register char *cp;
54 if(sp == 1)
55 if(optind >= argc ||
56 argv[optind][0] != '-' || argv[optind][1] == '\0')
57 return(EOF);
58 else if(strcmp(argv[optind], "--") == 0) {
59 optind++;
60 return(EOF);
62 optopt = c = argv[optind][sp];
63 if(c == ':' || (cp=strchr(opts, c)) == NULL) {
64 ERR(": unknown option, -", c);
65 if(argv[optind][++sp] == '\0') {
66 optind++;
67 sp = 1;
69 return('?');
71 if(*++cp == ':') {
72 if(argv[optind][sp+1] != '\0')
73 optarg = &argv[optind++][sp+1];
74 else if(++optind >= argc) {
75 ERR(": argument missing for -", c);
76 sp = 1;
77 return('?');
78 } else
79 optarg = argv[optind++];
80 sp = 1;
81 } else {
82 if(argv[optind][++sp] == '\0') {
83 sp = 1;
84 optind++;
86 optarg = NULL;
88 return(c);
90 #endif /* HAVE_GETOPT */