ACPICA: Core: Major update for code formatting, no functional changes
[linux-2.6-block.git] / tools / power / acpi / common / getopt.c
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/acpi.h>
55 #include "accommon.h"
56 #include "acapps.h"
57
58 #define ACPI_OPTION_ERROR(msg, badchar) \
59         if (acpi_gbl_opterr) {acpi_log_error ("%s%c\n", msg, badchar);}
60
61 int acpi_gbl_opterr = 1;
62 int acpi_gbl_optind = 1;
63 int acpi_gbl_sub_opt_char = 0;
64 char *acpi_gbl_optarg;
65
66 static int current_char_ptr = 1;
67
68 /*******************************************************************************
69  *
70  * FUNCTION:    acpi_getopt_argument
71  *
72  * PARAMETERS:  argc, argv          - from main
73  *
74  * RETURN:      0 if an argument was found, -1 otherwise. Sets acpi_gbl_Optarg
75  *              to point to the next argument.
76  *
77  * DESCRIPTION: Get the next argument. Used to obtain arguments for the
78  *              two-character options after the original call to acpi_getopt.
79  *              Note: Either the argument starts at the next character after
80  *              the option, or it is pointed to by the next argv entry.
81  *              (After call to acpi_getopt, we need to backup to the previous
82  *              argv entry).
83  *
84  ******************************************************************************/
85
86 int acpi_getopt_argument(int argc, char **argv)
87 {
88
89         acpi_gbl_optind--;
90         current_char_ptr++;
91
92         if (argv[acpi_gbl_optind][(int)(current_char_ptr + 1)] != '\0') {
93                 acpi_gbl_optarg =
94                     &argv[acpi_gbl_optind++][(int)(current_char_ptr + 1)];
95         } else if (++acpi_gbl_optind >= argc) {
96                 ACPI_OPTION_ERROR("Option requires an argument: -", 'v');
97
98                 current_char_ptr = 1;
99                 return (-1);
100         } else {
101                 acpi_gbl_optarg = argv[acpi_gbl_optind++];
102         }
103
104         current_char_ptr = 1;
105         return (0);
106 }
107
108 /*******************************************************************************
109  *
110  * FUNCTION:    acpi_getopt
111  *
112  * PARAMETERS:  argc, argv          - from main
113  *              opts                - options info list
114  *
115  * RETURN:      Option character or ACPI_OPT_END
116  *
117  * DESCRIPTION: Get the next option
118  *
119  ******************************************************************************/
120
121 int acpi_getopt(int argc, char **argv, char *opts)
122 {
123         int current_char;
124         char *opts_ptr;
125
126         if (current_char_ptr == 1) {
127                 if (acpi_gbl_optind >= argc ||
128                     argv[acpi_gbl_optind][0] != '-' ||
129                     argv[acpi_gbl_optind][1] == '\0') {
130                         return (ACPI_OPT_END);
131                 } else if (strcmp(argv[acpi_gbl_optind], "--") == 0) {
132                         acpi_gbl_optind++;
133                         return (ACPI_OPT_END);
134                 }
135         }
136
137         /* Get the option */
138
139         current_char = argv[acpi_gbl_optind][current_char_ptr];
140
141         /* Make sure that the option is legal */
142
143         if (current_char == ':' ||
144             (opts_ptr = strchr(opts, current_char)) == NULL) {
145                 ACPI_OPTION_ERROR("Illegal option: -", current_char);
146
147                 if (argv[acpi_gbl_optind][++current_char_ptr] == '\0') {
148                         acpi_gbl_optind++;
149                         current_char_ptr = 1;
150                 }
151
152                 return ('?');
153         }
154
155         /* Option requires an argument? */
156
157         if (*++opts_ptr == ':') {
158                 if (argv[acpi_gbl_optind][(int)(current_char_ptr + 1)] != '\0') {
159                         acpi_gbl_optarg =
160                             &argv[acpi_gbl_optind++][(int)
161                                                      (current_char_ptr + 1)];
162                 } else if (++acpi_gbl_optind >= argc) {
163                         ACPI_OPTION_ERROR("Option requires an argument: -",
164                                           current_char);
165
166                         current_char_ptr = 1;
167                         return ('?');
168                 } else {
169                         acpi_gbl_optarg = argv[acpi_gbl_optind++];
170                 }
171
172                 current_char_ptr = 1;
173         }
174
175         /* Option has an optional argument? */
176
177         else if (*opts_ptr == '+') {
178                 if (argv[acpi_gbl_optind][(int)(current_char_ptr + 1)] != '\0') {
179                         acpi_gbl_optarg =
180                             &argv[acpi_gbl_optind++][(int)
181                                                      (current_char_ptr + 1)];
182                 } else if (++acpi_gbl_optind >= argc) {
183                         acpi_gbl_optarg = NULL;
184                 } else {
185                         acpi_gbl_optarg = argv[acpi_gbl_optind++];
186                 }
187
188                 current_char_ptr = 1;
189         }
190
191         /* Option has optional single-char arguments? */
192
193         else if (*opts_ptr == '^') {
194                 if (argv[acpi_gbl_optind][(int)(current_char_ptr + 1)] != '\0') {
195                         acpi_gbl_optarg =
196                             &argv[acpi_gbl_optind][(int)(current_char_ptr + 1)];
197                 } else {
198                         acpi_gbl_optarg = "^";
199                 }
200
201                 acpi_gbl_sub_opt_char = acpi_gbl_optarg[0];
202                 acpi_gbl_optind++;
203                 current_char_ptr = 1;
204         }
205
206         /* Option has a required single-char argument? */
207
208         else if (*opts_ptr == '|') {
209                 if (argv[acpi_gbl_optind][(int)(current_char_ptr + 1)] != '\0') {
210                         acpi_gbl_optarg =
211                             &argv[acpi_gbl_optind][(int)(current_char_ptr + 1)];
212                 } else {
213                         ACPI_OPTION_ERROR
214                             ("Option requires a single-character suboption: -",
215                              current_char);
216
217                         current_char_ptr = 1;
218                         return ('?');
219                 }
220
221                 acpi_gbl_sub_opt_char = acpi_gbl_optarg[0];
222                 acpi_gbl_optind++;
223                 current_char_ptr = 1;
224         }
225
226         /* Option with no arguments */
227
228         else {
229                 if (argv[acpi_gbl_optind][++current_char_ptr] == '\0') {
230                         current_char_ptr = 1;
231                         acpi_gbl_optind++;
232                 }
233
234                 acpi_gbl_optarg = NULL;
235         }
236
237         return (current_char);
238 }