Home | History | Annotate | Line # | Download | only in common
getopt.c revision 1.1.1.4.2.1
      1 /******************************************************************************
      2  *
      3  * Module Name: getopt
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2015, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 /*
     45  * ACPICA getopt() implementation
     46  *
     47  * Option strings:
     48  *    "f"       - Option has no arguments
     49  *    "f:"      - Option requires an argument
     50  *    "f^"      - Option has optional single-char sub-options
     51  *    "f|"      - Option has required single-char sub-options
     52  */
     53 
     54 #include "acpi.h"
     55 #include "accommon.h"
     56 #include "acapps.h"
     57 
     58 #define ACPI_OPTION_ERROR(msg, badchar) \
     59     if (AcpiGbl_Opterr) {AcpiLogError ("%s%c\n", msg, badchar);}
     60 
     61 
     62 int                 AcpiGbl_Opterr = 1;
     63 int                 AcpiGbl_Optind = 1;
     64 int                 AcpiGbl_SubOptChar = 0;
     65 char                *AcpiGbl_Optarg;
     66 
     67 static int          CurrentCharPtr = 1;
     68 
     69 
     70 /*******************************************************************************
     71  *
     72  * FUNCTION:    AcpiGetoptArgument
     73  *
     74  * PARAMETERS:  argc, argv          - from main
     75  *
     76  * RETURN:      0 if an argument was found, -1 otherwise. Sets AcpiGbl_Optarg
     77  *              to point to the next argument.
     78  *
     79  * DESCRIPTION: Get the next argument. Used to obtain arguments for the
     80  *              two-character options after the original call to AcpiGetopt.
     81  *              Note: Either the argument starts at the next character after
     82  *              the option, or it is pointed to by the next argv entry.
     83  *              (After call to AcpiGetopt, we need to backup to the previous
     84  *              argv entry).
     85  *
     86  ******************************************************************************/
     87 
     88 int
     89 AcpiGetoptArgument (
     90     int                     argc,
     91     char                    **argv)
     92 {
     93     AcpiGbl_Optind--;
     94     CurrentCharPtr++;
     95 
     96     if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
     97     {
     98         AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][(int) (CurrentCharPtr+1)];
     99     }
    100     else if (++AcpiGbl_Optind >= argc)
    101     {
    102         ACPI_OPTION_ERROR ("Option requires an argument: -", 'v');
    103 
    104         CurrentCharPtr = 1;
    105         return (-1);
    106     }
    107     else
    108     {
    109         AcpiGbl_Optarg = argv[AcpiGbl_Optind++];
    110     }
    111 
    112     CurrentCharPtr = 1;
    113     return (0);
    114 }
    115 
    116 
    117 /*******************************************************************************
    118  *
    119  * FUNCTION:    AcpiGetopt
    120  *
    121  * PARAMETERS:  argc, argv          - from main
    122  *              opts                - options info list
    123  *
    124  * RETURN:      Option character or ACPI_OPT_END
    125  *
    126  * DESCRIPTION: Get the next option
    127  *
    128  ******************************************************************************/
    129 
    130 int
    131 AcpiGetopt(
    132     int                     argc,
    133     char                    **argv,
    134     char                    *opts)
    135 {
    136     int                     CurrentChar;
    137     char                    *OptsPtr;
    138 
    139 
    140     if (CurrentCharPtr == 1)
    141     {
    142         if (AcpiGbl_Optind >= argc ||
    143             argv[AcpiGbl_Optind][0] != '-' ||
    144             argv[AcpiGbl_Optind][1] == '\0')
    145         {
    146             return (ACPI_OPT_END);
    147         }
    148         else if (ACPI_STRCMP (argv[AcpiGbl_Optind], "--") == 0)
    149         {
    150             AcpiGbl_Optind++;
    151             return (ACPI_OPT_END);
    152         }
    153     }
    154 
    155     /* Get the option */
    156 
    157     CurrentChar = argv[AcpiGbl_Optind][CurrentCharPtr];
    158 
    159     /* Make sure that the option is legal */
    160 
    161     if (CurrentChar == ':' ||
    162        (OptsPtr = ACPI_STRCHR (opts, CurrentChar)) == NULL)
    163     {
    164         ACPI_OPTION_ERROR ("Illegal option: -", CurrentChar);
    165 
    166         if (argv[AcpiGbl_Optind][++CurrentCharPtr] == '\0')
    167         {
    168             AcpiGbl_Optind++;
    169             CurrentCharPtr = 1;
    170         }
    171 
    172         return ('?');
    173     }
    174 
    175     /* Option requires an argument? */
    176 
    177     if (*++OptsPtr == ':')
    178     {
    179         if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
    180         {
    181             AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][(int) (CurrentCharPtr+1)];
    182         }
    183         else if (++AcpiGbl_Optind >= argc)
    184         {
    185             ACPI_OPTION_ERROR ("Option requires an argument: -", CurrentChar);
    186 
    187             CurrentCharPtr = 1;
    188             return ('?');
    189         }
    190         else
    191         {
    192             AcpiGbl_Optarg = argv[AcpiGbl_Optind++];
    193         }
    194 
    195         CurrentCharPtr = 1;
    196     }
    197 
    198     /* Option has an optional argument? */
    199 
    200     else if (*OptsPtr == '+')
    201     {
    202         if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
    203         {
    204             AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][(int) (CurrentCharPtr+1)];
    205         }
    206         else if (++AcpiGbl_Optind >= argc)
    207         {
    208             AcpiGbl_Optarg = NULL;
    209         }
    210         else
    211         {
    212             AcpiGbl_Optarg = argv[AcpiGbl_Optind++];
    213         }
    214 
    215         CurrentCharPtr = 1;
    216     }
    217 
    218     /* Option has optional single-char arguments? */
    219 
    220     else if (*OptsPtr == '^')
    221     {
    222         if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
    223         {
    224             AcpiGbl_Optarg = &argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)];
    225         }
    226         else
    227         {
    228             AcpiGbl_Optarg = "^";
    229         }
    230 
    231         AcpiGbl_SubOptChar = AcpiGbl_Optarg[0];
    232         AcpiGbl_Optind++;
    233         CurrentCharPtr = 1;
    234     }
    235 
    236     /* Option has a required single-char argument? */
    237 
    238     else if (*OptsPtr == '|')
    239     {
    240         if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
    241         {
    242             AcpiGbl_Optarg = &argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)];
    243         }
    244         else
    245         {
    246             ACPI_OPTION_ERROR ("Option requires a single-character suboption: -", CurrentChar);
    247 
    248             CurrentCharPtr = 1;
    249             return ('?');
    250         }
    251 
    252         AcpiGbl_SubOptChar = AcpiGbl_Optarg[0];
    253         AcpiGbl_Optind++;
    254         CurrentCharPtr = 1;
    255     }
    256 
    257     /* Option with no arguments */
    258 
    259     else
    260     {
    261         if (argv[AcpiGbl_Optind][++CurrentCharPtr] == '\0')
    262         {
    263             CurrentCharPtr = 1;
    264             AcpiGbl_Optind++;
    265         }
    266 
    267         AcpiGbl_Optarg = NULL;
    268     }
    269 
    270     return (CurrentChar);
    271 }
    272