]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - sys/contrib/dev/acpica/common/getopt.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / sys / contrib / dev / acpica / common / getopt.c
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 <contrib/dev/acpica/include/acpi.h>
49 #include <contrib/dev/acpica/include/accommon.h>
50 #include <contrib/dev/acpica/include/acapps.h>
51
52 #define ERR(szz,czz) if(AcpiGbl_Opterr){fprintf(stderr,"%s%s%c\n",argv[0],szz,czz);}
53
54
55 int   AcpiGbl_Opterr = 1;
56 int   AcpiGbl_Optind = 1;
57 char  *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
73 int
74 AcpiGetopt(
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 }