|
| 1 | +#ifdef _MSC_VER |
| 2 | +#ifndef __GETOPT_H__ |
| 3 | +/** |
| 4 | + * DISCLAIMER |
| 5 | + * This file is part of the mingw-w64 runtime package. |
| 6 | + * |
| 7 | + * The mingw-w64 runtime package and its code is distributed in the hope that it |
| 8 | + * will be useful but WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESSED OR |
| 9 | + * IMPLIED ARE HEREBY DISCLAIMED. This includes but is not limited to |
| 10 | + * warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| 11 | + */ |
| 12 | +/* |
| 13 | + * Copyright (c) 2002 Todd C. Miller <Todd.Miller@courtesan.com> |
| 14 | + * |
| 15 | + * Permission to use, copy, modify, and distribute this software for any |
| 16 | + * purpose with or without fee is hereby granted, provided that the above |
| 17 | + * copyright notice and this permission notice appear in all copies. |
| 18 | + * |
| 19 | + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| 20 | + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| 21 | + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| 22 | + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| 23 | + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| 24 | + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 25 | + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 26 | + * |
| 27 | + * Sponsored in part by the Defense Advanced Research Projects |
| 28 | + * Agency (DARPA) and Air Force Research Laboratory, Air Force |
| 29 | + * Materiel Command, USAF, under agreement number F39502-99-1-0512. |
| 30 | + */ |
| 31 | +/*- |
| 32 | + * Copyright (c) 2000 The NetBSD Foundation, Inc. |
| 33 | + * All rights reserved. |
| 34 | + * |
| 35 | + * This code is derived from software contributed to The NetBSD Foundation |
| 36 | + * by Dieter Baron and Thomas Klausner. |
| 37 | + * |
| 38 | + * Redistribution and use in source and binary forms, with or without |
| 39 | + * modification, are permitted provided that the following conditions |
| 40 | + * are met: |
| 41 | + * 1. Redistributions of source code must retain the above copyright |
| 42 | + * notice, this list of conditions and the following disclaimer. |
| 43 | + * 2. Redistributions in binary form must reproduce the above copyright |
| 44 | + * notice, this list of conditions and the following disclaimer in the |
| 45 | + * documentation and/or other materials provided with the distribution. |
| 46 | + * |
| 47 | + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
| 48 | + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
| 49 | + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 50 | + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
| 51 | + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 52 | + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 53 | + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 54 | + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 55 | + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 56 | + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 57 | + * POSSIBILITY OF SUCH DAMAGE. |
| 58 | + */ |
| 59 | + |
| 60 | +#define __GETOPT_H__ |
| 61 | + |
| 62 | +/* All the headers include this file. */ |
| 63 | +#include <crtdefs.h> |
| 64 | +#include <errno.h> |
| 65 | +#include <stdarg.h> |
| 66 | +#include <stdio.h> |
| 67 | +#include <stdlib.h> |
| 68 | +#include <string.h> |
| 69 | +#define WIN32_LEAN_AND_MEAN |
| 70 | +#include <windows.h> |
| 71 | + |
| 72 | +#ifdef __cplusplus |
| 73 | +extern "C" { |
| 74 | +#endif |
| 75 | + |
| 76 | +#define REPLACE_GETOPT /* use this getopt as the system getopt(3) */ |
| 77 | + |
| 78 | +//extern int optind; /* index of first non-option in argv */ |
| 79 | +//extern int optopt; /* single option character, as parsed */ |
| 80 | +//extern int opterr; /* flag to enable built-in diagnostics... */ |
| 81 | +// /* (user may set to zero, to suppress) */ |
| 82 | +// |
| 83 | +//extern char *optarg; /* pointer to argument of current option */ |
| 84 | + |
| 85 | +#define PRINT_ERROR ((opterr) && (*options != ':')) |
| 86 | + |
| 87 | +#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */ |
| 88 | +#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */ |
| 89 | +#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */ |
| 90 | + |
| 91 | +/* return values */ |
| 92 | +#define BADCH (int)'?' |
| 93 | +#define BADARG ((*options == ':') ? (int)':' : (int)'?') |
| 94 | +#define INORDER (int)1 |
| 95 | + |
| 96 | +#ifndef __CYGWIN__ |
| 97 | +#define __progname __argv[0] |
| 98 | +#else |
| 99 | +extern char __declspec(dllimport) * __progname; |
| 100 | +#endif |
| 101 | + |
| 102 | +#ifdef __CYGWIN__ |
| 103 | +static char EMSG[] = ""; |
| 104 | +#else |
| 105 | +#define EMSG "" |
| 106 | +#endif |
| 107 | + |
| 108 | +static int getopt_internal(int, char* const*, const char*, |
| 109 | + const struct option*, int*, int); |
| 110 | +static int parse_long_options(char* const*, const char*, |
| 111 | + const struct option*, int*, int); |
| 112 | +static int gcd(int, int); |
| 113 | +static void permute_args(int, int, int, char* const*); |
| 114 | + |
| 115 | +static char* place = EMSG; /* option letter processing */ |
| 116 | + |
| 117 | +/* XXX: set optreset to 1 rather than these two */ |
| 118 | +static int nonopt_start = -1; /* first non option argument (for permute) */ |
| 119 | +static int nonopt_end = -1; /* first option after non options (for permute) */ |
| 120 | + |
| 121 | +/* Error messages */ |
| 122 | +static const char recargchar[] = "option requires an argument -- %c"; |
| 123 | +static const char recargstring[] = "option requires an argument -- %s"; |
| 124 | +static const char ambig[] = "ambiguous option -- %.*s"; |
| 125 | +static const char noarg[] = "option doesn't take an argument -- %.*s"; |
| 126 | +static const char illoptchar[] = "unknown option -- %c"; |
| 127 | +static const char illoptstring[] = "unknown option -- %s"; |
| 128 | + |
| 129 | +static void _vwarnx(const char* fmt, va_list ap); |
| 130 | + |
| 131 | +static void warnx(const char* fmt, ...); |
| 132 | + |
| 133 | +/* |
| 134 | + * Compute the greatest common divisor of a and b. |
| 135 | + */ |
| 136 | +static int gcd(int a, int b); |
| 137 | + |
| 138 | +/* |
| 139 | + * Exchange the block from nonopt_start to nonopt_end with the block |
| 140 | + * from nonopt_end to opt_end (keeping the same order of arguments |
| 141 | + * in each block). |
| 142 | + */ |
| 143 | +static void permute_args(int panonopt_start, int panonopt_end, int opt_end, char* const* nargv); |
| 144 | + |
| 145 | +#ifdef REPLACE_GETOPT |
| 146 | +/* |
| 147 | + * getopt -- |
| 148 | + * Parse argc/argv argument vector. |
| 149 | + * |
| 150 | + * [eventually this will replace the BSD getopt] |
| 151 | + */ |
| 152 | +int getopt(int nargc, char* const* nargv, const char* options); |
| 153 | +#endif /* REPLACE_GETOPT */ |
| 154 | + |
| 155 | +//extern int getopt(int nargc, char * const *nargv, const char *options); |
| 156 | + |
| 157 | +#ifdef _BSD_SOURCE |
| 158 | +/* |
| 159 | + * BSD adds the non-standard `optreset' feature, for reinitialisation |
| 160 | + * of `getopt' parsing. We support this feature, for applications which |
| 161 | + * proclaim their BSD heritage, before including this header; however, |
| 162 | + * to maintain portability, developers are advised to avoid it. |
| 163 | + */ |
| 164 | +#define optreset __mingw_optreset |
| 165 | +extern int optreset; |
| 166 | +#endif |
| 167 | +#ifdef __cplusplus |
| 168 | +} |
| 169 | +#endif |
| 170 | +/* |
| 171 | + * POSIX requires the `getopt' API to be specified in `unistd.h'; |
| 172 | + * thus, `unistd.h' includes this header. However, we do not want |
| 173 | + * to expose the `getopt_long' or `getopt_long_only' APIs, when |
| 174 | + * included in this manner. Thus, close the standard __GETOPT_H__ |
| 175 | + * declarations block, and open an additional __GETOPT_LONG_H__ |
| 176 | + * specific block, only when *not* __UNISTD_H_SOURCED__, in which |
| 177 | + * to declare the extended API. |
| 178 | + */ |
| 179 | +#endif /* !defined(__GETOPT_H__) */ |
| 180 | + |
| 181 | +#if !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__) |
| 182 | +#define __GETOPT_LONG_H__ |
| 183 | + |
| 184 | +#ifdef __cplusplus |
| 185 | +extern "C" { |
| 186 | +#endif |
| 187 | + |
| 188 | +/* |
| 189 | + * parse_long_options -- |
| 190 | + * Parse long options in argc/argv argument vector. |
| 191 | + * Returns -1 if short_too is set and the option does not match long_options. |
| 192 | + */ |
| 193 | +/* static int parse_long_options(char* const* nargv, const char* options, const struct option* long_options, int* idx, int short_too); */ |
| 194 | + |
| 195 | +/* |
| 196 | + * getopt_internal -- |
| 197 | + * Parse argc/argv argument vector. Called by user level routines. |
| 198 | + */ |
| 199 | +/* static int getopt_internal(int nargc, char* const* nargv, const char* options, const struct option* long_options, int* idx, int flags); */ |
| 200 | + |
| 201 | +/* |
| 202 | + * getopt_long -- |
| 203 | + * Parse argc/argv argument vector. |
| 204 | + */ |
| 205 | +int getopt_long(int nargc, char* const* nargv, const char* options, const struct option* long_options, int* idx); |
| 206 | + |
| 207 | +/* |
| 208 | + * getopt_long_only -- |
| 209 | + * Parse argc/argv argument vector. |
| 210 | + */ |
| 211 | +int getopt_long_only(int nargc, char* const* nargv, const char* options, const struct option* long_options, int* idx); |
| 212 | + |
| 213 | +/* |
| 214 | + * Previous MinGW implementation had... |
| 215 | + */ |
| 216 | +#ifndef HAVE_DECL_GETOPT |
| 217 | +/* |
| 218 | + * ...for the long form API only; keep this for compatibility. |
| 219 | + */ |
| 220 | +#define HAVE_DECL_GETOPT 1 |
| 221 | +#endif |
| 222 | + |
| 223 | +#ifdef __cplusplus |
| 224 | +} |
| 225 | +#endif |
| 226 | + |
| 227 | +#endif /* !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__) */ |
| 228 | +#endif |
0 commit comments