/*---------------------------------------------------------------------------* | |
* <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. | |
* | |
* 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 <stdio.h> | |
#include <string.h> | |
#ifdef __cplusplus | |
extern "C" { | |
#endif | |
int _PyOS_opterr = 1; /* generate error messages */ | |
int _PyOS_optind = 1; /* index into argv array */ | |
char *_PyOS_optarg = NULL; /* optional argument */ | |
int _PyOS_GetOpt(int argc, char **argv, char *optstring) | |
{ | |
static char *opt_ptr = ""; | |
char *ptr; | |
int option; | |
if (*opt_ptr == '\0') { | |
if (_PyOS_optind >= argc) | |
return -1; | |
#ifdef MS_WINDOWS | |
else if (strcmp(argv[_PyOS_optind], "/?") == 0) { | |
++_PyOS_optind; | |
return 'h'; | |
} | |
#endif | |
else if (argv[_PyOS_optind][0] != '-' || | |
argv[_PyOS_optind][1] == '\0' /* lone dash */ ) | |
return -1; | |
else if (strcmp(argv[_PyOS_optind], "--") == 0) { | |
++_PyOS_optind; | |
return -1; | |
} | |
else if (strcmp(argv[_PyOS_optind], "--help") == 0) { | |
++_PyOS_optind; | |
return 'h'; | |
} | |
else if (strcmp(argv[_PyOS_optind], "--version") == 0) { | |
++_PyOS_optind; | |
return 'V'; | |
} | |
opt_ptr = &argv[_PyOS_optind++][1]; | |
} | |
if ( (option = *opt_ptr++) == '\0') | |
return -1; | |
if (option == 'J') { | |
fprintf(stderr, "-J is reserved for Jython\n"); | |
return '_'; | |
} | |
if (option == 'X') { | |
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) == ':') { | |
if (*opt_ptr != '\0') { | |
_PyOS_optarg = opt_ptr; | |
opt_ptr = ""; | |
} | |
else { | |
if (_PyOS_optind >= argc) { | |
if (_PyOS_opterr) | |
fprintf(stderr, | |
"Argument expected for the -%c option\n", option); | |
return '_'; | |
} | |
_PyOS_optarg = argv[_PyOS_optind++]; | |
} | |
} | |
return option; | |
} | |
#ifdef __cplusplus | |
} | |
#endif | |