comparison XGetopt.c @ 0:6b1b602514db libpst_0_5

Initial revision
author carl
date Fri, 09 Jul 2004 07:26:16 -0700
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:6b1b602514db
1 // XGetopt.cpp Version 1.1
2 //
3 // Author: Hans Dietrich
4 // hdietrich2@hotmail.com
5 //
6 // Modified: David Smith
7 // dave.s@earthcorp.com
8 // Moved two char declarations from body of function so
9 // that it can compile as a C function.
10 // Thanks so much Hans
11 //
12 // This software is released into the public domain.
13 // You are free to use it in any way you like.
14 //
15 // This software is provided "as is" with no expressed
16 // or implied warranty. I accept no liability for any
17 // damage or loss of business that this software may cause.
18 //
19 ///////////////////////////////////////////////////////////////////////////////
20
21 #include <stdio.h>
22 #include <string.h>
23 #include "XGetopt.h"
24
25 ///////////////////////////////////////////////////////////////////////////////
26 //
27 // X G e t o p t . c p p
28 //
29 //
30 // NAME
31 // getopt -- parse command line options
32 //
33 // SYNOPSIS
34 // int getopt(int argc, char *argv[], char *optstring)
35 //
36 // extern char *optarg;
37 // extern int optind;
38 //
39 // DESCRIPTION
40 // The getopt() function parses the command line arguments. Its
41 // arguments argc and argv are the argument count and array as
42 // passed into the application on program invocation. In the case
43 // of Visual C++ programs, argc and argv are available via the
44 // variables __argc and __argv (double underscores), respectively.
45 // getopt returns the next option letter in argv that matches a
46 // letter in optstring.
47 //
48 // optstring is a string of recognized option letters; if a letter
49 // is followed by a colon, the option is expected to have an argument
50 // that may or may not be separated from it by white space. optarg
51 // is set to point to the start of the option argument on return from
52 // getopt.
53 //
54 // Option letters may be combined, e.g., "-ab" is equivalent to
55 // "-a -b". Option letters are case sensitive.
56 //
57 // getopt places in the external variable optind the argv index
58 // of the next argument to be processed. optind is initialized
59 // to 0 before the first call to getopt.
60 //
61 // When all options have been processed (i.e., up to the first
62 // non-option argument), getopt returns EOF, optarg will point
63 // to the argument, and optind will be set to the argv index of
64 // the argument. If there are no non-option arguments, optarg
65 // will be set to NULL.
66 //
67 // The special option "--" may be used to delimit the end of the
68 // options; EOF will be returned, and "--" (and everything after it)
69 // will be skipped.
70 //
71 // RETURN VALUE
72 // For option letters contained in the string optstring, getopt
73 // will return the option letter. getopt returns a question mark (?)
74 // when it encounters an option letter not included in optstring.
75 // EOF is returned when processing is finished.
76 //
77 // BUGS
78 // 1) Long options are not supported.
79 // 2) The GNU double-colon extension is not supported.
80 // 3) The environment variable POSIXLY_CORRECT is not supported.
81 // 4) The + syntax is not supported.
82 // 5) The automatic permutation of arguments is not supported.
83 // 6) This implementation of getopt() returns EOF if an error is
84 // encountered, instead of -1 as the latest standard requires.
85 //
86 // EXAMPLE
87 // BOOL CMyApp::ProcessCommandLine(int argc, char *argv[])
88 // {
89 // int c;
90 //
91 // while ((c = getopt(argc, argv, "aBn:")) != EOF)
92 // {
93 // switch (c)
94 // {
95 // case 'a':
96 // TRACE(_T("option a\n"));
97 // //
98 // // set some flag here
99 // //
100 // break;
101 //
102 // case 'B':
103 // TRACE( _T("option B\n"));
104 // //
105 // // set some other flag here
106 // //
107 // break;
108 //
109 // case 'n':
110 // TRACE(_T("option n: value=%d\n"), atoi(optarg));
111 // //
112 // // do something with value here
113 // //
114 // break;
115 //
116 // case '?':
117 // TRACE(_T("ERROR: illegal option %s\n"), argv[optind-1]);
118 // return FALSE;
119 // break;
120 //
121 // default:
122 // TRACE(_T("WARNING: no handler for option %c\n"), c);
123 // return FALSE;
124 // break;
125 // }
126 // }
127 // //
128 // // check for non-option args here
129 // //
130 // return TRUE;
131 // }
132 //
133 ///////////////////////////////////////////////////////////////////////////////
134
135 char *optarg; // global argument pointer
136 int optind = 0; // global argv index
137
138 int getopt(int argc, char *argv[], char *optstring)
139 {
140 static char *next = NULL;
141 char c, *cp;
142 if (optind == 0)
143 next = NULL;
144
145 optarg = NULL;
146
147 if (next == NULL || *next == '\0')
148 {
149 if (optind == 0)
150 optind++;
151
152 if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0')
153 {
154 optarg = NULL;
155 if (optind < argc)
156 optarg = argv[optind];
157 return EOF;
158 }
159
160 if (strcmp(argv[optind], "--") == 0)
161 {
162 optind++;
163 optarg = NULL;
164 if (optind < argc)
165 optarg = argv[optind];
166 return EOF;
167 }
168
169 next = argv[optind]+1;
170 optind++;
171 }
172
173 c = *next++;
174 cp = strchr(optstring, c);
175
176 if (cp == NULL || c == ':')
177 return '?';
178
179 cp++;
180 if (*cp == ':')
181 {
182 if (*next != '\0')
183 {
184 optarg = next;
185 next = NULL;
186 }
187 else if (optind < argc)
188 {
189 optarg = argv[optind];
190 optind++;
191 }
192 else
193 {
194 return '?';
195 }
196 }
197
198 return c;
199 }