This is an automated email from the ASF dual-hosted git repository.

masayuki pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 35f3b60  system/argtable3: Update to the latest version(v3.1.5.1c1bb23)
35f3b60 is described below

commit 35f3b609fe51fcc4d893f8116f5fefee8c072113
Author: Xiang Xiao <xiaoxi...@xiaomi.com>
AuthorDate: Thu Jan 14 01:57:46 2021 +0800

    system/argtable3: Update to the latest version(v3.1.5.1c1bb23)
    
    Signed-off-by: Xiang Xiao <xiaoxi...@xiaomi.com>
---
 ...001-feat-Switch-to-FreeBSD-getopt-library.patch | 1448 ++++++++++++++++++++
 system/argtable3/Kconfig                           |    2 +-
 system/argtable3/Make.defs                         |    4 +-
 system/argtable3/Makefile                          |    9 +-
 4 files changed, 1456 insertions(+), 7 deletions(-)

diff --git a/system/argtable3/0001-feat-Switch-to-FreeBSD-getopt-library.patch 
b/system/argtable3/0001-feat-Switch-to-FreeBSD-getopt-library.patch
new file mode 100644
index 0000000..9595905
--- /dev/null
+++ b/system/argtable3/0001-feat-Switch-to-FreeBSD-getopt-library.patch
@@ -0,0 +1,1448 @@
+From 01ba528135afc14c9c407b541ab320d01bc17c9b Mon Sep 17 00:00:00 2001
+From: "Tom G. Huang" <tomghu...@gmail.com>
+Date: Sat, 12 Dec 2020 23:33:43 -0800
+Subject: [PATCH] feat: Switch to FreeBSD getopt library
+
+Switching to FreeBSD getopt library can resolve two issues:
+  1. FreeBSD getopt always uses the 2-Clause BSD, which is compatible
+     to GPL. (Although NetBSD has switched to the 2-Clause BSD in
+     2008.)
+  2. FreeBSD getopt_long provides getopt_long_only, which is critical
+     for developers who want to follow the command-line syntax
+     convention, which uses a single '-' character for long options.
+
+resolves: #54 #56
+---
+ LICENSE                        |  12 +-
+ src/{getopt.h => arg_getopt.h} |  77 ++--
+ src/arg_getopt_long.c          | 659 +++++++++++++++++++++++++++++++++
+ src/argtable3.c                |  10 +-
+ src/argtable3.h                |   2 +-
+ src/getopt_long.c              | 531 --------------------------
+ tools/build                    |   4 +-
+ tools/build.bat                |   4 +-
+ 8 files changed, 711 insertions(+), 588 deletions(-)
+ rename src/{getopt.h => arg_getopt.h} (51%)
+ create mode 100644 src/arg_getopt_long.c
+ delete mode 100644 src/getopt_long.c
+
+diff --git argtable3/LICENSE argtable3/LICENSE
+index b7853f1..63c7a7f 100644
+--- argtable3/LICENSE
++++ argtable3/LICENSE
+@@ -25,8 +25,8 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
LIABILITY, OR TORT
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ 
+ 
+-NetBSD getopt library
+-=====================
++FreeBSD getopt library
++======================
+ 
+ Copyright (c) 2000 The NetBSD Foundation, Inc.
+ All rights reserved.
+@@ -42,13 +42,6 @@ are met:
+ 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. All advertising materials mentioning features or use of this software
+-   must display the following acknowledgement:
+-       This product includes software developed by the NetBSD
+-       Foundation, Inc. and its contributors.
+-4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+@@ -172,4 +165,3 @@ 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.
+-
+diff --git argtable3/src/getopt.h argtable3/src/arg_getopt.h
+similarity index 51%
+rename from src/getopt.h
+rename to src/arg_getopt.h
+index 2d14394..a67673b 100644
+--- argtable3/src/getopt.h
++++ argtable3/src/arg_getopt.h
+@@ -1,8 +1,9 @@
+-/*    $Id: getopt.h,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $ */
+-/*    $OpenBSD: getopt.h,v 1.1 2002/12/03 20:24:29 millert Exp $      */
+ /*    $NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp $    */
++/*    $FreeBSD$ */
+ 
+-/*
++/*-
++ * SPDX-License-Identifier: BSD-2-Clause-NetBSD
++ *
+  * Copyright (c) 2000 The NetBSD Foundation, Inc.
+  * All rights reserved.
+  *
+@@ -17,13 +18,6 @@
+  * 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. All advertising materials mentioning features or use of this software
+- *    must display the following acknowledgment:
+- *        This product includes software developed by the NetBSD
+- *        Foundation, Inc. and its contributors.
+- * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+@@ -44,50 +38,51 @@
+ #define _GETOPT_H_
+ 
+ /*
+- * GNU-like getopt_long() and 4.4BSD getsubopt()/optreset extensions
++ * GNU-like getopt_long()/getopt_long_only() with 4.4BSD optreset extension.
++ * getopt() is declared here too for GNU programs.
+  */
+-#define no_argument 0
+-#define required_argument 1
+-#define optional_argument 2
++#define no_argument        0
++#define required_argument  1
++#define optional_argument  2
+ 
+ struct option {
+-    /* name of long option */
+-    const char* name;
+-    /*
+-     * one of no_argument, required_argument, and optional_argument:
+-     * whether option takes an argument
+-     */
+-    int has_arg;
+-    /* if not NULL, set *flag to val when option found */
+-    int* flag;
+-    /* if flag not NULL, value to set *flag to; else return value */
+-    int val;
++      /* name of long option */
++      const char *name;
++      /*
++       * one of no_argument, required_argument, and optional_argument:
++       * whether option takes an argument
++       */
++      int has_arg;
++      /* if not NULL, set *flag to val when option found */
++      int *flag;
++      /* if flag not NULL, value to set *flag to; else return value */
++      int val;
+ };
+ 
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+ 
+-int getopt_long(int, char* const*, const char*, const struct option*, int*);
+-int getopt_long_only(int, char* const*, const char*, const struct option*, 
int*);
+-#ifndef _GETOPT_DEFINED
+-#define _GETOPT_DEFINED
+-int getopt(int, char* const*, const char*);
+-int getsubopt(char**, char* const*, char**);
++int   getopt_long(int, char * const *, const char *,
++      const struct option *, int *);
++int   getopt_long_only(int, char * const *, const char *,
++      const struct option *, int *);
++#ifndef _GETOPT_DECLARED
++#define       _GETOPT_DECLARED
++int getopt(int, char * const [], const char *);
+ 
+-extern char* optarg; /* getopt(3) external variables */
+-extern int opterr;
+-extern int optind;
+-extern int optopt;
+-extern int optreset;
+-extern char* suboptarg; /* getsubopt(3) external variable */
+-#endif                  /* _GETOPT_DEFINED */
++extern char *optarg;                  /* getopt(3) external variables */
++extern int optind, opterr, optopt;
++#endif
++#ifndef _OPTRESET_DECLARED
++#define       _OPTRESET_DECLARED
++extern int optreset;                  /* getopt(3) external variable */
++#endif
+ 
+ #ifdef __cplusplus
+ }
+ #endif
++ 
+ #endif /* !_GETOPT_H_ */
+ 
+-#else
+-#include <getopt.h>
+-#endif /* ARG_REPLACE_GETOPT */
++#endif /* ARG_REPLACE_GETOPT == 1 */
+diff --git argtable3/src/arg_getopt_long.c argtable3/src/arg_getopt_long.c
+new file mode 100644
+index 0000000..c30d770
+--- /dev/null
++++ argtable3/src/arg_getopt_long.c
+@@ -0,0 +1,659 @@
++/*    $OpenBSD: getopt_long.c,v 1.26 2013/06/08 22:47:56 millert Exp $        
*/
++/*    $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $      */
++
++/*
++ * Copyright (c) 2002 Todd C. Miller <todd.mil...@courtesan.com>
++ *
++ * Permission to use, copy, modify, and distribute this software for any
++ * purpose with or without fee is hereby granted, provided that the above
++ * copyright notice and this permission notice appear in all copies.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Sponsored in part by the Defense Advanced Research Projects
++ * Agency (DARPA) and Air Force Research Laboratory, Air Force
++ * Materiel Command, USAF, under agreement number F39502-99-1-0512.
++ */
++/*-
++ * Copyright (c) 2000 The NetBSD Foundation, Inc.
++ * All rights reserved.
++ *
++ * This code is derived from software contributed to The NetBSD Foundation
++ * by Dieter Baron and Thomas Klausner.
++ *
++ * 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.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
++ */
++
++#include "argtable3.h"
++
++#if ARG_REPLACE_GETOPT == 1
++
++#ifndef ARG_AMALGAMATION
++#include "arg_getopt.h"
++#endif
++
++#include <errno.h>
++#include <stdlib.h>
++#include <string.h>
++
++#define GNU_COMPATIBLE                /* Be more compatible, configure's use 
us! */
++
++int   opterr = 1;             /* if error message should be printed */
++int   optind = 1;             /* index into parent argv vector */
++int   optopt = '?';   /* character checked for validity */
++int   optreset;               /* reset getopt */
++char *optarg;         /* argument associated with option */
++
++#define PRINT_ERROR   ((opterr) && (*options != ':'))
++
++#define FLAG_PERMUTE  0x01    /* permute non-options to the end of argv */
++#define FLAG_ALLARGS  0x02    /* treat non-options as args to option "-1" */
++#define FLAG_LONGONLY 0x04    /* operate as getopt_long_only */
++
++/* return values */
++#define       BADCH           (int)'?'
++#define       BADARG          ((*options == ':') ? (int)':' : (int)'?')
++#define       INORDER         (int)1
++
++#define       EMSG            ""
++
++#ifdef GNU_COMPATIBLE
++#define NO_PREFIX     (-1)
++#define D_PREFIX      0
++#define DD_PREFIX     1
++#define W_PREFIX      2
++#endif
++
++static int getopt_internal(int, char * const *, const char *,
++                         const struct option *, int *, int);
++static int parse_long_options(char * const *, const char *,
++                            const struct option *, int *, int, int);
++static int gcd(int, int);
++static void permute_args(int, int, int, char * const *);
++
++static char *place = EMSG; /* option letter processing */
++
++/* XXX: set optreset to 1 rather than these two */
++static int nonopt_start = -1; /* first non option argument (for permute) */
++static int nonopt_end = -1;   /* first option after non options (for permute) 
*/
++
++/* Error messages */
++static const char recargchar[] = "option requires an argument -- %c";
++static const char illoptchar[] = "illegal option -- %c"; /* From P1003.2 */
++#ifdef GNU_COMPATIBLE
++static int dash_prefix = NO_PREFIX;
++static const char gnuoptchar[] = "invalid option -- %c";
++
++static const char recargstring[] = "option `%s%s' requires an argument";
++static const char ambig[] = "option `%s%.*s' is ambiguous";
++static const char noarg[] = "option `%s%.*s' doesn't allow an argument";
++static const char illoptstring[] = "unrecognized option `%s%s'";
++#else
++static const char recargstring[] = "option requires an argument -- %s";
++static const char ambig[] = "ambiguous option -- %.*s";
++static const char noarg[] = "option doesn't take an argument -- %.*s";
++static const char illoptstring[] = "unknown option -- %s";
++#endif
++
++#ifdef _WIN32
++
++/*
++ * Windows needs warnx().  We change the definition though:
++ *  1. (another) global is defined, opterrmsg, which holds the error message
++ *  2. errors are always printed out on stderr w/o the program name
++ * Note that opterrmsg always gets set no matter what opterr is set to.  The
++ * error message will not be printed if opterr is 0 as usual.
++ */
++
++#include <stdarg.h>
++#include <stdio.h>
++
++#define MAX_OPTERRMSG_SIZE 128
++
++extern char opterrmsg[MAX_OPTERRMSG_SIZE];
++char opterrmsg[MAX_OPTERRMSG_SIZE]; /* buffer for the last error message */
++
++static void warnx(const char* fmt, ...) {
++    va_list ap;
++    va_start(ap, fmt);
++
++    /*
++     * Make sure opterrmsg is always zero-terminated despite the _vsnprintf()
++     * implementation specifics and manually suppress the warning.
++     */
++    memset(opterrmsg, 0, sizeof(opterrmsg));
++    if (fmt != NULL)
++#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || 
(defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__))
++        _vsnprintf_s(opterrmsg, sizeof(opterrmsg), sizeof(opterrmsg) - 1, 
fmt, ap);
++#else
++        _vsnprintf(opterrmsg, sizeof(opterrmsg) - 1, fmt, ap);
++#endif
++
++    va_end(ap);
++
++#ifdef _MSC_VER
++#pragma warning(suppress : 6053)
++#endif
++    fprintf(stderr, "%s\n", opterrmsg);
++}
++
++#else
++#include <err.h>
++#endif /*_WIN32*/
++/*
++ * Compute the greatest common divisor of a and b.
++ */
++static int
++gcd(int a, int b)
++{
++      int c;
++
++      c = a % b;
++      while (c != 0) {
++              a = b;
++              b = c;
++              c = a % b;
++      }
++
++      return (b);
++}
++
++/*
++ * Exchange the block from nonopt_start to nonopt_end with the block
++ * from nonopt_end to opt_end (keeping the same order of arguments
++ * in each block).
++ */
++static void
++permute_args(int panonopt_start, int panonopt_end, int opt_end,
++      char * const *nargv)
++{
++      int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
++      char *swap;
++
++      /*
++       * compute lengths of blocks and number and size of cycles
++       */
++      nnonopts = panonopt_end - panonopt_start;
++      nopts = opt_end - panonopt_end;
++      ncycle = gcd(nnonopts, nopts);
++      cyclelen = (opt_end - panonopt_start) / ncycle;
++
++      for (i = 0; i < ncycle; i++) {
++              cstart = panonopt_end+i;
++              pos = cstart;
++              for (j = 0; j < cyclelen; j++) {
++                      if (pos >= panonopt_end)
++                              pos -= nnonopts;
++                      else
++                              pos += nopts;
++                      swap = nargv[pos];
++                      /* LINTED const cast */
++                      ((char **) nargv)[pos] = nargv[cstart];
++                      /* LINTED const cast */
++                      ((char **)nargv)[cstart] = swap;
++              }
++      }
++}
++
++/*
++ * parse_long_options --
++ *    Parse long options in argc/argv argument vector.
++ * Returns -1 if short_too is set and the option does not match long_options.
++ */
++static int
++parse_long_options(char * const *nargv, const char *options,
++      const struct option *long_options, int *idx, int short_too, int flags)
++{
++      char *current_argv, *has_equal;
++#ifdef GNU_COMPATIBLE
++      char *current_dash;
++#endif
++      size_t current_argv_len;
++      int i, match, exact_match, second_partial_match;
++
++      current_argv = place;
++#ifdef GNU_COMPATIBLE
++      switch (dash_prefix) {
++              case D_PREFIX:
++                      current_dash = "-";
++                      break;
++              case DD_PREFIX:
++                      current_dash = "--";
++                      break;
++              case W_PREFIX:
++                      current_dash = "-W ";
++                      break;
++              default:
++                      current_dash = "";
++                      break;
++      }
++#endif
++      match = -1;
++      exact_match = 0;
++      second_partial_match = 0;
++
++      optind++;
++
++      if ((has_equal = strchr(current_argv, '=')) != NULL) {
++              /* argument found (--option=arg) */
++              current_argv_len = has_equal - current_argv;
++              has_equal++;
++      } else
++              current_argv_len = strlen(current_argv);
++
++      for (i = 0; long_options[i].name; i++) {
++              /* find matching long option */
++              if (strncmp(current_argv, long_options[i].name,
++                  current_argv_len))
++                      continue;
++
++              if (strlen(long_options[i].name) == current_argv_len) {
++                      /* exact match */
++                      match = i;
++                      exact_match = 1;
++                      break;
++              }
++              /*
++               * If this is a known short option, don't allow
++               * a partial match of a single character.
++               */
++              if (short_too && current_argv_len == 1)
++                      continue;
++
++              if (match == -1)        /* first partial match */
++                      match = i;
++              else if ((flags & FLAG_LONGONLY) ||
++                       long_options[i].has_arg !=
++                           long_options[match].has_arg ||
++                       long_options[i].flag != long_options[match].flag ||
++                       long_options[i].val != long_options[match].val)
++                      second_partial_match = 1;
++      }
++      if (!exact_match && second_partial_match) {
++              /* ambiguous abbreviation */
++              if (PRINT_ERROR)
++                      warnx(ambig,
++#ifdef GNU_COMPATIBLE
++                           current_dash,
++#endif
++                           (int)current_argv_len,
++                           current_argv);
++              optopt = 0;
++              return (BADCH);
++      }
++      if (match != -1) {              /* option found */
++              if (long_options[match].has_arg == no_argument
++                  && has_equal) {
++                      if (PRINT_ERROR)
++                              warnx(noarg,
++#ifdef GNU_COMPATIBLE
++                                   current_dash,
++#endif
++                                   (int)current_argv_len,
++                                   current_argv);
++                      /*
++                       * XXX: GNU sets optopt to val regardless of flag
++                       */
++                      if (long_options[match].flag == NULL)
++                              optopt = long_options[match].val;
++                      else
++                              optopt = 0;
++#ifdef GNU_COMPATIBLE
++                      return (BADCH);
++#else
++                      return (BADARG);
++#endif
++              }
++              if (long_options[match].has_arg == required_argument ||
++                  long_options[match].has_arg == optional_argument) {
++                      if (has_equal)
++                              optarg = has_equal;
++                      else if (long_options[match].has_arg ==
++                          required_argument) {
++                              /*
++                               * optional argument doesn't use next nargv
++                               */
++                              optarg = nargv[optind++];
++                      }
++              }
++              if ((long_options[match].has_arg == required_argument)
++                  && (optarg == NULL)) {
++                      /*
++                       * Missing argument; leading ':' indicates no error
++                       * should be generated.
++                       */
++                      if (PRINT_ERROR)
++                              warnx(recargstring,
++#ifdef GNU_COMPATIBLE
++                                  current_dash,
++#endif
++                                  current_argv);
++                      /*
++                       * XXX: GNU sets optopt to val regardless of flag
++                       */
++                      if (long_options[match].flag == NULL)
++                              optopt = long_options[match].val;
++                      else
++                              optopt = 0;
++                      --optind;
++                      return (BADARG);
++              }
++      } else {                        /* unknown option */
++              if (short_too) {
++                      --optind;
++                      return (-1);
++              }
++              if (PRINT_ERROR)
++                      warnx(illoptstring,
++#ifdef GNU_COMPATIBLE
++                            current_dash,
++#endif
++                            current_argv);
++              optopt = 0;
++              return (BADCH);
++      }
++      if (idx)
++              *idx = match;
++      if (long_options[match].flag) {
++              *long_options[match].flag = long_options[match].val;
++              return (0);
++      } else
++              return (long_options[match].val);
++}
++
++/*
++ * getopt_internal --
++ *    Parse argc/argv argument vector.  Called by user level routines.
++ */
++static int
++getopt_internal(int nargc, char * const *nargv, const char *options,
++      const struct option *long_options, int *idx, int flags)
++{
++      char *oli;                              /* option letter list index */
++      int optchar, short_too;
++      static int posixly_correct = -1;
++
++      if (options == NULL)
++              return (-1);
++
++      /*
++       * XXX Some GNU programs (like cvs) set optind to 0 instead of
++       * XXX using optreset.  Work around this braindamage.
++       */
++      if (optind == 0)
++              optind = optreset = 1;
++
++      /*
++       * Disable GNU extensions if POSIXLY_CORRECT is set or options
++       * string begins with a '+'.
++       */
++      if (posixly_correct == -1 || optreset) {
++#ifdef _WIN32
++              size_t requiredSize;
++              getenv_s(&requiredSize, NULL, 0, "POSIXLY_CORRECT");
++              posixly_correct = requiredSize != 0;
++#else
++              posixly_correct = (getenv("POSIXLY_CORRECT") != NULL);
++#endif
++      }
++
++      if (*options == '-')
++              flags |= FLAG_ALLARGS;
++      else if (posixly_correct || *options == '+')
++              flags &= ~FLAG_PERMUTE;
++      if (*options == '+' || *options == '-')
++              options++;
++
++      optarg = NULL;
++      if (optreset)
++              nonopt_start = nonopt_end = -1;
++start:
++      if (optreset || !*place) {              /* update scanning pointer */
++              optreset = 0;
++              if (optind >= nargc) {          /* end of argument vector */
++                      place = EMSG;
++                      if (nonopt_end != -1) {
++                              /* do permutation, if we have to */
++                              permute_args(nonopt_start, nonopt_end,
++                                  optind, nargv);
++                              optind -= nonopt_end - nonopt_start;
++                      }
++                      else if (nonopt_start != -1) {
++                              /*
++                               * If we skipped non-options, set optind
++                               * to the first of them.
++                               */
++                              optind = nonopt_start;
++                      }
++                      nonopt_start = nonopt_end = -1;
++                      return (-1);
++              }
++              if (*(place = nargv[optind]) != '-' ||
++#ifdef GNU_COMPATIBLE
++                  place[1] == '\0') {
++#else
++                  (place[1] == '\0' && strchr(options, '-') == NULL)) {
++#endif
++                      place = EMSG;           /* found non-option */
++                      if (flags & FLAG_ALLARGS) {
++                              /*
++                               * GNU extension:
++                               * return non-option as argument to option 1
++                               */
++                              optarg = nargv[optind++];
++                              return (INORDER);
++                      }
++                      if (!(flags & FLAG_PERMUTE)) {
++                              /*
++                               * If no permutation wanted, stop parsing
++                               * at first non-option.
++                               */
++                              return (-1);
++                      }
++                      /* do permutation */
++                      if (nonopt_start == -1)
++                              nonopt_start = optind;
++                      else if (nonopt_end != -1) {
++                              permute_args(nonopt_start, nonopt_end,
++                                  optind, nargv);
++                              nonopt_start = optind -
++                                  (nonopt_end - nonopt_start);
++                              nonopt_end = -1;
++                      }
++                      optind++;
++                      /* process next argument */
++                      goto start;
++              }
++              if (nonopt_start != -1 && nonopt_end == -1)
++                      nonopt_end = optind;
++
++              /*
++               * If we have "-" do nothing, if "--" we are done.
++               */
++              if (place[1] != '\0' && *++place == '-' && place[1] == '\0') {
++                      optind++;
++                      place = EMSG;
++                      /*
++                       * We found an option (--), so if we skipped
++                       * non-options, we have to permute.
++                       */
++                      if (nonopt_end != -1) {
++                              permute_args(nonopt_start, nonopt_end,
++                                  optind, nargv);
++                              optind -= nonopt_end - nonopt_start;
++                      }
++                      nonopt_start = nonopt_end = -1;
++                      return (-1);
++              }
++      }
++
++      /*
++       * Check long options if:
++       *  1) we were passed some
++       *  2) the arg is not just "-"
++       *  3) either the arg starts with -- we are getopt_long_only()
++       */
++      if (long_options != NULL && place != nargv[optind] &&
++          (*place == '-' || (flags & FLAG_LONGONLY))) {
++              short_too = 0;
++#ifdef GNU_COMPATIBLE
++              dash_prefix = D_PREFIX;
++#endif
++              if (*place == '-') {
++                      place++;                /* --foo long option */
++                      if (*place == '\0')
++                              return (BADARG);        /* malformed option */
++#ifdef GNU_COMPATIBLE
++                      dash_prefix = DD_PREFIX;
++#endif
++              } else if (*place != ':' && strchr(options, *place) != NULL)
++                      short_too = 1;          /* could be short option too */
++
++              optchar = parse_long_options(nargv, options, long_options,
++                  idx, short_too, flags);
++              if (optchar != -1) {
++                      place = EMSG;
++                      return (optchar);
++              }
++      }
++
++      if ((optchar = (int)*place++) == (int)':' ||
++          (optchar == (int)'-' && *place != '\0') ||
++          (oli = strchr(options, optchar)) == NULL) {
++              /*
++               * If the user specified "-" and  '-' isn't listed in
++               * options, return -1 (non-option) as per POSIX.
++               * Otherwise, it is an unknown option character (or ':').
++               */
++              if (optchar == (int)'-' && *place == '\0')
++                      return (-1);
++              if (!*place)
++                      ++optind;
++#ifdef GNU_COMPATIBLE
++              if (PRINT_ERROR)
++                      warnx(posixly_correct ? illoptchar : gnuoptchar,
++                            optchar);
++#else
++              if (PRINT_ERROR)
++                      warnx(illoptchar, optchar);
++#endif
++              optopt = optchar;
++              return (BADCH);
++      }
++      if (long_options != NULL && optchar == 'W' && oli[1] == ';') {
++              /* -W long-option */
++              if (*place)                     /* no space */
++                      /* NOTHING */;
++              else if (++optind >= nargc) {   /* no arg */
++                      place = EMSG;
++                      if (PRINT_ERROR)
++                              warnx(recargchar, optchar);
++                      optopt = optchar;
++                      return (BADARG);
++              } else                          /* white space */
++                      place = nargv[optind];
++#ifdef GNU_COMPATIBLE
++              dash_prefix = W_PREFIX;
++#endif
++              optchar = parse_long_options(nargv, options, long_options,
++                  idx, 0, flags);
++              place = EMSG;
++              return (optchar);
++      }
++      if (*++oli != ':') {                    /* doesn't take argument */
++              if (!*place)
++                      ++optind;
++      } else {                                /* takes (optional) argument */
++              optarg = NULL;
++              if (*place)                     /* no white space */
++                      optarg = place;
++              else if (oli[1] != ':') {       /* arg not optional */
++                      if (++optind >= nargc) {        /* no arg */
++                              place = EMSG;
++                              if (PRINT_ERROR)
++                                      warnx(recargchar, optchar);
++                              optopt = optchar;
++                              return (BADARG);
++                      } else
++                              optarg = nargv[optind];
++              }
++              place = EMSG;
++              ++optind;
++      }
++      /* dump back option letter */
++      return (optchar);
++}
++
++/*
++ * getopt --
++ *    Parse argc/argv argument vector.
++ *
++ * [eventually this will replace the BSD getopt]
++ */
++int
++getopt(int nargc, char * const *nargv, const char *options)
++{
++
++      /*
++       * We don't pass FLAG_PERMUTE to getopt_internal() since
++       * the BSD getopt(3) (unlike GNU) has never done this.
++       *
++       * Furthermore, since many privileged programs call getopt()
++       * before dropping privileges it makes sense to keep things
++       * as simple (and bug-free) as possible.
++       */
++      return (getopt_internal(nargc, nargv, options, NULL, NULL, 0));
++}
++
++/*
++ * getopt_long --
++ *    Parse argc/argv argument vector.
++ */
++int
++getopt_long(int nargc, char * const *nargv, const char *options,
++      const struct option *long_options, int *idx)
++{
++
++      return (getopt_internal(nargc, nargv, options, long_options, idx,
++          FLAG_PERMUTE));
++}
++
++/*
++ * getopt_long_only --
++ *    Parse argc/argv argument vector.
++ */
++int
++getopt_long_only(int nargc, char * const *nargv, const char *options,
++      const struct option *long_options, int *idx)
++{
++
++      return (getopt_internal(nargc, nargv, options, long_options, idx,
++          FLAG_PERMUTE|FLAG_LONGONLY));
++}
++
++#endif /* ARG_REPLACE_GETOPT == 1 */
+diff --git argtable3/src/argtable3.c argtable3/src/argtable3.c
+index 53e84cb..db9fd91 100644
+--- argtable3/src/argtable3.c
++++ argtable3/src/argtable3.c
+@@ -34,7 +34,15 @@
+ 
+ #ifndef ARG_AMALGAMATION
+ #include "argtable3_private.h"
+-#include "getopt.h"
++#if ARG_REPLACE_GETOPT == 1
++#include "arg_getopt.h"
++#else
++#include <getopt.h>
++#endif
++#else
++#if ARG_REPLACE_GETOPT == 0
++#include <getopt.h>
++#endif
+ #endif
+ 
+ #ifdef _WIN32
+diff --git argtable3/src/argtable3.h argtable3/src/argtable3.h
+index 4266874..d3b0540 100644
+--- argtable3/src/argtable3.h
++++ argtable3/src/argtable3.h
+@@ -47,7 +47,7 @@ extern "C" {
+ 
+ #ifndef ARG_REPLACE_GETOPT
+ #define ARG_REPLACE_GETOPT 1 /* use the embedded getopt as the system 
getopt(3) */
+-#endif                       /* ARG_REPLACE_GETOPT */
++#endif /* ARG_REPLACE_GETOPT */
+ 
+ /* bit masks for arg_hdr.flag */
+ enum { ARG_TERMINATOR = 0x1, ARG_HASVALUE = 0x2, ARG_HASOPTVALUE = 0x4 };
+diff --git argtable3/src/getopt_long.c argtable3/src/getopt_long.c
+deleted file mode 100644
+index d374afc..0000000
+--- argtable3/src/getopt_long.c
++++ /dev/null
+@@ -1,531 +0,0 @@
+-/*    $Id: getopt_long.c,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $        
*/
+-/*    $OpenBSD: getopt_long.c,v 1.23 2007/10/31 12:34:57 chl Exp $    */
+-/*    $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $      */
+-
+-/*
+- * Copyright (c) 2002 Todd C. Miller <todd.mil...@courtesan.com>
+- *
+- * Permission to use, copy, modify, and distribute this software for any
+- * purpose with or without fee is hereby granted, provided that the above
+- * copyright notice and this permission notice appear in all copies.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+- *
+- * Sponsored in part by the Defense Advanced Research Projects
+- * Agency (DARPA) and Air Force Research Laboratory, Air Force
+- * Materiel Command, USAF, under agreement number F39502-99-1-0512.
+- */
+-
+-/*
+- * Copyright (c) 2000 The NetBSD Foundation, Inc.
+- * All rights reserved.
+- *
+- * This code is derived from software contributed to The NetBSD Foundation
+- * by Dieter Baron and Thomas Klausner.
+- *
+- * 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.
+- *
+- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+- */
+-
+-#include "argtable3.h"
+-
+-#ifndef ARG_AMALGAMATION
+-#include "getopt.h"
+-#endif
+-
+-#include <errno.h>
+-#include <stdlib.h>
+-#include <string.h>
+-
+-#if ARG_REPLACE_GETOPT == 1
+-int opterr = 1;   /* if error message should be printed */
+-int optind = 1;   /* index into parent argv vector */
+-int optopt = '?'; /* character checked for validity */
+-int optreset;     /* reset getopt */
+-char* optarg;     /* argument associated with option */
+-#endif            /* ARG_REPLACE_GETOPT */
+-
+-#define PRINT_ERROR ((opterr) && (*options != ':'))
+-
+-#define FLAG_PERMUTE 0x01  /* permute non-options to the end of argv */
+-#define FLAG_ALLARGS 0x02  /* treat non-options as args to option "-1" */
+-#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */
+-
+-/* return values */
+-#define BADCH (int)'?'
+-#define BADARG ((*options == ':') ? (int)':' : (int)'?')
+-#define INORDER (int)1
+-
+-#define EMSG ""
+-
+-#if ARG_REPLACE_GETOPT == 1
+-static int getopt_internal(int, char* const*, const char*, const struct 
option*, int*, int);
+-#endif /* ARG_REPLACE_GETOPT */
+-static int parse_long_options(char* const*, const char*, const struct 
option*, int*, int);
+-static int gcd(int, int);
+-static void permute_args(int, int, int, char* const*);
+-
+-static char* place = EMSG; /* option letter processing */
+-
+-/* XXX: set optreset to 1 rather than these two */
+-static int nonopt_start = -1; /* first non option argument (for permute) */
+-static int nonopt_end = -1;   /* first option after non options (for permute) 
*/
+-
+-/* Error messages */
+-static const char recargchar[] = "option requires an argument -- %c";
+-static const char recargstring[] = "option requires an argument -- %s";
+-static const char ambig[] = "ambiguous option -- %.*s";
+-static const char noarg[] = "option doesn't take an argument -- %.*s";
+-static const char illoptchar[] = "unknown option -- %c";
+-static const char illoptstring[] = "unknown option -- %s";
+-
+-#ifdef _WIN32
+-
+-/* 
+- * Windows needs warnx().  We change the definition though:
+- *  1. (another) global is defined, opterrmsg, which holds the error message
+- *  2. errors are always printed out on stderr w/o the program name
+- * Note that opterrmsg always gets set no matter what opterr is set to.  The
+- * error message will not be printed if opterr is 0 as usual.
+- */
+-
+-#include <stdarg.h>
+-#include <stdio.h>
+-
+-#define MAX_OPTERRMSG_SIZE 128
+-
+-extern char opterrmsg[MAX_OPTERRMSG_SIZE];
+-char opterrmsg[MAX_OPTERRMSG_SIZE]; /* buffer for the last error message */
+-
+-static void warnx(const char* fmt, ...) {
+-    va_list ap;
+-    va_start(ap, fmt);
+-
+-    /* 
+-     * Make sure opterrmsg is always zero-terminated despite the _vsnprintf()
+-     * implementation specifics and manually suppress the warning.
+-     */
+-    memset(opterrmsg, 0, sizeof(opterrmsg));
+-    if (fmt != NULL)
+-#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || 
(defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__))
+-        _vsnprintf_s(opterrmsg, sizeof(opterrmsg), sizeof(opterrmsg) - 1, 
fmt, ap);
+-#else
+-        _vsnprintf(opterrmsg, sizeof(opterrmsg) - 1, fmt, ap);
+-#endif
+-
+-    va_end(ap);
+-
+-#ifdef _MSC_VER
+-#pragma warning(suppress : 6053)
+-#endif
+-    fprintf(stderr, "%s\n", opterrmsg);
+-}
+-
+-#else
+-#include <err.h>
+-#endif /*_WIN32*/
+-
+-/*
+- * Compute the greatest common divisor of a and b.
+- */
+-static int gcd(int a, int b) {
+-    int c;
+-
+-    c = a % b;
+-    while (c != 0) {
+-        a = b;
+-        b = c;
+-        c = a % b;
+-    }
+-
+-    return (b);
+-}
+-
+-/*
+- * Exchange the block from nonopt_start to nonopt_end with the block
+- * from nonopt_end to opt_end (keeping the same order of arguments
+- * in each block).
+- */
+-static void permute_args(int panonopt_start, int panonopt_end, int opt_end, 
char* const* nargv) {
+-    int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
+-    char* swap;
+-
+-    /*
+-     * compute lengths of blocks and number and size of cycles
+-     */
+-    nnonopts = panonopt_end - panonopt_start;
+-    nopts = opt_end - panonopt_end;
+-    ncycle = gcd(nnonopts, nopts);
+-    cyclelen = (opt_end - panonopt_start) / ncycle;
+-
+-    for (i = 0; i < ncycle; i++) {
+-        cstart = panonopt_end + i;
+-        pos = cstart;
+-        for (j = 0; j < cyclelen; j++) {
+-            if (pos >= panonopt_end)
+-                pos -= nnonopts;
+-            else
+-                pos += nopts;
+-            swap = nargv[pos];
+-            /* LINTED const cast */
+-            ((char**)nargv)[pos] = nargv[cstart];
+-            /* LINTED const cast */
+-            ((char**)nargv)[cstart] = swap;
+-        }
+-    }
+-}
+-
+-/*
+- * parse_long_options --
+- *    Parse long options in argc/argv argument vector.
+- * Returns -1 if short_too is set and the option does not match long_options.
+- */
+-static int parse_long_options(char* const* nargv, const char* options, const 
struct option* long_options, int* idx, int short_too) {
+-    char *current_argv, *has_equal;
+-    size_t current_argv_len;
+-    int i, match;
+-
+-    current_argv = place;
+-    match = -1;
+-
+-    optind++;
+-
+-    if ((has_equal = strchr(current_argv, '=')) != NULL) {
+-        /* argument found (--option=arg) */
+-        current_argv_len = has_equal - current_argv;
+-        has_equal++;
+-    } else
+-        current_argv_len = strlen(current_argv);
+-
+-    for (i = 0; long_options[i].name; i++) {
+-        /* find matching long option */
+-        if (strncmp(current_argv, long_options[i].name, current_argv_len))
+-            continue;
+-
+-        if (strlen(long_options[i].name) == current_argv_len) {
+-            /* exact match */
+-            match = i;
+-            break;
+-        }
+-        /*
+-         * If this is a known short option, don't allow
+-         * a partial match of a single character.
+-         */
+-        if (short_too && current_argv_len == 1)
+-            continue;
+-
+-        if (match == -1) /* partial match */
+-            match = i;
+-        else {
+-            /* ambiguous abbreviation */
+-            if (PRINT_ERROR)
+-                warnx(ambig, (int)current_argv_len, current_argv);
+-            optopt = 0;
+-            return (BADCH);
+-        }
+-    }
+-    if (match != -1) { /* option found */
+-        if (long_options[match].has_arg == no_argument && has_equal) {
+-            if (PRINT_ERROR)
+-                warnx(noarg, (int)current_argv_len, current_argv);
+-            /*
+-             * XXX: GNU sets optopt to val regardless of flag
+-             */
+-            if (long_options[match].flag == NULL)
+-                optopt = long_options[match].val;
+-            else
+-                optopt = 0;
+-            return (BADARG);
+-        }
+-        if (long_options[match].has_arg == required_argument || 
long_options[match].has_arg == optional_argument) {
+-            if (has_equal)
+-                optarg = has_equal;
+-            else if (long_options[match].has_arg == required_argument) {
+-                /*
+-                 * optional argument doesn't use next nargv
+-                 */
+-                optarg = nargv[optind++];
+-            }
+-        }
+-        if ((long_options[match].has_arg == required_argument) && (optarg == 
NULL)) {
+-            /*
+-             * Missing argument; leading ':' indicates no error
+-             * should be generated.
+-             */
+-            if (PRINT_ERROR)
+-                warnx(recargstring, current_argv);
+-            /*
+-             * XXX: GNU sets optopt to val regardless of flag
+-             */
+-            if (long_options[match].flag == NULL)
+-                optopt = long_options[match].val;
+-            else
+-                optopt = 0;
+-            --optind;
+-            return (BADARG);
+-        }
+-    } else { /* unknown option */
+-        if (short_too) {
+-            --optind;
+-            return (-1);
+-        }
+-        if (PRINT_ERROR)
+-            warnx(illoptstring, current_argv);
+-        optopt = 0;
+-        return (BADCH);
+-    }
+-    if (idx)
+-        *idx = match;
+-    if (long_options[match].flag) {
+-        *long_options[match].flag = long_options[match].val;
+-        return (0);
+-    } else
+-        return (long_options[match].val);
+-}
+-
+-#if ARG_REPLACE_GETOPT == 1
+-/*
+- * getopt_internal --
+- *    Parse argc/argv argument vector.  Called by user level routines.
+- */
+-static int getopt_internal(int nargc, char* const* nargv, const char* 
options, const struct option* long_options, int* idx, int flags) {
+-    char* oli; /* option letter list index */
+-    int optchar, short_too;
+-    static int posixly_correct = -1;
+-
+-    if (options == NULL)
+-        return (-1);
+-
+-    /*
+-     * Disable GNU extensions if POSIXLY_CORRECT is set or options
+-     * string begins with a '+'.
+-     */
+-    if (posixly_correct == -1)
+-#if defined(_MSC_VER)
+-#pragma warning(push)
+-#pragma warning(disable : 4996)
+-#endif
+-        posixly_correct = (getenv("POSIXLY_CORRECT") != NULL);
+-#if defined(_MSC_VER)
+-#pragma warning(pop)
+-#endif
+-    if (posixly_correct || *options == '+')
+-        flags &= ~FLAG_PERMUTE;
+-    else if (*options == '-')
+-        flags |= FLAG_ALLARGS;
+-    if (*options == '+' || *options == '-')
+-        options++;
+-
+-    /*
+-     * XXX Some GNU programs (like cvs) set optind to 0 instead of
+-     * XXX using optreset.  Work around this braindamage.
+-     */
+-    if (optind == 0)
+-        optind = optreset = 1;
+-
+-    optarg = NULL;
+-    if (optreset)
+-        nonopt_start = nonopt_end = -1;
+-start:
+-    if (optreset || !*place) { /* update scanning pointer */
+-        optreset = 0;
+-        if (optind >= nargc) { /* end of argument vector */
+-            place = EMSG;
+-            if (nonopt_end != -1) {
+-                /* do permutation, if we have to */
+-                permute_args(nonopt_start, nonopt_end, optind, nargv);
+-                optind -= nonopt_end - nonopt_start;
+-            } else if (nonopt_start != -1) {
+-                /*
+-                 * If we skipped non-options, set optind
+-                 * to the first of them.
+-                 */
+-                optind = nonopt_start;
+-            }
+-            nonopt_start = nonopt_end = -1;
+-            return (-1);
+-        }
+-        if (*(place = nargv[optind]) != '-' || (place[1] == '\0' && 
strchr(options, '-') == NULL)) {
+-            place = EMSG; /* found non-option */
+-            if (flags & FLAG_ALLARGS) {
+-                /*
+-                 * GNU extension:
+-                 * return non-option as argument to option 1
+-                 */
+-                optarg = nargv[optind++];
+-                return (INORDER);
+-            }
+-            if (!(flags & FLAG_PERMUTE)) {
+-                /*
+-                 * If no permutation wanted, stop parsing
+-                 * at first non-option.
+-                 */
+-                return (-1);
+-            }
+-            /* do permutation */
+-            if (nonopt_start == -1)
+-                nonopt_start = optind;
+-            else if (nonopt_end != -1) {
+-                permute_args(nonopt_start, nonopt_end, optind, nargv);
+-                nonopt_start = optind - (nonopt_end - nonopt_start);
+-                nonopt_end = -1;
+-            }
+-            optind++;
+-            /* process next argument */
+-            goto start;
+-        }
+-        if (nonopt_start != -1 && nonopt_end == -1)
+-            nonopt_end = optind;
+-
+-        /*
+-         * If we have "-" do nothing, if "--" we are done.
+-         */
+-        if (place[1] != '\0' && *++place == '-' && place[1] == '\0') {
+-            optind++;
+-            place = EMSG;
+-            /*
+-             * We found an option (--), so if we skipped
+-             * non-options, we have to permute.
+-             */
+-            if (nonopt_end != -1) {
+-                permute_args(nonopt_start, nonopt_end, optind, nargv);
+-                optind -= nonopt_end - nonopt_start;
+-            }
+-            nonopt_start = nonopt_end = -1;
+-            return (-1);
+-        }
+-    }
+-
+-    /*
+-     * Check long options if:
+-     *  1) we were passed some
+-     *  2) the arg is not just "-"
+-     *  3) either the arg starts with -- we are getopt_long_only()
+-     */
+-    if (long_options != NULL && place != nargv[optind] && (*place == '-' || 
(flags & FLAG_LONGONLY))) {
+-        short_too = 0;
+-        if (*place == '-')
+-            place++; /* --foo long option */
+-        else if (*place != ':' && strchr(options, *place) != NULL)
+-            short_too = 1; /* could be short option too */
+-
+-        optchar = parse_long_options(nargv, options, long_options, idx, 
short_too);
+-        if (optchar != -1) {
+-            place = EMSG;
+-            return (optchar);
+-        }
+-    }
+-
+-    if ((optchar = (int)*place++) == (int)':' || (optchar == (int)'-' && 
*place != '\0') || (oli = strchr(options, optchar)) == NULL) {
+-        /*
+-         * If the user specified "-" and  '-' isn't listed in
+-         * options, return -1 (non-option) as per POSIX.
+-         * Otherwise, it is an unknown option character (or ':').
+-         */
+-        if (optchar == (int)'-' && *place == '\0')
+-            return (-1);
+-        if (!*place)
+-            ++optind;
+-        if (PRINT_ERROR)
+-            warnx(illoptchar, optchar);
+-        optopt = optchar;
+-        return (BADCH);
+-    }
+-    if (long_options != NULL && optchar == 'W' && oli[1] == ';') {
+-        /* -W long-option */
+-        if (*place) /* no space */
+-            /* NOTHING */;
+-        else if (++optind >= nargc) { /* no arg */
+-            place = EMSG;
+-            if (PRINT_ERROR)
+-                warnx(recargchar, optchar);
+-            optopt = optchar;
+-            return (BADARG);
+-        } else /* white space */
+-            place = nargv[optind];
+-        optchar = parse_long_options(nargv, options, long_options, idx, 0);
+-        place = EMSG;
+-        return (optchar);
+-    }
+-    if (*++oli != ':') { /* doesn't take argument */
+-        if (!*place)
+-            ++optind;
+-    } else { /* takes (optional) argument */
+-        optarg = NULL;
+-        if (*place) /* no white space */
+-            optarg = place;
+-        else if (oli[1] != ':') {    /* arg not optional */
+-            if (++optind >= nargc) { /* no arg */
+-                place = EMSG;
+-                if (PRINT_ERROR)
+-                    warnx(recargchar, optchar);
+-                optopt = optchar;
+-                return (BADARG);
+-            } else
+-                optarg = nargv[optind];
+-        }
+-        place = EMSG;
+-        ++optind;
+-    }
+-    /* dump back option letter */
+-    return (optchar);
+-}
+-
+-/*
+- * getopt --
+- *    Parse argc/argv argument vector.
+- *
+- * [eventually this will replace the BSD getopt]
+- */
+-int getopt(int nargc, char* const* nargv, const char* options) {
+-    /*
+-     * We don't pass FLAG_PERMUTE to getopt_internal() since
+-     * the BSD getopt(3) (unlike GNU) has never done this.
+-     *
+-     * Furthermore, since many privileged programs call getopt()
+-     * before dropping privileges it makes sense to keep things
+-     * as simple (and bug-free) as possible.
+-     */
+-    return (getopt_internal(nargc, nargv, options, NULL, NULL, 0));
+-}
+-#endif /* ARG_REPLACE_GETOPT */
+-
+-/*
+- * getopt_long --
+- *    Parse argc/argv argument vector.
+- */
+-int getopt_long(int nargc, char* const* nargv, const char* options, const 
struct option* long_options, int* idx) {
+-    return (getopt_internal(nargc, nargv, options, long_options, idx, 
FLAG_PERMUTE));
+-}
+-
+-/*
+- * getopt_long_only --
+- *    Parse argc/argv argument vector.
+- */
+-int getopt_long_only(int nargc, char* const* nargv, const char* options, 
const struct option* long_options, int* idx) {
+-    return (getopt_internal(nargc, nargv, options, long_options, idx, 
FLAG_PERMUTE | FLAG_LONGONLY));
+-}
+diff --git argtable3/tools/build argtable3/tools/build
+index 87710a9..25ebe8f 100755
+--- argtable3/tools/build
++++ argtable3/tools/build
+@@ -36,8 +36,8 @@ if [ "$1" = "dist" ]; then
+       ../src/arg_utils.c \
+       ../src/arg_hashtable.c \
+       ../src/arg_dstr.c \
+-      ../src/getopt.h \
+-      ../src/getopt_long.c \
++      ../src/arg_getopt.h \
++      ../src/arg_getopt_long.c \
+       ../src/arg_date.c \
+       ../src/arg_dbl.c \
+       ../src/arg_end.c \
+diff --git argtable3/tools/build.bat argtable3/tools/build.bat
+index ab3132d..162ebb1 100644
+--- argtable3/tools/build.bat
++++ argtable3/tools/build.bat
+@@ -72,8 +72,8 @@ cat -B ^
+     ..\src\arg_utils.c ^
+     ..\src\arg_hashtable.c ^
+     ..\src\arg_dstr.c ^
+-    ..\src\getopt.h ^
+-    ..\src\getopt_long.c ^
++    ..\src\arg_getopt.h ^
++    ..\src\arg_getopt_long.c ^
+     ..\src\arg_date.c ^
+     ..\src\arg_dbl.c ^
+     ..\src\arg_end.c ^
+-- 
+2.17.1
+
diff --git a/system/argtable3/Kconfig b/system/argtable3/Kconfig
index acaa3ca..cc6cef9 100644
--- a/system/argtable3/Kconfig
+++ b/system/argtable3/Kconfig
@@ -13,6 +13,6 @@ if SYSTEM_ARGTABLE3
 
 config SYSTEM_ARGTABLE3_VERSION
        string "ARGTABLE3 Version"
-       default "3.0.0"
+       default "3.1.5.1c1bb23"
 
 endif
diff --git a/system/argtable3/Make.defs b/system/argtable3/Make.defs
index 5c7a759..0bed6a6 100644
--- a/system/argtable3/Make.defs
+++ b/system/argtable3/Make.defs
@@ -22,6 +22,6 @@
 ifneq ($(CONFIG_SYSTEM_ARGTABLE3),)
 CONFIGURED_APPS += $(APPDIR)/system/argtable3
 
-CFLAGS   += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" 
"$(APPDIR)/system/argtable3/argtable3/"}
-CXXFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" 
"$(APPDIR)/system/argtable3/argtable3/"}
+CFLAGS   += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" 
"$(APPDIR)/system/argtable3/argtable3/src"}
+CXXFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" 
"$(APPDIR)/system/argtable3/argtable3/src"}
 endif
diff --git a/system/argtable3/Makefile b/system/argtable3/Makefile
index c696ed6..560baa5 100644
--- a/system/argtable3/Makefile
+++ b/system/argtable3/Makefile
@@ -23,24 +23,25 @@ include $(APPDIR)/Make.defs
 ARGTABLE3_VERSION := $(patsubst "%",%,$(CONFIG_SYSTEM_ARGTABLE3_VERSION))
 ARGTABLE3_TARBALL  = v$(ARGTABLE3_VERSION).tar.gz
 ARGTABLE3_UNPACK   = argtable3
-ARGTABLE3_SRCDIR   = $(ARGTABLE3_UNPACK)
+ARGTABLE3_SRCDIR   = $(ARGTABLE3_UNPACK)$(DELIM)src
 
 DEPPATH += --dep-path $(ARGTABLE3_SRCDIR)
 VPATH   += :$(ARGTABLE3_SRCDIR)
 
-CSRCS := $(notdir $(wildcard $(ARGTABLE3_SRCDIR)$(DELIM)argtable3.c))
+CFLAGS += ${shell $(DEFINE) "$(CC)" ARG_REPLACE_GETOPT=0}
+CSRCS := $(notdir $(wildcard $(ARGTABLE3_SRCDIR)$(DELIM)*.c))
 
 $(ARGTABLE3_TARBALL):
        $(Q) echo "Downloading argtable3-$(ARGTABLE3_VERSION)"
        $(Q) echo "$(ARGTABLE3_SRCDIR)"
        $(Q) echo "$(ARGTABLE3_TARBALL)--$(ARGTABLE3_UNPACK)"
-       $(Q) wget 
https://github.com/argtable/argtable3/archive/$(ARGTABLE3_TARBALL)
+       $(Q) curl -O -L 
https://github.com/argtable/argtable3/archive/$(ARGTABLE3_TARBALL)
 
 $(ARGTABLE3_UNPACK): $(ARGTABLE3_TARBALL)
        $(Q) tar zxf $(ARGTABLE3_TARBALL)
        $(Q) mv argtable3-$(ARGTABLE3_VERSION) $(ARGTABLE3_UNPACK)
        $(Q) echo "Patching $(ARGTABLE3_UNPACK)"
-       $(Q) patch -p0 < argtable3.patch
+       $(Q) patch -p0 < 0001-feat-Switch-to-FreeBSD-getopt-library.patch
 
 $(ARGTABLE3_UNPACK)/.patch: $(ARGTABLE3_UNPACK)
        $(Q) touch $(ARGTABLE3_UNPACK)/.patch

Reply via email to