1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright (c) 1996-2001 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27 #include "common.h"
28
29 int
parse_option(int * pargc,char *** pargv,struct flags * flag)30 parse_option(int *pargc, char ***pargv, struct flags *flag)
31 {
32 char c;
33 char *arg;
34 int argc = *pargc;
35 char **argv = *pargv;
36
37 argv++;
38 while (--argc > 1) {
39 arg = *argv;
40 if (*arg == '-') {
41 if (!*(arg + 1)) {
42 /* not an option */
43 break;
44 }
45 loop:
46 if ((c = *++arg) == '\0') {
47 /* next argument */
48 argv++;
49 continue;
50 } else if (c != '-') {
51 /* Sun option */
52 switch (c) {
53 case 'D':
54 /*
55 * add directory to list for input
56 * files search.
57 */
58 if (*(arg + 1)) {
59 /*
60 * no spaces between -D and
61 * optarg
62 */
63 flag->idir = ++arg;
64 argv++;
65 continue;
66 }
67 if (--argc > 1) {
68 if (!flag->idir)
69 flag->idir = *++argv;
70 else
71 ++argv;
72 argv++;
73 continue;
74 }
75 /* not enough args */
76 return (-1);
77 /* NOTREACHED */
78 case 'f':
79 /*
80 * Use fuzzy entry
81 */
82 flag->fuzzy = 1;
83 goto loop;
84 /* NOTREACHED */
85 case 'o':
86 /*
87 * Specify output file name
88 */
89 if (*(arg + 1)) {
90 /*
91 * no spaces between -o and
92 * optarg
93 */
94 flag->ofile = ++arg;
95 argv++;
96 continue;
97 }
98 if (--argc > 1) {
99 flag->ofile = *++argv;
100 argv++;
101 continue;
102 }
103 /* not enough args */
104 return (-1);
105 case 'g':
106 /*
107 * GNU mode
108 */
109 flag->gnu_p = 1;
110 goto loop;
111 case 's':
112 /*
113 * Sun mode
114 */
115 flag->sun_p = 1;
116 goto loop;
117 case 'v':
118 /*
119 * verbose mode
120 */
121 flag->verbose = 1;
122 goto loop;
123 default:
124 /* illegal option */
125 return (-1);
126 }
127 /* NOTREACHED */
128 }
129
130 if (*(arg + 1) == '\0') {
131 /* option end */
132 argv++;
133 argc--;
134 break;
135 }
136
137 /* GNU options */
138 arg++;
139 if (strncmp(arg, "directory=", 10) == 0) {
140 /*
141 * add directory to list for input
142 * files search.
143 */
144 if (flag->idir) {
145 /*
146 * inputdir has already been specified
147 */
148 argv++;
149 continue;
150 }
151 arg += 10;
152 if (*arg == '\0') {
153 /* illegal option */
154 return (-1);
155 }
156 flag->idir = arg;
157 argv++;
158 continue;
159 }
160 if (strcmp(arg, "use-fuzzy") == 0) {
161 /*
162 * Use fuzzy entry
163 */
164 flag->fuzzy = 1;
165 argv++;
166 continue;
167 }
168 if (strncmp(arg, "output-file=", 12) == 0) {
169 /*
170 * Specify output file name
171 */
172 arg += 12;
173 if (*arg == '\0') {
174 /* illegal option */
175 return (-1);
176 }
177 flag->ofile = arg;
178 argv++;
179 continue;
180 }
181 if (strcmp(arg, "strict") == 0) {
182 /*
183 * strict mode
184 */
185 flag->strict = 1;
186 argv++;
187 continue;
188 }
189 if (strcmp(arg, "verbose") == 0) {
190 /*
191 * verbose mode
192 */
193 flag->verbose = 1;
194 argv++;
195 continue;
196 }
197 /* illegal option */
198 return (-1);
199 }
200 break;
201 }
202
203 if (argc == 0)
204 return (-1);
205
206 *pargc = argc;
207 *pargv = argv;
208 return (0);
209 }
210