1*4d9fdb46SRobert Mustacchi /* $NetBSD: getopt.c,v 1.1 2009/03/22 22:33:13 joerg Exp $*/ 2*4d9fdb46SRobert Mustacchi /* Modified by David Anderson to work with GNU/Linux and freebsd. 3*4d9fdb46SRobert Mustacchi Added {} for clarity. 4*4d9fdb46SRobert Mustacchi Switched to standard dwarfdump formatting. 5*4d9fdb46SRobert Mustacchi Treatment of : modified so that :: gets dwoptarg NULL 6*4d9fdb46SRobert Mustacchi if space follows the letter 7*4d9fdb46SRobert Mustacchi (the dwoptarg is set to null). 8*4d9fdb46SRobert Mustacchi */ 9*4d9fdb46SRobert Mustacchi /* 10*4d9fdb46SRobert Mustacchi * Copyright (c) 1987, 1993, 1994 11*4d9fdb46SRobert Mustacchi * The Regents of the University of California. All rights reserved. 12*4d9fdb46SRobert Mustacchi * 13*4d9fdb46SRobert Mustacchi * Redistribution and use in source and binary forms, with or without 14*4d9fdb46SRobert Mustacchi * modification, are permitted provided that the following conditions 15*4d9fdb46SRobert Mustacchi * are met: 16*4d9fdb46SRobert Mustacchi * 1. Redistributions of source code must retain the above copyright 17*4d9fdb46SRobert Mustacchi * notice, this list of conditions and the following disclaimer. 18*4d9fdb46SRobert Mustacchi * 2. Redistributions in binary form must reproduce the above copyright 19*4d9fdb46SRobert Mustacchi * notice, this list of conditions and the following disclaimer in the 20*4d9fdb46SRobert Mustacchi * documentation and/or other materials provided with the distribution. 21*4d9fdb46SRobert Mustacchi * 3. Neither the name of the University nor the names of its contributors 22*4d9fdb46SRobert Mustacchi * may be used to endorse or promote products derived from this software 23*4d9fdb46SRobert Mustacchi * without specific prior written permission. 24*4d9fdb46SRobert Mustacchi * 25*4d9fdb46SRobert Mustacchi * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26*4d9fdb46SRobert Mustacchi * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27*4d9fdb46SRobert Mustacchi * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28*4d9fdb46SRobert Mustacchi * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29*4d9fdb46SRobert Mustacchi * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30*4d9fdb46SRobert Mustacchi * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31*4d9fdb46SRobert Mustacchi * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32*4d9fdb46SRobert Mustacchi * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33*4d9fdb46SRobert Mustacchi * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34*4d9fdb46SRobert Mustacchi * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35*4d9fdb46SRobert Mustacchi * SUCH DAMAGE. 36*4d9fdb46SRobert Mustacchi */ 37*4d9fdb46SRobert Mustacchi 38*4d9fdb46SRobert Mustacchi #ifdef __cplusplus 39*4d9fdb46SRobert Mustacchi extern "C" { 40*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */ 41*4d9fdb46SRobert Mustacchi extern int dwopterr; 42*4d9fdb46SRobert Mustacchi extern int dwoptind; 43*4d9fdb46SRobert Mustacchi extern int dwoptopt; 44*4d9fdb46SRobert Mustacchi extern int dwoptreset; 45*4d9fdb46SRobert Mustacchi extern char *dwoptarg; 46*4d9fdb46SRobert Mustacchi 47*4d9fdb46SRobert Mustacchi int dwgetopt(int nargc, char * const nargv[], const char *ostr); 48*4d9fdb46SRobert Mustacchi 49*4d9fdb46SRobert Mustacchi /* As of October 2017 it seems adviseable to allow 50*4d9fdb46SRobert Mustacchi long option names. So based on a reading of 51*4d9fdb46SRobert Mustacchi 'man 3 getopt' we reimplement a portion of GNU getopt_long(). 52*4d9fdb46SRobert Mustacchi It's a wonderfully sensible design and all the credit 53*4d9fdb46SRobert Mustacchi should go to the original designers. 54*4d9fdb46SRobert Mustacchi We are not implementing all the features of GNU/Linux 55*4d9fdb46SRobert Mustacchi getopt_long(), just the features we wish to use. 56*4d9fdb46SRobert Mustacchi Specifically, we require val be 0 and flag 57*4d9fdb46SRobert Mustacchi be NULL and ignore those fields. 58*4d9fdb46SRobert Mustacchi We do not implement GNU digit_optind at all. 59*4d9fdb46SRobert Mustacchi Within these restrictions the interface behaves the same 60*4d9fdb46SRobert Mustacchi as GNU getopt_long() (or so it appears from the 61*4d9fdb46SRobert Mustacchi getopt documentation: 62*4d9fdb46SRobert Mustacchi release 4.04 of the Linux man-pages project, 63*4d9fdb46SRobert Mustacchi GETOPT(3), 64*4d9fdb46SRobert Mustacchi http://www.kernel.org/doc/man-pages/). 65*4d9fdb46SRobert Mustacchi */ 66*4d9fdb46SRobert Mustacchi 67*4d9fdb46SRobert Mustacchi struct dwoption { 68*4d9fdb46SRobert Mustacchi const char *name; 69*4d9fdb46SRobert Mustacchi int has_arg; 70*4d9fdb46SRobert Mustacchi int *flag; 71*4d9fdb46SRobert Mustacchi int val; 72*4d9fdb46SRobert Mustacchi }; 73*4d9fdb46SRobert Mustacchi #define dwno_argument 0 74*4d9fdb46SRobert Mustacchi #define dwrequired_argument 1 75*4d9fdb46SRobert Mustacchi #define dwoptional_argument 2 76*4d9fdb46SRobert Mustacchi 77*4d9fdb46SRobert Mustacchi int dwgetopt_long(int nargc, char *const nargv[], 78*4d9fdb46SRobert Mustacchi const char *ostr, 79*4d9fdb46SRobert Mustacchi const struct dwoption* longopts, 80*4d9fdb46SRobert Mustacchi int *longindex); 81*4d9fdb46SRobert Mustacchi 82*4d9fdb46SRobert Mustacchi 83*4d9fdb46SRobert Mustacchi #ifdef __cplusplus 84*4d9fdb46SRobert Mustacchi } 85*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */ 86