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