1d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes/*	$OpenBSD: getopt_long.c,v 1.22 2006/10/04 21:29:04 jmc Exp $	*/
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*	$NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $	*/
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2002 Todd C. Miller <Todd.Miller@courtesan.com>
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Sponsored in part by the Defense Advanced Research Projects
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Agency (DARPA) and Air Force Research Laboratory, Air Force
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Materiel Command, USAF, under agreement number F39502-99-1-0512.
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*-
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2000 The NetBSD Foundation, Inc.
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved.
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This code is derived from software contributed to The NetBSD Foundation
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * by Dieter Baron and Thomas Klausner.
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met:
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    documentation and/or other materials provided with the distribution.
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * POSSIBILITY OF SUCH DAMAGE.
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
52d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#if 0
53d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#if defined(LIBC_SCCS) && !defined(lint)
54d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughesstatic char *rcsid = "$OpenBSD: getopt_long.c,v 1.16 2004/02/04 18:17:25 millert Exp $";
55d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif /* LIBC_SCCS and not lint */
56d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
57d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#include <sys/cdefs.h>
58d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes__FBSDID("$FreeBSD$");
59d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <err.h>
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <errno.h>
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <getopt.h>
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdlib.h>
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h>
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
66d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#define GNU_COMPATIBLE		/* Be more compatible, configure's use us! */
67d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes
68d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#if 0				/* we prefer to keep our getopt(3) */
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	REPLACE_GETOPT		/* use this getopt as the system getopt(3) */
70d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef REPLACE_GETOPT
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	opterr = 1;		/* if error message should be printed */
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	optind = 1;		/* index into parent argv vector */
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	optopt = '?';		/* character checked for validity */
76d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughesint	optreset;		/* reset getopt */
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar    *optarg;		/* argument associated with option */
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define PRINT_ERROR	((opterr) && (*options != ':'))
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define FLAG_PERMUTE	0x01	/* permute non-options to the end of argv */
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define FLAG_ALLARGS	0x02	/* treat non-options as args to option "-1" */
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define FLAG_LONGONLY	0x04	/* operate as getopt_long_only */
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* return values */
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	BADCH		(int)'?'
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	BADARG		((*options == ':') ? (int)':' : (int)'?')
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	INORDER 	(int)1
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	EMSG		""
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
93d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
94d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#define NO_PREFIX	(-1)
95d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#define D_PREFIX	0
96d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#define DD_PREFIX	1
97d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#define W_PREFIX	2
98d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
99d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int getopt_internal(int, char * const *, const char *,
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			   const struct option *, int *, int);
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int parse_long_options(char * const *, const char *,
103d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			      const struct option *, int *, int, int);
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int gcd(int, int);
1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void permute_args(int, int, int, char * const *);
1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char *place = EMSG; /* option letter processing */
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* XXX: set optreset to 1 rather than these two */
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int nonopt_start = -1; /* first non option argument (for permute) */
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int nonopt_end = -1;   /* first option after non options (for permute) */
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Error messages */
1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char recargchar[] = "option requires an argument -- %c";
115d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughesstatic const char illoptchar[] = "illegal option -- %c"; /* From P1003.2 */
116d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
117d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughesstatic int dash_prefix = NO_PREFIX;
118d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughesstatic const char gnuoptchar[] = "invalid option -- %c";
119d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes
120d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughesstatic const char recargstring[] = "option `%s%s' requires an argument";
121d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughesstatic const char ambig[] = "option `%s%.*s' is ambiguous";
122d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughesstatic const char noarg[] = "option `%s%.*s' doesn't allow an argument";
123d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughesstatic const char illoptstring[] = "unrecognized option `%s%s'";
124d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#else
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char recargstring[] = "option requires an argument -- %s";
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char ambig[] = "ambiguous option -- %.*s";
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char noarg[] = "option doesn't take an argument -- %.*s";
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char illoptstring[] = "unknown option -- %s";
129d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Compute the greatest common divisor of a and b.
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectgcd(int a, int b)
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int c;
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	c = a % b;
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	while (c != 0) {
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		a = b;
1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		b = c;
1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		c = a % b;
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (b);
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Exchange the block from nonopt_start to nonopt_end with the block
1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * from nonopt_end to opt_end (keeping the same order of arguments
1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * in each block).
1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void
1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectpermute_args(int panonopt_start, int panonopt_end, int opt_end,
1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char * const *nargv)
1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char *swap;
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * compute lengths of blocks and number and size of cycles
1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	nnonopts = panonopt_end - panonopt_start;
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	nopts = opt_end - panonopt_end;
1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	ncycle = gcd(nnonopts, nopts);
1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cyclelen = (opt_end - panonopt_start) / ncycle;
1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	for (i = 0; i < ncycle; i++) {
1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		cstart = panonopt_end+i;
1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		pos = cstart;
1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		for (j = 0; j < cyclelen; j++) {
1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (pos >= panonopt_end)
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				pos -= nnonopts;
1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			else
1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				pos += nopts;
1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			swap = nargv[pos];
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/* LINTED const cast */
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			((char **) nargv)[pos] = nargv[cstart];
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/* LINTED const cast */
1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			((char **)nargv)[cstart] = swap;
1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * parse_long_options --
1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Parse long options in argc/argv argument vector.
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Returns -1 if short_too is set and the option does not match long_options.
1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectparse_long_options(char * const *nargv, const char *options,
193d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	const struct option *long_options, int *idx, int short_too, int flags)
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char *current_argv, *has_equal;
196d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
197d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	char *current_dash;
198d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	size_t current_argv_len;
200d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	int i, match, exact_match, second_partial_match;
2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	current_argv = place;
203d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
204d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	switch (dash_prefix) {
205d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		case D_PREFIX:
206d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			current_dash = "-";
207d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			break;
208d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		case DD_PREFIX:
209d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			current_dash = "--";
210d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			break;
211d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		case W_PREFIX:
212d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			current_dash = "-W ";
213d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			break;
214d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		default:
215d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			current_dash = "";
216d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			break;
217d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	}
218d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	match = -1;
220d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	exact_match = 0;
221d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	second_partial_match = 0;
2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	optind++;
2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if ((has_equal = strchr(current_argv, '=')) != NULL) {
2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* argument found (--option=arg) */
2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		current_argv_len = has_equal - current_argv;
2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		has_equal++;
2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else
2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		current_argv_len = strlen(current_argv);
2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	for (i = 0; long_options[i].name; i++) {
2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* find matching long option */
2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (strncmp(current_argv, long_options[i].name,
2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    current_argv_len))
2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			continue;
2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (strlen(long_options[i].name) == current_argv_len) {
2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/* exact match */
2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			match = i;
241d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			exact_match = 1;
2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			break;
2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/*
2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * If this is a known short option, don't allow
2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * a partial match of a single character.
2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 */
2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (short_too && current_argv_len == 1)
2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			continue;
2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
251d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		if (match == -1)        /* first partial match */
2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			match = i;
253d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		else if ((flags & FLAG_LONGONLY) ||
254d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			 long_options[i].has_arg !=
255d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			     long_options[match].has_arg ||
256d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			 long_options[i].flag != long_options[match].flag ||
257d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			 long_options[i].val != long_options[match].val)
258d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			second_partial_match = 1;
259d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	}
260d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	if (!exact_match && second_partial_match) {
261d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		/* ambiguous abbreviation */
262d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		if (PRINT_ERROR)
263d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			warnx(ambig,
264d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
265d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			     current_dash,
266d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
267d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			     (int)current_argv_len,
268d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			     current_argv);
269d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		optopt = 0;
270d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		return (BADCH);
2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (match != -1) {		/* option found */
2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (long_options[match].has_arg == no_argument
2741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    && has_equal) {
2751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (PRINT_ERROR)
276d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes				warnx(noarg,
277d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
278d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes				     current_dash,
279d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
280d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes				     (int)current_argv_len,
281d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes				     current_argv);
2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/*
2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 * XXX: GNU sets optopt to val regardless of flag
2841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 */
2851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (long_options[match].flag == NULL)
2861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optopt = long_options[match].val;
2871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			else
2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optopt = 0;
289d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
290d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			return (BADCH);
291d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#else
2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (BADARG);
293d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
2951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (long_options[match].has_arg == required_argument ||
2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    long_options[match].has_arg == optional_argument) {
2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (has_equal)
2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optarg = has_equal;
2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			else if (long_options[match].has_arg ==
3001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			    required_argument) {
3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/*
3021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 * optional argument doesn't use next nargv
3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 */
3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optarg = nargv[optind++];
3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if ((long_options[match].has_arg == required_argument)
3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    && (optarg == NULL)) {
3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/*
3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 * Missing argument; leading ':' indicates no error
3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 * should be generated.
3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 */
3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (PRINT_ERROR)
314d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes				warnx(recargstring,
315d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
316d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes				    current_dash,
317d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
318d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes				    current_argv);
3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/*
3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 * XXX: GNU sets optopt to val regardless of flag
3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 */
3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (long_options[match].flag == NULL)
3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optopt = long_options[match].val;
3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			else
3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optopt = 0;
3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			--optind;
3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (BADARG);
3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
3291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else {			/* unknown option */
3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (short_too) {
3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			--optind;
3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (-1);
3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (PRINT_ERROR)
335d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			warnx(illoptstring,
336d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
337d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			      current_dash,
338d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
339d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			      current_argv);
3401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		optopt = 0;
3411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (BADCH);
3421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
3431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (idx)
3441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		*idx = match;
3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (long_options[match].flag) {
3461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		*long_options[match].flag = long_options[match].val;
3471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (0);
3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else
3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (long_options[match].val);
3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * getopt_internal --
3541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Parse argc/argv argument vector.  Called by user level routines.
3551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int
3571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectgetopt_internal(int nargc, char * const *nargv, const char *options,
3581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	const struct option *long_options, int *idx, int flags)
3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char *oli;				/* option letter list index */
3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int optchar, short_too;
362d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	int posixly_correct;	/* no static, can be changed on the fly */
3631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (options == NULL)
3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (-1);
3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
3681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * Disable GNU extensions if POSIXLY_CORRECT is set or options
3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * string begins with a '+'.
3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
371d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	posixly_correct = (getenv("POSIXLY_CORRECT") != NULL);
372d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
373d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	if (*options == '-')
374d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		flags |= FLAG_ALLARGS;
375d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	else if (posixly_correct || *options == '+')
376d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		flags &= ~FLAG_PERMUTE;
377d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#else
3781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (posixly_correct || *options == '+')
3791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		flags &= ~FLAG_PERMUTE;
3801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	else if (*options == '-')
3811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		flags |= FLAG_ALLARGS;
382d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
3831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (*options == '+' || *options == '-')
3841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		options++;
3851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
3871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * XXX Some GNU programs (like cvs) set optind to 0 instead of
3881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * XXX using optreset.  Work around this braindamage.
3891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
3901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (optind == 0)
3911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		optind = optreset = 1;
3921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	optarg = NULL;
3941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (optreset)
3951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		nonopt_start = nonopt_end = -1;
3961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstart:
3971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (optreset || !*place) {		/* update scanning pointer */
3981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		optreset = 0;
3991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (optind >= nargc) {          /* end of argument vector */
4001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			place = EMSG;
4011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (nonopt_end != -1) {
4021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/* do permutation, if we have to */
4031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				permute_args(nonopt_start, nonopt_end,
4041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				    optind, nargv);
4051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optind -= nonopt_end - nonopt_start;
4061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
4071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			else if (nonopt_start != -1) {
4081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/*
4091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 * If we skipped non-options, set optind
4101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 * to the first of them.
4111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 */
4121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optind = nonopt_start;
4131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
4141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			nonopt_start = nonopt_end = -1;
4151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (-1);
4161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
4171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (*(place = nargv[optind]) != '-' ||
418d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
419d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		    place[1] == '\0') {
420d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#else
4211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    (place[1] == '\0' && strchr(options, '-') == NULL)) {
422d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
4231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			place = EMSG;		/* found non-option */
4241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (flags & FLAG_ALLARGS) {
4251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/*
4261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 * GNU extension:
4271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 * return non-option as argument to option 1
4281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 */
4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optarg = nargv[optind++];
4301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				return (INORDER);
4311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
4321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (!(flags & FLAG_PERMUTE)) {
4331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/*
4341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 * If no permutation wanted, stop parsing
4351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 * at first non-option.
4361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 */
4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				return (-1);
4381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
4391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/* do permutation */
4401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (nonopt_start == -1)
4411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				nonopt_start = optind;
4421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			else if (nonopt_end != -1) {
4431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				permute_args(nonopt_start, nonopt_end,
4441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				    optind, nargv);
4451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				nonopt_start = optind -
4461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				    (nonopt_end - nonopt_start);
4471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				nonopt_end = -1;
4481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
4491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			optind++;
4501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/* process next argument */
4511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto start;
4521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
4531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (nonopt_start != -1 && nonopt_end == -1)
4541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			nonopt_end = optind;
4551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/*
4571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * If we have "-" do nothing, if "--" we are done.
4581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 */
4591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (place[1] != '\0' && *++place == '-' && place[1] == '\0') {
4601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			optind++;
4611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			place = EMSG;
4621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/*
4631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 * We found an option (--), so if we skipped
4641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 * non-options, we have to permute.
4651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 */
4661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (nonopt_end != -1) {
4671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				permute_args(nonopt_start, nonopt_end,
4681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				    optind, nargv);
4691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optind -= nonopt_end - nonopt_start;
4701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
4711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			nonopt_start = nonopt_end = -1;
4721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (-1);
4731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
4741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
4751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
4771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * Check long options if:
4781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 *  1) we were passed some
4791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 *  2) the arg is not just "-"
4801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 *  3) either the arg starts with -- we are getopt_long_only()
4811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
4821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (long_options != NULL && place != nargv[optind] &&
4831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    (*place == '-' || (flags & FLAG_LONGONLY))) {
4841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		short_too = 0;
485d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
486d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		dash_prefix = D_PREFIX;
487d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
488d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		if (*place == '-') {
4891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			place++;		/* --foo long option */
490d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
491d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			dash_prefix = DD_PREFIX;
492d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
493d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		} else if (*place != ':' && strchr(options, *place) != NULL)
4941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			short_too = 1;		/* could be short option too */
4951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		optchar = parse_long_options(nargv, options, long_options,
497d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		    idx, short_too, flags);
4981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (optchar != -1) {
4991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			place = EMSG;
5001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (optchar);
5011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
5021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
5031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
504d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	if ((optchar = (int)*place++) == (int)':' ||
5051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    (optchar == (int)'-' && *place != '\0') ||
5061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    (oli = strchr(options, optchar)) == NULL) {
5071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/*
5081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * If the user specified "-" and  '-' isn't listed in
5091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * options, return -1 (non-option) as per POSIX.
5101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * Otherwise, it is an unknown option character (or ':').
5111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 */
5121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (optchar == (int)'-' && *place == '\0')
5131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (-1);
5141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (!*place)
5151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			++optind;
516d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
5171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (PRINT_ERROR)
518d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			warnx(posixly_correct ? illoptchar : gnuoptchar,
519d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			      optchar);
520d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#else
521d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		if (PRINT_ERROR)
522d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes			warnx(illoptchar, optchar);
523d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
5241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		optopt = optchar;
5251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (BADCH);
5261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
5271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (long_options != NULL && optchar == 'W' && oli[1] == ';') {
5281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* -W long-option */
5291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (*place)			/* no space */
5301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/* NOTHING */;
5311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		else if (++optind >= nargc) {	/* no arg */
5321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			place = EMSG;
5331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (PRINT_ERROR)
534d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes				warnx(recargchar, optchar);
5351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			optopt = optchar;
5361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (BADARG);
5371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} else				/* white space */
5381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			place = nargv[optind];
539d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#ifdef GNU_COMPATIBLE
540d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		dash_prefix = W_PREFIX;
541d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes#endif
5421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		optchar = parse_long_options(nargv, options, long_options,
543d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes		    idx, 0, flags);
5441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		place = EMSG;
5451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (optchar);
5461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
5471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (*++oli != ':') {			/* doesn't take argument */
5481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (!*place)
5491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			++optind;
5501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else {				/* takes (optional) argument */
5511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		optarg = NULL;
5521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (*place)			/* no white space */
5531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			optarg = place;
5541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		else if (oli[1] != ':') {	/* arg not optional */
5551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (++optind >= nargc) {	/* no arg */
5561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				place = EMSG;
5571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				if (PRINT_ERROR)
558d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes					warnx(recargchar, optchar);
5591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optopt = optchar;
5601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				return (BADARG);
5611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			} else
5621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				optarg = nargv[optind];
5631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
5641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		place = EMSG;
5651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		++optind;
5661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
5671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* dump back option letter */
5681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (optchar);
5691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
5701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef REPLACE_GETOPT
5721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
5731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * getopt --
5741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Parse argc/argv argument vector.
5751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
5761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * [eventually this will replace the BSD getopt]
5771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
5781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
5791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectgetopt(int nargc, char * const *nargv, const char *options)
5801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
5811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
5831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * We don't pass FLAG_PERMUTE to getopt_internal() since
5841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * the BSD getopt(3) (unlike GNU) has never done this.
5851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 *
5861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * Furthermore, since many privileged programs call getopt()
5871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * before dropping privileges it makes sense to keep things
5881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * as simple (and bug-free) as possible.
5891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
5901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (getopt_internal(nargc, nargv, options, NULL, NULL, 0));
5911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
5921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* REPLACE_GETOPT */
5931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
5951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * getopt_long --
5961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Parse argc/argv argument vector.
5971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
5981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
5991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectgetopt_long(int nargc, char * const *nargv, const char *options,
600d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	const struct option *long_options, int *idx)
6011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
6021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (getopt_internal(nargc, nargv, options, long_options, idx,
6041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    FLAG_PERMUTE));
6051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
6061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
6081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * getopt_long_only --
6091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Parse argc/argv argument vector.
6101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
6111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
6121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectgetopt_long_only(int nargc, char * const *nargv, const char *options,
613d278b828fef47fb2d7098f8ec70867fbd3da09d6Elliott Hughes	const struct option *long_options, int *idx)
6141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
6151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (getopt_internal(nargc, nargv, options, long_options, idx,
6171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    FLAG_PERMUTE|FLAG_LONGONLY));
6181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
619