1
2/******************************************************************************
3 *
4 * Module Name: getopt
5 *
6 *****************************************************************************/
7
8/*
9 * Copyright (C) 2000 - 2011, Intel Corp.
10 * All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 *    notice, this list of conditions, and the following disclaimer,
17 *    without modification.
18 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19 *    substantially similar to the "NO WARRANTY" disclaimer below
20 *    ("Disclaimer") and any redistribution must be conditioned upon
21 *    including a substantially similar Disclaimer requirement for further
22 *    binary redistribution.
23 * 3. Neither the names of the above-listed copyright holders nor the names
24 *    of any contributors may be used to endorse or promote products derived
25 *    from this software without specific prior written permission.
26 *
27 * Alternatively, this software may be distributed under the terms of the
28 * GNU General Public License ("GPL") version 2 as published by the Free
29 * Software Foundation.
30 *
31 * NO WARRANTY
32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42 * POSSIBILITY OF SUCH DAMAGES.
43 */
44
45
46#include <stdio.h>
47#include <string.h>
48#include "acpi.h"
49#include "accommon.h"
50#include "acapps.h"
51
52#define ERR(szz,czz) if(AcpiGbl_Opterr){fprintf(stderr,"%s%s%c\n",argv[0],szz,czz);}
53
54
55int   AcpiGbl_Opterr = 1;
56int   AcpiGbl_Optind = 1;
57char  *AcpiGbl_Optarg;
58
59
60/*******************************************************************************
61 *
62 * FUNCTION:    AcpiGetopt
63 *
64 * PARAMETERS:  argc, argv          - from main
65 *              opts                - options info list
66 *
67 * RETURN:      Option character or EOF
68 *
69 * DESCRIPTION: Get the next option
70 *
71 ******************************************************************************/
72
73int
74AcpiGetopt(
75    int                     argc,
76    char                    **argv,
77    char                    *opts)
78{
79    static int              CurrentCharPtr = 1;
80    int                     CurrentChar;
81    char                    *OptsPtr;
82
83
84    if (CurrentCharPtr == 1)
85    {
86        if (AcpiGbl_Optind >= argc ||
87            argv[AcpiGbl_Optind][0] != '-' ||
88            argv[AcpiGbl_Optind][1] == '\0')
89        {
90            return(EOF);
91        }
92        else if (strcmp (argv[AcpiGbl_Optind], "--") == 0)
93        {
94            AcpiGbl_Optind++;
95            return(EOF);
96        }
97    }
98
99    /* Get the option */
100
101    CurrentChar = argv[AcpiGbl_Optind][CurrentCharPtr];
102
103    /* Make sure that the option is legal */
104
105    if (CurrentChar == ':' ||
106       (OptsPtr = strchr (opts, CurrentChar)) == NULL)
107    {
108        ERR (": illegal option -- ", CurrentChar);
109
110        if (argv[AcpiGbl_Optind][++CurrentCharPtr] == '\0')
111        {
112            AcpiGbl_Optind++;
113            CurrentCharPtr = 1;
114        }
115
116        return ('?');
117    }
118
119    /* Option requires an argument? */
120
121    if (*++OptsPtr == ':')
122    {
123        if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
124        {
125            AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][(int) (CurrentCharPtr+1)];
126        }
127        else if (++AcpiGbl_Optind >= argc)
128        {
129            ERR (": option requires an argument -- ", CurrentChar);
130
131            CurrentCharPtr = 1;
132            return ('?');
133        }
134        else
135        {
136            AcpiGbl_Optarg = argv[AcpiGbl_Optind++];
137        }
138
139        CurrentCharPtr = 1;
140    }
141
142    /* Option has optional single-char arguments? */
143
144    else if (*OptsPtr == '^')
145    {
146        if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
147        {
148            AcpiGbl_Optarg = &argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)];
149        }
150        else
151        {
152            AcpiGbl_Optarg = "^";
153        }
154
155        AcpiGbl_Optind++;
156        CurrentCharPtr = 1;
157    }
158
159    /* Option with no arguments */
160
161    else
162    {
163        if (argv[AcpiGbl_Optind][++CurrentCharPtr] == '\0')
164        {
165            CurrentCharPtr = 1;
166            AcpiGbl_Optind++;
167        }
168
169        AcpiGbl_Optarg = NULL;
170    }
171
172    return (CurrentChar);
173}
174