Python-2.7.3/Python/getopt.c

No issues found

  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         fprintf(stderr, "-J is reserved for Jython\n");
 94         return '_';
 95     }
 96 
 97     if (option == 'X') {
 98         fprintf(stderr,
 99           "-X is reserved for implementation-specific arguments\n");
100         return '_';
101     }
102 
103     if ((ptr = strchr(optstring, option)) == NULL) {
104         if (_PyOS_opterr)
105             fprintf(stderr, "Unknown option: -%c\n", option);
106 
107         return '_';
108     }
109 
110     if (*(ptr + 1) == ':') {
111         if (*opt_ptr != '\0') {
112             _PyOS_optarg  = opt_ptr;
113             opt_ptr = "";
114         }
115 
116         else {
117             if (_PyOS_optind >= argc) {
118                 if (_PyOS_opterr)
119                     fprintf(stderr,
120                 "Argument expected for the -%c option\n", option);
121                 return '_';
122             }
123 
124             _PyOS_optarg = argv[_PyOS_optind++];
125         }
126     }
127 
128     return option;
129 }
130 
131 #ifdef __cplusplus
132 }
133 #endif