123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- /*---------------------------------------------------------------------------*
- * <RCS keywords>
- *
- * C++ Library
- *
- * Copyright 1992-1994, David Gottner
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice, this permission notice and
- * the following disclaimer notice appear unmodified in all copies.
- *
- * I DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL I
- * BE LIABLE FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
- * 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.
- *---------------------------------------------------------------------------*/
- /* 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:OPqRsStuvVW:xX:?"
- static const _PyOS_LongOption longopts[] = {
- /* name, has_arg, val (used in switch in initconfig.c) */
- {L"check-hash-based-pycs", 1, 0},
- {L"help-all", 0, 1},
- {L"help-env", 0, 2},
- {L"help-xoptions", 0, 3},
- {NULL, 0, -1}, /* sentinel */
- };
- void _PyOS_ResetGetOpt(void)
- {
- _PyOS_opterr = 1;
- _PyOS_optind = 1;
- _PyOS_optarg = NULL;
- opt_ptr = L"";
- }
- int _PyOS_GetOpt(Py_ssize_t argc, wchar_t * const *argv, int *longindex)
- {
- wchar_t *ptr;
- wchar_t option;
- if (*opt_ptr == '\0') {
- if (_PyOS_optind >= argc)
- return -1;
- #ifdef MS_WINDOWS
- else if (wcscmp(argv[_PyOS_optind], L"/?") == 0) {
- ++_PyOS_optind;
- return 'h';
- }
- #endif
- else if (argv[_PyOS_optind][0] != L'-' ||
- argv[_PyOS_optind][1] == L'\0' /* lone dash */ )
- return -1;
- else if (wcscmp(argv[_PyOS_optind], L"--") == 0) {
- ++_PyOS_optind;
- return -1;
- }
- else if (wcscmp(argv[_PyOS_optind], L"--help") == 0) {
- ++_PyOS_optind;
- return 'h';
- }
- else if (wcscmp(argv[_PyOS_optind], L"--version") == 0) {
- ++_PyOS_optind;
- return 'V';
- }
- opt_ptr = &argv[_PyOS_optind++][1];
- }
- if ((option = *opt_ptr++) == L'\0')
- return -1;
- if (option == L'-') {
- // Parse long option.
- if (*opt_ptr == L'\0') {
- if (_PyOS_opterr) {
- 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) {
- if (_PyOS_opterr) {
- 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) {
- if (_PyOS_opterr) {
- 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 (_PyOS_opterr) {
- fprintf(stderr, "Unknown option: -%c\n", (char)option);
- }
- return '_';
- }
- if (*(ptr + 1) == L':') {
- if (*opt_ptr != L'\0') {
- _PyOS_optarg = opt_ptr;
- opt_ptr = L"";
- }
- else {
- if (_PyOS_optind >= argc) {
- if (_PyOS_opterr) {
- fprintf(stderr,
- "Argument expected for the -%c option\n", (char)option);
- }
- return '_';
- }
- _PyOS_optarg = argv[_PyOS_optind++];
- }
- }
- return option;
- }
- #ifdef __cplusplus
- }
- #endif
|