|
1 /*---------------------------------------------------------------------------* |
|
2 * <RCS keywords> |
|
3 * |
|
4 * C++ Library |
|
5 * |
|
6 * Copyright 1992-1994, David Gottner |
|
7 * |
|
8 * All Rights Reserved |
|
9 * |
|
10 * Permission to use, copy, modify, and distribute this software and its |
|
11 * documentation for any purpose and without fee is hereby granted, |
|
12 * provided that the above copyright notice, this permission notice and |
|
13 * the following disclaimer notice appear unmodified in all copies. |
|
14 * |
|
15 * I DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL |
|
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL I |
|
17 * BE LIABLE FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY |
|
18 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER |
|
19 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT |
|
20 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
21 * |
|
22 * Nevertheless, I would like to know about bugs in this library or |
|
23 * suggestions for improvment. Send bug reports and feedback to |
|
24 * davegottner@delphi.com. |
|
25 *---------------------------------------------------------------------------*/ |
|
26 |
|
27 /* Modified to support --help and --version, as well as /? on Windows |
|
28 * by Georg Brandl. */ |
|
29 |
|
30 #include <stdio.h> |
|
31 #include <string.h> |
|
32 |
|
33 #ifdef __cplusplus |
|
34 extern "C" { |
|
35 #endif |
|
36 |
|
37 int _PyOS_opterr = 1; /* generate error messages */ |
|
38 int _PyOS_optind = 1; /* index into argv array */ |
|
39 char *_PyOS_optarg = NULL; /* optional argument */ |
|
40 |
|
41 int _PyOS_GetOpt(int argc, char **argv, char *optstring) |
|
42 { |
|
43 static char *opt_ptr = ""; |
|
44 char *ptr; |
|
45 int option; |
|
46 |
|
47 if (*opt_ptr == '\0') { |
|
48 |
|
49 if (_PyOS_optind >= argc) |
|
50 return -1; |
|
51 #ifdef MS_WINDOWS |
|
52 else if (strcmp(argv[_PyOS_optind], "/?") == 0) { |
|
53 ++_PyOS_optind; |
|
54 return 'h'; |
|
55 } |
|
56 #endif |
|
57 |
|
58 else if (argv[_PyOS_optind][0] != '-' || |
|
59 argv[_PyOS_optind][1] == '\0' /* lone dash */ ) |
|
60 return -1; |
|
61 |
|
62 else if (strcmp(argv[_PyOS_optind], "--") == 0) { |
|
63 ++_PyOS_optind; |
|
64 return -1; |
|
65 } |
|
66 |
|
67 else if (strcmp(argv[_PyOS_optind], "--help") == 0) { |
|
68 ++_PyOS_optind; |
|
69 return 'h'; |
|
70 } |
|
71 |
|
72 else if (strcmp(argv[_PyOS_optind], "--version") == 0) { |
|
73 ++_PyOS_optind; |
|
74 return 'V'; |
|
75 } |
|
76 |
|
77 |
|
78 opt_ptr = &argv[_PyOS_optind++][1]; |
|
79 } |
|
80 |
|
81 if ( (option = *opt_ptr++) == '\0') |
|
82 return -1; |
|
83 |
|
84 if (option == 'J') { |
|
85 fprintf(stderr, "-J is reserved for Jython\n"); |
|
86 return '_'; |
|
87 } |
|
88 |
|
89 if (option == 'X') { |
|
90 fprintf(stderr, |
|
91 "-X is reserved for implementation-specific arguments\n"); |
|
92 return '_'; |
|
93 } |
|
94 |
|
95 if ((ptr = strchr(optstring, option)) == NULL) { |
|
96 if (_PyOS_opterr) |
|
97 fprintf(stderr, "Unknown option: -%c\n", option); |
|
98 |
|
99 return '_'; |
|
100 } |
|
101 |
|
102 if (*(ptr + 1) == ':') { |
|
103 if (*opt_ptr != '\0') { |
|
104 _PyOS_optarg = opt_ptr; |
|
105 opt_ptr = ""; |
|
106 } |
|
107 |
|
108 else { |
|
109 if (_PyOS_optind >= argc) { |
|
110 if (_PyOS_opterr) |
|
111 fprintf(stderr, |
|
112 "Argument expected for the -%c option\n", option); |
|
113 return '_'; |
|
114 } |
|
115 |
|
116 _PyOS_optarg = argv[_PyOS_optind++]; |
|
117 } |
|
118 } |
|
119 |
|
120 return option; |
|
121 } |
|
122 |
|
123 #ifdef __cplusplus |
|
124 } |
|
125 #endif |
|
126 |