xref: /illumos-gate/usr/src/cmd/msgfmt/option.c (revision 2aeafac3612e19716bf8164f89c3c9196342979c)
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
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