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