diff options
Diffstat (limited to 'Python/getopt.c')
-rw-r--r-- | Python/getopt.c | 98 |
1 files changed, 34 insertions, 64 deletions
diff --git a/Python/getopt.c b/Python/getopt.c index 708d9ce..af5b03c 100644 --- a/Python/getopt.c +++ b/Python/getopt.c @@ -18,138 +18,108 @@ * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Nevertheless, I would like to know about bugs in this library or + * suggestions for improvment. Send bug reports and feedback to + * davegottner@delphi.com. *---------------------------------------------------------------------------*/ /* Modified to support --help and --version, as well as /? on Windows * by Georg Brandl. */ -#include <Python.h> #include <stdio.h> #include <string.h> -#include <wchar.h> -#include "pycore_getopt.h" #ifdef __cplusplus extern "C" { #endif -int _PyOS_opterr = 1; /* generate error messages */ -Py_ssize_t _PyOS_optind = 1; /* index into argv array */ -const wchar_t *_PyOS_optarg = NULL; /* optional argument */ - -static const wchar_t *opt_ptr = L""; - -/* Python command line short and long options */ - -#define SHORT_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?" - -static const _PyOS_LongOption longopts[] = { - {L"check-hash-based-pycs", 1, 0}, - {NULL, 0, 0}, -}; - +int _PyOS_opterr = 1; /* generate error messages */ +int _PyOS_optind = 1; /* index into argv array */ +char *_PyOS_optarg = NULL; /* optional argument */ +static char *opt_ptr = ""; void _PyOS_ResetGetOpt(void) { _PyOS_opterr = 1; _PyOS_optind = 1; _PyOS_optarg = NULL; - opt_ptr = L""; + opt_ptr = ""; } -int _PyOS_GetOpt(Py_ssize_t argc, wchar_t * const *argv, int *longindex) +int _PyOS_GetOpt(int argc, char **argv, char *optstring) { - wchar_t *ptr; - wchar_t option; + char *ptr; + int option; if (*opt_ptr == '\0') { if (_PyOS_optind >= argc) return -1; #ifdef MS_WINDOWS - else if (wcscmp(argv[_PyOS_optind], L"/?") == 0) { + else if (strcmp(argv[_PyOS_optind], "/?") == 0) { ++_PyOS_optind; return 'h'; } #endif - else if (argv[_PyOS_optind][0] != L'-' || - argv[_PyOS_optind][1] == L'\0' /* lone dash */ ) + else if (argv[_PyOS_optind][0] != '-' || + argv[_PyOS_optind][1] == '\0' /* lone dash */ ) return -1; - else if (wcscmp(argv[_PyOS_optind], L"--") == 0) { + else if (strcmp(argv[_PyOS_optind], "--") == 0) { ++_PyOS_optind; return -1; } - else if (wcscmp(argv[_PyOS_optind], L"--help") == 0) { + else if (strcmp(argv[_PyOS_optind], "--help") == 0) { ++_PyOS_optind; return 'h'; } - else if (wcscmp(argv[_PyOS_optind], L"--version") == 0) { + else if (strcmp(argv[_PyOS_optind], "--version") == 0) { ++_PyOS_optind; return 'V'; } + opt_ptr = &argv[_PyOS_optind++][1]; } - if ((option = *opt_ptr++) == L'\0') + if ((option = *opt_ptr++) == '\0') return -1; - if (option == L'-') { - // Parse long option. - if (*opt_ptr == L'\0') { - fprintf(stderr, "expected long option\n"); - return -1; - } - *longindex = 0; - const _PyOS_LongOption *opt; - for (opt = &longopts[*longindex]; opt->name; opt = &longopts[++(*longindex)]) { - if (!wcscmp(opt->name, opt_ptr)) - break; - } - if (!opt->name) { - fprintf(stderr, "unknown option %ls\n", argv[_PyOS_optind - 1]); - return '_'; - } - opt_ptr = L""; - if (!opt->has_arg) { - return opt->val; - } - if (_PyOS_optind >= argc) { - fprintf(stderr, "Argument expected for the %ls options\n", - argv[_PyOS_optind - 1]); - return '_'; - } - _PyOS_optarg = argv[_PyOS_optind++]; - return opt->val; - } - if (option == 'J') { if (_PyOS_opterr) fprintf(stderr, "-J is reserved for Jython\n"); return '_'; } - if ((ptr = wcschr(SHORT_OPTS, option)) == NULL) { + if (option == 'X') { if (_PyOS_opterr) - fprintf(stderr, "Unknown option: -%c\n", (char)option); + fprintf(stderr, + "-X is reserved for implementation-specific arguments\n"); + return '_'; + } + + if ((ptr = strchr(optstring, option)) == NULL) { + if (_PyOS_opterr) + fprintf(stderr, "Unknown option: -%c\n", option); + return '_'; } - if (*(ptr + 1) == L':') { - if (*opt_ptr != L'\0') { + if (*(ptr + 1) == ':') { + if (*opt_ptr != '\0') { _PyOS_optarg = opt_ptr; - opt_ptr = L""; + opt_ptr = ""; } else { if (_PyOS_optind >= argc) { if (_PyOS_opterr) fprintf(stderr, - "Argument expected for the -%c option\n", (char)option); + "Argument expected for the -%c option\n", option); return '_'; } |