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 static char *opt_ptr = "";
41 
42 void _PyOS_ResetGetOpt(void)
43 {
44     _PyOS_opterr = 1;
45     _PyOS_optind = 1;
46     _PyOS_optarg = NULL;
47     opt_ptr = "";
48 }
49 
50 int _PyOS_GetOpt(int argc, char **argv, char *optstring)
51 {
52     char *ptr;
53     int option;
54 
55     if (*opt_ptr == '\0') {
56 
57         if (_PyOS_optind >= argc)
58             return -1;
59 #ifdef MS_WINDOWS
60         else if (strcmp(argv[_PyOS_optind], "/?") == 0) {
61             ++_PyOS_optind;
62             return 'h';
63         }
64 #endif
65 
66         else if (argv[_PyOS_optind][0] != '-' ||
67                  argv[_PyOS_optind][1] == '\0' /* lone dash */ )
68             return -1;
69 
70         else if (strcmp(argv[_PyOS_optind], "--") == 0) {
71             ++_PyOS_optind;
72             return -1;
73         }
74 
75         else if (strcmp(argv[_PyOS_optind], "--help") == 0) {
76             ++_PyOS_optind;
77             return 'h';
78         }
79 
80         else if (strcmp(argv[_PyOS_optind], "--version") == 0) {
81             ++_PyOS_optind;
82             return 'V';
83         }
84 
85 
86         opt_ptr = &argv[_PyOS_optind++][1];
87     }
88 
89     if ((option = *opt_ptr++) == '\0')
90         return -1;
91 
92     if (option == 'J') {
93         if (_PyOS_opterr)
94             fprintf(stderr, "-J is reserved for Jython\n");
95         return '_';
96     }
97 
98     if (option == 'X') {
99         if (_PyOS_opterr)
100             fprintf(stderr,
101                 "-X is reserved for implementation-specific arguments\n");
102         return '_';
103     }
104 
105     if ((ptr = strchr(optstring, option)) == NULL) {
106         if (_PyOS_opterr)
107             fprintf(stderr, "Unknown option: -%c\n", option);
108 
109         return '_';
110     }
111 
112     if (*(ptr + 1) == ':') {
113         if (*opt_ptr != '\0') {
114             _PyOS_optarg  = opt_ptr;
115             opt_ptr = "";
116         }
117 
118         else {
119             if (_PyOS_optind >= argc) {
120                 if (_PyOS_opterr)
121                     fprintf(stderr,
122                         "Argument expected for the -%c option\n", option);
123                 return '_';
124             }
125 
126             _PyOS_optarg = argv[_PyOS_optind++];
127         }
128     }
129 
130     return option;
131 }
132 
133 #ifdef __cplusplus
134 }
135 #endif
136 
137