1 | /* |
---|
2 | * Revision Control Information |
---|
3 | * |
---|
4 | * $Id: getopt.c,v 1.5 2009/01/05 21:04:04 fabio Exp $ |
---|
5 | * |
---|
6 | */ |
---|
7 | /* LINTLIBRARY */ |
---|
8 | |
---|
9 | #include <stdio.h> |
---|
10 | #include "util.h" |
---|
11 | |
---|
12 | |
---|
13 | /* File : getopt.c |
---|
14 | * Author : Henry Spencer, University of Toronto |
---|
15 | * Updated: 28 April 1984 |
---|
16 | * |
---|
17 | * Changes: (R Rudell) |
---|
18 | * changed index() to strchr(); |
---|
19 | * added getopt_reset() to reset the getopt argument parsing |
---|
20 | * |
---|
21 | * Purpose: get option letter from argv. |
---|
22 | */ |
---|
23 | |
---|
24 | char *util_optarg; /* Global argument pointer. */ |
---|
25 | int util_optind = 0; /* Global argv index. */ |
---|
26 | static char *scan; |
---|
27 | |
---|
28 | |
---|
29 | void |
---|
30 | util_getopt_reset(void) |
---|
31 | { |
---|
32 | util_optarg = 0; |
---|
33 | util_optind = 0; |
---|
34 | scan = 0; |
---|
35 | } |
---|
36 | |
---|
37 | |
---|
38 | |
---|
39 | int |
---|
40 | util_getopt(int argc, char * const argv[], char const *optstring) |
---|
41 | { |
---|
42 | register int c; |
---|
43 | register char *place; |
---|
44 | |
---|
45 | util_optarg = NIL(char); |
---|
46 | |
---|
47 | if (scan == NIL(char) || *scan == '\0') { |
---|
48 | if (util_optind == 0) util_optind++; |
---|
49 | if (util_optind >= argc) return EOF; |
---|
50 | place = argv[util_optind]; |
---|
51 | if (place[0] != '-' || place[1] == '\0') return EOF; |
---|
52 | util_optind++; |
---|
53 | if (place[1] == '-' && place[2] == '\0') return EOF; |
---|
54 | scan = place+1; |
---|
55 | } |
---|
56 | |
---|
57 | c = *scan++; |
---|
58 | place = strchr(optstring, c); |
---|
59 | if (place == NIL(char) || c == ':') { |
---|
60 | (void) fprintf(stderr, "%s: unknown option %c\n", argv[0], c); |
---|
61 | return '?'; |
---|
62 | } |
---|
63 | if (*++place == ':') { |
---|
64 | if (*scan != '\0') { |
---|
65 | util_optarg = scan; |
---|
66 | scan = NIL(char); |
---|
67 | } else { |
---|
68 | if (util_optind >= argc) { |
---|
69 | (void) fprintf(stderr, "%s: %c requires an argument\n", |
---|
70 | argv[0], c); |
---|
71 | return '?'; |
---|
72 | } |
---|
73 | util_optarg = argv[util_optind]; |
---|
74 | util_optind++; |
---|
75 | } |
---|
76 | } |
---|
77 | return c; |
---|
78 | } |
---|