]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
updated libopts to 5.18
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 5 Nov 2013 20:11:23 +0000 (21:11 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 5 Nov 2013 20:11:23 +0000 (21:11 +0100)
34 files changed:
src/libopts/Makefile.am
src/libopts/ag-char-map.h
src/libopts/alias.c
src/libopts/ao-strs.c
src/libopts/ao-strs.h
src/libopts/autoopts.c
src/libopts/autoopts.h
src/libopts/autoopts/options.h
src/libopts/autoopts/project.h
src/libopts/autoopts/usage-txt.h
src/libopts/compat/pathfind.c
src/libopts/configfile.c
src/libopts/enum.c
src/libopts/find.c
src/libopts/genshell.c
src/libopts/genshell.h
src/libopts/gettext.h
src/libopts/init.c
src/libopts/load.c
src/libopts/m4/libopts.m4
src/libopts/makeshell.c
src/libopts/option-value-type.c
src/libopts/option-value-type.h
src/libopts/option-xat-attribute.c
src/libopts/option-xat-attribute.h
src/libopts/pgusage.c
src/libopts/proto.h
src/libopts/putshell.c
src/libopts/restore.c
src/libopts/save.c
src/libopts/stack.c
src/libopts/text_mmap.c
src/libopts/usage.c
src/libopts/version.c

index 550299bfeeb7b87a76d486e7ea15c2eb2ba9124b..1a9771de259af8846fd139992d8443949c814d30 100644 (file)
@@ -1,7 +1,7 @@
 ## LIBOPTS Makefile
 MAINTAINERCLEANFILES    = Makefile.in
 
-noinst_LTLIBRARIES      = libopts.la
+noinst_LTLIBRARIES      = libopts.a
 
 libopts_la_SOURCES      = libopts.c
 libopts_la_CPPFLAGS     = -I$(top_srcdir)
@@ -9,16 +9,16 @@ libopts_la_LIBADD       = $(LTLIBINTL)
 
 EXTRA_DIST              = \
     ag-char-map.h           alias.c                 ao-strs.c  \
-    ao-strs.h               autoopts/options.h      autoopts/project.h  \
-    autoopts/usage-txt.h    autoopts.c              autoopts.h  \
-    boolean.c               check.c                 compat/strchr.c  \
-    compat/snprintf.c       compat/compat.h         compat/windows-config.h  \
-    compat/pathfind.c       compat/strdup.c         configfile.c  \
+    ao-strs.h               autoopts/options.h      autoopts/usage-txt.h  \
+    autoopts/project.h      autoopts.c              autoopts.h  \
+    boolean.c               check.c                 compat/strdup.c  \
+    compat/strchr.c         compat/snprintf.c       compat/compat.h  \
+    compat/pathfind.c       compat/windows-config.h configfile.c  \
     cook.c                  COPYING.gplv3           COPYING.lgplv3  \
     COPYING.mbsd            enum.c                  env.c  \
     file.c                  find.c                  genshell.c  \
     genshell.h              gettext.h               init.c  \
-    load.c                  m4/libopts.m4           m4/liboptschk.m4  \
+    load.c                  m4/liboptschk.m4        m4/libopts.m4  \
     MakeDefs.inc            makeshell.c             nested.c  \
     numeric.c               option-value-type.c     option-value-type.h  \
     option-xat-attribute.c  option-xat-attribute.h  parse-duration.c  \
index abbce96e5930f587b9c97d72ba40923afa98da69..58154d978ea4296401aa1a7db957f8d0184b0f25 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  29 bits for 46 character classifications
- *  generated by char-mapper on 03/31/13 at 10:41:23
+ *  generated by char-mapper on 07/14/13 at 17:37:05
  *
  *  This file contains the character classifications
  *  used by AutoGen and AutoOpts for identifying tokens.
 // file-name       +dir-sep      +suffix
 // end-token       +nul-byte     +whitespace
 // end-list-entry  +comma        +end-token
-// set-separator   "|+"          +end-list-entry
+// set-separator   "|+-!"        +end-list-entry
 // signed-number   +inversion    +dec-digit
 // make-script     +dollar       +newline
 // load-line-skip  +horiz-white  +option-marker
@@ -489,7 +489,7 @@ spn_ag_char_map_chars(char const * p, unsigned int mask_ix)
     unsigned char const * v = ag_char_map_spanners[mask_ix];
     if (v == NULL)
         v = calc_ag_char_map_spanners(mask_ix);
-    while (v[(unsigned char)*p])  p++;
+    while (v[(unsigned)*p])  p++;
     return (char *)(uintptr_t)p;
 }
 
@@ -499,7 +499,7 @@ brk_ag_char_map_chars(char const * p, unsigned int mask_ix)
     unsigned char const * v = ag_char_map_spanners[mask_ix];
     if (v == NULL)
         v = calc_ag_char_map_spanners(mask_ix);
-    while ((*p != '\0') && (! v[(unsigned char)*p]))  p++;
+    while ((*p != '\0') && (! v[(unsigned)*p]))  p++;
     return (char *)(uintptr_t)p;
 }
 
@@ -510,7 +510,7 @@ spn_ag_char_map_back(char const * s, char const * e, unsigned int mask_ix)
     if (v == NULL)
         v = calc_ag_char_map_spanners(mask_ix);
     if (s >= e) e = s + strlen(s);
-    while ((e > s) && v[(unsigned char)e[-1]])  e--;
+    while ((e > s) && v[(unsigned)e[-1]])  e--;
     return (char *)(uintptr_t)e;
 }
 
@@ -521,7 +521,7 @@ brk_ag_char_map_back(char const * s, char const * e, unsigned int mask_ix)
     if (v == NULL)
         v = calc_ag_char_map_spanners(mask_ix);
     if (s == e) e += strlen(e);
-    while ((e > s) && (! v[(unsigned char)e[-1]]))  e--;
+    while ((e > s) && (! v[(unsigned)e[-1]]))  e--;
     return (char *)(uintptr_t)e;
 }
 #endif /* AG_CHAR_MAP_H_GUARD */
index d05cc4be9b3b4d54d0266db423d178f69c5a9d35..2fa16fd11c7315bd96cb66970ff84ea5f0d88a52 100644 (file)
@@ -74,7 +74,7 @@ optionAlias(tOptions * opts, tOptDesc * old_od, unsigned int alias)
     new_od = opts->pOptDesc + alias;
     if ((unsigned)opts->optCt <= alias) {
         fputs(zbad_alias_id, stderr);
-        exit(EXIT_FAILURE);
+        option_exits(EXIT_FAILURE);
     }
 
     /*
index 13a7e4f35bcebafde9fd4974996d31b5fd2008a2..fa37136d9da74b6ee22418fff3e442ee697faf5e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * DO NOT EDIT THIS FILE   (ao-strs.c)
  *
- * It has been AutoGen-ed  March 31, 2013 at 10:41:23 AM by AutoGen 5.17.3
+ * It has been AutoGen-ed  July 14, 2013 at 05:37:05 PM by AutoGen 5.18
  * From the definitions    ao-strs.def
  * and the template file   strings
  *
@@ -38,7 +38,7 @@
  */
 #include "ao-strs.h"
 
-char const ao_strs_strtable[6637] =
+char const ao_strs_strtable[6633] =
 /*     0 */ "-_^\0"
 /*     4 */ "  %s%s\n\0"
 /*    12 */ "auto-options\0"
@@ -130,65 +130,67 @@ char const ao_strs_strtable[6637] =
 /*   625 */ "=%1$lu # 0x%1$lX\n\0"
 /*   643 */ "stdout\0"
 /*   650 */ "%A %B %e, %Y at %r %Z\0"
-/*   672 */ "/tmp/use.%lu\0"
-/*   685 */ "true\0"
-/*   690 */ "<%s type=%s>\0"
-/*   703 */ "VERSION\0"
-/*   711 */ "#x%02X;\0"
-/*   719 */ "OPT_ARG_NEEDED=YES\0"
-/*   738 */ "'\\''\0"
-/*   743 */ " '%s'\0"
-/*   749 */ "\n"
+/*   672 */ "%s/use-%u.XXXXXX\0"
+/*   689 */ "true\0"
+/*   694 */ "<%s type=%s>\0"
+/*   707 */ "VERSION\0"
+/*   715 */ "#x%02X;\0"
+/*   723 */ "OPT_ARG_NEEDED=YES\0"
+/*   742 */ "'\\''\0"
+/*   747 */ " '%s'\0"
+/*   753 */ "\n"
             "OPTION_CT=0\n\0"
-/*   763 */ "set --\0"
-/*   770 */ "            ;;\n\n\0"
-/*   787 */ "        '%c' )\n\0"
-/*   803 */ "        '%s' )\n\0"
-/*   819 */ "        '%s' | \\\n\0"
-/*   837 */ "%1$s /tmp/use.%2$lu ; rm -f /tmp/use.%2$lu\0"
-/*   880 */ "<%1$s type=boolean>%2$s</%1$s>\n\0"
-/*   912 */ "#  From the %s option definitions\n"
+/*   767 */ "set --\0"
+/*   774 */ "            ;;\n\n\0"
+/*   791 */ "        '%c' )\n\0"
+/*   807 */ "        '%s' )\n\0"
+/*   823 */ "        '%s' | \\\n\0"
+/*   841 */ "TMPDIR\0"
+/*   848 */ "/tmp\0"
+/*   853 */ "%1$s %2$s ; rm -f %2$s\0"
+/*   876 */ "<%1$s type=boolean>%2$s</%1$s>\n\0"
+/*   908 */ "#  From the %s option definitions\n"
             "#\n\0"
-/*   949 */ "echo 'Warning:  Cannot load options files' >&2\0"
-/*   996 */ "echo 'Warning:  Cannot save options files' >&2\0"
-/*  1043 */ "echo 'Warning:  Cannot suppress the loading of options files' >&2\0"
-/*  1109 */ "<%1$s type=integer>0x%2$lX</%1$s>\n\0"
-/*  1144 */ "%1$s_%2$s_TEXT='no %2$s text'\n\0"
-/*  1175 */ "%1$s_%2$s_MODE='%3$s'\n"
+/*   945 */ "echo 'Warning:  Cannot load options files' >&2\0"
+/*   992 */ "echo 'Warning:  Cannot save options files' >&2\0"
+/*  1039 */ "echo 'Warning:  Cannot suppress the loading of options files' >&2\0"
+/*  1105 */ "<%1$s type=integer>0x%2$lX</%1$s>\n\0"
+/*  1140 */ "%1$s_%2$s_TEXT='no %2$s text'\n\0"
+/*  1171 */ "%1$s_%2$s_MODE='%3$s'\n"
             "export %1$s_%2$s_MODE\n\0"
-/*  1220 */ "%1$s_%2$s='%3$s'\n"
+/*  1216 */ "%1$s_%2$s='%3$s'\n"
             "export %1$s_%2$s\n\0"
-/*  1255 */ "%1$s_%2$s_CT=%3$d\n"
+/*  1251 */ "%1$s_%2$s_CT=%3$d\n"
             "export %1$s_%2$s_CT\n\0"
-/*  1294 */ "OPTION_CT=%d\n"
+/*  1290 */ "OPTION_CT=%d\n"
             "export OPTION_CT\n\0"
-/*  1325 */ "%1$s_%2$s=%3$s\n"
+/*  1321 */ "%1$s_%2$s=%3$s\n"
             "export %1$s_%2$s\n\0"
-/*  1358 */ "%1$s_%2$s=%3$d # 0x%3$X\n"
+/*  1354 */ "%1$s_%2$s=%3$d # 0x%3$X\n"
             "export %1$s_%2$s\n\0"
-/*  1400 */ "        case \"${OPT_CODE}\" in\n\0"
-/*  1431 */ "            if [ $%1$s_%2$s_CT -gt %3$u ] ; then\n"
+/*  1396 */ "        case \"${OPT_CODE}\" in\n\0"
+/*  1427 */ "            if [ $%1$s_%2$s_CT -gt %3$u ] ; then\n"
             "                echo 'Error:  more than %3$d %2$s options'\n"
             "                echo \"$%1$s_USAGE_TEXT\"\n"
             "                exit 1\n"
             "            fi >&2\n\0"
-/*  1622 */ "test ${%1$s_%2$s_CT-0} -ge %3$u || {\n"
+/*  1618 */ "test ${%1$s_%2$s_CT-0} -ge %3$u || {\n"
             "    echo %1$s_%2$s has not been set\n"
             "    exit 1\n"
             "} 1>&2\n\0"
-/*  1714 */ "test -n \"$%1$s_%2$s\" || {\n"
+/*  1710 */ "test -n \"$%1$s_%2$s\" || {\n"
             "    echo %1$s_%2$s has not been set\n"
             "    exit 1\n"
             "} 1>&2\n\0"
-/*  1795 */ "            echo \"$%s_%s_TEXT\"\n"
+/*  1791 */ "            echo \"$%s_%s_TEXT\"\n"
             "            exit 0\n\0"
-/*  1846 */ "\n"
+/*  1842 */ "\n"
             "# # # # # # # # # #\n"
             "#\n"
             "#  END OF AUTOMATED OPTION PROCESSING\n"
             "#\n"
             "# # # # # # # # # # -- do not modify this marker --\n\0"
-/*  1962 */ "    if [ -n \"${OPT_ARG_VAL}\" ]\n"
+/*  1958 */ "    if [ -n \"${OPT_ARG_VAL}\" ]\n"
             "    then\n"
             "        eval %1$s_${OPT_NAME}${OPT_ELEMENT}=\"'${OPT_ARG_VAL}'\"\n"
             "        export %1$s_${OPT_NAME}${OPT_ELEMENT}\n"
@@ -203,15 +205,15 @@ char const ao_strs_strtable[6637] =
             "unset OPT_NAME    || :\n"
             "unset OPT_CODE    || :\n"
             "unset OPT_ARG_VAL || :\n\0"
-/*  2341 */ "        OPT_CODE=`echo \"X${OPT_ARG}\"|sed 's/^X-*//'`\n"
+/*  2337 */ "        OPT_CODE=`echo \"X${OPT_ARG}\"|sed 's/^X-*//'`\n"
             "        shift\n"
             "        OPT_ARG=$1\n"
             "        case \"${OPT_CODE}\" in *=* )\n"
             "            OPT_ARG_VAL=`echo \"${OPT_CODE}\"|sed 's/^[^=]*=//'`\n"
             "            OPT_CODE=`echo \"${OPT_CODE}\"|sed 's/=.*$//'` ;; esac\n\0"
-/*  2592 */ "        OPT_CODE=`echo \"X${OPT_ARG}\" | sed 's/X-\\(.\\).*/\\1/'`\n"
+/*  2588 */ "        OPT_CODE=`echo \"X${OPT_ARG}\" | sed 's/X-\\(.\\).*/\\1/'`\n"
             "        OPT_ARG=` echo \"X${OPT_ARG}\" | sed 's/X-.//'`\n\0"
-/*  2709 */ "\n"
+/*  2705 */ "\n"
             "ARG_COUNT=$#\n"
             "OPT_PROCESS=true\n"
             "OPT_ARG=$1\n"
@@ -224,7 +226,7 @@ char const ao_strs_strtable[6637] =
             "        OPT_PROCESS=false\n"
             "        shift\n"
             "        ;;\n\0"
-/*  2916 */ "        case \"${OPT_ARG_NEEDED}\" in\n"
+/*  2912 */ "        case \"${OPT_ARG_NEEDED}\" in\n"
             "        NO )\n"
             "            OPT_ARG_VAL=''\n"
             "            ;;\n"
@@ -252,10 +254,10 @@ char const ao_strs_strtable[6637] =
             "            fi\n"
             "            ;;\n"
             "        esac\n\0"
-/*  3695 */ "            %1$s_%2$s_CT=`expr ${%1$s_%2$s_CT} + 1`\n"
+/*  3691 */ "            %1$s_%2$s_CT=`expr ${%1$s_%2$s_CT} + 1`\n"
             "            OPT_ELEMENT=\"_${%1$s_%2$s_CT}\"\n"
             "            OPT_NAME='%2$s'\n\0"
-/*  3819 */ "\n"
+/*  3815 */ "\n"
             "if test -z \"${%1$s_%2$s}\"\n"
             "then\n"
             "  %1$s_%2$s_CT=0\n"
@@ -265,16 +267,16 @@ char const ao_strs_strtable[6637] =
             "  %1$s_%2$s_1=${%1$s_%2$s}\n"
             "  export %1$s_%2$s_CT %1$s_%2$s_1\n"
             "fi\n\0"
-/*  3977 */ "    * )\n"
+/*  3973 */ "    * )\n"
             "         OPT_PROCESS=false\n"
             "         ;;\n"
             "    esac\n\0"
-/*  4034 */ "            %1$s_%2$s_CT=0\n"
+/*  4030 */ "            %1$s_%2$s_CT=0\n"
             "            OPT_ELEMENT=''\n"
             "            %1$s_%2$s='%3$s'\n"
             "            export %1$s_%2$s\n"
             "            OPT_NAME='%2$s'\n\0"
-/*  4175 */ "            if [ -n \"${%1$s_%2$s}\" ] && ${%1$s_%2$s_set} ; then\n"
+/*  4171 */ "            if [ -n \"${%1$s_%2$s}\" ] && ${%1$s_%2$s_set} ; then\n"
             "                echo 'Error:  duplicate %2$s option'\n"
             "                echo \"$%1$s_USAGE_TEXT\"\n"
             "                exit 1\n"
@@ -283,7 +285,7 @@ char const ao_strs_strtable[6637] =
             "            %1$s_%2$s='%3$s'\n"
             "            export %1$s_%2$s\n"
             "            OPT_NAME='%2$s'\n\0"
-/*  4492 */ "\n"
+/*  4488 */ "\n"
             "ARG_COUNT=$#\n"
             "OPT_ARG=$1\n"
             "while [ $# -gt 0 ]\n"
@@ -291,7 +293,7 @@ char const ao_strs_strtable[6637] =
             "    OPT_ELEMENT=''\n"
             "    OPT_ARG_VAL=''\n"
             "    OPT_ARG=${1}\n\0"
-/*  4595 */ "        case \"${OPT_ARG_NEEDED}\" in\n"
+/*  4591 */ "        case \"${OPT_ARG_NEEDED}\" in\n"
             "        NO )\n"
             "            if [ -n \"${OPT_ARG}\" ]\n"
             "            then\n"
@@ -336,33 +338,33 @@ char const ao_strs_strtable[6637] =
             "            fi\n"
             "            ;;\n"
             "        esac\n\0"
-/*  5749 */ "            echo \"$%s_LONGUSAGE_TEXT\" | ${PAGER-more}\n"
+/*  5745 */ "            echo \"$%s_LONGUSAGE_TEXT\" | ${PAGER-more}\n"
             "            exit 0\n\0"
-/*  5823 */ "%s OF %s\n"
+/*  5819 */ "%s OF %s\n"
             "#\n"
             "#  From here to the next `-- do not modify this marker --',\n"
             "#  the text has been generated %s\n\0"
-/*  5929 */ "            eval %1$s_%2$s${OPT_ELEMENT}=true\n"
+/*  5925 */ "            eval %1$s_%2$s${OPT_ELEMENT}=true\n"
             "            export %1$s_%2$s${OPT_ELEMENT}\n\0"
-/*  6019 */ "            if [ -n \"${%1$s_%2$s}\" ] && ${%1$s_%2$s_set} ; then\n"
+/*  6015 */ "            if [ -n \"${%1$s_%2$s}\" ] && ${%1$s_%2$s_set} ; then\n"
             "                echo 'Error:  duplicate %2$s option'\n"
             "                echo \"$%1$s_USAGE_TEXT\"\n"
             "                exit 1\n"
             "            fi >&2\n"
             "            %1$s_%2$s_set=true\n"
             "            OPT_NAME='%2$s'\n\0"
-/*  6278 */ "\n"
+/*  6274 */ "\n"
             "%1$s_%2$s=${%1$s_%2$s-'%3$s'}\n"
             "%1$s_%2$s_set=false\n"
             "export %1$s_%2$s\n\0"
-/*  6347 */ "\n"
+/*  6343 */ "\n"
             "%1$s_%2$s=${%1$s_%2$s}\n"
             "%1$s_%2$s_set=false\n"
             "export %1$s_%2$s\n\0"
-/*  6409 */ "# # # # # # # # # # -- do not modify this marker --\n"
+/*  6405 */ "# # # # # # # # # # -- do not modify this marker --\n"
             "#\n"
             "#  DO NOT EDIT THIS SECTION\n\0"
-/*  6492 */ "        * )\n"
+/*  6488 */ "        * )\n"
             "            echo Unknown %s: \"${OPT_CODE}\" >&2\n"
             "            echo \"$%s_USAGE_TEXT\" >&2\n"
             "            exit 1\n"
index 0ea42ff964b1255b9716da4a5b3f158e3e8cd5a1..ca3eafc9b0402e60c963fe8c9c9793575facffcf 100644 (file)
@@ -2,7 +2,7 @@
  *
  * DO NOT EDIT THIS FILE   (ao-strs.h)
  *
- * It has been AutoGen-ed  March 31, 2013 at 10:41:23 AM by AutoGen 5.17.3
+ * It has been AutoGen-ed  July 14, 2013 at 05:37:05 PM by AutoGen 5.18
  * From the definitions    ao-strs.def
  * and the template file   strings
  *
 #ifndef STRINGS_AO_STRS_H_GUARD
 #define STRINGS_AO_STRS_H_GUARD 1
 /*
- * 140 strings in ao_strs_strtable string table
+ * 142 strings in ao_strs_strtable string table
  */
 #define ARG_BREAK_STR         (ao_strs_strtable+261)
 #define ARG_BREAK_STR_LEN     5
 #define ARG_BY_NUM_FMT        (ao_strs_strtable+267)
 #define ARG_BY_NUM_FMT_LEN    9
-#define BOOL_ATR_FMT          (ao_strs_strtable+880)
+#define BOOL_ATR_FMT          (ao_strs_strtable+876)
 #define BOOL_ATR_FMT_LEN      31
-#define CHK_MAX_COUNT         (ao_strs_strtable+1431)
+#define CHK_MAX_COUNT         (ao_strs_strtable+1427)
 #define CHK_MAX_COUNT_LEN     190
-#define CHK_MIN_COUNT         (ao_strs_strtable+1622)
+#define CHK_MIN_COUNT         (ao_strs_strtable+1618)
 #define CHK_MIN_COUNT_LEN     91
-#define CHK_ONE_REQUIRED      (ao_strs_strtable+1714)
+#define CHK_ONE_REQUIRED      (ao_strs_strtable+1710)
 #define CHK_ONE_REQUIRED_LEN  80
-#define ECHO_N_EXIT           (ao_strs_strtable+1795)
+#define ECHO_N_EXIT           (ao_strs_strtable+1791)
 #define ECHO_N_EXIT_LEN       50
 #define EMPTY_ARG             (ao_strs_strtable+277)
 #define EMPTY_ARG_LEN         2
-#define END_MARK              (ao_strs_strtable+1846)
+#define END_MARK              (ao_strs_strtable+1842)
 #define END_MARK_LEN          115
 #define END_OPT_SEL_STR       (ao_strs_strtable+280)
 #define END_OPT_SEL_STR_LEN   12
-#define END_PRE_FMT           (ao_strs_strtable+912)
+#define END_PRE_FMT           (ao_strs_strtable+908)
 #define END_PRE_FMT_LEN       36
 #define END_SET_TEXT          (ao_strs_strtable+293)
 #define END_SET_TEXT_LEN      3
 #define EXPORT_ARG_FMT_LEN    17
 #define FALSE_STR             (ao_strs_strtable+335)
 #define FALSE_STR_LEN         5
-#define FINISH_LOOP           (ao_strs_strtable+1962)
+#define FINISH_LOOP           (ao_strs_strtable+1958)
 #define FINISH_LOOP_LEN       378
 #define FLAG_OPT_MARK         (ao_strs_strtable+341)
 #define FLAG_OPT_MARK_LEN     9
 #define FLAG_STR              (ao_strs_strtable+351)
 #define FLAG_STR_LEN          4
-#define INIT_LOPT_STR         (ao_strs_strtable+2341)
+#define INIT_LOPT_STR         (ao_strs_strtable+2337)
 #define INIT_LOPT_STR_LEN     250
-#define INIT_OPT_STR          (ao_strs_strtable+2592)
+#define INIT_OPT_STR          (ao_strs_strtable+2588)
 #define INIT_OPT_STR_LEN      116
 #define INVALID_FMT           (ao_strs_strtable+356)
 #define INVALID_FMT_LEN       10
@@ -97,9 +97,9 @@
 #define LONG_OPT_MARK_LEN     10
 #define LONG_USE_STR          (ao_strs_strtable+396)
 #define LONG_USE_STR_LEN      9
-#define LOOP_STR              (ao_strs_strtable+2709)
+#define LOOP_STR              (ao_strs_strtable+2705)
 #define LOOP_STR_LEN          206
-#define LOPT_ARG_FMT          (ao_strs_strtable+2916)
+#define LOPT_ARG_FMT          (ao_strs_strtable+2912)
 #define LOPT_ARG_FMT_LEN      778
 #define LVL3_CMD              (ao_strs_strtable+406)
 #define LVL3_CMD_LEN          15
 #define MK_STR_OCT_FMT_LEN    5
 #define MORE_STR              (ao_strs_strtable+428)
 #define MORE_STR_LEN          4
-#define MULTI_ARG_FMT         (ao_strs_strtable+3695)
+#define MULTI_ARG_FMT         (ao_strs_strtable+3691)
 #define MULTI_ARG_FMT_LEN     123
-#define MULTI_DEF_FMT         (ao_strs_strtable+3819)
+#define MULTI_DEF_FMT         (ao_strs_strtable+3815)
 #define MULTI_DEF_FMT_LEN     157
 #define NESTED_OPT_FMT        (ao_strs_strtable+433)
 #define NESTED_OPT_FMT_LEN    17
 #define NLSTR_SPACE_FMT_LEN   5
 #define NONE_STR              (ao_strs_strtable+91)
 #define NONE_STR_LEN          4
-#define NOT_FOUND_STR         (ao_strs_strtable+3977)
+#define NOT_FOUND_STR         (ao_strs_strtable+3973)
 #define NOT_FOUND_STR_LEN     56
 #define NO_ARG_NEEDED         (ao_strs_strtable+461)
 #define NO_ARG_NEEDED_LEN     17
-#define NO_LOAD_WARN          (ao_strs_strtable+949)
+#define NO_LOAD_WARN          (ao_strs_strtable+945)
 #define NO_LOAD_WARN_LEN      46
-#define NO_MULTI_ARG_FMT      (ao_strs_strtable+4034)
+#define NO_MULTI_ARG_FMT      (ao_strs_strtable+4030)
 #define NO_MULTI_ARG_FMT_LEN  140
-#define NO_SAVE_OPTS          (ao_strs_strtable+996)
+#define NO_SAVE_OPTS          (ao_strs_strtable+992)
 #define NO_SAVE_OPTS_LEN      46
-#define NO_SGL_ARG_FMT        (ao_strs_strtable+4175)
+#define NO_SGL_ARG_FMT        (ao_strs_strtable+4171)
 #define NO_SGL_ARG_FMT_LEN    316
-#define NO_SUPPRESS_LOAD      (ao_strs_strtable+1043)
+#define NO_SUPPRESS_LOAD      (ao_strs_strtable+1039)
 #define NO_SUPPRESS_LOAD_LEN  65
 #define NULL_ATR_FMT          (ao_strs_strtable+479)
 #define NULL_ATR_FMT_LEN      6
-#define NUMB_ATR_FMT          (ao_strs_strtable+1109)
+#define NUMB_ATR_FMT          (ao_strs_strtable+1105)
 #define NUMB_ATR_FMT_LEN      34
 #define OK_NEED_OPT_ARG       (ao_strs_strtable+486)
 #define OK_NEED_OPT_ARG_LEN   17
 #define ONE_TAB_STR           (ao_strs_strtable+504)
 #define ONE_TAB_STR_LEN       1
-#define ONLY_OPTS_LOOP        (ao_strs_strtable+4492)
+#define ONLY_OPTS_LOOP        (ao_strs_strtable+4488)
 #define ONLY_OPTS_LOOP_LEN    102
 #define OPEN_CLOSE_FMT        (ao_strs_strtable+479)
 #define OPEN_CLOSE_FMT_LEN    6
 #define OPEN_XML_FMT_LEN      4
 #define OPTION_STR            (ao_strs_strtable+511)
 #define OPTION_STR_LEN        6
-#define OPT_ARG_FMT           (ao_strs_strtable+4595)
+#define OPT_ARG_FMT           (ao_strs_strtable+4591)
 #define OPT_ARG_FMT_LEN       1153
 #define OPT_END_FMT           (ao_strs_strtable+518)
 #define OPT_END_FMT_LEN       14
 #define OR_STR_LEN            3
 #define PAGER_NAME            (ao_strs_strtable+544)
 #define PAGER_NAME_LEN        5
-#define PAGE_USAGE_FMT        (ao_strs_strtable+837)
-#define PAGE_USAGE_FMT        (ao_strs_strtable+837)
-#define PAGE_USAGE_FMT_LEN    42
-#define PAGE_USAGE_FMT_LEN    42
-#define PAGE_USAGE_TEXT       (ao_strs_strtable+5749)
+#define PAGE_USAGE_FMT        (ao_strs_strtable+853)
+#define PAGE_USAGE_FMT_LEN    22
+#define PAGE_USAGE_TEXT       (ao_strs_strtable+5745)
 #define PAGE_USAGE_TEXT_LEN   73
 #define PLUS_STR              (ao_strs_strtable+550)
 #define PLUS_STR_LEN          3
-#define PREAMBLE_FMT          (ao_strs_strtable+5823)
+#define PREAMBLE_FMT          (ao_strs_strtable+5819)
 #define PREAMBLE_FMT_LEN      105
 #define PUTS_FMT              (ao_strs_strtable+554)
 #define PUTS_FMT_LEN          15
 #define QUOT_APOS_LEN         2
 #define QUOT_ARG_FMT          (ao_strs_strtable+573)
 #define QUOT_ARG_FMT_LEN      4
-#define SET_MULTI_ARG         (ao_strs_strtable+5929)
+#define SET_MULTI_ARG         (ao_strs_strtable+5925)
 #define SET_MULTI_ARG_LEN     89
-#define SET_NO_TEXT_FMT       (ao_strs_strtable+1144)
+#define SET_NO_TEXT_FMT       (ao_strs_strtable+1140)
 #define SET_NO_TEXT_FMT_LEN   30
 #define SET_OFF_FMT           (ao_strs_strtable+578)
 #define SET_OFF_FMT_LEN       6
 #define SET_TEXT_FMT          (ao_strs_strtable+585)
 #define SET_TEXT_FMT_LEN      12
-#define SGL_ARG_FMT           (ao_strs_strtable+6019)
+#define SGL_ARG_FMT           (ao_strs_strtable+6015)
 #define SGL_ARG_FMT_LEN       258
-#define SGL_DEF_FMT           (ao_strs_strtable+6278)
+#define SGL_DEF_FMT           (ao_strs_strtable+6274)
 #define SGL_DEF_FMT_LEN       68
-#define SGL_NO_DEF_FMT        (ao_strs_strtable+6347)
+#define SGL_NO_DEF_FMT        (ao_strs_strtable+6343)
 #define SGL_NO_DEF_FMT_LEN    61
 #define SHELL_MAGIC           (ao_strs_strtable+598)
 #define SHELL_MAGIC_LEN       6
 #define SHOW_PROG_ENV_LEN     19
 #define SHOW_VAL_FMT          (ao_strs_strtable+625)
 #define SHOW_VAL_FMT_LEN      17
-#define START_MARK            (ao_strs_strtable+6409)
+#define START_MARK            (ao_strs_strtable+6405)
 #define START_MARK_LEN        82
 #define STDOUT                (ao_strs_strtable+643)
 #define STDOUT_LEN            6
 #define TIME_FMT              (ao_strs_strtable+650)
 #define TIME_FMT_LEN          21
+#define TMPDIR                (ao_strs_strtable+841)
+#define TMPDIR_LEN            6
+#define TMP_FILE_FMT          (ao_strs_strtable+672)
+#define TMP_FILE_FMT_LEN      16
 #define TMP_USAGE_FMT         (ao_strs_strtable+672)
-#define TMP_USAGE_FMT_LEN     12
-#define TRUE_STR              (ao_strs_strtable+685)
+#define TMP_USAGE_FMT_LEN     16
+#define TRUE_STR              (ao_strs_strtable+689)
 #define TRUE_STR_LEN          4
 #define TWO_SPACES_STR        (ao_strs_strtable+254)
 #define TWO_SPACES_STR_LEN    2
-#define TYPE_ATR_FMT          (ao_strs_strtable+690)
+#define TYPE_ATR_FMT          (ao_strs_strtable+694)
 #define TYPE_ATR_FMT_LEN      12
-#define UNK_OPT_FMT           (ao_strs_strtable+6492)
+#define UNK_OPT_FMT           (ao_strs_strtable+6488)
 #define UNK_OPT_FMT_LEN       144
-#define VER_STR               (ao_strs_strtable+703)
+#define VER_STR               (ao_strs_strtable+707)
 #define VER_STR_LEN           7
-#define XML_HEX_BYTE_FMT      (ao_strs_strtable+711)
+#define XML_HEX_BYTE_FMT      (ao_strs_strtable+715)
 #define XML_HEX_BYTE_FMT_LEN  7
-#define YES_NEED_OPT_ARG      (ao_strs_strtable+719)
+#define YES_NEED_OPT_ARG      (ao_strs_strtable+723)
 #define YES_NEED_OPT_ARG_LEN  18
-#define apostrophe            (ao_strs_strtable+738)
+#define apostrophe            (ao_strs_strtable+742)
 #define apostrophe_LEN        4
-#define arg_fmt               (ao_strs_strtable+743)
+#define arg_fmt               (ao_strs_strtable+747)
 #define arg_fmt_LEN           5
-#define init_optct            (ao_strs_strtable+749)
+#define init_optct            (ao_strs_strtable+753)
 #define init_optct_LEN        13
-#define set_dash              (ao_strs_strtable+763)
+#define set_dash              (ao_strs_strtable+767)
 #define set_dash_LEN          6
+#define tmp_dir               (ao_strs_strtable+848)
+#define tmp_dir_LEN           4
 #define zAll                  (ao_strs_strtable+257)
 #define zAll_LEN              3
 #define zCfgAO_Flags          (ao_strs_strtable+12)
 #define zCfgAO_Flags_LEN      12
 #define zCfgProg              (ao_strs_strtable+25)
 #define zCfgProg_LEN          7
-#define zEquivMode            (ao_strs_strtable+1175)
+#define zEquivMode            (ao_strs_strtable+1171)
 #define zEquivMode_LEN        44
 #define zFiveSpaces           (ao_strs_strtable+244)
 #define zFiveSpaces_LEN       5
 #define zFmtFmt               (ao_strs_strtable+33)
 #define zFmtFmt_LEN           11
-#define zFullOptFmt           (ao_strs_strtable+1220)
+#define zFullOptFmt           (ao_strs_strtable+1216)
 #define zFullOptFmt_LEN       34
 #define zGnuBreak             (ao_strs_strtable+45)
 #define zGnuBreak_LEN         5
 #define zGnuTimeArg_LEN       4
 #define zNone                 (ao_strs_strtable+91)
 #define zNone_LEN             4
-#define zOptCookieCt          (ao_strs_strtable+1255)
+#define zOptCookieCt          (ao_strs_strtable+1251)
 #define zOptCookieCt_LEN      38
-#define zOptCtFmt             (ao_strs_strtable+1294)
+#define zOptCtFmt             (ao_strs_strtable+1290)
 #define zOptCtFmt_LEN         30
-#define zOptDisabl            (ao_strs_strtable+1325)
+#define zOptDisabl            (ao_strs_strtable+1321)
 #define zOptDisabl_LEN        32
-#define zOptNumFmt            (ao_strs_strtable+1358)
+#define zOptNumFmt            (ao_strs_strtable+1354)
 #define zOptNumFmt_LEN        41
-#define zOptionCase           (ao_strs_strtable+1400)
+#define zOptionCase           (ao_strs_strtable+1396)
 #define zOptionCase_LEN       30
-#define zOptionEndSelect      (ao_strs_strtable+770)
+#define zOptionEndSelect      (ao_strs_strtable+774)
 #define zOptionEndSelect_LEN  16
-#define zOptionFlag           (ao_strs_strtable+787)
+#define zOptionFlag           (ao_strs_strtable+791)
 #define zOptionFlag_LEN       15
-#define zOptionFullName       (ao_strs_strtable+803)
+#define zOptionFullName       (ao_strs_strtable+807)
 #define zOptionFullName_LEN   15
-#define zOptionPartName       (ao_strs_strtable+819)
+#define zOptionPartName       (ao_strs_strtable+823)
 #define zOptionPartName_LEN   17
 #define zPresetFile           (ao_strs_strtable+96)
 #define zPresetFile_LEN       37
 #define zTwoSpaces_LEN        2
 #define zambig_file           (ao_strs_strtable+4)
 #define zambig_file_LEN       7
-extern char const ao_strs_strtable[6637];
+extern char const ao_strs_strtable[6633];
 
 #endif /* STRINGS_AO_STRS_H_GUARD */
index ff54b1619ce55eb872dcc629267f67494e1cc89a..966ea45a85bc27eb9b2fef4864e8a6e024f651a7 100644 (file)
  *  13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239  COPYING.mbsd
  */
 
-#ifndef PKGDATADIR
-#  define PKGDATADIR ""
-#endif
-
-static char const   zNil[] = "";
-static arg_types_t  argTypes             = { NULL };
-static char         line_fmt_buf[32];
-static bool         displayEnum          = false;
-static char const   pkgdatadir_default[] = PKGDATADIR;
-static char const * program_pkgdatadir   = pkgdatadir_default;
-static tOptionLoadMode option_load_mode  = OPTION_LOAD_UNCOOKED;
-static tePagerState pagerState           = PAGER_STATE_INITIAL;
-
-       FILE *       option_usage_fp      = NULL;
-
 /**
  * The number of tab characters to skip when printing continuation lines.
  */
 static unsigned int tab_skip_ct          = 0;
 
+#ifndef HAVE_PATHFIND
+#  define  pathfind(_p, _n, _m) option_pathfind(_p, _n, _m)
+#  include "compat/pathfind.c"
+#endif
+
+#ifndef HAVE_SNPRINTF
+#  define vsnprintf       option_vsnprintf
+#  define snprintf        option_snprintf
+#  include "compat/snprintf.c"
+#endif
+
+#ifndef HAVE_STRDUP
+#  define  strdup(_s)     option_strdup(_s)
+#  include "compat/strdup.c"
+#endif
+
+#ifndef HAVE_STRCHR
+#  define strrchr(_s, _c) option_strrchr(_s, _c)
+#  define strchr(_s, _c)  option_strchr(_s, _c)
+#  include "compat/strchr.c"
+#endif
+
 LOCAL void *
 ao_malloc(size_t sz)
 {
     void * res = malloc(sz);
     if (res == NULL) {
         fprintf(stderr, zalloc_fail, (int)sz);
-        exit(EXIT_FAILURE);
+        option_exits(EXIT_FAILURE);
     }
     return res;
 }
@@ -71,7 +78,7 @@ ao_realloc(void *p, size_t sz)
     void * res = (p == NULL) ? malloc(sz) : realloc(p, sz);
     if (res == NULL) {
         fprintf(stderr, zrealloc_fail, (int)sz, p);
-        exit(EXIT_FAILURE);
+        option_exits(EXIT_FAILURE);
     }
     return res;
 }
@@ -84,35 +91,13 @@ ao_strdup(char const *str)
     char * res = strdup(str);
     if (res == NULL) {
         fprintf(stderr, zalloc_fail, (int)strlen(str));
-        exit(EXIT_FAILURE);
+        option_exits(EXIT_FAILURE);
     }
     return res;
 }
 #undef  strdup
 #define strdup(_p)        ao_strdup(_p)
 
-#ifndef HAVE_PATHFIND
-#  define  pathfind(_p, _n, _m) option_pathfind(_p, _n, _m)
-#  include "compat/pathfind.c"
-#endif
-
-#ifndef HAVE_SNPRINTF
-#  define vsnprintf       option_vsnprintf
-#  define snprintf        option_snprintf
-#  include "compat/snprintf.c"
-#endif
-
-#ifndef HAVE_STRDUP
-#  define  strdup(_s)     option_strdup(_s)
-#  include "compat/strdup.c"
-#endif
-
-#ifndef HAVE_STRCHR
-#  define strrchr(_s, _c) option_strrchr(_s, _c)
-#  define strchr(_s, _c)  option_strchr(_s, _c)
-#  include "compat/strchr.c"
-#endif
-
 /**
  *  handle an option.
  *
@@ -386,7 +371,7 @@ optionProcess(tOptions * opts, int a_ct, char ** a_v)
 
         if (SELECTED_OPT(od)) {
             optionSaveFile(opts);
-            exit(EXIT_SUCCESS);
+            option_exits(EXIT_SUCCESS);
         }
     }
     }
index 67fb86d7d02e94bbe17c40c533a22cb0ffdb9e53..7bb85a19bd53268e9ece6d954df801552373f85b 100644 (file)
 #define SKIP_OPT(p)  (((p)->fOptState & OPTST_IMMUTABLE_MASK) != 0)
 
 typedef int tDirection;
+/**
+ * handling option presets.  Start with command line and work through
+ * config settings in reverse order.
+ */
 #define DIRECTION_PRESET        -1
+/**
+ * handling normal options.  Start with first config file, then environment
+ * variables and finally the command line.
+ */
 #define DIRECTION_PROCESS       1
+/**
+ * An initialzation phase or an option being loaded from program sources.
+ */
 #define DIRECTION_CALLED        0
 
 #define PROCESSING(d)           ((d)>0)
@@ -392,6 +403,65 @@ static char const * program_pkgdatadir;
  */
 extern tOptProc optionPrintVersion, optionPagedUsage, optionLoadOpt;
 
+#ifdef AUTOOPTS_INTERNAL
+
+#ifndef PKGDATADIR
+#  define PKGDATADIR ""
+#endif
+#define APOSTROPHE '\''
+
+#define OPTPROC_L_N_S  (OPTPROC_LONGOPT | OPTPROC_SHORTOPT)
+#if defined(ENABLE_NLS) && defined(HAVE_LIBINTL_H)
+# include <libintl.h>
+#endif
+
+typedef struct {
+    size_t          fnm_len;
+    uint32_t        fnm_mask;
+    char const *    fnm_name;
+} ao_flag_names_t;
+
+/**
+ * Automated Options Usage Flags.
+ * NB: no entry may be a prefix of another entry
+ */
+#define AOFLAG_TABLE                            \
+    _aof_(gnu,             OPTPROC_GNUUSAGE )   \
+    _aof_(autoopts,        ~OPTPROC_GNUUSAGE)   \
+    _aof_(no_misuse_usage, OPTPROC_MISUSE   )   \
+    _aof_(misuse_usage,    ~OPTPROC_MISUSE  )   \
+    _aof_(compute,         OPTPROC_COMPUTE  )
+
+#define _aof_(_n, _f)   AOUF_ ## _n ## _ID,
+typedef enum { AOFLAG_TABLE AOUF_COUNT } ao_flag_id_t;
+#undef  _aof_
+
+#define _aof_(_n, _f)   AOUF_ ## _n = (1 << AOUF_ ## _n ## _ID),
+typedef enum { AOFLAG_TABLE } ao_flags_t;
+#undef  _aof_
+
+static char const   zNil[] = "";
+static arg_types_t  argTypes             = { NULL };
+static char         line_fmt_buf[32];
+static bool         displayEnum          = false;
+static char const   pkgdatadir_default[] = PKGDATADIR;
+static char const * program_pkgdatadir   = pkgdatadir_default;
+static tOptionLoadMode option_load_mode  = OPTION_LOAD_UNCOOKED;
+static tePagerState pagerState           = PAGER_STATE_INITIAL;
+
+       FILE *       option_usage_fp      = NULL;
+
+static char const * pz_enum_err_fmt;
+
+tOptions * optionParseShellOptions = NULL;
+
+static char const * shell_prog = NULL;
+static char * script_leader    = NULL;
+static char * script_trailer   = NULL;
+static char * script_text      = NULL;
+static bool   print_exit       = false;
+#endif /* AUTOOPTS_INTERNAL */
+
 #endif /* AUTOGEN_AUTOOPTS_H */
 /**
  * @}
index 5bb31fde507c89cd737c37204202c1e20e5015d5..fcf7739ca26a6f3a9b57d0fc5b71791ba91bc75e 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  DO NOT EDIT THIS FILE   (options.h)
  *
- *  It has been AutoGen-ed  March 31, 2013 at 10:41:30 AM by AutoGen 5.17.3
+ *  It has been AutoGen-ed  July 14, 2013 at 05:37:12 PM by AutoGen 5.18
  *  From the definitions    funcs.def
  *  and the template file   options_h
  *
  * @{
  */
 /// autoopts structure version
-#define OPTIONS_STRUCT_VERSION      155648
+#define OPTIONS_STRUCT_VERSION      163840
 /// autoopts structure version string
-#define OPTIONS_VERSION_STRING      "38:0:13"
+#define OPTIONS_VERSION_STRING      "40:0:15"
 /// minimum version the autoopts library supports
 #define OPTIONS_MINIMUM_VERSION     102400
 /// minimum version the autoopts library supports as a string
 #define OPTIONS_MIN_VER_STRING      "25:0:0"
 /// the display version of the autoopts library, as a string
-#define OPTIONS_DOTTED_VERSION      "38.0"
+#define OPTIONS_DOTTED_VERSION      "40.0"
 /// convert a version/release number pair to an integer value
 #define OPTIONS_VER_TO_NUM(_v, _r)  (((_v) * 4096) + (_r))
 /// @}
@@ -375,13 +375,16 @@ typedef uint32_t proc_state_mask_t;
 #define OPTPROC_PRESETTING    0x080000U
 /** proc_state_mask_t - Ignore pzFullUsage, compute usage text */
 #define OPTPROC_COMPUTE       0x100000U
+/** proc_state_mask_t - Program outputs digested option state for shell scripts.
+Usage text always written to stderr */
+#define OPTPROC_SHELL_OUTPUT  0x200000U
 
 /** bits in NO_XLAT mask:
  *  nxlat_opt_cfg nxlat_opt */
 #define OPTPROC_NO_XLAT_MASK  0x030000U
 
 /** all bits in proc_state_mask_t masks */
-#define OPTPROC_MASK_ALL      0x1FFFFFU
+#define OPTPROC_MASK_ALL      0x3FFFFFU
 
 /** no bits in proc_state_mask_t */
 #define OPTPROC_NONE          0x000000U
@@ -911,6 +914,19 @@ extern const tOptionValue* optionGetValue(const tOptionValue*, char const*);
 extern void optionLoadLine(tOptions*, char const*);
 
 
+/**
+ * optionMemberList - Get the list of members of a bit mask set
+ *
+ *  This converts the OPT_VALUE_name mask value to a allocated string.
+ *  It is the caller's responsibility to free the string.
+ *
+ * @param od           the set membership option description
+ *
+ * @return char* - the names of the set bits
+ */
+extern char* optionMemberList(tOptDesc *);
+
+
 /**
  * optionNextValue - get the next value from a hierarchical list
  *
@@ -1167,7 +1183,7 @@ extern void optionNestedVal(tOptions*, tOptDesc*);
 
 extern void optionNumericVal(tOptions*, tOptDesc*);
 
-extern void optionPagedUsage(tOptions*, tOptDesc*);
+extern void optionPagedUsage(tOptions *, tOptDesc *);
 
 extern void optionParseShell(tOptions*);
 
index 34a215368dd6b4c56395c3f27734a81de040911e..fe97e66683e273071dcc4de56531b2b76c3a8a38 100644 (file)
@@ -71,5 +71,7 @@ typedef int tSuccess;
 #  define MODE extern
 #endif
 
+#define parse_duration option_parse_duration
+
 #endif /* AUTOGEN_PROJECT_H */
 /* end of project.h */
index bf4bf4404803f3e839c9fe3ad0ddbd38bc0d65b5..83fa23ca106b1eae8640c88bbac3d192f908b2c5 100644 (file)
@@ -2,7 +2,7 @@
  *
  * DO NOT EDIT THIS FILE   (usage-txt.h)
  *
- * It has been AutoGen-ed  March 31, 2013 at 10:41:28 AM by AutoGen 5.17.3
+ * It has been AutoGen-ed  July 14, 2013 at 05:37:10 PM by AutoGen 5.18
  * From the definitions    usage-txt.def
  * and the template file   usage-txt.tpl
  *
@@ -362,51 +362,51 @@ do not compile this section.
  */
 static void dummy_func(void) {
   /* LIBOPTS-MESSAGES: */
-#line 60 "../autoopts.c"
+#line 67 "../autoopts.c"
   puts(_("allocation of %d bytes failed\n"));
-#line 86 "../autoopts.c"
+#line 93 "../autoopts.c"
   puts(_("allocation of %d bytes failed\n"));
 #line 53 "../init.c"
   puts(_("AutoOpts function called without option descriptor\n"));
-#line 89 "../init.c"
+#line 90 "../init.c"
   puts(_("\tThis exceeds the compiled library version:  "));
-#line 87 "../init.c"
+#line 88 "../init.c"
   puts(_("Automated Options Processing Error!\n"
        "\t%s called AutoOpts function with structure version %d:%d:%d.\n"));
-#line 73 "../autoopts.c"
+#line 80 "../autoopts.c"
   puts(_("realloc of %d bytes at 0x%p failed\n"));
-#line 91 "../init.c"
+#line 92 "../init.c"
   puts(_("\tThis is less than the minimum library version:  "));
 #line 121 "../version.c"
   puts(_("Automated Options version %s\n"
        "\tCopyright (C) 1999-2013 by Bruce Korb - all rights reserved\n"));
-#line 310 "../usage.c"
+#line 82 "../makeshell.c"
   puts(_("(AutoOpts bug):  %s.\n"));
 #line 90 "../reset.c"
   puts(_("optionResetOpt() called, but reset-option not configured"));
-#line 329 "../usage.c"
+#line 292 "../usage.c"
   puts(_("could not locate the 'help' option"));
-#line 351 "../autoopts.c"
+#line 336 "../autoopts.c"
   puts(_("optionProcess() was called with invalid data"));
-#line 783 "../usage.c"
+#line 747 "../usage.c"
   puts(_("invalid argument type specified"));
-#line 589 "../find.c"
+#line 598 "../find.c"
   puts(_("defaulted to option with optional arg"));
 #line 76 "../alias.c"
   puts(_("aliasing option is out of range."));
-#line 229 "../enum.c"
+#line 234 "../enum.c"
   puts(_("%s error:  the keyword '%s' is ambiguous for %s\n"));
 #line 108 "../find.c"
   puts(_("  The following options match:\n"));
-#line 290 "../find.c"
+#line 293 "../find.c"
   puts(_("%s: ambiguous option name: %s (matches %d options)\n"));
 #line 161 "../check.c"
   puts(_("%s: Command line arguments required\n"));
 #line 43 "../alias.c"
   puts(_("%d %s%s options allowed\n"));
-#line 81 "../makeshell.c"
+#line 89 "../makeshell.c"
   puts(_("%s error %d (%s) calling %s for '%s'\n"));
-#line 293 "../makeshell.c"
+#line 301 "../makeshell.c"
   puts(_("interprocess pipe"));
 #line 168 "../version.c"
   puts(_("error: version option argument '%c' invalid.  Use:\n"
@@ -415,48 +415,48 @@ static void dummy_func(void) {
        "\t'n' - version and full copyright notice\n"));
 #line 58 "../check.c"
   puts(_("%s error:  the '%s' and '%s' options conflict\n"));
-#line 214 "../find.c"
+#line 217 "../find.c"
   puts(_("%s: The '%s' option has been disabled."));
-#line 421 "../find.c"
+#line 430 "../find.c"
   puts(_("%s: The '%s' option has been disabled."));
 #line 38 "../alias.c"
   puts(_("-equivalence"));
-#line 460 "../find.c"
+#line 469 "../find.c"
   puts(_("%s: illegal option -- %c\n"));
 #line 110 "../reset.c"
   puts(_("%s: illegal option -- %c\n"));
-#line 268 "../find.c"
+#line 271 "../find.c"
   puts(_("%s: illegal option -- %s\n"));
-#line 746 "../find.c"
+#line 755 "../find.c"
   puts(_("%s: illegal option -- %s\n"));
 #line 118 "../reset.c"
   puts(_("%s: illegal option -- %s\n"));
-#line 332 "../find.c"
+#line 335 "../find.c"
   puts(_("%s: unknown vendor extension option -- %s\n"));
-#line 154 "../enum.c"
+#line 159 "../enum.c"
   puts(_("  or an integer from %d through %d\n"));
-#line 164 "../enum.c"
+#line 169 "../enum.c"
   puts(_("  or an integer from %d through %d\n"));
-#line 782 "../usage.c"
+#line 746 "../usage.c"
   puts(_("%s error:  invalid option descriptor for %s\n"));
-#line 1110 "../usage.c"
+#line 1080 "../usage.c"
   puts(_("%s error:  invalid option descriptor for %s\n"));
-#line 379 "../find.c"
+#line 385 "../find.c"
   puts(_("%s: invalid option name: %s\n"));
-#line 518 "../find.c"
+#line 527 "../find.c"
   puts(_("%s: The '%s' option requires an argument.\n"));
-#line 171 "../autoopts.c"
+#line 156 "../autoopts.c"
   puts(_("(AutoOpts bug):  Equivalenced option '%s' was equivalenced to both\n"
        "\t'%s' and '%s'."));
 #line 94 "../check.c"
   puts(_("%s error:  The %s option is required\n"));
-#line 623 "../find.c"
+#line 632 "../find.c"
   puts(_("%s: The '%s' option cannot have an argument.\n"));
 #line 151 "../check.c"
   puts(_("%s: Command line arguments are not allowed.\n"));
-#line 531 "../save.c"
+#line 535 "../save.c"
   puts(_("error %d (%s) creating %s\n"));
-#line 229 "../enum.c"
+#line 234 "../enum.c"
   puts(_("%s error:  '%s' does not match any %s keywords.\n"));
 #line 93 "../reset.c"
   puts(_("%s error: The '%s' option requires an argument.\n"));
@@ -466,7 +466,7 @@ static void dummy_func(void) {
   puts(_("error %d (%s) stat-ing %s\n"));
 #line 143 "../restore.c"
   puts(_("%s error: no saved option state\n"));
-#line 246 "../autoopts.c"
+#line 231 "../autoopts.c"
   puts(_("'%s' is not a command line option.\n"));
 #line 114 "../time.c"
   puts(_("%s error:  '%s' is not a recognizable date/time.\n"));
@@ -478,41 +478,41 @@ static void dummy_func(void) {
   puts(_("%s error:  The %s option must appear %d times.\n"));
 #line 157 "../numeric.c"
   puts(_("%s error:  '%s' is not a recognizable number.\n"));
-#line 195 "../enum.c"
+#line 200 "../enum.c"
   puts(_("%s error:  %s exceeds %s keyword count\n"));
-#line 366 "../usage.c"
+#line 329 "../usage.c"
   puts(_("Try '%s %s' for more information.\n"));
 #line 45 "../alias.c"
   puts(_("one %s%s option allowed\n"));
-#line 195 "../makeshell.c"
+#line 203 "../makeshell.c"
   puts(_("standard output"));
-#line 930 "../makeshell.c"
+#line 938 "../makeshell.c"
   puts(_("standard output"));
-#line 304 "../usage.c"
+#line 274 "../usage.c"
   puts(_("standard output"));
-#line 451 "../usage.c"
+#line 414 "../usage.c"
   puts(_("standard output"));
-#line 660 "../usage.c"
+#line 624 "../usage.c"
   puts(_("standard output"));
 #line 175 "../version.c"
   puts(_("standard output"));
-#line 304 "../usage.c"
+#line 274 "../usage.c"
   puts(_("standard error"));
-#line 451 "../usage.c"
+#line 414 "../usage.c"
   puts(_("standard error"));
-#line 660 "../usage.c"
+#line 624 "../usage.c"
   puts(_("standard error"));
 #line 175 "../version.c"
   puts(_("standard error"));
-#line 195 "../makeshell.c"
+#line 203 "../makeshell.c"
   puts(_("write"));
-#line 930 "../makeshell.c"
+#line 938 "../makeshell.c"
   puts(_("write"));
-#line 303 "../usage.c"
+#line 273 "../usage.c"
   puts(_("write"));
-#line 450 "../usage.c"
+#line 413 "../usage.c"
   puts(_("write"));
-#line 659 "../usage.c"
+#line 623 "../usage.c"
   puts(_("write"));
 #line 174 "../version.c"
   puts(_("write"));
@@ -528,70 +528,70 @@ static void dummy_func(void) {
   puts(_("%s warning:  cannot save options - %s not regular file\n"));
 #line 256 "../save.c"
   puts(_("%s warning:  cannot save options - %s not regular file\n"));
-#line 530 "../save.c"
+#line 534 "../save.c"
   puts(_("%s warning:  cannot save options - %s not regular file\n"));
   /* END-LIBOPTS-MESSAGES */
 
   /* USAGE-TEXT: */
-#line 908 "../usage.c"
+#line 872 "../usage.c"
   puts(_("\t\t\t\t- an alternate for '%s'\n"));
-#line 1177 "../usage.c"
+#line 1147 "../usage.c"
   puts(_("Version, usage and configuration options:"));
-#line 959 "../usage.c"
+#line 923 "../usage.c"
   puts(_("\t\t\t\t- default option for unnamed options\n"));
-#line 872 "../usage.c"
+#line 836 "../usage.c"
   puts(_("\t\t\t\t- disabled as '--%s'\n"));
-#line 1146 "../usage.c"
+#line 1116 "../usage.c"
   puts(_(" --- %-14s %s\n"));
-#line 1144 "../usage.c"
+#line 1114 "../usage.c"
   puts(_("This option has been disabled"));
-#line 899 "../usage.c"
+#line 863 "../usage.c"
   puts(_("\t\t\t\t- enabled by default\n"));
 #line 40 "../alias.c"
   puts(_("%s error:  only "));
-#line 1221 "../usage.c"
+#line 1193 "../usage.c"
   puts(_(" - examining environment variables named %s_*\n"));
 #line 168 "../file.c"
   puts(_("\t\t\t\t- file must not pre-exist\n"));
 #line 172 "../file.c"
   puts(_("\t\t\t\t- file must pre-exist\n"));
-#line 416 "../usage.c"
+#line 379 "../usage.c"
   puts(_("Options are specified by doubled hyphens and their name or by a single\n"
        "hyphen and the flag character.\n"));
-#line 908 "../makeshell.c"
+#line 916 "../makeshell.c"
   puts(_("\n"
        "= = = = = = = =\n\n"
        "This incarnation of genshell will produce\n"
        "a shell script to parse the options for %s:\n\n"));
-#line 161 "../enum.c"
+#line 166 "../enum.c"
   puts(_("  or an integer mask with any of the lower %d bits set\n"));
-#line 932 "../usage.c"
+#line 896 "../usage.c"
   puts(_("\t\t\t\t- is a set membership option\n"));
-#line 953 "../usage.c"
+#line 917 "../usage.c"
   puts(_("\t\t\t\t- must appear between %d and %d times\n"));
-#line 418 "../usage.c"
+#line 381 "../usage.c"
   puts(_("Options are specified by single or double hyphens and their name.\n"));
-#line 939 "../usage.c"
+#line 903 "../usage.c"
   puts(_("\t\t\t\t- may appear multiple times\n"));
-#line 926 "../usage.c"
+#line 890 "../usage.c"
   puts(_("\t\t\t\t- may not be preset\n"));
-#line 1336 "../usage.c"
+#line 1308 "../usage.c"
   puts(_("   Arg Option-Name    Description\n"));
-#line 1272 "../usage.c"
+#line 1244 "../usage.c"
   puts(_("  Flg Arg Option-Name    Description\n"));
-#line 1330 "../usage.c"
+#line 1302 "../usage.c"
   puts(_("  Flg Arg Option-Name    Description\n"));
-#line 1331 "../usage.c"
+#line 1303 "../usage.c"
   puts(_(" %3s %s"));
-#line 1337 "../usage.c"
+#line 1309 "../usage.c"
   puts(_(" %3s %s"));
-#line 423 "../usage.c"
+#line 386 "../usage.c"
   puts(_("The '-#<number>' option may omit the hash char\n"));
-#line 419 "../usage.c"
+#line 382 "../usage.c"
   puts(_("All arguments are named options.\n"));
-#line 1006 "../usage.c"
+#line 970 "../usage.c"
   puts(_(" - reading file %s"));
-#line 445 "../usage.c"
+#line 408 "../usage.c"
   puts(_("\n"
        "Please send bug reports to:  <%s>\n"));
 #line 100 "../version.c"
@@ -600,17 +600,17 @@ static void dummy_func(void) {
 #line 129 "../version.c"
   puts(_("\n"
        "Please send bug reports to:  <%s>\n"));
-#line 938 "../usage.c"
+#line 902 "../usage.c"
   puts(_("\t\t\t\t- may NOT appear - preset only\n"));
-#line 978 "../usage.c"
+#line 943 "../usage.c"
   puts(_("\n"
        "The following option preset mechanisms are supported:\n"));
-#line 1219 "../usage.c"
+#line 1191 "../usage.c"
   puts(_("\n"
        "The following option preset mechanisms are supported:\n"));
-#line 717 "../usage.c"
+#line 681 "../usage.c"
   puts(_("prohibits these options:\n"));
-#line 712 "../usage.c"
+#line 676 "../usage.c"
   puts(_("prohibits the option '%s'\n"));
 #line 81 "../numeric.c"
   puts(_("%s%ld to %ld"));
@@ -628,28 +628,28 @@ static void dummy_func(void) {
   puts(_("%sis scalable with a suffix: k/K/m/M/g/G/t/T\n"));
 #line 77 "../numeric.c"
   puts(_("%sless than or equal to %ld"));
-#line 426 "../usage.c"
+#line 389 "../usage.c"
   puts(_("Operands and options may be intermixed.  They will be reordered.\n"));
-#line 687 "../usage.c"
+#line 651 "../usage.c"
   puts(_("requires the option '%s'\n"));
-#line 690 "../usage.c"
+#line 654 "../usage.c"
   puts(_("requires these options:\n"));
-#line 1348 "../usage.c"
+#line 1320 "../usage.c"
   puts(_("   Arg Option-Name   Req?  Description\n"));
-#line 1342 "../usage.c"
+#line 1314 "../usage.c"
   puts(_("  Flg Arg Option-Name   Req?  Description\n"));
-#line 162 "../enum.c"
+#line 167 "../enum.c"
   puts(_("or you may use a numeric representation.  Preceding these with a '!'\n"
        "will clear the bits, specifying 'none' will clear all bits, and 'all'\n"
        "will set them all.  Multiple entries may be passed as an option\n"
        "argument list.\n"));
-#line 945 "../usage.c"
+#line 909 "../usage.c"
   puts(_("\t\t\t\t- may appear up to %d times\n"));
-#line 72 "../enum.c"
+#line 77 "../enum.c"
   puts(_("The valid \"%s\" option keywords are:\n"));
-#line 1181 "../usage.c"
+#line 1151 "../usage.c"
   puts(_("The next option supports vendor supported extra options:"));
-#line 808 "../usage.c"
+#line 772 "../usage.c"
   puts(_("These additional options are:"));
   /* END-USAGE-TEXT */
 }
index ec380bc8fa4eab4b1a509a2888eccc2fb63e4c5e..6554533d2a3abff2f175d3647f846fd173576fb3 100644 (file)
@@ -8,7 +8,7 @@
 
 static char *
 pathfind( char const * path,
-          char const * fileName,
+          char const * fname,
           char const * mode );
 
 #include "compat.h"
@@ -16,10 +16,10 @@ pathfind( char const * path,
 #if defined(__windows__) && !defined(__CYGWIN__)
 static char *
 pathfind( char const * path,
-          char const * fileName,
+          char const * fname,
           char const * mode )
 {
-    return NULL;
+    return strdup(fname);
 }
 #else
 
@@ -27,70 +27,22 @@ static char* make_absolute( char const *string, char const *dot_path );
 static char* canonicalize_pathname( char *path );
 static char* extract_colon_unit( char* dir, char const *string, int *p_index );
 
-
-/*=export_func pathfind
- *
- * what: fild a file in a list of directories
- *
- * ifndef: HAVE_PATHFIND
- *
- * arg:  + char const* + path + colon separated list of search directories +
- * arg:  + char const* + file + the name of the file to look for +
- * arg:  + char const* + mode + the mode bits that must be set to match +
- *
- * ret_type:  char*
- * ret_desc:  the path to the located file
- *
- * doc:
- *
- * pathfind looks for a a file with name "FILE" and "MODE" access
- * along colon delimited "PATH", and returns the full pathname as a
- * string, or NULL if not found.  If "FILE" contains a slash, then
- * it is treated as a relative or absolute path and "PATH" is ignored.
- *
- * @strong{NOTE}: this function is compiled into @file{libopts} only if
- * it is not natively supplied.
- *
- * The "MODE" argument is a string of option letters chosen from the
- * list below:
- * @example
- *          Letter    Meaning
- *          r         readable
- *          w         writable
- *          x         executable
- *          f         normal file       (NOT IMPLEMENTED)
- *          b         block special     (NOT IMPLEMENTED)
- *          c         character special (NOT IMPLEMENTED)
- *          d         directory         (NOT IMPLEMENTED)
- *          p         FIFO (pipe)       (NOT IMPLEMENTED)
- *          u         set user ID bit   (NOT IMPLEMENTED)
- *          g         set group ID bit  (NOT IMPLEMENTED)
- *          k         sticky bit        (NOT IMPLEMENTED)
- *          s         size nonzero      (NOT IMPLEMENTED)
- * @end example
- *
- * example:
- * To find the "ls" command using the "PATH" environment variable:
- * @example
- *    #include <stdlib.h>
- *    char* pz_ls = pathfind( getenv("PATH"), "ls", "rx" );
- *    <<do whatever with pz_ls>>
- *    free( pz_ls );
- * @end example
- * The path is allocated with @code{malloc(3C)}, so you must @code{free(3C)}
- * the result.  Also, do not use unimplemented file modes.  :-)
- *
- * err:  returns NULL if the file is not found.
-=*/
+/**
+ * local implementation of pathfind.
+ * @param[in] path  colon separated list of directories
+ * @param[in] fname the name we are hunting for
+ * @param[in] mode  the required file mode
+ * @returns an allocated string with the full path, or NULL
+ */
 static char *
 pathfind( char const * path,
-          char const * fileName,
+          char const * fname,
           char const * mode )
 {
-    int   p_index   = 0;
-    int   mode_bits = 0;
-    char* pathName  = NULL;
-    char  zPath[ AG_PATH_MAX + 1 ];
+    int    p_index   = 0;
+    int    mode_bits = 0;
+    char * res_path  = NULL;
+    char   zPath[ AG_PATH_MAX + 1 ];
 
     if (strchr( mode, 'r' )) mode_bits |= R_OK;
     if (strchr( mode, 'w' )) mode_bits |= W_OK;
@@ -103,9 +55,6 @@ pathfind( char const * path,
         DIR*  dirP;
         char* colon_unit = extract_colon_unit( zPath, path, &p_index );
 
-        /*
-         *  IF no more entries, THEN quit
-         */
         if (colon_unit == NULL)
             break;
 
@@ -117,9 +66,6 @@ pathfind( char const * path,
         if (dirP == NULL)
             continue;
 
-        /*
-         *  FOR every entry in the given directory, ...
-         */
         for (;;) {
             struct dirent *entP = readdir( dirP );
 
@@ -129,31 +75,31 @@ pathfind( char const * path,
             /*
              *  IF the file name matches the one we are looking for, ...
              */
-            if (strcmp( entP->d_name, fileName ) == 0) {
-                char* pzFullName = make_absolute( fileName, colon_unit);
+            if (strcmp(entP->d_name, fname) == 0) {
+                char * abs_name = make_absolute(fname, colon_unit);
 
                 /*
                  *  Make sure we can access it in the way we want
                  */
-                if (access( pzFullName, mode_bits ) >= 0) {
+                if (access(abs_name, mode_bits) >= 0) {
                     /*
                      *  We can, so normalize the name and return it below
                      */
-                    pathName = canonicalize_pathname( pzFullName );
+                    res_path = canonicalize_pathname(abs_name);
                 }
 
-                free( (void*)pzFullName );
+                free(abs_name);
                 break;
             }
         }
 
         closedir( dirP );
 
-        if (pathName != NULL)
+        if (res_path != NULL)
             break;
     }
 
-    return pathName;
+    return res_path;
 }
 
 /*
index 8c71111c5b5ef89203d0d64a02b62d110e284ec3..3b90cdc57aa606876d4b35a79616a29374af1ea2 100644 (file)
@@ -519,7 +519,7 @@ handle_cfg(tOptions * opts, tOptState * ost, char * txt, int dir)
     if (txt > pzEnd) {
     name_only:
         *pzEnd++ = NUL;
-        loadOptionLine(opts, ost, pzName, dir, OPTION_LOAD_UNCOOKED);
+        load_opt_line(opts, ost, pzName, dir, OPTION_LOAD_UNCOOKED);
         return pzEnd;
     }
 
@@ -575,7 +575,7 @@ handle_cfg(tOptions * opts, tOptState * ost, char * txt, int dir)
      *  "pzName" points to what looks like text for one option/configurable.
      *  It is NUL terminated.  Process it.
      */
-    loadOptionLine(opts, ost, pzName, dir, OPTION_LOAD_UNCOOKED);
+    load_opt_line(opts, ost, pzName, dir, OPTION_LOAD_UNCOOKED);
 
     return pzEnd;
 }
@@ -939,7 +939,7 @@ handle_struct(tOptions * opts, tOptState * ost, char * txt, int dir)
             return NULL;
         *txt = NUL;
         txt += 2;
-        loadOptionLine(opts, ost, pzName, dir, mode);
+        load_opt_line(opts, ost, pzName, dir, mode);
         return txt;
 
     case '>':
@@ -963,7 +963,7 @@ handle_struct(tOptions * opts, tOptState * ost, char * txt, int dir)
         return txt;
 
     /*
-     *  Rejoin the name and value for parsing by "loadOptionLine()".
+     *  Rejoin the name and value for parsing by "load_opt_line()".
      *  Erase any attributes parsed by "parse_attrs()".
      */
     memset(pcNulPoint, ' ', (size_t)(pzData - pcNulPoint));
@@ -980,7 +980,7 @@ handle_struct(tOptions * opts, tOptState * ost, char * txt, int dir)
      *  "pzName" points to what looks like text for one option/configurable.
      *  It is NUL terminated.  Process it.
      */
-    loadOptionLine(opts, ost, pzName, dir, mode);
+    load_opt_line(opts, ost, pzName, dir, mode);
 
     return txt;
 }
index 6529083b0c5a7ee6b4655716624578710ec61f51..4d52aa7361eddb41b024385c0e9f81aec91d60b7 100644 (file)
@@ -33,8 +33,6 @@
  *  13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239  COPYING.mbsd
  */
 
-static char const * pz_enum_err_fmt;
-
 /* = = = START-STATIC-FORWARD = = = */
 static void
 enum_err(tOptions * pOpts, tOptDesc * pOD,
@@ -49,8 +47,15 @@ set_memb_shell(tOptions * pOpts, tOptDesc * pOD, char const * const * paz_names,
                unsigned int name_ct);
 
 static void
-set_memb_names(tOptions * pOpts, tOptDesc * pOD, char const * const * paz_names,
-               unsigned int name_ct);
+set_memb_names(tOptions * opts, tOptDesc * od, char const * const * nm_list,
+               unsigned int nm_ct);
+
+static uintptr_t
+check_membership_start(tOptDesc * od, char const ** argp, bool * invert);
+
+static uintptr_t
+find_member_bit(tOptions * opts, tOptDesc * od, char const * pz, int len,
+                char const * const * nm_list, unsigned int nm_ct);
 /* = = = END-STATIC-FORWARD = = = */
 
 static void
@@ -360,16 +365,14 @@ set_memb_shell(tOptions * pOpts, tOptDesc * pOD, char const * const * paz_names,
 }
 
 static void
-set_memb_names(tOptions * pOpts, tOptDesc * pOD, char const * const * paz_names,
-               unsigned int name_ct)
+set_memb_names(tOptions * opts, tOptDesc * od, char const * const * nm_list,
+               unsigned int nm_ct)
 {
     char *     pz;
-    uintptr_t  bits = (uintptr_t)pOD->optCookie;
+    uintptr_t  mask = (1UL << (uintptr_t)nm_ct) - 1UL;
+    uintptr_t  bits = (uintptr_t)od->optCookie & mask;
     unsigned int ix = 0;
-    size_t     len  = NONE_STR_LEN + 1;
-
-    (void)pOpts;
-    bits &= ((uintptr_t)1 << (uintptr_t)name_ct) - (uintptr_t)1;
+    size_t     len  = 1;
 
     /*
      *  Replace the enumeration value with the name string.
@@ -377,46 +380,161 @@ set_memb_names(tOptions * pOpts, tOptDesc * pOD, char const * const * paz_names,
      */
     while (bits != 0) {
         if (bits & 1)
-            len += strlen(paz_names[ix]) + PLUS_STR_LEN + 1;
-        if (++ix >= name_ct) break;
+            len += strlen(nm_list[ix]) + PLUS_STR_LEN + 1;
+        if (++ix >= nm_ct) break;
         bits >>= 1;
     }
 
-    pOD->optArg.argString = pz = AGALOC(len, "enum");
+    od->optArg.argString = pz = AGALOC(len, "enum");
+    bits = (uintptr_t)od->optCookie & mask;
+    if (bits == 0) {
+        *pz = NUL;
+        return;
+    }
 
-    /*
-     *  Start by clearing all the bits.  We want to turn off any defaults
-     *  because we will be restoring to current state, not adding to
-     *  the default set of bits.
-     */
-    memcpy(pz, NONE_STR, NONE_STR_LEN);
-    pz += NONE_STR_LEN;
-    bits = (uintptr_t)pOD->optCookie;
-    bits &= ((uintptr_t)1 << (uintptr_t)name_ct) - (uintptr_t)1;
-    ix = 0;
+    for (ix = 0; ; ix++) {
+        size_t nln;
+        int    doit = bits & 1;
 
-    while (bits != 0) {
-        if (bits & 1) {
-            size_t nln = strlen(paz_names[ix]);
-            memcpy(pz, PLUS_STR, PLUS_STR_LEN);
-            memcpy(pz+PLUS_STR_LEN, paz_names[ix], nln);
-            pz += nln + PLUS_STR_LEN;
-        }
-        if (++ix >= name_ct) break;
         bits >>= 1;
+        if (doit == 0)
+            continue;
+
+        nln = strlen(nm_list[ix]);
+        memcpy(pz, nm_list[ix], nln);
+        pz += nln;
+        if (bits == 0)
+            break;
+        memcpy(pz, PLUS_STR, PLUS_STR_LEN);
+        pz += PLUS_STR_LEN;
     }
     *pz = NUL;
+    (void)opts;
+}
+
+/**
+ * Check membership start conditions.  An equal character (@samp{=}) says to
+ * clear the result and not carry over any residual value.  A carat
+ * (@samp{^}), which may follow the equal character, says to invert the
+ * result.  The scanning pointer is advanced past these characters and any
+ * leading white space.  Invalid sequences are indicated by setting the
+ * scanning pointer to NULL.
+ *
+ * @param od      the set membership option description
+ * @param argp    a pointer to the string scanning pointer
+ * @param invert  a pointer to the boolean inversion indicator
+ *
+ * @returns either zero or the original value for the optCookie.
+ */
+static uintptr_t
+check_membership_start(tOptDesc * od, char const ** argp, bool * invert)
+{
+    uintptr_t    res = (uintptr_t)od->optCookie;
+    char const * arg = SPN_WHITESPACE_CHARS(od->optArg.argString);
+    if ((arg == NULL) || (*arg == NUL))
+        goto member_start_fail;
+
+    *invert = false;
+
+    switch (*arg) {
+    case '=':
+        res = 0UL;
+        arg = SPN_WHITESPACE_CHARS(arg + 1);
+        switch (*arg) {
+        case '=': case ',':
+            goto member_start_fail;
+        case '^':
+            goto inversion;
+        default:
+            break;
+        }
+        break;
+
+    case '^':
+    inversion:
+        *invert = true;
+        arg = SPN_WHITESPACE_CHARS(arg + 1);
+        if (*arg != ',')
+            break;
+        /* FALLTHROUGH */
+
+    case ',':
+        goto member_start_fail;
+
+    default:
+        break;
+    }
+
+    *argp = arg;
+    return res;
+
+member_start_fail:
+    *argp = NULL;
+    return 0UL;
+}
+
+/**
+ * convert a name to a bit.  Look up a name string to get a bit number
+ * and shift the value "1" left that number of bits.
+ *
+ * @param opts      program options descriptor
+ * @param od        the set membership option description
+ * @param pz        address of the start of the bit name
+ * @param nm_list   the list of names for this option
+ * @param nm_ct     the number of entries in this list
+ *
+ * @returns 0UL on error, other an unsigned long with the correct bit set.
+ */
+static uintptr_t
+find_member_bit(tOptions * opts, tOptDesc * od, char const * pz, int len,
+                char const * const * nm_list, unsigned int nm_ct)
+{
+    char nm_buf[ AO_NAME_SIZE ];
+
+    memcpy(nm_buf, pz, len);
+    nm_buf[len] = NUL;
+
+    {
+        unsigned int shift_ct = (unsigned int)
+            find_name(nm_buf, opts, od, nm_list, nm_ct);
+        if (shift_ct >= nm_ct)
+            return 0UL;
+
+        return 1UL << shift_ct;
+    }
+}
+
+/*=export_func  optionMemberList
+ * what:  Get the list of members of a bit mask set
+ *
+ * arg:   tOptDesc *,  od,   the set membership option description
+ *
+ * ret_type: char*
+ * ret_desc: the names of the set bits
+ *
+ * doc:   This converts the OPT_VALUE_name mask value to a allocated string.
+ *        It is the caller's responsibility to free the string.
+=*/
+char *
+optionMemberList(tOptDesc * od)
+{
+    uintptr_t    sv = od->optArg.argIntptr;
+    char * res;
+    (*(od->pOptProc))(OPTPROC_RETURN_VALNAME, od);
+    res = (void *)od->optArg.argString;
+    od->optArg.argIntptr = sv;
+    return res;
 }
 
 /*=export_func  optionSetMembers
  * what:  Convert between bit flag values and strings
  * private:
  *
- * arg:   tOptions*,     pOpts,     the program options descriptor
- * arg:   tOptDesc*,     pOD,       enumeration option description
+ * arg:   tOptions*,     opts,     the program options descriptor
+ * arg:   tOptDesc*,     od,       the set membership option description
  * arg:   char const * const *,
- *                       paz_names, list of enumeration names
- * arg:   unsigned int,  name_ct,   number of names in list
+ *                       nm_list,  list of enumeration names
+ * arg:   unsigned int,  nm_ct,    number of names in list
  *
  * doc:   This converts the optArg.argString string from the option description
  *        into the index corresponding to an entry in the name list.
@@ -425,105 +543,103 @@ set_memb_names(tOptions * pOpts, tOptDesc * pOD, char const * const * paz_names,
  *        if there is only one partial match.
 =*/
 void
-optionSetMembers(tOptions * pOpts, tOptDesc * pOD,
-                 char const* const * paz_names, unsigned int name_ct)
+optionSetMembers(tOptions * opts, tOptDesc * od,
+                 char const * const * nm_list, unsigned int nm_ct)
 {
     /*
      *  IF the program option descriptor pointer is invalid,
      *  then it is some sort of special request.
      */
-    switch ((uintptr_t)pOpts) {
+    switch ((uintptr_t)opts) {
     case (uintptr_t)OPTPROC_EMIT_USAGE:
-        enum_err(OPTPROC_EMIT_USAGE, pOD, paz_names, name_ct);
+        enum_err(OPTPROC_EMIT_USAGE, od, nm_list, nm_ct);
         return;
 
     case (uintptr_t)OPTPROC_EMIT_SHELL:
-        set_memb_shell(pOpts, pOD, paz_names, name_ct);
+        set_memb_shell(opts, od, nm_list, nm_ct);
         return;
 
     case (uintptr_t)OPTPROC_RETURN_VALNAME:
-        set_memb_names(pOpts, pOD, paz_names, name_ct);
+        set_memb_names(opts, od, nm_list, nm_ct);
         return;
 
     default:
         break;
     }
 
-    if ((pOD->fOptState & OPTST_RESET) != 0)
+    if ((od->fOptState & OPTST_RESET) != 0)
         return;
 
     {
-        char const * pzArg = pOD->optArg.argString;
-        uintptr_t res;
-        if ((pzArg == NULL) || (*pzArg == NUL)) {
-            pOD->optCookie = (void*)0;
-            return;
-        }
-
-        res = (uintptr_t)pOD->optCookie;
-        for (;;) {
-            int  iv, len;
-
-            pzArg = SPN_SET_SEPARATOR_CHARS(pzArg);
-            iv = (*pzArg == '!');
-            if (iv)
-                pzArg = SPN_WHITESPACE_CHARS(pzArg+1);
+        char const * arg;
+        bool         invert;
+        uintptr_t    res = check_membership_start(od, &arg, &invert);
+        if (arg == NULL)
+            goto fail_return;
+
+        while (*arg != NUL) {
+            bool inv_val = false;
+            int  len;
+
+            switch (*arg) {
+            case ',':
+                arg = SPN_WHITESPACE_CHARS(arg+1);
+                if ((*arg == ',') || (*arg == '|'))
+                    goto fail_return;
+                continue;
+
+            case '-':
+            case '!':
+                inv_val = true;
+                /* FALLTHROUGH */
+
+            case '+':
+            case '|':
+                arg = SPN_WHITESPACE_CHARS(arg+1);
+            }
 
-            len = (int)(BRK_SET_SEPARATOR_CHARS(pzArg) - pzArg);
+            len = (int)(BRK_SET_SEPARATOR_CHARS(arg) - arg);
             if (len == 0)
                 break;
 
-            if ((len == 3) && (strncmp(pzArg, zAll, 3) == 0)) {
-                if (iv)
+            if ((len == 3) && (strncmp(arg, zAll, 3) == 0)) {
+                if (inv_val)
                      res = 0;
                 else res = ~0UL;
             }
-            else if ((len == 4) && (strncmp(pzArg, zNone, 4) == 0)) {
-                if (! iv)
+            else if ((len == 4) && (strncmp(arg, zNone, 4) == 0)) {
+                if (! inv_val)
                     res = 0;
             }
             else do {
-                char* pz;
-                uintptr_t bit = strtoul(pzArg, &pz, 0);
-
-                if (pz != pzArg + len) {
-                    char z[ AO_NAME_SIZE ];
-                    char const* p;
-                    unsigned int shift_ct;
-
-                    if (*pz != NUL) {
-                        if (len >= AO_NAME_LIMIT)
-                            break;
-                        memcpy(z, pzArg, (size_t)len);
-                        z[len] = NUL;
-                        p = z;
-                    } else {
-                        p = pzArg;
-                    }
-
-                    shift_ct = (unsigned int)
-                        find_name(p, pOpts, pOD, paz_names, name_ct);
-                    if (shift_ct >= name_ct) {
-                        pOD->optCookie = (void*)0;
-                        return;
-                    }
-                    bit = 1UL << shift_ct;
+                char *    pz;
+                uintptr_t bit = strtoul(arg, &pz, 0);
+
+                if (pz != arg + len) {
+                    bit = find_member_bit(opts, od, pz, len, nm_list, nm_ct);
+                    if (bit == 0UL)
+                        goto fail_return;
                 }
-                if (iv)
+                if (inv_val)
                      res &= ~bit;
                 else res |= bit;
             } while (false);
 
-            if (pzArg[len] == NUL)
-                break;
-            pzArg += len + 1;
-        }
-        if (name_ct < (8 * sizeof(uintptr_t))) {
-            res &= (1UL << name_ct) - 1UL;
+            arg = SPN_WHITESPACE_CHARS(arg + len);
         }
 
-        pOD->optCookie = (void*)res;
+        if (invert)
+            res ^= ~0UL;
+
+        if (nm_ct < (8 * sizeof(uintptr_t)))
+            res &= (1UL << nm_ct) - 1UL;
+
+        od->optCookie = (void *)res;
     }
+    return;
+
+fail_return:
+    od->optCookie = (void *)0;
 }
 
 /** @}
index e3534291d1e6a396433b77391a154bb4e6b71f09..1ba504ebc31d5e71c774f7cf55d1e6e8c01495ad 100644 (file)
@@ -107,6 +107,9 @@ opt_ambiguities(tOptions * opts, char const * name, int nm_len)
 
     fputs(zambig_list_msg, stderr);
     do  {
+        if (pOD->pz_Name == NULL)
+            continue; /* doc option */
+
         if (strneqvcmp(name, pOD->pz_Name, nm_len) == 0)
             fprintf(stderr, zambig_file, hyph, pOD->pz_Name);
 
@@ -375,7 +378,10 @@ opt_find_long(tOptions * opts, char const * opt_name, tOptState * state)
     bool    disable  = false;
     int     ct;
 
-    if (nm_len <= 0) {
+    if (nm_len <= 1) {
+        if ((opts->fOptSet & OPTPROC_ERRSTOP) == 0)
+            return FAILURE;
+        
         fprintf(stderr, zInvalOptName, opts->pzProgName, opt_name);
         (*opts->pUsageProc)(opts, EXIT_FAILURE);
         /* NOTREACHED */
@@ -418,6 +424,9 @@ opt_find_short(tOptions* pOpts, uint_t optValue, tOptState* pOptState)
         if (SKIP_OPT(pRes)) {
             if (  (pRes->fOptState == (OPTST_OMITTED | OPTST_NO_INIT))
                && (pRes->pz_Name != NULL)) {
+                if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0)
+                    return FAILURE;
+        
                 fprintf(stderr, zDisabledErr, pOpts->pzProgPath, pRes->pz_Name);
                 if (pRes->pzText != NULL)
                     fprintf(stderr, SET_OFF_FMT, pRes->pzText);
@@ -500,7 +509,7 @@ get_opt_arg_must(tOptions * opts, tOptState * o_st)
     default:
 #ifdef DEBUG
         fputs("AutoOpts lib error: option type not selected\n", stderr);
-        exit(EXIT_FAILURE);
+        option_exits(EXIT_FAILURE);
 #endif
 
     case TOPT_DEFAULT:
index 3d4f63be3078b79fffeb81cecb7c311302dfb35b..173704ee0391606ca3f98b9f54387e01fb1d7303 100644 (file)
@@ -2,11 +2,11 @@
  *
  *  DO NOT EDIT THIS FILE   (genshell.c)
  *
- *  It has been AutoGen-ed  March 31, 2013 at 10:41:27 AM by AutoGen 5.17.3
+ *  It has been AutoGen-ed  July 14, 2013 at 05:37:09 PM by AutoGen 5.18
  *  From the definitions    genshell.def
  *  and the template file   options
  *
- * Generated from AutoOpts 38:0:13 templates.
+ * Generated from AutoOpts 40:0:15 templates.
  *
  *  AutoOpts is a copyrighted work.  This source file is not encumbered
  *  by AutoOpts licensing, but is provided under the licensing terms chosen
@@ -146,8 +146,8 @@ static char const genshellopt_opt_strs[1769] =
 #define MORE_HELP_name  (genshellopt_opt_strs+1134)
 #define MORE_HELP_FLAGS (OPTST_IMM | OPTST_NO_INIT)
 #else
-#define MORE_HELP_DESC  NULL
-#define MORE_HELP_name  NULL
+#define MORE_HELP_DESC  HELP_DESC
+#define MORE_HELP_name  HELP_name
 #define MORE_HELP_FLAGS (OPTST_OMITTED | OPTST_NO_INIT)
 #endif
 #ifdef NO_OPTIONAL_OPT_ARGS
@@ -258,7 +258,7 @@ static tOptDesc optDesc[GENSHELL_OPTION_CT] = {
 #define zDetail         (genshellopt_opt_strs+1534)
 /** The full version string for genshellopt. */
 #define zFullVersion    (genshellopt_opt_strs+1755)
-/* extracted from optcode.tlib near line 371 */
+/* extracted from optcode.tlib near line 364 */
 
 #if defined(ENABLE_NLS)
 # define OPTPROC_BASE OPTPROC_TRANSLATE
@@ -279,19 +279,21 @@ static tOptDesc optDesc[GENSHELL_OPTION_CT] = {
 /**
  * The callout function that invokes the genshelloptUsage function.
  *
- * @param[in] pOptions the AutoOpts option description structure
- * @param[in] pOptDesc the descriptor for the "help" (usage) option.
+ * @param[in] opts the AutoOpts option description structure
+ * @param[in] od   the descriptor for the "help" (usage) option.
  * @noreturn
  */
 static void
-doUsageOpt(tOptions * pOptions, tOptDesc * pOptDesc)
+doUsageOpt(tOptions * opts, tOptDesc * od)
 {
-    genshelloptUsage(&genshelloptOptions, GENSHELLOPT_EXIT_SUCCESS);
+    int ex_code;
+    ex_code = GENSHELLOPT_EXIT_SUCCESS;
+    genshelloptUsage(&genshelloptOptions, ex_code);
     /* NOTREACHED */
-    (void)pOptDesc;
-    (void)pOptions;
+    (void)opts;
+    (void)od;
 }
-/* extracted from optmain.tlib near line 1254 */
+/* extracted from optmain.tlib near line 1266 */
 
 /**
  * The directory containing the data associated with genshellopt.
@@ -474,10 +476,10 @@ translate_option_strings(void)
 static void bogus_function(void) {
   /* TRANSLATORS:
 
-     The following dummy function was crated solely so that xgettext can extract
-     the correct strings.  These strings are actually referenced by a field name
-     in the genshelloptOptions structure noted in the comments below.  The
-     literal text is defined in genshellopt_opt_strs.
+     The following dummy function was crated solely so that xgettext can
+     extract the correct strings.  These strings are actually referenced
+     by a field name in the genshelloptOptions structure noted in the
+     comments below.  The literal text is defined in genshellopt_opt_strs.
    
      NOTE: the strings below are segmented with respect to the source string
      genshellopt_opt_strs.  The strings above are handed off for translation
@@ -546,51 +548,51 @@ by the newly generated text.  The first '#!' line will be regenerated.\n"));
   /* referenced via genshelloptOptions.pzShortUsage */
   puts(_("<<<NOT-FOUND>>>"));
   /* LIBOPTS-MESSAGES: */
-#line 60 "../autoopts.c"
+#line 67 "../autoopts.c"
   puts(_("allocation of %d bytes failed\n"));
-#line 86 "../autoopts.c"
+#line 93 "../autoopts.c"
   puts(_("allocation of %d bytes failed\n"));
 #line 53 "../init.c"
   puts(_("AutoOpts function called without option descriptor\n"));
-#line 89 "../init.c"
+#line 90 "../init.c"
   puts(_("\tThis exceeds the compiled library version:  "));
-#line 87 "../init.c"
+#line 88 "../init.c"
   puts(_("Automated Options Processing Error!\n"
        "\t%s called AutoOpts function with structure version %d:%d:%d.\n"));
-#line 73 "../autoopts.c"
+#line 80 "../autoopts.c"
   puts(_("realloc of %d bytes at 0x%p failed\n"));
-#line 91 "../init.c"
+#line 92 "../init.c"
   puts(_("\tThis is less than the minimum library version:  "));
 #line 121 "../version.c"
   puts(_("Automated Options version %s\n"
        "\tCopyright (C) 1999-2013 by Bruce Korb - all rights reserved\n"));
-#line 310 "../usage.c"
+#line 82 "../makeshell.c"
   puts(_("(AutoOpts bug):  %s.\n"));
 #line 90 "../reset.c"
   puts(_("optionResetOpt() called, but reset-option not configured"));
-#line 329 "../usage.c"
+#line 292 "../usage.c"
   puts(_("could not locate the 'help' option"));
-#line 351 "../autoopts.c"
+#line 336 "../autoopts.c"
   puts(_("optionProcess() was called with invalid data"));
-#line 783 "../usage.c"
+#line 747 "../usage.c"
   puts(_("invalid argument type specified"));
-#line 589 "../find.c"
+#line 598 "../find.c"
   puts(_("defaulted to option with optional arg"));
 #line 76 "../alias.c"
   puts(_("aliasing option is out of range."));
-#line 229 "../enum.c"
+#line 234 "../enum.c"
   puts(_("%s error:  the keyword '%s' is ambiguous for %s\n"));
 #line 108 "../find.c"
   puts(_("  The following options match:\n"));
-#line 290 "../find.c"
+#line 293 "../find.c"
   puts(_("%s: ambiguous option name: %s (matches %d options)\n"));
 #line 161 "../check.c"
   puts(_("%s: Command line arguments required\n"));
 #line 43 "../alias.c"
   puts(_("%d %s%s options allowed\n"));
-#line 81 "../makeshell.c"
+#line 89 "../makeshell.c"
   puts(_("%s error %d (%s) calling %s for '%s'\n"));
-#line 293 "../makeshell.c"
+#line 301 "../makeshell.c"
   puts(_("interprocess pipe"));
 #line 168 "../version.c"
   puts(_("error: version option argument '%c' invalid.  Use:\n"
@@ -599,48 +601,48 @@ by the newly generated text.  The first '#!' line will be regenerated.\n"));
        "\t'n' - version and full copyright notice\n"));
 #line 58 "../check.c"
   puts(_("%s error:  the '%s' and '%s' options conflict\n"));
-#line 214 "../find.c"
+#line 217 "../find.c"
   puts(_("%s: The '%s' option has been disabled."));
-#line 421 "../find.c"
+#line 430 "../find.c"
   puts(_("%s: The '%s' option has been disabled."));
 #line 38 "../alias.c"
   puts(_("-equivalence"));
-#line 460 "../find.c"
+#line 469 "../find.c"
   puts(_("%s: illegal option -- %c\n"));
 #line 110 "../reset.c"
   puts(_("%s: illegal option -- %c\n"));
-#line 268 "../find.c"
+#line 271 "../find.c"
   puts(_("%s: illegal option -- %s\n"));
-#line 746 "../find.c"
+#line 755 "../find.c"
   puts(_("%s: illegal option -- %s\n"));
 #line 118 "../reset.c"
   puts(_("%s: illegal option -- %s\n"));
-#line 332 "../find.c"
+#line 335 "../find.c"
   puts(_("%s: unknown vendor extension option -- %s\n"));
-#line 154 "../enum.c"
+#line 159 "../enum.c"
   puts(_("  or an integer from %d through %d\n"));
-#line 164 "../enum.c"
+#line 169 "../enum.c"
   puts(_("  or an integer from %d through %d\n"));
-#line 782 "../usage.c"
+#line 746 "../usage.c"
   puts(_("%s error:  invalid option descriptor for %s\n"));
-#line 1110 "../usage.c"
+#line 1080 "../usage.c"
   puts(_("%s error:  invalid option descriptor for %s\n"));
-#line 379 "../find.c"
+#line 385 "../find.c"
   puts(_("%s: invalid option name: %s\n"));
-#line 518 "../find.c"
+#line 527 "../find.c"
   puts(_("%s: The '%s' option requires an argument.\n"));
-#line 171 "../autoopts.c"
+#line 156 "../autoopts.c"
   puts(_("(AutoOpts bug):  Equivalenced option '%s' was equivalenced to both\n"
        "\t'%s' and '%s'."));
 #line 94 "../check.c"
   puts(_("%s error:  The %s option is required\n"));
-#line 623 "../find.c"
+#line 632 "../find.c"
   puts(_("%s: The '%s' option cannot have an argument.\n"));
 #line 151 "../check.c"
   puts(_("%s: Command line arguments are not allowed.\n"));
-#line 531 "../save.c"
+#line 535 "../save.c"
   puts(_("error %d (%s) creating %s\n"));
-#line 229 "../enum.c"
+#line 234 "../enum.c"
   puts(_("%s error:  '%s' does not match any %s keywords.\n"));
 #line 93 "../reset.c"
   puts(_("%s error: The '%s' option requires an argument.\n"));
@@ -650,7 +652,7 @@ by the newly generated text.  The first '#!' line will be regenerated.\n"));
   puts(_("error %d (%s) stat-ing %s\n"));
 #line 143 "../restore.c"
   puts(_("%s error: no saved option state\n"));
-#line 246 "../autoopts.c"
+#line 231 "../autoopts.c"
   puts(_("'%s' is not a command line option.\n"));
 #line 114 "../time.c"
   puts(_("%s error:  '%s' is not a recognizable date/time.\n"));
@@ -662,41 +664,41 @@ by the newly generated text.  The first '#!' line will be regenerated.\n"));
   puts(_("%s error:  The %s option must appear %d times.\n"));
 #line 157 "../numeric.c"
   puts(_("%s error:  '%s' is not a recognizable number.\n"));
-#line 195 "../enum.c"
+#line 200 "../enum.c"
   puts(_("%s error:  %s exceeds %s keyword count\n"));
-#line 366 "../usage.c"
+#line 329 "../usage.c"
   puts(_("Try '%s %s' for more information.\n"));
 #line 45 "../alias.c"
   puts(_("one %s%s option allowed\n"));
-#line 195 "../makeshell.c"
+#line 203 "../makeshell.c"
   puts(_("standard output"));
-#line 930 "../makeshell.c"
+#line 938 "../makeshell.c"
   puts(_("standard output"));
-#line 304 "../usage.c"
+#line 274 "../usage.c"
   puts(_("standard output"));
-#line 451 "../usage.c"
+#line 414 "../usage.c"
   puts(_("standard output"));
-#line 660 "../usage.c"
+#line 624 "../usage.c"
   puts(_("standard output"));
 #line 175 "../version.c"
   puts(_("standard output"));
-#line 304 "../usage.c"
+#line 274 "../usage.c"
   puts(_("standard error"));
-#line 451 "../usage.c"
+#line 414 "../usage.c"
   puts(_("standard error"));
-#line 660 "../usage.c"
+#line 624 "../usage.c"
   puts(_("standard error"));
 #line 175 "../version.c"
   puts(_("standard error"));
-#line 195 "../makeshell.c"
+#line 203 "../makeshell.c"
   puts(_("write"));
-#line 930 "../makeshell.c"
+#line 938 "../makeshell.c"
   puts(_("write"));
-#line 303 "../usage.c"
+#line 273 "../usage.c"
   puts(_("write"));
-#line 450 "../usage.c"
+#line 413 "../usage.c"
   puts(_("write"));
-#line 659 "../usage.c"
+#line 623 "../usage.c"
   puts(_("write"));
 #line 174 "../version.c"
   puts(_("write"));
@@ -712,70 +714,70 @@ by the newly generated text.  The first '#!' line will be regenerated.\n"));
   puts(_("%s warning:  cannot save options - %s not regular file\n"));
 #line 256 "../save.c"
   puts(_("%s warning:  cannot save options - %s not regular file\n"));
-#line 530 "../save.c"
+#line 534 "../save.c"
   puts(_("%s warning:  cannot save options - %s not regular file\n"));
   /* END-LIBOPTS-MESSAGES */
 
   /* USAGE-TEXT: */
-#line 908 "../usage.c"
+#line 872 "../usage.c"
   puts(_("\t\t\t\t- an alternate for '%s'\n"));
-#line 1177 "../usage.c"
+#line 1147 "../usage.c"
   puts(_("Version, usage and configuration options:"));
-#line 959 "../usage.c"
+#line 923 "../usage.c"
   puts(_("\t\t\t\t- default option for unnamed options\n"));
-#line 872 "../usage.c"
+#line 836 "../usage.c"
   puts(_("\t\t\t\t- disabled as '--%s'\n"));
-#line 1146 "../usage.c"
+#line 1116 "../usage.c"
   puts(_(" --- %-14s %s\n"));
-#line 1144 "../usage.c"
+#line 1114 "../usage.c"
   puts(_("This option has been disabled"));
-#line 899 "../usage.c"
+#line 863 "../usage.c"
   puts(_("\t\t\t\t- enabled by default\n"));
 #line 40 "../alias.c"
   puts(_("%s error:  only "));
-#line 1221 "../usage.c"
+#line 1193 "../usage.c"
   puts(_(" - examining environment variables named %s_*\n"));
 #line 168 "../file.c"
   puts(_("\t\t\t\t- file must not pre-exist\n"));
 #line 172 "../file.c"
   puts(_("\t\t\t\t- file must pre-exist\n"));
-#line 416 "../usage.c"
+#line 379 "../usage.c"
   puts(_("Options are specified by doubled hyphens and their name or by a single\n"
        "hyphen and the flag character.\n"));
-#line 908 "../makeshell.c"
+#line 916 "../makeshell.c"
   puts(_("\n"
        "= = = = = = = =\n\n"
        "This incarnation of genshell will produce\n"
        "a shell script to parse the options for %s:\n\n"));
-#line 161 "../enum.c"
+#line 166 "../enum.c"
   puts(_("  or an integer mask with any of the lower %d bits set\n"));
-#line 932 "../usage.c"
+#line 896 "../usage.c"
   puts(_("\t\t\t\t- is a set membership option\n"));
-#line 953 "../usage.c"
+#line 917 "../usage.c"
   puts(_("\t\t\t\t- must appear between %d and %d times\n"));
-#line 418 "../usage.c"
+#line 381 "../usage.c"
   puts(_("Options are specified by single or double hyphens and their name.\n"));
-#line 939 "../usage.c"
+#line 903 "../usage.c"
   puts(_("\t\t\t\t- may appear multiple times\n"));
-#line 926 "../usage.c"
+#line 890 "../usage.c"
   puts(_("\t\t\t\t- may not be preset\n"));
-#line 1336 "../usage.c"
+#line 1308 "../usage.c"
   puts(_("   Arg Option-Name    Description\n"));
-#line 1272 "../usage.c"
+#line 1244 "../usage.c"
   puts(_("  Flg Arg Option-Name    Description\n"));
-#line 1330 "../usage.c"
+#line 1302 "../usage.c"
   puts(_("  Flg Arg Option-Name    Description\n"));
-#line 1331 "../usage.c"
+#line 1303 "../usage.c"
   puts(_(" %3s %s"));
-#line 1337 "../usage.c"
+#line 1309 "../usage.c"
   puts(_(" %3s %s"));
-#line 423 "../usage.c"
+#line 386 "../usage.c"
   puts(_("The '-#<number>' option may omit the hash char\n"));
-#line 419 "../usage.c"
+#line 382 "../usage.c"
   puts(_("All arguments are named options.\n"));
-#line 1006 "../usage.c"
+#line 970 "../usage.c"
   puts(_(" - reading file %s"));
-#line 445 "../usage.c"
+#line 408 "../usage.c"
   puts(_("\n"
        "Please send bug reports to:  <%s>\n"));
 #line 100 "../version.c"
@@ -784,17 +786,17 @@ by the newly generated text.  The first '#!' line will be regenerated.\n"));
 #line 129 "../version.c"
   puts(_("\n"
        "Please send bug reports to:  <%s>\n"));
-#line 938 "../usage.c"
+#line 902 "../usage.c"
   puts(_("\t\t\t\t- may NOT appear - preset only\n"));
-#line 978 "../usage.c"
+#line 943 "../usage.c"
   puts(_("\n"
        "The following option preset mechanisms are supported:\n"));
-#line 1219 "../usage.c"
+#line 1191 "../usage.c"
   puts(_("\n"
        "The following option preset mechanisms are supported:\n"));
-#line 717 "../usage.c"
+#line 681 "../usage.c"
   puts(_("prohibits these options:\n"));
-#line 712 "../usage.c"
+#line 676 "../usage.c"
   puts(_("prohibits the option '%s'\n"));
 #line 81 "../numeric.c"
   puts(_("%s%ld to %ld"));
@@ -812,28 +814,28 @@ by the newly generated text.  The first '#!' line will be regenerated.\n"));
   puts(_("%sis scalable with a suffix: k/K/m/M/g/G/t/T\n"));
 #line 77 "../numeric.c"
   puts(_("%sless than or equal to %ld"));
-#line 426 "../usage.c"
+#line 389 "../usage.c"
   puts(_("Operands and options may be intermixed.  They will be reordered.\n"));
-#line 687 "../usage.c"
+#line 651 "../usage.c"
   puts(_("requires the option '%s'\n"));
-#line 690 "../usage.c"
+#line 654 "../usage.c"
   puts(_("requires these options:\n"));
-#line 1348 "../usage.c"
+#line 1320 "../usage.c"
   puts(_("   Arg Option-Name   Req?  Description\n"));
-#line 1342 "../usage.c"
+#line 1314 "../usage.c"
   puts(_("  Flg Arg Option-Name   Req?  Description\n"));
-#line 162 "../enum.c"
+#line 167 "../enum.c"
   puts(_("or you may use a numeric representation.  Preceding these with a '!'\n"
        "will clear the bits, specifying 'none' will clear all bits, and 'all'\n"
        "will set them all.  Multiple entries may be passed as an option\n"
        "argument list.\n"));
-#line 945 "../usage.c"
+#line 909 "../usage.c"
   puts(_("\t\t\t\t- may appear up to %d times\n"));
-#line 72 "../enum.c"
+#line 77 "../enum.c"
   puts(_("The valid \"%s\" option keywords are:\n"));
-#line 1181 "../usage.c"
+#line 1151 "../usage.c"
   puts(_("The next option supports vendor supported extra options:"));
-#line 808 "../usage.c"
+#line 772 "../usage.c"
   puts(_("These additional options are:"));
   /* END-USAGE-TEXT */
 }
index 37ecc3bc7bea22cd1c7aea3dad1647173142b544..dd5b75426b894078504edaca9c3b5001b6bc79e0 100644 (file)
@@ -2,11 +2,11 @@
  *
  *  DO NOT EDIT THIS FILE   (genshell.h)
  *
- *  It has been AutoGen-ed  March 31, 2013 at 10:41:27 AM by AutoGen 5.17.3
+ *  It has been AutoGen-ed  July 14, 2013 at 05:37:09 PM by AutoGen 5.18
  *  From the definitions    genshell.def
  *  and the template file   options
  *
- * Generated from AutoOpts 38:0:13 templates.
+ * Generated from AutoOpts 40:0:15 templates.
  *
  *  AutoOpts is a copyrighted work.  This header file is not encumbered
  *  by AutoOpts licensing, but is provided under the licensing terms chosen
@@ -55,7 +55,7 @@
  *  tolerable version is at least as old as what was current when the header
  *  template was released.
  */
-#define AO_TEMPLATE_VERSION 155648
+#define AO_TEMPLATE_VERSION 163840
 #if (AO_TEMPLATE_VERSION < OPTIONS_MINIMUM_VERSION) \
  || (AO_TEMPLATE_VERSION > OPTIONS_STRUCT_VERSION)
 # error option template version mismatches autoopts/options.h header
@@ -87,7 +87,7 @@ typedef enum {
 #define GENSHELL_DESC(n) (genshelloptOptions.pOptDesc[INDEX_GENSHELL_OPT_## n])
 /** 'true' if an option has been specified in any way */
 #define     HAVE_GENSHELL_OPT(n) (! UNUSED_OPT(& GENSHELL_DESC(n)))
-/** The string argument to an option. The argument type must be "string". */
+/** The string argument to an option. The argument type must be \"string\". */
 #define      GENSHELL_OPT_ARG(n) (GENSHELL_DESC(n).optArg.argString)
 /** Mask the option state revealing how an option was specified.
  *  It will be one and only one of \a OPTST_SET, \a OPTST_PRESET,
@@ -114,18 +114,16 @@ typedef enum {
                 if ((GENSHELL_DESC(n).fOptState & OPTST_INITENABLED) == 0) \
                     GENSHELL_DESC(n).fOptState |= OPTST_DISABLED; \
                 GENSHELL_DESC(n).optCookie = NULL )
-
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /**
  *  Enumeration of genshellopt exit codes
  */
 typedef enum {
-    GENSHELLOPT_EXIT_SUCCESS        = 0,
-    GENSHELLOPT_EXIT_FAILURE        = 1,
-    GENSHELLOPT_EXIT_USAGE_ERROR    = 64,
+    GENSHELLOPT_EXIT_SUCCESS         = 0,
+    GENSHELLOPT_EXIT_FAILURE         = 1,
+    GENSHELLOPT_EXIT_USAGE_ERROR     = 64,
     GENSHELLOPT_EXIT_LIBOPTS_FAILURE = 70
-} genshellopt_exit_code_t;
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+}   genshellopt_exit_code_t;
 /**
  *  Interface defines for specific options.
  * @{
@@ -148,7 +146,6 @@ typedef enum {
                 genshelloptOptions.pzCurOpt  = NULL )
 #define START_GENSHELL_OPT       RESTART_GENSHELL_OPT(1)
 #define GENSHELL_USAGE(c)        (*genshelloptOptions.pUsageProc)(&genshelloptOptions, c)
-/* extracted from opthead.tlib near line 538 */
 
 #ifdef  __cplusplus
 extern "C" {
@@ -203,4 +200,5 @@ static inline char* aoGetsText(char const* pz) {
 }
 #endif
 #endif /* AUTOOPTS_GENSHELL_H_GUARD */
+
 /* genshell.h ends here */
index 5cd8d6d1e8f2fd596c084829dfddd25c8fdfaa9e..e059b209917d2e4b8737bfea7d1d44ce8ae0f994 100644 (file)
@@ -20,6 +20,7 @@
 
 /* NLS can be disabled through the configure --disable-nls option.  */
 #if ENABLE_NLS
+
 /* Get declarations of GNU message catalog functions.  */
 # include <libintl.h>
 
index 25dc07bd05ab1a5583067323ad7ae5699ea9c342..f41d737e415dbd50a742498658f6f5bece9cb2b4 100644 (file)
@@ -53,6 +53,7 @@ validate_struct(tOptions * opts, char const * pname)
         fputs(zno_opt_arg, stderr);
         return FAILURE;
     }
+    print_exit = ((opts->fOptSet & OPTPROC_SHELL_OUTPUT) != 0);
 
     /*
      *  IF the client has enabled translation and the translation procedure
@@ -103,14 +104,14 @@ validate_struct(tOptions * opts, char const * pname)
         char const ** pp =
             (char const **)(void **)&(opts->pzProgName);
 
-        if (pz != NULL) {
+        if (pz != NULL)
             *pp = pz+1;
-        } else {
+        else
             *pp = pname;
-            pz = pathfind(getenv("PATH"), (char *)pname, "rx");
-            if (pz != NULL)
-                pname = (void *)pz;
-        }
+
+        pz = pathfind(getenv("PATH"), (char *)pname, "rx");
+        if (pz != NULL)
+            pname = (void *)pz;
 
         pp  = (char const **)(void **)&(opts->pzProgPath);
         *pp = pname;
index 7f69cdad0050626c8156531fb27d36c854b0761e..71e57ecb0d9a2d8f9828145bd90dff4b4c105627 100644 (file)
 
 /* = = = START-STATIC-FORWARD = = = */
 static bool
-add_prog_path(char * pzBuf, int b_sz, char const * pzName,
-              char const * pzProgPath);
+get_realpath(char * buf, size_t b_sz);
+
+static bool
+add_prog_path(char * buf, int b_sz, char const * fname, char const * prg_path);
 
 static bool
 add_env_val(char * buf, int buf_sz, char const * name);
 
 static char *
 assemble_arg_val(char * txt, tOptionLoadMode mode);
+
+static char *
+trim_quotes(char * arg);
+
+static bool
+direction_ok(opt_state_mask_t f, int dir);
 /* = = = END-STATIC-FORWARD = = = */
 
+static bool
+get_realpath(char * buf, size_t b_sz)
+{
+#if defined(HAVE_CANONICALIZE_FILE_NAME)
+    {
+        size_t name_len;
+
+        char * pz = canonicalize_file_name(buf);
+        if (pz == NULL)
+            return false;
+
+        name_len = strlen(pz);
+        if (name_len >= (size_t)b_sz) {
+            free(pz);
+            return false;
+        }
+
+        memcpy(buf, pz, name_len + 1);
+        free(pz);
+    }
+
+#elif defined(HAVE_REALPATH)
+    {
+        size_t name_len;
+        char z[PATH_MAX+1];
+
+        if (realpath(buf, z) == NULL)
+            return false;
+
+        name_len = strlen(z);
+        if (name_len >= b_sz)
+            return false;
+
+        memcpy(buf, z, name_len + 1);
+    }
+#endif
+    return true;
+}
+
 /*=export_func  optionMakePath
  * private:
  *
  * what:  translate and construct a path
- * arg:   + char*       + pzBuf      + The result buffer +
- * arg:   + int         + bufSize    + The size of this buffer +
- * arg:   + char const* + pzName     + The input name +
- * arg:   + char const* + pzProgPath + The full path of the current program +
+ * arg:   + char*       + p_buf     + The result buffer +
+ * arg:   + int         + b_sz      + The size of this buffer +
+ * arg:   + char const* + fname     + The input name +
+ * arg:   + char const* + prg_path  + The full path of the current program +
  *
  * ret-type: bool
  * ret-desc: true if the name was handled, otherwise false.
@@ -95,24 +142,25 @@ assemble_arg_val(char * txt, tOptionLoadMode mode);
  *                 errors (cannot resolve the resulting path).
 =*/
 bool
-optionMakePath(char * pzBuf, int b_sz, char const * pzName,
-               char const * pzProgPath)
+optionMakePath(char * p_buf, int b_sz, char const * fname, char const * prg_path)
 {
-    size_t name_len = strlen(pzName);
+    {
+        size_t len = strlen(fname);
 
-    if (((size_t)b_sz <= name_len) || (name_len == 0))
-        return false;
+        if (((size_t)b_sz <= len) || (len == 0))
+            return false;
+    }
 
     /*
      *  IF not an environment variable, just copy the data
      */
-    if (*pzName != '$') {
-        char const*  pzS = pzName;
-        char* pzD = pzBuf;
-        int   ct  = b_sz;
+    if (*fname != '$') {
+        char   const * src = fname;
+        char * dst = p_buf;
+        int    ct  = b_sz;
 
         for (;;) {
-            if ( (*(pzD++) = *(pzS++)) == NUL)
+            if ( (*(dst++) = *(src++)) == NUL)
                 break;
             if (--ct <= 0)
                 return false;
@@ -124,12 +172,12 @@ optionMakePath(char * pzBuf, int b_sz, char const * pzName,
      *  it must start with "$$/".  In either event, replace the "$$"
      *  with the path to the executable and append a "/" character.
      */
-    else switch (pzName[1]) {
+    else switch (fname[1]) {
     case NUL:
         return false;
 
     case '$':
-        if (! add_prog_path(pzBuf, b_sz, pzName, pzProgPath))
+        if (! add_prog_path(p_buf, b_sz, fname, prg_path))
             return false;
         break;
 
@@ -137,59 +185,30 @@ optionMakePath(char * pzBuf, int b_sz, char const * pzName,
         if (program_pkgdatadir[0] == NUL)
             return false;
 
-        if (snprintf(pzBuf, (size_t)b_sz, "%s%s",
-                     program_pkgdatadir, pzName + 2) >= b_sz)
+        if (snprintf(p_buf, (size_t)b_sz, "%s%s",
+                     program_pkgdatadir, fname + 2) >= b_sz)
             return false;
         break;
 
     default:
-        if (! add_env_val(pzBuf, b_sz, pzName))
+        if (! add_env_val(p_buf, b_sz, fname))
             return false;
     }
 
-#if defined(HAVE_CANONICALIZE_FILE_NAME)
-    {
-        char * pz = canonicalize_file_name(pzBuf);
-        if (pz == NULL)
-            return false;
-
-        name_len = strlen(pz);
-        if (name_len >= (size_t)b_sz) {
-            free(pz);
-            return false;
-        }
-
-        memcpy(pzBuf, pz, name_len + 1);
-        free(pz);
-    }
-
-#elif defined(HAVE_REALPATH)
-    {
-        char z[PATH_MAX+1];
-
-        if (realpath(pzBuf, z) == NULL)
-            return false;
-
-        name_len = strlen(z);
-        if (name_len >= b_sz)
-            return false;
-
-        memcpy(pzBuf, z, name_len + 1);
-    }
-#endif
-
-    return true;
+    return get_realpath(p_buf, b_sz);
 }
 
+/**
+ * convert a leading "$$" into a path to the executable.
+ */
 static bool
-add_prog_path(char * pzBuf, int b_sz, char const * pzName,
-              char const * pzProgPath)
+add_prog_path(char * buf, int b_sz, char const * fname, char const * prg_path)
 {
-    char const*    pzPath;
-    char const   pz;
+    char const *   path;
+    char const *   pz;
     int     skip = 2;
 
-    switch (pzName[2]) {
+    switch (fname[2]) {
     case DIRCH:
         skip = 3;
     case NUL:
@@ -203,16 +222,16 @@ add_prog_path(char * pzBuf, int b_sz, char const * pzName,
      *  If it is, we're done.  Otherwise, we have to hunt
      *  for the program using "pathfind".
      */
-    if (strchr(pzProgPath, DIRCH) != NULL)
-        pzPath = pzProgPath;
+    if (strchr(prg_path, DIRCH) != NULL)
+        path = prg_path;
     else {
-        pzPath = pathfind(getenv("PATH"), (char*)pzProgPath, "rx");
+        path = pathfind(getenv("PATH"), (char*)prg_path, "rx");
 
-        if (pzPath == NULL)
+        if (path == NULL)
             return false;
     }
 
-    pz = strrchr(pzPath, DIRCH);
+    pz = strrchr(path, DIRCH);
 
     /*
      *  IF we cannot find a directory name separator,
@@ -221,27 +240,30 @@ add_prog_path(char * pzBuf, int b_sz, char const * pzName,
     if (pz == NULL)
         return false;
 
-    pzName += skip;
+    fname += skip;
 
     /*
      *  Concatenate the file name to the end of the executable path.
      *  The result may be either a file or a directory.
      */
-    if ((unsigned)(pz - pzPath) + 1 + strlen(pzName) >= (unsigned)b_sz)
+    if ((unsigned)(pz - path) + 1 + strlen(fname) >= (unsigned)b_sz)
         return false;
 
-    memcpy(pzBuf, pzPath, (size_t)((pz - pzPath)+1));
-    strcpy(pzBuf + (pz - pzPath) + 1, pzName);
+    memcpy(buf, path, (size_t)((pz - path)+1));
+    strcpy(buf + (pz - path) + 1, fname);
 
     /*
-     *  If the "pzPath" path was gotten from "pathfind()", then it was
+     *  If the "path" path was gotten from "pathfind()", then it was
      *  allocated and we need to deallocate it.
      */
-    if (pzPath != pzProgPath)
-        AGFREE(pzPath);
+    if (path != prg_path)
+        AGFREE(path);
     return true;
 }
 
+/**
+ * Add an environment variable value.
+ */
 static bool
 add_env_val(char * buf, int buf_sz, char const * name)
 {
@@ -291,9 +313,9 @@ munge_str(char * txt, tOptionLoadMode mode)
         return;
 
     if (IS_WHITESPACE_CHAR(*txt)) {
-        char * pzS = SPN_WHITESPACE_CHARS(txt+1);
-        size_t l   = strlen(pzS) + 1;
-        memmove(txt, pzS, l);
+        char * src = SPN_WHITESPACE_CHARS(txt+1);
+        size_t l   = strlen(src) + 1;
+        memmove(txt, src, l);
         pzE = txt + l - 1;
 
     } else
@@ -323,13 +345,13 @@ munge_str(char * txt, tOptionLoadMode mode)
 static char *
 assemble_arg_val(char * txt, tOptionLoadMode mode)
 {
-    char* pzEnd = strpbrk(txt, ARG_BREAK_STR);
-    int   space_break;
+    char * end = strpbrk(txt, ARG_BREAK_STR);
+    int    space_break;
 
     /*
      *  Not having an argument to a configurable name is okay.
      */
-    if (pzEnd == NULL)
+    if (end == NULL)
         return txt + strlen(txt);
 
     /*
@@ -338,8 +360,8 @@ assemble_arg_val(char * txt, tOptionLoadMode mode)
      *  of which character caused it.
      */
     if (mode == OPTION_LOAD_KEEP) {
-        *(pzEnd++) = NUL;
-        return pzEnd;
+        *(end++) = NUL;
+        return end;
     }
 
     /*
@@ -347,98 +369,85 @@ assemble_arg_val(char * txt, tOptionLoadMode mode)
      *  because we'll have to skip over an immediately following ':' or '='
      *  (and the white space following *that*).
      */
-    space_break = IS_WHITESPACE_CHAR(*pzEnd);
-    *(pzEnd++) = NUL;
+    space_break = IS_WHITESPACE_CHAR(*end);
+    *(end++) = NUL;
 
-    pzEnd = SPN_WHITESPACE_CHARS(pzEnd);
-    if (space_break && ((*pzEnd == ':') || (*pzEnd == '=')))
-        pzEnd = SPN_WHITESPACE_CHARS(pzEnd+1);
+    end = SPN_WHITESPACE_CHARS(end);
+    if (space_break && ((*end == ':') || (*end == '=')))
+        end = SPN_WHITESPACE_CHARS(end+1);
 
-    return pzEnd;
+    return end;
+}
+
+static char *
+trim_quotes(char * arg)
+{
+    switch (*arg) {
+    case '"':
+    case '\'':
+        ao_string_cook(arg, NULL);
+    }
+    return arg;
 }
 
 /**
- *  Load an option from a block of text.  The text must start with the
- *  configurable/option name and be followed by its associated value.
- *  That value may be processed in any of several ways.  See "tOptionLoadMode"
- *  in autoopts.h.
- *
- * @param[in,out] opts       program options descriptor
- * @param[in,out] opt_state  option processing state
- * @param[in,out] line       source line with long option name in it
- * @param[in]     direction  current processing direction (preset or not)
- * @param[in]     load_mode  option loading mode (OPTION_LOAD_*)
+ * See if the option is to be processed in the current scan direction
+ * (-1 or +1).
  */
-LOCAL void
-loadOptionLine(
-    tOptions *  opts,
-    tOptState * opt_state,
-    char *      line,
-    tDirection  direction,
-    tOptionLoadMode   load_mode )
+static bool
+direction_ok(opt_state_mask_t f, int dir)
 {
-    line = SPN_LOAD_LINE_SKIP_CHARS(line);
+    if (dir == 0)
+        return true;
 
-    {
-        char * arg = assemble_arg_val(line, load_mode);
-
-        if (! SUCCESSFUL(opt_find_long(opts, line, opt_state)))
-            return;
-
-        if (opt_state->flags & OPTST_NO_INIT)
-            return;
-
-        opt_state->pzOptArg = arg;
-    }
-
-    switch (opt_state->flags & (OPTST_IMM|OPTST_DISABLE_IMM)) {
+    switch (f & (OPTST_IMM|OPTST_DISABLE_IMM)) {
     case 0:
         /*
          *  The selected option has no immediate action.
          *  THEREFORE, if the direction is PRESETTING
          *  THEN we skip this option.
          */
-        if (PRESETTING(direction))
-            return;
+        if (PRESETTING(dir))
+            return false;
         break;
 
     case OPTST_IMM:
-        if (PRESETTING(direction)) {
+        if (PRESETTING(dir)) {
             /*
              *  We are in the presetting direction with an option we handle
              *  immediately for enablement, but normally for disablement.
              *  Therefore, skip if disabled.
              */
-            if ((opt_state->flags & OPTST_DISABLED) == 0)
-                return;
+            if ((f & OPTST_DISABLED) == 0)
+                return false;
         } else {
             /*
              *  We are in the processing direction with an option we handle
              *  immediately for enablement, but normally for disablement.
              *  Therefore, skip if NOT disabled.
              */
-            if ((opt_state->flags & OPTST_DISABLED) != 0)
-                return;
+            if ((f & OPTST_DISABLED) != 0)
+                return false;
         }
         break;
 
     case OPTST_DISABLE_IMM:
-        if (PRESETTING(direction)) {
+        if (PRESETTING(dir)) {
             /*
              *  We are in the presetting direction with an option we handle
              *  immediately for disablement, but normally for disablement.
              *  Therefore, skip if NOT disabled.
              */
-            if ((opt_state->flags & OPTST_DISABLED) != 0)
-                return;
+            if ((f & OPTST_DISABLED) != 0)
+                return false;
         } else {
             /*
              *  We are in the processing direction with an option we handle
              *  immediately for disablement, but normally for disablement.
              *  Therefore, skip if disabled.
              */
-            if ((opt_state->flags & OPTST_DISABLED) == 0)
-                return;
+            if ((f & OPTST_DISABLED) == 0)
+                return false;
         }
         break;
 
@@ -448,10 +457,55 @@ loadOptionLine(
          *  THEREFORE, if the direction is PROCESSING
          *  THEN we skip this option.
          */
-        if (PROCESSING(direction))
-            return;
+        if (PROCESSING(dir))
+            return false;
         break;
     }
+    return true;
+}
+
+/**
+ *  Load an option from a block of text.  The text must start with the
+ *  configurable/option name and be followed by its associated value.
+ *  That value may be processed in any of several ways.  See "tOptionLoadMode"
+ *  in autoopts.h.
+ *
+ * @param[in,out] opts       program options descriptor
+ * @param[in,out] opt_state  option processing state
+ * @param[in,out] line       source line with long option name in it
+ * @param[in]     direction  current processing direction (preset or not)
+ * @param[in]     load_mode  option loading mode (OPTION_LOAD_*)
+ */
+LOCAL void
+load_opt_line(tOptions * opts, tOptState * opt_state, char * line,
+              tDirection direction, tOptionLoadMode load_mode )
+{
+    /*
+     * When parsing a stored line, we only look at the characters after
+     * a hyphen.  Long names must always be at least two characters and
+     * short options are always exactly one character long.
+     */
+    line = SPN_LOAD_LINE_SKIP_CHARS(line);
+
+    {
+        char * arg = assemble_arg_val(line, load_mode);
+
+        if (IS_OPTION_NAME_CHAR(line[1])) {
+
+            if (! SUCCESSFUL(opt_find_long(opts, line, opt_state)))
+                return;
+
+        } else if (! SUCCESSFUL(opt_find_short(opts, *line, opt_state)))
+            return;
+
+        if ((! CALLED(direction)) && (opt_state->flags & OPTST_NO_INIT))
+            return;
+
+        opt_state->pzOptArg = trim_quotes(arg);
+    }
+
+    if (! direction_ok(opt_state->flags, direction))
+        return;
 
     /*
      *  Fix up the args.
@@ -516,10 +570,13 @@ void
 optionLoadLine(tOptions * opts, char const * line)
 {
     tOptState st = OPTSTATE_INITIALIZER(SET);
-    char* pz;
-    AGDUPSTR(pz, line, "user option line");
-    loadOptionLine(opts, &st, pz, DIRECTION_PROCESS, OPTION_LOAD_COOKED);
+    char *    pz;
+    proc_state_mask_t sv_flags = opts->fOptSet;
+    opts->fOptSet &= ~OPTPROC_ERRSTOP;
+    AGDUPSTR(pz, line, "opt line");
+    load_opt_line(opts, &st, pz, DIRECTION_CALLED, OPTION_LOAD_COOKED);
     AGFREE(pz);
+    opts->fOptSet = sv_flags;
 }
 /** @}
  *
index 146861d29b3995e65ea4e7db22e2858b184df418..961ea1ddcd09c3a68169296f8ec71a8155da5184 100644 (file)
@@ -2,7 +2,7 @@ dnl  -*- buffer-read-only: t -*- vi: set ro:
 dnl
 dnl DO NOT EDIT THIS FILE   (libopts.m4)
 dnl
-dnl It has been AutoGen-ed  March 31, 2013 at 10:41:19 AM by AutoGen 5.17.3
+dnl It has been AutoGen-ed  July 14, 2013 at 05:37:02 PM by AutoGen 5.18
 dnl From the definitions    libopts.def
 dnl and the template file   conftest.tpl
 dnl
@@ -72,8 +72,7 @@ AC_DEFUN([INVOKE_LIBOPTS_MACROS_FIRST],[
   ${lo_have_typ_hdr} || \
     ]AC_MSG_ERROR([you must have inttypes.h or stdint.h on your system])[
 
-  for f in sys_types sys_param sys_stat \
-           string errno stdlib memory setjmp
+  for f in sys_types sys_param sys_stat string errno stdlib memory setjmp
   do eval as_ac_var=\${ac_cv_header_${f}_h}
      test "X${as_ac_var}" = Xyes || {
        ]AC_MSG_ERROR([you must have ${f}.h on your system])[
@@ -102,10 +101,11 @@ AC_DEFUN([INVOKE_LIBOPTS_MACROS_FIRST],[
   AC_CHECK_SIZEOF(long,  8)
   AC_CHECK_SIZEOF(short, 2)
 
-  # ----------------------------------------------------------------------
-  # AC_CHECK_LIB for SVR4 libgen, and use it if it defines pathfind.
-  # ----------------------------------------------------------------------
+  # ------------
+  # AC_CHECK_LIB
+  # ------------
   AC_CHECK_LIB(gen, pathfind)
+  AC_CHECK_LIB(intl,gettext)
   AC_FUNC_VPRINTF
   AC_FUNC_FORK
   AC_CHECK_FUNCS([mmap canonicalize_file_name snprintf strdup strchr \
@@ -200,7 +200,6 @@ AC_DEFUN([LIBOPTS_WITHLIB_REGEX],[
   esac
   libopts_save_CPPFLAGS="${CPPFLAGS}"
   libopts_save_LIBS="${LIBS}"
-
   case "X${libopts_cv_with_libregex_cflags}" in
   Xyes|Xno|X )
     libopts_cv_with_libregex_cflags="" ;;
@@ -239,9 +238,8 @@ int main() {
     [libopts_cv_with_libregex=yes], [libopts_cv_with_libregex=no],
     [libopts_cv_with_libregex=no]) # end of AC_RUN_IFELSE 
   ]) # end of AC_CACHE_VAL for libopts_cv_with_libregex
-  AC_MSG_RESULT([${libopts_cv_with_libregex}])
   fi ## disabled by request
-
+  AC_MSG_RESULT([${libopts_cv_with_libregex}])
   if test "X${libopts_cv_with_libregex}" != Xno
   then
     AC_DEFINE([WITH_LIBREGEX],[1],
@@ -250,9 +248,9 @@ int main() {
     CPPFLAGS="${libopts_save_CPPFLAGS}"
     LIBS="${libopts_save_LIBS}"
     libopts_cv_with_libregex_root=no
-    libopts_cv_with_libregex_cflags=no
-    libopts_cv_with_libregex_libs=no
-    AC_MSG_RESULT([the regex library does not work and will not be used])
+libopts_cv_with_libregex_cflags=no
+libopts_cv_with_libregex_libs=no
+libopts_cv_with_libregex=no
   fi
 
 ]) # end of AC_DEFUN of LIBOPTS_WITHLIB_REGEX
index d5a8b82fe66e3c49ba298b824340b9937fda35d4..d65a8b372e2af116b99933fde54cb345f5183cf5 100644 (file)
  *  13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239  COPYING.mbsd
  */
 
-tOptions * optionParseShellOptions = NULL;
-
-static char const * shell_prog = NULL;
-static char * script_leader    = NULL;
-static char * script_trailer   = NULL;
-static char * script_text      = NULL;
-
 /* = = = START-STATIC-FORWARD = = = */
 static void
 emit_var_text(char const * prog, char const * var, int fdin);
@@ -75,6 +68,21 @@ static void
 open_out(char const * fname, char const * pname);
 /* = = = END-STATIC-FORWARD = = = */
 
+LOCAL void
+option_exits(int exit_code)
+{
+    if (print_exit)
+        printf("\nexit %d\n", exit_code);
+    exit(exit_code);
+}
+
+LOCAL void
+ao_bug(char const * msg)
+{
+    fprintf(stderr, zao_bug_msg, msg);
+    option_exits(EX_SOFTWARE);
+}
+
 LOCAL void
 fserr_warn(char const * prog, char const * op, char const * fname)
 {
@@ -86,7 +94,7 @@ LOCAL void
 fserr_exit(char const * prog, char const * op, char const * fname)
 {
     fserr_warn(prog, op, fname);
-    exit(EXIT_FAILURE);
+    option_exits(EXIT_FAILURE);
 }
 
 /*=export_func  optionParseShell
@@ -325,7 +333,7 @@ text_to_var(tOptions * opts, teTextTo which, tOptDesc * od)
             /* NOTREACHED */
 
         default:
-            exit(EXIT_FAILURE);
+            option_exits(EXIT_FAILURE);
             /* NOTREACHED */
         }
         /* NOTREACHED */
@@ -345,7 +353,7 @@ text_to_var(tOptions * opts, teTextTo which, tOptDesc * od)
 static void
 emit_usage(tOptions * opts)
 {
-    char tm_nm_buf[AO_NAME_SIZE] = "";
+    char tm_nm_buf[AO_NAME_SIZE];
 
     /*
      *  First, switch stdout to the output file name.
@@ -359,13 +367,11 @@ emit_usage(tOptions * opts)
     {
         char const * out_nm;
 
-#ifdef HAVE_LOCALTIME
         {
             time_t    c_tim = time(NULL);
             struct tm * ptm = localtime(&c_tim);
             strftime(tm_nm_buf, AO_NAME_SIZE, TIME_FMT, ptm );
         }
-#endif
 
         if (HAVE_GENSHELL_OPT(SCRIPT))
              out_nm = GENSHELL_OPT_ARG(SCRIPT);
@@ -864,7 +870,7 @@ genshelloptUsage(tOptions * opts, int exit_cd)
     fflush(stderr);
     fflush(stdout);
     if (ferror(stdout) || ferror(stderr))
-        exit(EXIT_FAILURE);
+        option_exits(EXIT_FAILURE);
 
     option_usage_fp = stdout;
 
@@ -931,7 +937,7 @@ genshelloptUsage(tOptions * opts, int exit_cd)
     if (ferror(stdout))
         fserr_exit(opts->pzProgName, zwriting, zstdout_name);
 
-    exit(EXIT_SUCCESS);
+    option_exits(EXIT_SUCCESS);
 #endif
 }
 
index d3b0a6c65cdbab85f0b1e15ffd19374b5345c4ed..0cf3394c32653f400fe1415b4ec5ad4feafd054b 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  DO NOT EDIT THIS FILE   (stdin.c)
  *
- *  It has been AutoGen-ed  March 31, 2013 at 10:41:26 AM by AutoGen 5.17.3
+ *  It has been AutoGen-ed  July 14, 2013 at 05:37:08 PM by AutoGen 5.18
  *  From the definitions    stdin
  *  and the template file   str2enum
  *
index 2d99b4b0b4ece78b1bdcaf709bb260c1fe69efa2..192e71b925548cde756bcc5ef4ca3b876b2f7798 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  DO NOT EDIT THIS FILE   (stdin.h)
  *
- *  It has been AutoGen-ed  March 31, 2013 at 10:41:25 AM by AutoGen 5.17.3
+ *  It has been AutoGen-ed  July 14, 2013 at 05:37:08 PM by AutoGen 5.18
  *  From the definitions    stdin
  *  and the template file   str2enum
  *
index 9f6cbdb7f235d252fcc4794704fa73b598a881e3..10ff870c7cf612feda7334525e7b27eacfbc20b0 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  DO NOT EDIT THIS FILE   (stdin.c)
  *
- *  It has been AutoGen-ed  March 31, 2013 at 10:41:24 AM by AutoGen 5.17.3
+ *  It has been AutoGen-ed  July 14, 2013 at 05:37:07 PM by AutoGen 5.18
  *  From the definitions    stdin
  *  and the template file   str2enum
  *
index c6ac0847dc11ca5189ff92669eae2ef707bf83d6..7d6386e7298c0aeaa7a4ab9a8355c3de3cd056e1 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  DO NOT EDIT THIS FILE   (stdin.h)
  *
- *  It has been AutoGen-ed  March 31, 2013 at 10:41:24 AM by AutoGen 5.17.3
+ *  It has been AutoGen-ed  July 14, 2013 at 05:37:07 PM by AutoGen 5.18
  *  From the definitions    stdin
  *  and the template file   str2enum
  *
index 3bc7fc31e2f4d8871c1deb7beaeb0af12c4df015..5154410239ba7a75061a3c00f12dd2e495eaf8e4 100644 (file)
  *  13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239  COPYING.mbsd
  */
 
+#if defined(HAVE_WORKING_FORK)
+static FILE *
+open_tmp_usage(char ** buf)
+{
+    char * bf;
+    size_t bfsz;
+
+    {
+        unsigned int my_pid = (unsigned int)getpid();
+        char const * tmpdir = getenv(TMPDIR);
+        if (tmpdir == NULL)
+            tmpdir = tmp_dir;
+        bfsz = TMP_FILE_FMT_LEN + strlen(tmpdir) + 10;
+        bf   = AGALOC(bfsz, "tmp fil");
+        snprintf(bf, bfsz, TMP_FILE_FMT, tmpdir, my_pid);
+    }
+
+    {
+        int fd = mkstemp(bf);
+        if (fd < 0) {
+            AGFREE(bf);
+            return NULL;
+        }
+        *buf = bf;
+        return fdopen(fd, "w");
+    }
+}
+
+static char *
+mk_pager_cmd(char const * fname)
+{
+    /*
+     * Page the file and remove it when done.  For shell script processing,
+     * we must redirect the output to the current stderr, otherwise stdout.
+     */
+    fclose(option_usage_fp);
+    option_usage_fp = NULL;
+
+    {
+        char const * pager  = (char const *)getenv(PAGER_NAME);
+        size_t bfsz;
+        char * res;
+
+        /*
+         *  Use the "more(1)" program if "PAGER" has not been defined
+         */
+        if (pager == NULL)
+            pager = MORE_STR;
+
+        bfsz = strlen(fname) + strlen(pager) + PAGE_USAGE_FMT_LEN;
+        res  = AGALOC(bfsz, "more cmd");
+        snprintf(res, bfsz, PAGE_USAGE_FMT, pager, fname);
+        AGFREE((void*)fname);
+        return res;
+    }
+}
+#endif
+
 /*=export_func  optionPagedUsage
  * private:
  *
- * what:  Decipher a boolean value
- * arg:   + tOptions* + opts + program options descriptor +
- * arg:   + tOptDesc* + od   + the descriptor for this arg +
+ * what:  emit help text and pass through a pager program.
+ * arg:   + tOptions * + opts + program options descriptor +
+ * arg:   + tOptDesc * + od   + the descriptor for this arg +
  *
  * doc:
  *  Run the usage output through a pager.
@@ -53,8 +111,8 @@ optionPagedUsage(tOptions * opts, tOptDesc * od)
 
     (*opts->pUsageProc)(opts, EXIT_SUCCESS);
 #else
-    static pid_t     my_pid;
-    char fil_name[1024];
+    static bool sv_print_exit = false;
+    static char * fil_name = NULL;
 
     /*
      *  IF we are being called after the usage proc is done
@@ -66,20 +124,12 @@ optionPagedUsage(tOptions * opts, tOptDesc * od)
     {
         if ((od->fOptState & OPTST_RESET) != 0)
             return;
-
-        my_pid  = getpid();
-        snprintf(fil_name, sizeof(fil_name), TMP_USAGE_FMT,
-                 (unsigned long)my_pid);
-        unlink(fil_name);
-
-        /*
-         *  Set usage output to this temporary file
-         */
-        option_usage_fp = fopen(fil_name, "w" FOPEN_BINARY_FLAG);
+        option_usage_fp = open_tmp_usage(&fil_name);
         if (option_usage_fp == NULL)
-            _exit(EXIT_FAILURE);
+            (*opts->pUsageProc)(opts, EXIT_SUCCESS);
 
-        pagerState = PAGER_STATE_READY;
+        pagerState    = PAGER_STATE_READY;
+        sv_print_exit = print_exit;
 
         /*
          *  Set up so this routine gets called during the exit logic
@@ -88,8 +138,10 @@ optionPagedUsage(tOptions * opts, tOptDesc * od)
 
         /*
          *  The usage procedure will now put the usage information into
-         *  the temporary file we created above.
+         *  the temporary file we created above.  Keep any shell commands
+         *  out of the result.
          */
+        print_exit = false;
         (*opts->pUsageProc)(opts, EXIT_SUCCESS);
 
         /* NOTREACHED */
@@ -97,25 +149,20 @@ optionPagedUsage(tOptions * opts, tOptDesc * od)
     }
 
     case PAGER_STATE_READY:
-    {
-        char const * pager  = (char const *)getenv(PAGER_NAME);
+        fil_name = mk_pager_cmd(fil_name);
 
-        /*
-         *  Use the "more(1)" program if "PAGER" has not been defined
-         */
-        if (pager == NULL)
-            pager = MORE_STR;
+        if (sv_print_exit) {
+            fputs("\nexit 0\n", stdout);
+            fclose(stdout);
+            dup2(STDERR_FILENO, STDOUT_FILENO);
 
-        /*
-         *  Page the file and remove it when done.
-         */
-        snprintf(fil_name, sizeof(fil_name), PAGE_USAGE_FMT, pager,
-                 (unsigned long)my_pid);
-        fclose(stderr);
-        dup2(STDOUT_FILENO, STDERR_FILENO);
+        } else {
+            fclose(stderr);
+            dup2(STDOUT_FILENO, STDERR_FILENO);
+        }
 
         ignore_val( system( fil_name));
-    }
+        AGFREE(fil_name);
 
     case PAGER_STATE_CHILD:
         /*
index 7cf6c532894d7a90fd3d2ce49d42b78dd09b96d7..686879efb91102839a8ca8aa9a307ea4af8252da 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- buffer-read-only: t -*- vi: set ro:
  *
  * Prototypes for autoopts
- * Generated Sun Mar 31 10:41:38 PDT 2013
+ * Generated Sun Jul 14 17:37:20 PDT 2013
  */
 #ifndef AUTOOPTS_PROTO_H_GUARD
 #define AUTOOPTS_PROTO_H_GUARD 1
@@ -92,16 +92,18 @@ static void
 munge_str(char * txt, tOptionLoadMode mode);
 
 static void
-loadOptionLine(
-    tOptions *  opts,
-    tOptState * opt_state,
-    char *      line,
-    tDirection  direction,
-    tOptionLoadMode   load_mode );
+load_opt_line(tOptions * opts, tOptState * opt_state, char * line,
+              tDirection direction, tOptionLoadMode load_mode );
 
 /*
  *  Extracted from makeshell.c
  */
+static void
+option_exits(int exit_code);
+
+static void
+ao_bug(char const * msg);
+
 static void
 fserr_warn(char const * prog, char const * op, char const * fname);
 
@@ -141,7 +143,4 @@ addArgListEntry(void** ppAL, void* entry);
 static void
 set_usage_flags(tOptions * opts, char const * flg_txt);
 
-static void
-ao_bug(char const * msg);
-
 #endif /* AUTOOPTS_PROTO_H_GUARD */
index d21039294640e4f2340d0da1493c7f7054cc8f5b..a96bc373363c4b503be689b7fae2da2113a035ca 100644 (file)
@@ -30,7 +30,6 @@
  *  4379e7444a0e2ce2b12dd6f5a52a27a4d02d39d247901d3285c88cf0d37f477b  COPYING.lgplv3
  *  13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239  COPYING.mbsd
  */
-#define APOSTROPHE '\''
 
 /* = = = START-STATIC-FORWARD = = = */
 static size_t
@@ -292,6 +291,7 @@ print_enumeration(tOptions * pOpts, tOptDesc * pOD)
 static void
 print_membership(tOptions * pOpts, tOptDesc * pOD)
 {
+    char const * svstr = pOD->optArg.argString;
     char const * pz;
     uintptr_t val = 1;
     printf(zOptNumFmt, pOpts->pzPROGNAME, pOD->pz_NAME,
@@ -299,13 +299,9 @@ print_membership(tOptions * pOpts, tOptDesc * pOD)
     pOD->optCookie = (void*)(uintptr_t)~0UL;
     (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
 
-    /*
-     *  We are building the typeset list.  The list returned starts with
-     *  'none + ' for use by option saving stuff.  We must ignore that.
-     */
-    pz = pOD->optArg.argString + 7;
+    pz = pOD->optArg.argString;
     while (*pz != NUL) {
-        printf("typeset -x -i %s_", pOD->pz_NAME);
+        printf("readonly %s_", pOD->pz_NAME);
         pz = SPN_PLUS_N_SPACE_CHARS(pz);
 
         for (;;) {
@@ -321,8 +317,7 @@ print_membership(tOptions * pOpts, tOptDesc * pOD)
     }
 
     AGFREE(pOD->optArg.argString);
-    pOD->optArg.argString = NULL;
-    pOD->fOptState &= ~OPTST_ALLOC_ARG;
+    pOD->optArg.argString = svstr;
 }
 
 static void
index 09ecb33264a9a6ebf11d7c2ea467d5c62fe9f30e..d3beb14050583b7de9979449ad29b6f065a19f37 100644 (file)
@@ -141,7 +141,7 @@ optionRestore(tOptions* pOpts)
                 pzName = zNil;
         }
         fprintf(stderr, zNoState, pzName);
-        exit(EXIT_FAILURE);
+        option_exits(EXIT_FAILURE);
     }
 
     pOpts->pSavedState = NULL;
index 3ae046feaad569e7dd812c8d86c3f6b7c18013d8..404a478e209d9445a1a5e6532340798146d11ede 100644 (file)
@@ -63,7 +63,7 @@ static void
 prt_str_arg(FILE * fp, tOptDesc * pOD);
 
 static void
-prt_enum_arg(FILE * fp, tOptDesc * pOD);
+prt_enum_arg(FILE * fp, tOptDesc * od);
 
 static void
 prt_set_arg(FILE * fp, tOptDesc * od);
@@ -138,7 +138,7 @@ find_dir_name(tOptions * opts, int * p_free)
 
         {
             size_t sz = strlen(pzEnv) + strlen(pzEndDir) + 2;
-            pzFileName = (char*)AGALOC(sz, "dir name");
+            pzFileName = (char *)AGALOC(sz, "dir name");
         }
 
         if (pzFileName == NULL)
@@ -277,6 +277,8 @@ find_file_name(tOptions * opts, int * p_free_name)
 static void
 prt_entry(FILE * fp, tOptDesc * od, char const * l_arg)
 {
+    int space_ct;
+
     /*
      *  There is an argument.  Pad the name so values line up.
      *  Not disabled *OR* this got equivalenced to another opt,
@@ -284,29 +286,29 @@ prt_entry(FILE * fp, tOptDesc * od, char const * l_arg)
      *  Otherwise, there must be a disablement name.
      */
     {
-        char const * pz;
-        if (! DISABLED_OPT(od) || (od->optEquivIndex != NO_EQUIVALENT))
-            pz = od->pz_Name;
-        else
-            pz = od->pz_DisableName;
-
-        fprintf(fp, "%-18s", pz);
+        char const * pz =
+            (! DISABLED_OPT(od) || (od->optEquivIndex != NO_EQUIVALENT))
+            ? od->pz_Name
+            : od->pz_DisableName;
+        space_ct = 17 - strlen(pz);
+        fputs(pz, fp);
     }
+
+    if (  (l_arg == NULL)
+       && (OPTST_GET_ARGTYPE(od->fOptState) != OPARG_TYPE_NUMERIC))
+        goto end_entry;
+
+    fputs(" = ", fp);
+    while (space_ct-- > 0)  fputc(' ', fp);
+
     /*
      *  IF the option is numeric only,
      *  THEN the char pointer is really the number
      */
     if (OPTST_GET_ARGTYPE(od->fOptState) == OPARG_TYPE_NUMERIC)
-        fprintf(fp, "  %d\n", (int)(t_word)l_arg);
-
-    /*
-     *  OTHERWISE, FOR each line of the value text, ...
-     */
-    else if (l_arg == NULL)
-        fputc(NL, fp);
+        fprintf(fp, "%d", (int)(t_word)l_arg);
 
     else {
-        fputc(' ', fp); fputc(' ', fp);
         for (;;) {
             char const * eol = strchr(l_arg, NL);
 
@@ -329,8 +331,10 @@ prt_entry(FILE * fp, tOptDesc * od, char const * l_arg)
          *  Terminate the entry
          */
         fputs(l_arg, fp);
-        fputc(NL, fp);
     }
+
+end_entry:
+    fputc(NL, fp);
 }
 
 /**
@@ -610,20 +614,24 @@ prt_str_arg(FILE * fp, tOptDesc * pOD)
 }
 
 /**
+ * print the string value of an enumeration.
+ *
+ * @param[in] fp  the file pointer to write to
+ * @param[in] od  the option descriptor with the enumerated value
  */
 static void
-prt_enum_arg(FILE * fp, tOptDesc * pOD)
+prt_enum_arg(FILE * fp, tOptDesc * od)
 {
-    uintptr_t val = pOD->optArg.argEnum;
+    uintptr_t val = od->optArg.argEnum;
 
     /*
      *  This is a magic incantation that will convert the
      *  bit flag values back into a string suitable for printing.
      */
-    (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
-    prt_entry(fp, pOD, (void*)(pOD->optArg.argString));
+    (*(od->pOptProc))(OPTPROC_RETURN_VALNAME, od);
+    prt_entry(fp, od, (void*)(od->optArg.argString));
 
-    pOD->optArg.argEnum = val;
+    od->optArg.argEnum = val;
 }
 
 /**
@@ -638,24 +646,14 @@ prt_enum_arg(FILE * fp, tOptDesc * pOD)
 static void
 prt_set_arg(FILE * fp, tOptDesc * od)
 {
-    uintptr_t val = od->optArg.argEnum;
-
-    /*
-     *  This is a magic incantation that will convert the
-     *  bit flag values back into a string suitable for printing.
-     */
-    (*(od->pOptProc))(OPTPROC_RETURN_VALNAME, od);
-    prt_entry(fp, od, (void*)(od->optArg.argString));
-
-    if (od->optArg.argString != NULL) {
-        /*
-         *  set membership strings get allocated
-         */
-        AGFREE((void*)od->optArg.argString);
-        od->fOptState &= ~OPTST_ALLOC_ARG;
-    }
-
-    od->optArg.argEnum = val;
+    char * list = optionMemberList(od);
+    size_t len  = strlen(list);
+    char * buf  = (char *)AGALOC(len + 3, "dir name");
+    *buf= '=';
+    memcpy(buf+1, list, len + 1);
+    prt_entry(fp, od, buf);
+    AGFREE(buf);
+    AGFREE(list);
 }
 
 /**
index dc73702afd514ab457e57c5b1a0697761704295f..62069b561fba97ca63859e19f86a30e2fa77857a 100644 (file)
@@ -133,8 +133,8 @@ optionUnstackArg(tOptions * pOpts, tOptDesc * pOptDesc)
          *  we are keeping a define.
          */
         for (i = 0, dIdx = 0, ct = pAL->useCt; --ct >= 0; i++) {
-            const char ** pzSrc = pAL->apzArgs[ i ];
-            char *        pzEq  = strchr(pzSrc, '=');
+            const char * pzSrc = pAL->apzArgs[ i ];
+            char *       pzEq  = strchr(pzSrc, '=');
 
             if (pzEq != NULL)
                 *pzEq = NUL;
index 8b117c059910ae2d89ee76b64e52c7ac2ec3a6dc..7085f3eb068e42a32c2a4ce6242d6ee2521fdaf8 100644 (file)
@@ -233,7 +233,7 @@ close_mmap_files(tmap_info_t * mi)
     close(mi->txt_fd);
     mi->txt_fd = AO_INVALID_FD;
 
-#if ! defined(MAP_ANONYMOUS)
+#if defined(HAVE_MMAP) && ! defined(MAP_ANONYMOUS)
     if (mi->txt_zero_fd == AO_INVALID_FD)
         return;
 
index 54ae86be7c32bb269ab48c8a5a36c8cf8d916305..da77c61b9977b3c31b2c393cbee112fe831d0f0c 100644 (file)
  *  13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239  COPYING.mbsd
  */
 
-#define OPTPROC_L_N_S  (OPTPROC_LONGOPT | OPTPROC_SHORTOPT)
-#if defined(ENABLE_NLS) && defined(HAVE_LIBINTL_H)
-# include <libintl.h>
-#endif
-
-typedef struct {
-    size_t          fnm_len;
-    uint32_t        fnm_mask;
-    char const *    fnm_name;
-} ao_flag_names_t;
-
-/**
- * Automated Options Usage Flags.
- * NB: no entry may be a prefix of another entry
- */
-#define AOFLAG_TABLE                            \
-    _aof_(gnu,             OPTPROC_GNUUSAGE )   \
-    _aof_(autoopts,        ~OPTPROC_GNUUSAGE)   \
-    _aof_(no_misuse_usage, OPTPROC_MISUSE   )   \
-    _aof_(misuse_usage,    ~OPTPROC_MISUSE  )   \
-    _aof_(compute,         OPTPROC_COMPUTE  )
-
-#define _aof_(_n, _f)   AOUF_ ## _n ## _ID,
-typedef enum { AOFLAG_TABLE AOUF_COUNT } ao_flag_id_t;
-#undef  _aof_
-
-#define _aof_(_n, _f)   AOUF_ ## _n = (1 << AOUF_ ## _n ## _ID),
-typedef enum { AOFLAG_TABLE } ao_flags_t;
-#undef  _aof_
-
 /* = = = START-STATIC-FORWARD = = = */
 static unsigned int
 parse_usage_flags(ao_flag_names_t const * fnt, char const * txt);
@@ -100,8 +70,8 @@ static void
 prt_extd_usage(tOptions * opts, tOptDesc * od, char const * title);
 
 static void
-prt_ini_list(char const * const * papz, bool * need_intro,
-             char const * ini_file, char const * path_nm);
+prt_ini_list(char const * const * papz, char const * ini_file,
+             char const * path_nm);
 
 static void
 prt_preamble(tOptions * opts, tOptDesc * od, arg_types_t * at);
@@ -304,13 +274,6 @@ optionOnlyUsage(tOptions * pOpts, int ex_code)
                    ? zstderr_name : zstdout_name);
 }
 
-LOCAL void
-ao_bug(char const * msg)
-{
-    fprintf(stderr, zao_bug_msg, msg);
-    exit(EX_SOFTWARE);
-}
-
 /**
  * Print a message suggesting how to get help.
  *
@@ -626,7 +589,8 @@ optionUsage(tOptions * opts, int usage_exit_code)
                 ? opts->pzFullUsage : NULL;
 
             if (option_usage_fp == NULL)
-                option_usage_fp = stdout;
+                option_usage_fp = print_exit ? stderr : stdout;
+
         } else {
             pz = (opts->structVersion >= 30 * 4096)
                 ? opts->pzShortUsage : NULL;
@@ -659,7 +623,7 @@ optionUsage(tOptions * opts, int usage_exit_code)
         fserr_exit(opts->pzProgName, zwriting, (option_usage_fp == stdout)
                    ? zstdout_name : zstderr_name);
 
-    exit(exit_code);
+    option_exits(exit_code);
 }
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -959,24 +923,24 @@ prt_extd_usage(tOptions * opts, tOptDesc * od, char const * title)
         fputs(zDefaultOpt + tab_skip_ct, option_usage_fp);
 }
 
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/**
+ * Figure out where all the initialization files might live.  This requires
+ * translating some environment variables and testing to see if a name is a
+ * directory or a file.  It's squishy, but important to tell users how to
+ * find these files.
  *
- *   Figure out where all the initialization files might live.
- *   This requires translating some environment variables and
- *   testing to see if a name is a directory or a file.  It's
- *   squishy, but important to tell users how to find these files.
+ * @param[in]  papz        search path
+ * @param[out] ini_file    an output buffer of AG_PATH_MAX+1 bytes
+ * @param[in]  path_nm     the name of the file we're hunting for
  */
 static void
-prt_ini_list(char const * const * papz, bool * need_intro,
-             char const * ini_file, char const * path_nm)
+prt_ini_list(char const * const * papz, char const * ini_file,
+             char const * path_nm)
 {
     char pth_buf[AG_PATH_MAX+1];
 
-    if (papz == NULL)
-        return;
-
     fputs(zPresetIntro, option_usage_fp);
-    *need_intro = false;
 
     for (;;) {
         char const * path   = *(papz++);
@@ -1021,7 +985,13 @@ prt_ini_list(char const * const * papz, bool * need_intro,
     }
 }
 
-
+/**
+ *  Print the usage line preamble text
+ *
+ * @param opts  the program option descriptor
+ * @param od    the option descriptor
+ * @param at    names of the option argument types
+ */
 static void
 prt_preamble(tOptions * opts, tOptDesc * od, arg_types_t * at)
 {
@@ -1108,10 +1078,10 @@ prt_one_usage(tOptions * opts, tOptDesc * od, arg_types_t * at)
 
  bogus_desc:
     fprintf(stderr, zbad_od, opts->pzProgName, od->pz_Name);
-    exit(EX_SOFTWARE);
+    option_exits(EX_SOFTWARE);
 }
 
-/*
+/**
  *  Print out the usage information for just the options.
  */
 static void
@@ -1196,20 +1166,22 @@ prt_opt_usage(tOptions * opts, int ex_code, char const * title)
 }
 
 
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- *   PROGRAM DETAILS
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/**
+ *  Print program details.
+ * @param[in] opts  the program option descriptor
  */
 static void
 prt_prog_detail(tOptions * opts)
 {
-    bool need_intro = true;
+    bool need_intro = (opts->papzHomeList == NULL);
 
     /*
-     *  Display all the places we look for config files
+     *  Display all the places we look for config files, if we have
+     *  a list of directories to search.
      */
-    prt_ini_list(opts->papzHomeList, &need_intro,
-                 opts->pzRcName, opts->pzProgPath);
+    if (! need_intro)
+        prt_ini_list(opts->papzHomeList, opts->pzRcName, opts->pzProgPath);
 
     /*
      *  Let the user know about environment variable settings
index 8f2b1db3226840afbb740d8fa097c1b73f242ef0..08d8696db495c412046ed1812f9331e8d8f0ab6b 100644 (file)
@@ -166,7 +166,7 @@ print_ver(tOptions * opts, tOptDesc * od, FILE * fp)
 
     default:
         fprintf(stderr, zBadVerArg, ch);
-        exit(EXIT_FAILURE);
+        option_exits(EXIT_FAILURE);
     }
 
     fflush(fp);
@@ -174,7 +174,7 @@ print_ver(tOptions * opts, tOptDesc * od, FILE * fp)
         fserr_exit(opts->pzProgName, zwriting,
                    (fp == stdout) ? zstdout_name : zstderr_name);
 
-    exit(EXIT_SUCCESS);
+    option_exits(EXIT_SUCCESS);
 }
 
 /*=export_func  optionPrintVersion
@@ -190,7 +190,7 @@ print_ver(tOptions * opts, tOptDesc * od, FILE * fp)
 void
 optionPrintVersion(tOptions * opts, tOptDesc * od)
 {
-    print_ver(opts, od, stdout);
+    print_ver(opts, od, print_exit ? stderr : stdout);
 }
 
 /*=export_func  optionVersionStderr