/Python/getopt.c
http://unladen-swallow.googlecode.com/ · C · 127 lines · 73 code · 22 blank · 32 comment · 36 complexity · f6b958155aa3dd4bf3838c2869fcb478 MD5 · raw file
- /*---------------------------------------------------------------------------*
- * <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 ((ptr = strchr(optstring, option)) == NULL) {
- if (_PyOS_opterr)
- fprintf(stderr, "Unknown option: -%c\n", option);
- return '_';
- }
- /* The * modifier says that this option _can_ take an argument, but
- not necessarily (unlike :, which requires the argument). If no
- argument was passed, _PyOS_optarg will be \0. The * modifier
- requires the option's argument to be cuddled up to the flag, for
- example: -O2 is legal, -O 2 is not. */
- if (*(ptr + 1) == '*') {
- _PyOS_optarg = opt_ptr;
- opt_ptr = "";
- } else 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