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 #pragma ident "%Z%%M% %I% %E% SMI"
28
29 #include "common.h"
30
31 int
parse_option(int * pargc,char *** pargv,struct flags * flag)32 parse_option(int *pargc, char ***pargv, struct flags *flag)
33 {
34 char c;
35 char *arg;
36 int argc = *pargc;
37 char **argv = *pargv;
38
39 argv++;
40 while (--argc > 1) {
41 arg = *argv;
42 if (*arg == '-') {
43 if (!*(arg + 1)) {
44 /* not an option */
45 break;
46 }
47 loop:
48 if ((c = *++arg) == '\0') {
49 /* next argument */
50 argv++;
51 continue;
52 } else if (c != '-') {
53 /* Sun option */
54 switch (c) {
55 case 'D':
56 /*
57 * add directory to list for input
58 * files search.
59 */
60 if (*(arg + 1)) {
61 /*
62 * no spaces between -D and
63 * optarg
64 */
65 flag->idir = ++arg;
66 argv++;
67 continue;
68 }
69 if (--argc > 1) {
70 if (!flag->idir)
71 flag->idir = *++argv;
72 else
73 ++argv;
74 argv++;
75 continue;
76 }
77 /* not enough args */
78 return (-1);
79 /* NOTREACHED */
80 case 'f':
81 /*
82 * Use fuzzy entry
83 */
84 flag->fuzzy = 1;
85 goto loop;
86 /* NOTREACHED */
87 case 'o':
88 /*
89 * Specify output file name
90 */
91 if (*(arg + 1)) {
92 /*
93 * no spaces between -o and
94 * optarg
95 */
96 flag->ofile = ++arg;
97 argv++;
98 continue;
99 }
100 if (--argc > 1) {
101 flag->ofile = *++argv;
102 argv++;
103 continue;
104 }
105 /* not enough args */
106 return (-1);
107 case 'g':
108 /*
109 * GNU mode
110 */
111 flag->gnu_p = 1;
112 goto loop;
113 case 's':
114 /*
115 * Sun mode
116 */
117 flag->sun_p = 1;
118 goto loop;
119 case 'v':
120 /*
121 * verbose mode
122 */
123 flag->verbose = 1;
124 goto loop;
125 default:
126 /* illegal option */
127 return (-1);
128 }
129 /* NOTREACHED */
130 }
131
132 if (*(arg + 1) == '\0') {
133 /* option end */
134 argv++;
135 argc--;
136 break;
137 }
138
139 /* GNU options */
140 arg++;
141 if (strncmp(arg, "directory=", 10) == 0) {
142 /*
143 * add directory to list for input
144 * files search.
145 */
146 if (flag->idir) {
147 /*
148 * inputdir has already been specified
149 */
150 argv++;
151 continue;
152 }
153 arg += 10;
154 if (*arg == '\0') {
155 /* illegal option */
156 return (-1);
157 }
158 flag->idir = arg;
159 argv++;
160 continue;
161 }
162 if (strcmp(arg, "use-fuzzy") == 0) {
163 /*
164 * Use fuzzy entry
165 */
166 flag->fuzzy = 1;
167 argv++;
168 continue;
169 }
170 if (strncmp(arg, "output-file=", 12) == 0) {
171 /*
172 * Specify output file name
173 */
174 arg += 12;
175 if (*arg == '\0') {
176 /* illegal option */
177 return (-1);
178 }
179 flag->ofile = arg;
180 argv++;
181 continue;
182 }
183 if (strcmp(arg, "strict") == 0) {
184 /*
185 * strict mode
186 */
187 flag->strict = 1;
188 argv++;
189 continue;
190 }
191 if (strcmp(arg, "verbose") == 0) {
192 /*
193 * verbose mode
194 */
195 flag->verbose = 1;
196 argv++;
197 continue;
198 }
199 /* illegal option */
200 return (-1);
201 }
202 break;
203 }
204
205 if (argc == 0)
206 return (-1);
207
208 *pargc = argc;
209 *pargv = argv;
210 return (0);
211 }
212