[= autogen5 template

# Time-stamp:      "2012-08-11 08:31:28 bkorb"
#
##  This file is part of AutoOpts, a companion to AutoGen.
##  AutoOpts is free software.
##  AutoOpts is Copyright (c) 1992-2012 by Bruce Korb - all rights reserved
##
##  AutoOpts is available under any one of two licenses.  The license
##  in use must be one of these two and the choice is under the control
##  of the user of the license.
##
##   The GNU Lesser General Public License, version 3 or later
##      See the files "COPYING.lgplv3" and "COPYING.gplv3"
##
##   The Modified Berkeley Software Distribution License
##      See the file "COPYING.mbsd"
##
##  These files have the following md5sums:
##
##  43b91e8ca915626ed3818ffb1b71248b COPYING.gplv3
##  06a1a2e4760c90ea5e1dad8dfaac4d39 COPYING.lgplv3
##  66a5cedaf62c4b2637025f049f9b826f COPYING.mbsd

=][=

;;;
;;;  Compute the usage line.  It is complex because we are trying to
;;;  encode as much information as we can and still be comprehensible.
;;;
;;;  The rules are:  If any options have a "value" attribute, then
;;;  there are flags allowed, so include "-<flag>" on the usage line.
;;;  If the program has the "long-opts" attribute set, then we must
;;;  have "<option-name>" or "--<name>" on the line, depending on
;;;  whether or not there are flag options.  If any options take
;;;  arguments, then append "[<val>]" to the flag description and
;;;  "[{=| }<val>]" to the option-name/name descriptions.  We will not
;;;  worry about being correct if every option has a required argument.
;;;  Finally, if there are no minimum occurrence counts (i.e. all
;;;  options are optional), then we put square brackets around the
;;;  syntax.
;;;
;;;  Compute the option arguments
;;;
(define tmp-val "")
(if (exist? "flag.arg-type")
    (set! tmp-val "[{=| }<val>]"))

(define usage-line (string-append "USAGE:  %s "

  ;; If at least one option has a minimum occurrence count
  ;; we use curly brackets around the option syntax.
  ;;
  (if (not (exist? "flag.min")) "[ " "{ ")

  (if (exist? "flag.value")
      (string-append "-<flag>"
         (if (exist? "flag.arg-type") " [<val>]" "")
         (if (exist? "long-opts") " | " "") )
      (if (not (exist? "long-opts"))
         (string-append "<option-name>" tmp-val) "" )  )

  (if (exist? "long-opts")
      (string-append "--<name>" tmp-val) "" )

  (if (not (exist? "flag.min")) " ]..." " }...")
) )

(if (exist? "argument")
  (set! usage-line (string-append usage-line

    ;; the USAGE line plus the program name plus the argument goes
    ;; past 80 columns, then break the line, else separate with space
    ;;
    (if (< 80 (+ (string-length usage-line)
          (len "argument")
          (string-length prog-name) ))
        " \\\n\t\t"
        " "
    )

    (get "argument")
  ))
)

(define usage-text (string-append prog-name
        (if (exist? "package")
            (string-append " (" (get "package") ")")
            "" )
        " - " (get "prog-title")
        (if (exist? "version")
            (string-append " - Ver. " (get "version"))
            "" )
        "\n" usage-line "\n"
))

=][= # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # =][=

INCLUDE "optmain.tlib"

=][=

IF (or (= "shell-process"  (get "main.main-type"))
       (= "shell-parser"   (get "main.main-type"))
       (exist? "main.code")) =]
#define [= (set! make-test-main #t) main-guard =] 1[=
ENDIF
=]
#ifndef __doxygen__
#define OPTION_CODE_COMPILE 1
#include "[= (define lib-externs "") header-file=]"[=

IF (== (get "main.main-type" "") "for-each")

=]
#include <sys/types.h>
#include <sys/stat.h>

#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>[=

ELSE

=]
#include <sys/types.h>

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>[=

 (if (exist? "flag.arg-range")
     (emit "\n#include <errno.h>"))

 (if (and (exist? "resettable") (exist? "flag.open-file"))
     (emit "
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>" )) =][=

ENDIF

=]

#ifdef  __cplusplus
extern "C" {
#endif
extern FILE * option_usage_fp;

/* TRANSLATORS: choose the translation for option names wisely because you
                cannot ever change your mind. */[=

IF (not (exist? "copyright"))

=]
#define zCopyright      NULL
#define zLicenseDescrip NULL[=
ELSE  =][=
  (define cright-owner (get "copyright.owner" (get "copyright.author")))
  =][=
  CASE (get "copyright.type") =][=
    = note       =][=
      (set! tmp-text (get  "copyright.text"))
      (define ext-text tmp-text)            =][=

    ~~* .       =][=
      (define ext-text
         (license-description (get "copyright.type")
            prog-name "" cright-owner ) )

      (set! tmp-text
         (license-info (get "copyright.type")
            prog-name "" cright-owner (get "copyright.date") ) )
                =][=

    *           =][=
      (set! tmp-text (sprintf
              "Copyright (C) %s %s, all rights reserved"
              (get "copyright.date") cright-owner  ))
      (define ext-text tmp-text)            =][=

  ESAC          =][=

(set! tmp-text (string-append version-text "\n" tmp-text))
(string-append "\n#define zCopyright      ("
    (string-table-add-ref opt-strs tmp-text)
    ")\n#define zLicenseDescrip ("

    (if (= tmp-text ext-text)
        "zCopyright"
        (begin
           (set! ext-text (string-append (shell (string-append
             "${CLexe} --fill -I0 -W75 <<_EOF_\n" ext-text "\n_EOF_" )) "\n" ))

           (string-table-add-ref opt-strs ext-text)
    )   )
    ")\n" )              =][=

ENDIF "copyright"        =][=

   (define usage-proc (get "usage"))
   (if (< 1 (string-length usage-proc))
     (emit (string-append "\nextern tUsageProc " usage-proc ";"))
     (set! usage-proc "optionUsage")
   )

=]
[= INVOKE join-or-expand   join-type = "include" =]
#ifndef NULL
#  define NULL 0
#endif

/*
 *  [= prog-name =] option static const strings
 */[=
 (out-resume "home-list") \=][=

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # =][=

FOR flag "\n"           =][=
  (define flag-index (for-index)) =][=
  INVOKE emit-opt-strs  =][=

  (if (exist? "lib-name") (begin
      (set! lib-opt-ptr (string->c-name! (string-append
                        (get "lib-name") "_" (get "name") "_optDesc_p")))
      (set! lib-externs (string-append lib-externs
                        (sprintf "tOptDesc * const %-16s = optDesc + %d;\n"
                                 lib-opt-ptr (for-index) )  ))
  )   )                 =][=

ENDFOR flag             =][=

INVOKE help-strs        =][=
INVOKE decl-callbacks   =][=

IF (exist? "version")   =][=

  IF (exist? "version-proc") =]
#define VER_PROC        [= (get "version-proc") =][=
  ELIF (. make-test-main) =]
#ifdef [=(. main-guard) =]
# define VER_PROC       optionVersionStderr
#else
# define VER_PROC       optionPrintVersion
#endif /* [=(. main-guard)=] */[=
  ELSE                  =]
#define VER_PROC        optionPrintVersion[=
  ENDIF  make-test-main =][=

ENDIF  there is a version

=]
[= INVOKE emit-option-desc-table =]
[= (. lib-externs) =]
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *
 *  Define the [= (. prog-name) =] Option Environment
 */
#define zPROGNAME       ([= (string-table-add-ref opt-strs pname-up)   =])
#define zUsageTitle     ([=
 (define homerc-ct   0)
 (define homerc-txt "")
 (string-table-add-ref opt-strs usage-text) =])
[=
FOR homerc              =][=
  (set! tmp-text (get "homerc"))
  (if (> (string-length tmp-text)) (begin
      (set! homerc-ct  (+ 1 homerc-ct))
      (set! homerc-txt (string-append homerc-txt
            "\n    " (string-table-add-ref opt-strs tmp-text) "," ))
  )   )                 =][=
ENDFOR homerc           =][=
IF (> homerc-ct 0)     \=]
#define zRcName         ([=
 (set! tmp-text (if (exist? "rcfile") (get "rcfile")
       (string-append "." pname-down "rc") ))
 (string-table-add-ref opt-strs tmp-text) =])
static char const * const apzHomeList[=
  (sprintf "[%u] = {%s\n    NULL };" (+ 1 homerc-ct) homerc-txt) =][=

ELSE                    \=]
#define zRcName         NULL
#define apzHomeList     NULL[=
ENDIF                   =]
#define zBugsAddr       ([=
(out-push-new)         \=]
s/@[a-z]*{\([^{@}]*\)}/``\1''/g
s=@<prog-name>@=[= prog-name =]=g
/^@\(end *\)*example/d
s/^@item *$/\
/[=

(define patch-text-sed
  (sprintf "sed %s <<\\_EODetail_ | ${CLexe} --fill -I0 -W75\n"
    (raw-shell-str (out-pop #t)) ) )

(define patch-text (lambda (t-name)
  (set! tmp-text (string-append "\n"

  (shell (string-append
    patch-text-sed
    (get t-name)
    "\n_EODetail_" ))
  "\n" )) ))

(if (exist? "copyright.eaddr")
    (string-table-add-ref opt-strs (get "copyright.eaddr"))
    (if (exist? "eaddr")
        (string-table-add-ref opt-strs (get "eaddr"))
        "NULL"
)   )                   =])
#define zExplain        ([=

(if (or (exist? "explain") (== (get "main.main-type") "for-each"))
    (begin
      (if (exist? "explain")
          (patch-text "explain")
          (set! tmp-text "")  )

      (if (== (get "main.main-type") "for-each")
          (set! tmp-text (string-append tmp-text
"\nIf no arguments are provided, input arguments are read from stdin,
one per line; blank and '#'-prefixed lines are comments.
'stdin' may not be a terminal (tty).\n" ))  )

      (string-table-add-ref opt-strs tmp-text)
    )
    "NULL"
)                       =])
#define zDetail         ([=

(if (exist? "detail")
    (begin
      (patch-text "detail")
      (string-table-add-ref opt-strs tmp-text)
    )
    "NULL"
)                       =])
#define zFullVersion    ([=

(if (exist? "version")
    (string-table-add-ref opt-strs version-text)
    "NULL")             =])[=
(tpl-file-line extract-fmt)
=][=

   IF (. omit-nls-code) =]
#define OPTPROC_BASE OPTPROC_NONE
#define translate_option_strings NULL
[= ELSE  =]
#if defined(ENABLE_NLS)
# define OPTPROC_BASE OPTPROC_TRANSLATE[=
CASE   no-xlate             =][=
!E                          =][=
= opt-cfg                   =] | OPTPROC_NXLAT_OPT_CFG[=
= opt                       =] | OPTPROC_NXLAT_OPT[=
*                           =][= (error "invalid value for 'no-xlate'") =][=
ESAC   no-xlate             =]
  static tOptionXlateProc translate_option_strings;
#else
# define OPTPROC_BASE OPTPROC_NONE
# define translate_option_strings NULL
#endif /* ENABLE_NLS */
[= ENDIF no-nls             =][=
   IF (exist? "resettable") =]
static optArgBucket_t const original_[=(. pname-down)=]_defaults[ [=
(. UP-prefix) =]OPTION_CT ] = {
[= (shell (string-append
      "sed '$s@},@} @' <<\\_EOF_" default-text "\n_EOF_\n")) =]
};
static void * const original_[=(. pname-down)=]_cookies[ [=
(. UP-prefix) =]OPTION_CT ] = {
[=
 (shell (string-append "${CLexe} -I4 -S, <<\\_EOF_\n" default-cookie "_EOF_"))
=]
};
[= ENDIF resettable=]
[= INVOKE usage-text usage-type = full  \=]
[= INVOKE usage-text usage-type = short  =]
#endif /* not defined __doxygen__ */
[= INVOKE emit-option-callbacks          =]
/**
 * The directory containing the data associated with [= prog-name =].
 */
#ifndef  PKGDATADIR
# define PKGDATADIR ""
#endif

/**
 * Information about the person or institution that packaged [= prog-name =]
 * for the current distribution.
 */
#ifndef  WITH_PACKAGER
# define [=(. pname)=]_packager_info NULL
#else
static char const [=(. pname)=]_packager_info[] =
    "Packaged by " WITH_PACKAGER

# ifdef WITH_PACKAGER_VERSION
        " ("WITH_PACKAGER_VERSION")"
# endif

# ifdef WITH_PACKAGER_BUG_REPORTS
    "\nReport [=(. pname)=] bugs to " WITH_PACKAGER_BUG_REPORTS
# endif
    "\n";
#endif
#ifndef __doxygen__
[=
 (out-suspend  "home-list") =][=
 (emit-string-table opt-strs) =][=
 (out-resume   "home-list") =][=
 (out-pop      #t)
=]
#endif /* __doxygen__ */
/**
 * The option definitions for [= prog-name =].  The one structure that
 * binds them all.
 */
tOptions [=(. pname)=]Options = {
    OPTIONS_STRUCT_VERSION,
    0, NULL,                    /* original argc + argv    */
    ( OPTPROC_BASE[=                IF (not (exist? "allow-errors"))     =]
    + OPTPROC_ERRSTOP[=    ENDIF=][=IF      (exist? "flag.value")        =]
    + OPTPROC_SHORTOPT[=   ENDIF=][=IF      (exist? "long-opts")         =]
    + OPTPROC_LONGOPT[=    ENDIF=][=IF (not (exist? "flag.min"))         =]
    + OPTPROC_NO_REQ_OPT[= ENDIF=][=IF      (exist? "flag.disable")      =]
    + OPTPROC_NEGATIONS[=  ENDIF=][=IF (>=   number-opt-index 0)         =]
    + OPTPROC_NUM_OPT[=    ENDIF=][=IF      (exist? "environrc")         =]
    + OPTPROC_ENVIRON[=    ENDIF=][=IF (not (exist? "argument"))         =]
    + OPTPROC_NO_ARGS[=           ELIF (not (==* (get "argument") "[" )) =]
    + OPTPROC_ARGS_REQ[=   ENDIF=][=IF      (exist? "reorder-args")      =]
    + OPTPROC_REORDER[=    ENDIF=][=IF      (exist? "gnu-usage")         =]
    + OPTPROC_GNUUSAGE[=   ENDIF=][=IF      (exist? "no-misuse-usage")   =]
    + OPTPROC_MISUSE[=     ENDIF=][=IF      (exist? "vendor-opt")        =]
    + OPTPROC_VENDOR_OPT[= ENDIF=] ),
    0, NULL,                    /* current option index, current option */
    NULL,         NULL,         zPROGNAME,
    zRcName,      zCopyright,   zLicenseDescrip,
    zFullVersion, apzHomeList,  zUsageTitle,
    zExplain,     zDetail,      optDesc,
    zBugsAddr,                  /* address to send bugs to */
    NULL, NULL,                 /* extensions/saved state  */
    [= (. usage-proc)       =], /* usage procedure */
    translate_option_strings,   /* translation procedure */
    /*
     *  Indexes to special options
     */
    { [= (if (exist? "no-libopts") "NO_EQUIVALENT"
             (string-append INDEX-pfx "MORE_HELP"))
       =], /* more-help option index */
      [=IF (and (exist? "homerc") (not (exist? "disable-save")))
             =][= (. INDEX-pfx) =]SAVE_OPTS[=
        ELSE =]NO_EQUIVALENT[=
        ENDIF=], /* save option index */
      [= (if (>= number-opt-index 0) number-opt-index "NO_EQUIVALENT")
        =], /* '-#' option index */
      [= (if (>= default-opt-index 0) default-opt-index "NO_EQUIVALENT")
        =] /* index of default opt */
    },
    [= (. option-ct) =] /* full option count */, [=
       (count "flag")=] /* user option count */,
    [= (. pname) =]_full_usage, [= (. pname) =]_short_usage,
[= IF (exist? "resettable") \=]
    original_[=(. pname-down)=]_defaults, original_[=(. pname-down)=]_cookies,
[= ELSE \=]
    NULL, NULL,
[= ENDIF \=]
    PKGDATADIR, [=(. pname)=]_packager_info
};
[=

FOR lib-name

=]
tOptDesc* [= (string->c-name! (get "lib-name")) =]_optDesc_p = NULL;[=

ENDFOR                      =][=

INVOKE emit-nls-code

=]
#ifdef  __cplusplus
}
#endif[= #

// = = = = = = = = = = = = = = = = = = = = = = = = = = = = =][=

DEFINE emit-nls-code

=][= IF (. omit-nls-code) =][= RETURN =][= ENDIF

=]
#if ENABLE_NLS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <autoopts/usage-txt.h>

static char* AO_gettext(char const* pz);
static void  coerce_it(void** s);

/**
 * AutoGen specific wrapper function for gettext.
 * It relies on the macro _() to convert from English to the target
 * language, then strdup-duplicates the result string.
 *
 * @param[in] pz the input text used as a lookup key.
 * @returns the translated text (if there is one),
 *   or the original text (if not).
 */
static char *
AO_gettext(char const* pz)
{
    char* pzRes;
    if (pz == NULL)
        return NULL;
    pzRes = _(pz);
    if (pzRes == pz)
        return pzRes;
    pzRes = strdup(pzRes);
    if (pzRes == NULL) {
        fputs(_("No memory for duping translated strings\n"), stderr);
        exit([=(. nomem-exit-code)=]);
    }
    return pzRes;
}

static void coerce_it(void** s) { *s = AO_gettext(*s);
}

/**
 * Translate all the translatable strings in the [=(. pname)=]Options
 * structure defined above.  This is done only once.
 */
static void
translate_option_strings(void)
{
    tOptions * const pOpt = &[=(. pname)=]Options;

    /*
     *  Guard against re-translation.  It won't work.  The strings will have
     *  been changed by the first pass through this code.  One shot only.
     */
    if (option_usage_text.field_ct != 0) {
        /*
         *  Do the translations.  The first pointer follows the field count
         *  field.  The field count field is the size of a pointer.
         */
        tOptDesc * pOD = pOpt->pOptDesc;
        char **    ppz = (char**)(void*)&(option_usage_text);
        int        ix  = option_usage_text.field_ct;

        do {
            ppz++;
            *ppz = AO_gettext(*ppz);
        } while (--ix > 0);
[=
  FOR field IN pzCopyright pzCopyNotice pzFullVersion pzUsageTitle pzExplain
               pzDetail    pzPackager   =]
        coerce_it((void*)&(pOpt->[= field =]));[=
  ENDFOR                        =][=

  IF (exist? "full-usage")      =]
        coerce_it((void*)&(pOpt->pzFullUsage));[=
  ENDIF                         =][=

  IF (exist? "short-usage")     =]
        coerce_it((void*)&(pOpt->pzShortUsage));[=
  ENDIF                         =]
        option_usage_text.field_ct = 0;

        for (ix = pOpt->optCt; ix > 0; ix--, pOD++)
            coerce_it((void*)&(pOD->pzText));
    }

    if ((pOpt->fOptSet & OPTPROC_NXLAT_OPT_CFG) == 0) {
        tOptDesc * pOD = pOpt->pOptDesc;
        int        ix;

        for (ix = pOpt->optCt; ix > 0; ix--, pOD++) {[=

  FOR field IN pz_Name pz_DisableName pz_DisablePfx  =][=

    (sprintf "\n            coerce_it((void*)&(pOD->%1$s));"
             (get "field"))     =][=

  ENDFOR                        =]
        }
        /* prevent re-translation */
        [= (. pname)
        =]Options.fOptSet |= OPTPROC_NXLAT_OPT_CFG | OPTPROC_NXLAT_OPT;
    }
}

#endif /* ENABLE_NLS */
[=

ENDDEF emit-nls-code

=][=

DEFINE emit-option-desc-table

=]
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
 *  Define the [= prog-name =] Option Descriptions.
 * This is an array of [=(. UP-prefix)=]OPTION_CT entries, one for each
 * option that the [= prog-name =] program responds to.
 */
static tOptDesc optDesc[[=
(define default-text   "")
(define default-cookie "")
UP-prefix
=]OPTION_CT] = {[=

FOR flag "\n"           =][=
  (define flag-index (for-index)) =][=

  INVOKE emit-opt-desc  =][=

ENDFOR flag

=][=

IF (exist? "resettable")

=]

  {  /* entry idx, value */ [=
        (set! default-text (string-append default-text
               "\n    { NULL }, /* resettable */" ))
        (set! default-cookie (string-append default-cookie "NULL\n" ))
        INDEX-pfx =]RESET_OPTION, [= (. VALUE-pfx) =]RESET_OPTION,
     /* equiv idx value  */ NO_EQUIVALENT, [= (. VALUE-pfx) =]RESET_OPTION,
     /* equivalenced to  */ NO_EQUIVALENT,
     /* min, max, act ct */ 0, 1, 0,
     /* opt state flags  */ RESET_FLAGS, 0,
     /* last opt argumnt */ { NULL },
     /* arg list/cookie  */ NULL,
     /* must/cannot opts */ NULL,  NULL,
     /* option proc      */ optionResetOpt,
     /* desc, NAME, name */ RESET_DESC, NULL, RESET_name,
     /* disablement strs */ NULL, NULL },[=

ENDIF

=][=

IF (exist? "version")   =]

  {  /* entry idx, value */ [=
        (set! default-text (string-append default-text
               "\n    { NULL }, /* version */" ))
        (set! default-cookie (string-append default-cookie "NULL\n" ))
         INDEX-pfx =]VERSION, [= (. VALUE-pfx) =]VERSION,
     /* equiv idx value  */ NO_EQUIVALENT, [= (. VALUE-pfx) =]VERSION,
     /* equivalenced to  */ NO_EQUIVALENT,
     /* min, max, act ct */ 0, 1, 0,
     /* opt state flags  */ VER_FLAGS, 0,
     /* last opt argumnt */ { NULL },
     /* arg list/cookie  */ NULL,
     /* must/cannot opts */ NULL, NULL,
     /* option proc      */ VER_PROC,
     /* desc, NAME, name */ VER_DESC, NULL, VER_name,
     /* disablement strs */ NULL, NULL },

[=

ENDIF =]

  {  /* entry idx, value */ [=
        (set! default-text (string-append default-text
               "\n    { NULL }, /* help */" ))
        (set! default-cookie (string-append default-cookie "NULL\n" ))
        INDEX-pfx =]HELP, [= (. VALUE-pfx) =]HELP,
     /* equiv idx value  */ NO_EQUIVALENT, [= (. VALUE-pfx) =]HELP,
     /* equivalenced to  */ NO_EQUIVALENT,
     /* min, max, act ct */ 0, 1, 0,
     /* opt state flags  */ OPTST_IMM | OPTST_NO_INIT, 0,
     /* last opt argumnt */ { NULL },
     /* arg list/cookie  */ NULL,
     /* must/cannot opts */ NULL, NULL,
     /* option proc      */ doUsageOpt,
     /* desc, NAME, name */ HELP_DESC, NULL, HELP_name,
     /* disablement strs */ NULL, NULL }[=

IF (not (exist? "no-libopts"))          =],

  {  /* entry idx, value */ [=
        (set! default-text (string-append default-text
               "\n    { NULL }, /* more-help */" ))
        (set! default-cookie (string-append default-cookie "NULL\n" ))
        INDEX-pfx =]MORE_HELP, [= (. VALUE-pfx) =]MORE_HELP,
     /* equiv idx value  */ NO_EQUIVALENT, [= (. VALUE-pfx) =]MORE_HELP,
     /* equivalenced to  */ NO_EQUIVALENT,
     /* min, max, act ct */ 0, 1, 0,
     /* opt state flags  */ MORE_HELP_FLAGS, 0,
     /* last opt argumnt */ { NULL },
     /* arg list/cookie  */ NULL,
     /* must/cannot opts */ NULL,  NULL,
     /* option proc      */ optionPagedUsage,
     /* desc, NAME, name */ MORE_HELP_DESC, NULL, MORE_HELP_name,
     /* disablement strs */ NULL, NULL }[=

ENDIF not have no-libopts               =][=

IF (exist? "usage-opt")                 =],

  {  /* entry idx, value */ [=
        (set! default-text (string-append default-text
               "\n    { NULL }, /* usage-opt */" ))
        (set! default-cookie (string-append default-cookie "NULL\n" ))
        INDEX-pfx =]USAGE, [= (. VALUE-pfx) =]USAGE,
     /* equiv idx value  */ NO_EQUIVALENT, [= (. VALUE-pfx) =]USAGE,
     /* equivalenced to  */ NO_EQUIVALENT,
     /* min, max, act ct */ 0, 1, 0,
     /* opt state flags  */ OPTST_IMM | OPTST_NO_INIT, 0,
     /* last opt argumnt */ { NULL },
     /* arg list/cookie  */ NULL,
     /* must/cannot opts */ NULL,  NULL,
     /* option proc      */ doUsageOpt,
     /* desc, NAME, name */ USAGE_DESC, NULL, USAGE_name,
     /* disablement strs */ NULL, NULL }[=

ENDIF have usage-opt                    =][=

IF (exist? "homerc")                    =][=
   IF (not (exist? "disable-save"))     =],

  {  /* entry idx, value */ [=
        (set! default-text (string-append default-text
               "\n    { NULL }, /* save-opts */" ))
        (set! default-cookie (string-append default-cookie "NULL\n" ))
        INDEX-pfx =]SAVE_OPTS, [=
           (if (not (exist? "disable-save"))
               (string-append VALUE-pfx "SAVE_OPTS")
               "0") =],
     /* equiv idx value  */ NO_EQUIVALENT, [= (. VALUE-pfx) =]SAVE_OPTS,
     /* equivalenced to  */ NO_EQUIVALENT,
     /* min, max, act ct */ 0, 1, 0,
     /* opt state flags  */ OPTST_SET_ARGTYPE(OPARG_TYPE_STRING)
                          | OPTST_ARG_OPTIONAL | OPTST_NO_INIT, 0,
     /* last opt argumnt */ { NULL },
     /* arg list/cookie  */ NULL,
     /* must/cannot opts */ NULL,  NULL,
     /* option proc      */ NULL,
     /* desc, NAME, name */ SAVE_OPTS_DESC, NULL, SAVE_OPTS_name,
     /* disablement strs */ NULL, NULL }[=

   ENDIF disable-save does not exist     =],

  {  /* entry idx, value */ [=
        (set! default-text (string-append default-text
               "\n    { NULL }, /* load-opts */" ))
        (set! default-cookie (string-append default-cookie "NULL\n" ))
        INDEX-pfx =]LOAD_OPTS, [=
           (if (not (exist? "disable-load"))
               (string-append VALUE-pfx "LOAD_OPTS")
               "0") =],
     /* equiv idx value  */ NO_EQUIVALENT, [= (. VALUE-pfx) =]LOAD_OPTS,
     /* equivalenced to  */ NO_EQUIVALENT,
     /* min, max, act ct */ 0, NOLIMIT, 0,
     /* opt state flags  */ OPTST_SET_ARGTYPE(OPARG_TYPE_STRING)
			  | OPTST_DISABLE_IMM[=
    (if (exist? "disable-load") "| OPTST_NO_COMMAND") =], 0,
     /* last opt argumnt */ { NULL },
     /* arg list/cookie  */ NULL,
     /* must/cannot opts */ NULL, NULL,
     /* option proc      */ optionLoadOpt,
     /* desc, NAME, name */ [=
    (if (exist? "disable-load") "NULL, NULL, NULL"
         "LOAD_OPTS_DESC, LOAD_OPTS_NAME, LOAD_OPTS_name")=],
     /* disablement strs */ [=
    (if (exist? "disable-load") "NULL, NULL"
         "NO_LOAD_OPTS_name, LOAD_OPTS_pfx")=] }[=

ENDIF have homerc                       =][=

IF (exist? "vendor-opt")                =],

  {  /* entry idx, value */ [=
        (set! default-text (string-append default-text
               "\n    { NULL }, /* vendor-opt */" ))
        (set! default-cookie (string-append default-cookie "NULL\n" ))
        INDEX-pfx =]VENDOR_OPT, [= (. VALUE-pfx) =]VENDOR_OPT,
     /* equiv idx value  */ NO_EQUIVALENT, [= (. VALUE-pfx) =]VENDOR_OPT,
     /* equivalenced to  */ NO_EQUIVALENT,
     /* min, max, act ct */ 0, NOLIMIT, 0,
     /* opt state flags  */ OPTST_SET_ARGTYPE(OPARG_TYPE_STRING)
                          | OPTST_IMM | OPTST_TWICE, 0, /* both directions */
     /* last opt argumnt */ { NULL },
     /* arg list/cookie  */ NULL,
     /* must/cannot opts */ NULL,  NULL,
     /* option proc      */ optionVendorOption,
     /* desc, NAME, name */ VEND_DESC, NULL, VEND_name,
     /* disablement strs */ NULL, NULL }[=

ENDIF have vendor-opt                   =]
};
[=

ENDDEF emit-option-desc-table

/*
 * Local Variables:
 * mode: C
 * c-file-style: "stroustrup"
 * indent-tabs-mode: nil
 * End:
 * opthead.tpl ends here */    \=]
