/* $NetBSD: getopt.c,v 1.1 2009/03/22 22:33:13 joerg Exp $*/ /* Modified by David Anderson to work with GNU/Linux and freebsd. Added {} for clarity. Switched to standard dwarfdump formatting. Treatment of : modified so that :: gets dwoptarg NULL if space follows the letter (the dwoptarg is set to null). */ /* * Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * 3. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products * derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ extern int dwopterr; extern int dwoptind; extern int dwoptopt; extern int dwoptreset; extern char *dwoptarg; int dwgetopt(int nargc, char * const nargv[], const char *ostr); /* As of October 2017 it seems advisable to allow long option names. So based on a reading of 'man 3 getopt' we reimplement a portion of GNU getopt_long(). It's a wonderfully sensible design and all the credit should go to the original designers. We are not implementing all the features of GNU/Linux getopt_long(), just the features we wish to use. Specifically, we require val be 0 and flag be NULL and ignore those fields. We do not implement GNU digit_optind at all. Within these restrictions the interface behaves the same as GNU getopt_long() (or so it appears from the getopt documentation: release 4.04 of the Linux man-pages project, GETOPT(3), http://www.kernel.org/doc/man-pages/). */ struct dwoption { const char *name; int has_arg; int *flag; int val; }; #define dwno_argument 0 #define dwrequired_argument 1 #define dwoptional_argument 2 int dwgetopt_long(int nargc, char *const nargv[], const char *ostr, const struct dwoption* longopts, int *longindex); #ifdef __cplusplus } #endif /* __cplusplus */