xref: /freebsd/sys/contrib/dev/acpica/common/getopt.c (revision 10b59a9b4add0320d52c15ce057dd697261e7dfc)
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 }
174