Blame src/libopts/putshell.c

Packit Service 4684c1
Packit Service 4684c1
/**
Packit Service 4684c1
 * \file putshell.c
Packit Service 4684c1
 *
Packit Service 4684c1
 *  This module will interpret the options set in the tOptions
Packit Service 4684c1
 *  structure and print them to standard out in a fashion that
Packit Service 4684c1
 *  will allow them to be interpreted by the Bourne or Korn shells.
Packit Service 4684c1
 *
Packit Service 4684c1
 * @addtogroup autoopts
Packit Service 4684c1
 * @{
Packit Service 4684c1
 */
Packit Service 4684c1
/*
Packit Service 4684c1
 *  This file is part of AutoOpts, a companion to AutoGen.
Packit Service 4684c1
 *  AutoOpts is free software.
Packit Service 4684c1
 *  AutoOpts is Copyright (C) 1992-2018 by Bruce Korb - all rights reserved
Packit Service 4684c1
 *
Packit Service 4684c1
 *  AutoOpts is available under any one of two licenses.  The license
Packit Service 4684c1
 *  in use must be one of these two and the choice is under the control
Packit Service 4684c1
 *  of the user of the license.
Packit Service 4684c1
 *
Packit Service 4684c1
 *   The GNU Lesser General Public License, version 3 or later
Packit Service 4684c1
 *      See the files "COPYING.lgplv3" and "COPYING.gplv3"
Packit Service 4684c1
 *
Packit Service 4684c1
 *   The Modified Berkeley Software Distribution License
Packit Service 4684c1
 *      See the file "COPYING.mbsd"
Packit Service 4684c1
 *
Packit Service 4684c1
 *  These files have the following sha256 sums:
Packit Service 4684c1
 *
Packit Service 4684c1
 *  8584710e9b04216a394078dc156b781d0b47e1729104d666658aecef8ee32e95  COPYING.gplv3
Packit Service 4684c1
 *  4379e7444a0e2ce2b12dd6f5a52a27a4d02d39d247901d3285c88cf0d37f477b  COPYING.lgplv3
Packit Service 4684c1
 *  13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239  COPYING.mbsd
Packit Service 4684c1
 */
Packit Service 4684c1
Packit Service 4684c1
/**
Packit Service 4684c1
 * Count the number of bytes required to represent a string as a
Packit Service 4684c1
 * compilable string.
Packit Service 4684c1
 *
Packit Service 4684c1
 * @param[in] scan    the text to be rewritten as a C program text string.
Packit Service 4684c1
 * @param[in] nl_len  the number of bytes used for each embedded newline.
Packit Service 4684c1
 *
Packit Service 4684c1
 * @returns the count, including the terminating NUL byte.
Packit Service 4684c1
 */
Packit Service 4684c1
static size_t
Packit Service 4684c1
string_size(char const * scan, size_t nl_len)
Packit Service 4684c1
{
Packit Service 4684c1
    /*
Packit Service 4684c1
     *  Start by counting the start and end quotes, plus the NUL.
Packit Service 4684c1
     */
Packit Service 4684c1
    size_t res_ln = 3;
Packit Service 4684c1
Packit Service 4684c1
    for (;;) {
Packit Service 4684c1
        char ch = *(scan++);
Packit Service 4684c1
        if ((ch >= ' ') && (ch <= '~')) {
Packit Service 4684c1
Packit Service 4684c1
            /*
Packit Service 4684c1
             * a backslash allowance for double quotes and baskslashes
Packit Service 4684c1
             */
Packit Service 4684c1
            res_ln += ((ch == '"') || (ch == '\\')) ? 2 : 1;
Packit Service 4684c1
        }
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  When not a normal character, then count the characters
Packit Service 4684c1
         *  required to represent whatever it is.
Packit Service 4684c1
         */
Packit Service 4684c1
        else switch (ch) {
Packit Service 4684c1
        case NUL:
Packit Service 4684c1
            return res_ln;
Packit Service 4684c1
Packit Service 4684c1
        case NL:
Packit Service 4684c1
            res_ln += nl_len;
Packit Service 4684c1
            break;
Packit Service 4684c1
Packit Service 4684c1
        case HT:
Packit Service 4684c1
        case BEL:
Packit Service 4684c1
        case BS:
Packit Service 4684c1
        case FF:
Packit Service 4684c1
        case CR:
Packit Service 4684c1
        case VT:
Packit Service 4684c1
            res_ln += 2;
Packit Service 4684c1
            break;
Packit Service 4684c1
Packit Service 4684c1
        default:
Packit Service 4684c1
            res_ln += 4; /* text len for \xNN */
Packit Service 4684c1
        }
Packit Service 4684c1
    }
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/*=export_func  optionQuoteString
Packit Service 4684c1
 * private:
Packit Service 4684c1
 *
Packit Service 4684c1
 * what:  Print a string as quoted text suitable for a C compiler.
Packit Service 4684c1
 * arg:   + char const * + text  + a block of text to quote +
Packit Service 4684c1
 * arg:   + char const * + nl    + line splice text         +
Packit Service 4684c1
 *
Packit Service 4684c1
 * ret_type:  char const *
Packit Service 4684c1
 * ret_desc:  the allocated input string as a quoted string
Packit Service 4684c1
 *
Packit Service 4684c1
 * doc:
Packit Service 4684c1
 *  This is for internal use by autogen and autoopts.
Packit Service 4684c1
 *  It takes an input string and produces text the C compiler can process
Packit Service 4684c1
 *  to produce an exact copy of the original string.
Packit Service 4684c1
 *  The caller must deallocate the result.  Standard C strings and
Packit Service 4684c1
 *  K&R strings are distinguished by the "nl" string.
Packit Service 4684c1
=*/
Packit Service 4684c1
char const *
Packit Service 4684c1
optionQuoteString(char const * text, char const * nl)
Packit Service 4684c1
{
Packit Service 4684c1
    size_t   nl_len = strlen(nl);
Packit Service 4684c1
    size_t   out_sz = string_size(text, nl_len);
Packit Service 4684c1
    char *   out;
Packit Service 4684c1
    char *   res    = out = AGALOC(out_sz, "quot str");
Packit Service 4684c1
Packit Service 4684c1
    *(out++) = '"';
Packit Service 4684c1
Packit Service 4684c1
    for (;;) {
Packit Service 4684c1
        unsigned char ch = (unsigned char)*text;
Packit Service 4684c1
        if ((ch >= ' ') && (ch <= '~')) {
Packit Service 4684c1
            if ((ch == '"') || (ch == '\\'))
Packit Service 4684c1
                /*
Packit Service 4684c1
                 *  We must escape these characters in the output string
Packit Service 4684c1
                 */
Packit Service 4684c1
                *(out++) = '\\';
Packit Service 4684c1
            *(out++) = (char)ch;
Packit Service 4684c1
Packit Service 4684c1
        } else switch (ch) {
Packit Service 4684c1
#       define   add_esc_ch(_ch)  { *(out++) = '\\'; *(out++) = (_ch); }
Packit Service 4684c1
        case BEL: add_esc_ch('a'); break;
Packit Service 4684c1
        case BS:  add_esc_ch('b'); break;
Packit Service 4684c1
        case HT:  add_esc_ch('t'); break;
Packit Service 4684c1
        case VT:  add_esc_ch('v'); break;
Packit Service 4684c1
        case FF:  add_esc_ch('f'); break;
Packit Service 4684c1
        case CR:  add_esc_ch('r'); break;
Packit Service 4684c1
Packit Service 4684c1
        case LF:
Packit Service 4684c1
            /*
Packit Service 4684c1
             *  Place contiguous new-lines on a single line.
Packit Service 4684c1
             *  The current character is a NL, check the next one.
Packit Service 4684c1
             */
Packit Service 4684c1
            while (*++text == NL)
Packit Service 4684c1
                add_esc_ch('n');
Packit Service 4684c1
Packit Service 4684c1
            /*
Packit Service 4684c1
             *  Insert a splice before starting next line
Packit Service 4684c1
             */
Packit Service 4684c1
            if (*text != NUL) {
Packit Service 4684c1
                memcpy(out, nl, nl_len);
Packit Service 4684c1
                out += nl_len;
Packit Service 4684c1
Packit Service 4684c1
                continue; /* text is already at the next character */
Packit Service 4684c1
            }
Packit Service 4684c1
Packit Service 4684c1
            add_esc_ch('n');
Packit Service 4684c1
            /* FALLTHROUGH */
Packit Service 4684c1
Packit Service 4684c1
        case NUL:
Packit Service 4684c1
            /*
Packit Service 4684c1
             *  End of string.  Terminate the quoted output.  If necessary,
Packit Service 4684c1
             *  deallocate the text string.  Return the scan resumption point.
Packit Service 4684c1
             */
Packit Service 4684c1
            *(out++) = '"';
Packit Service 4684c1
            *(out++) = NUL;
Packit Service 4684c1
#ifndef NDEBUG
Packit Service 4684c1
            if ((size_t)(out - res) > out_sz) {
Packit Service 4684c1
                fputs(misguess_len, stderr);
Packit Service 4684c1
                option_exits(EXIT_FAILURE);
Packit Service 4684c1
            }
Packit Service 4684c1
#endif
Packit Service 4684c1
            return res;
Packit Service 4684c1
Packit Service 4684c1
        default:
Packit Service 4684c1
            /*
Packit Service 4684c1
             *  sprintf is safe here, because we already computed
Packit Service 4684c1
             *  the amount of space we will be using.  Assertion is above.
Packit Service 4684c1
             */
Packit Service 4684c1
            out += sprintf(out, MK_STR_OCT_FMT, ch);
Packit Service 4684c1
        }
Packit Service 4684c1
Packit Service 4684c1
        text++;
Packit Service 4684c1
#       undef add_esc_ch
Packit Service 4684c1
    }
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/**
Packit Service 4684c1
 *  Print out escaped apostorophes.
Packit Service 4684c1
 *
Packit Service 4684c1
 *  @param[in] str  the apostrophies to print
Packit Service 4684c1
 */
Packit Service 4684c1
static char const *
Packit Service 4684c1
print_quoted_apostrophes(char const * str)
Packit Service 4684c1
{
Packit Service 4684c1
    while (*str == APOSTROPHE) {
Packit Service 4684c1
        fputs(QUOT_APOS, stdout);
Packit Service 4684c1
        str++;
Packit Service 4684c1
    }
Packit Service 4684c1
    return str;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/**
Packit Service 4684c1
 *  Print a single quote (apostrophe quoted) string.
Packit Service 4684c1
 *  Other than somersaults for apostrophes, nothing else needs quoting.
Packit Service 4684c1
 *
Packit Service 4684c1
 *  @param[in] str  the string to print
Packit Service 4684c1
 */
Packit Service 4684c1
static void
Packit Service 4684c1
print_quot_str(char const * str)
Packit Service 4684c1
{
Packit Service 4684c1
    /*
Packit Service 4684c1
     *  Handle empty strings to make the rest of the logic simpler.
Packit Service 4684c1
     */
Packit Service 4684c1
    if ((str == NULL) || (*str == NUL)) {
Packit Service 4684c1
        fputs(EMPTY_ARG, stdout);
Packit Service 4684c1
        return;
Packit Service 4684c1
    }
Packit Service 4684c1
Packit Service 4684c1
    /*
Packit Service 4684c1
     *  Emit any single quotes/apostrophes at the start of the string and
Packit Service 4684c1
     *  bail if that is all we need to do.
Packit Service 4684c1
     */
Packit Service 4684c1
    str = print_quoted_apostrophes(str);
Packit Service 4684c1
    if (*str == NUL)
Packit Service 4684c1
        return;
Packit Service 4684c1
Packit Service 4684c1
    /*
Packit Service 4684c1
     *  Start the single quote string
Packit Service 4684c1
     */
Packit Service 4684c1
    fputc(APOSTROPHE, stdout);
Packit Service 4684c1
    for (;;) {
Packit Service 4684c1
        char const * pz = strchr(str, APOSTROPHE);
Packit Service 4684c1
        if (pz == NULL)
Packit Service 4684c1
            break;
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  Emit the string up to the single quote (apostrophe) we just found.
Packit Service 4684c1
         */
Packit Service 4684c1
        (void)fwrite(str, (size_t)(pz - str), (size_t)1, stdout);
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         * Close the current string, emit the apostrophes and re-open the
Packit Service 4684c1
         * string (IFF there is more text to print).
Packit Service 4684c1
         */
Packit Service 4684c1
        fputc(APOSTROPHE, stdout);
Packit Service 4684c1
        str = print_quoted_apostrophes(pz);
Packit Service 4684c1
        if (*str == NUL)
Packit Service 4684c1
            return;
Packit Service 4684c1
Packit Service 4684c1
        fputc(APOSTROPHE, stdout);
Packit Service 4684c1
    }
Packit Service 4684c1
Packit Service 4684c1
    /*
Packit Service 4684c1
     *  If we broke out of the loop, we must still emit the remaining text
Packit Service 4684c1
     *  and then close the single quote string.
Packit Service 4684c1
     */
Packit Service 4684c1
    fputs(str, stdout);
Packit Service 4684c1
    fputc(APOSTROPHE, stdout);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static void
Packit Service 4684c1
print_enumeration(tOptions * pOpts, tOptDesc * pOD)
Packit Service 4684c1
{
Packit Service 4684c1
    uintptr_t e_val = pOD->optArg.argEnum;
Packit Service 4684c1
    printf(OPT_VAL_FMT, pOpts->pzPROGNAME, pOD->pz_NAME);
Packit Service 4684c1
Packit Service 4684c1
    /*
Packit Service 4684c1
     *  Convert value to string, print that and restore numeric value.
Packit Service 4684c1
     */
Packit Service 4684c1
    (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
Packit Service 4684c1
    printf(QUOT_ARG_FMT, pOD->optArg.argString);
Packit Service 4684c1
    if (pOD->fOptState & OPTST_ALLOC_ARG)
Packit Service 4684c1
        AGFREE(pOD->optArg.argString);
Packit Service 4684c1
    pOD->optArg.argEnum = e_val;
Packit Service 4684c1
Packit Service 4684c1
    printf(OPT_END_FMT, pOpts->pzPROGNAME, pOD->pz_NAME);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static void
Packit Service 4684c1
print_membership(tOptions * pOpts, tOptDesc * pOD)
Packit Service 4684c1
{
Packit Service 4684c1
    char const * svstr = pOD->optArg.argString;
Packit Service 4684c1
    char const * pz;
Packit Service 4684c1
    uintptr_t val = 1;
Packit Service 4684c1
    printf(zOptNumFmt, pOpts->pzPROGNAME, pOD->pz_NAME,
Packit Service 4684c1
           (int)(uintptr_t)(pOD->optCookie));
Packit Service 4684c1
    pOD->optCookie = VOIDP(~0UL);
Packit Service 4684c1
    (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD);
Packit Service 4684c1
Packit Service 4684c1
    pz = pOD->optArg.argString;
Packit Service 4684c1
    while (*pz != NUL) {
Packit Service 4684c1
        printf("readonly %s_", pOD->pz_NAME);
Packit Service 4684c1
        pz = SPN_PLUS_N_SPACE_CHARS(pz);
Packit Service 4684c1
Packit Service 4684c1
        for (;;) {
Packit Service 4684c1
            int ch = *(pz++);
Packit Service 4684c1
            if (IS_LOWER_CASE_CHAR(ch))   fputc(toupper(ch), stdout);
Packit Service 4684c1
            else if (IS_UPPER_CASE_CHAR(ch))   fputc(ch, stdout);
Packit Service 4684c1
            else if (IS_PLUS_N_SPACE_CHAR(ch)) goto name_done;
Packit Service 4684c1
            else if (ch == NUL)        { pz--; goto name_done; }
Packit Service 4684c1
            else fputc('_', stdout);
Packit Service 4684c1
        } name_done:;
Packit Service 4684c1
        printf(SHOW_VAL_FMT, (unsigned long)val);
Packit Service 4684c1
        val <<= 1;
Packit Service 4684c1
    }
Packit Service 4684c1
Packit Service 4684c1
    AGFREE(pOD->optArg.argString);
Packit Service 4684c1
    pOD->optArg.argString = svstr;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static void
Packit Service 4684c1
print_stacked_arg(tOptions * pOpts, tOptDesc * pOD)
Packit Service 4684c1
{
Packit Service 4684c1
    tArgList *      pAL = (tArgList *)pOD->optCookie;
Packit Service 4684c1
    char const **   ppz = pAL->apzArgs;
Packit Service 4684c1
    int             ct  = pAL->useCt;
Packit Service 4684c1
Packit Service 4684c1
    printf(zOptCookieCt, pOpts->pzPROGNAME, pOD->pz_NAME, ct);
Packit Service 4684c1
Packit Service 4684c1
    while (--ct >= 0) {
Packit Service 4684c1
        printf(ARG_BY_NUM_FMT, pOpts->pzPROGNAME, pOD->pz_NAME,
Packit Service 4684c1
               pAL->useCt - ct);
Packit Service 4684c1
        print_quot_str(*(ppz++));
Packit Service 4684c1
        printf(EXPORT_ARG_FMT, pOpts->pzPROGNAME, pOD->pz_NAME,
Packit Service 4684c1
               pAL->useCt - ct);
Packit Service 4684c1
    }
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/**
Packit Service 4684c1
 * emit the arguments as readily parsed text.
Packit Service 4684c1
 * The program options are set by emitting the shell "set" command.
Packit Service 4684c1
 *
Packit Service 4684c1
 * @param[in] opts  the program options structure
Packit Service 4684c1
 */
Packit Service 4684c1
static void
Packit Service 4684c1
print_reordering(tOptions * opts)
Packit Service 4684c1
{
Packit Service 4684c1
    unsigned int ix;
Packit Service 4684c1
Packit Service 4684c1
    fputs(set_dash, stdout);
Packit Service 4684c1
Packit Service 4684c1
    for (ix = opts->curOptIdx;
Packit Service 4684c1
         ix < opts->origArgCt;
Packit Service 4684c1
         ix++) {
Packit Service 4684c1
        fputc(' ', stdout);
Packit Service 4684c1
        print_quot_str(opts->origArgVect[ ix ]);
Packit Service 4684c1
    }
Packit Service 4684c1
    fputs(init_optct, stdout);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/*=export_func  optionPutShell
Packit Service 4684c1
 * what:  write a portable shell script to parse options
Packit Service 4684c1
 * private:
Packit Service 4684c1
 * arg:   tOptions *, pOpts, the program options descriptor
Packit Service 4684c1
 * doc:   This routine will emit portable shell script text for parsing
Packit Service 4684c1
 *        the options described in the option definitions.
Packit Service 4684c1
=*/
Packit Service 4684c1
void
Packit Service 4684c1
optionPutShell(tOptions * pOpts)
Packit Service 4684c1
{
Packit Service 4684c1
    int  optIx = 0;
Packit Service 4684c1
Packit Service 4684c1
    printf(zOptCtFmt, pOpts->curOptIdx-1);
Packit Service 4684c1
Packit Service 4684c1
    do  {
Packit Service 4684c1
        tOptDesc * pOD = pOpts->pOptDesc + optIx;
Packit Service 4684c1
Packit Service 4684c1
        if ((pOD->fOptState & OPTST_NO_OUTPUT_MASK) != 0)
Packit Service 4684c1
            continue;
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  Equivalence classes are hard to deal with.  Where the
Packit Service 4684c1
         *  option data wind up kind of squishes around.  For the purposes
Packit Service 4684c1
         *  of emitting shell state, they are not recommended, but we'll
Packit Service 4684c1
         *  do something.  I guess we'll emit the equivalenced-to option
Packit Service 4684c1
         *  at the point in time when the base option is found.
Packit Service 4684c1
         */
Packit Service 4684c1
        if (pOD->optEquivIndex != NO_EQUIVALENT)
Packit Service 4684c1
            continue; /* equivalence to a different option */
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  Equivalenced to a different option.  Process the current option
Packit Service 4684c1
         *  as the equivalenced-to option.  Keep the persistent state bits,
Packit Service 4684c1
         *  but copy over the set-state bits.
Packit Service 4684c1
         */
Packit Service 4684c1
        if (pOD->optActualIndex != optIx) {
Packit Service 4684c1
            tOptDesc * p  = pOpts->pOptDesc + pOD->optActualIndex;
Packit Service 4684c1
            p->optArg     = pOD->optArg;
Packit Service 4684c1
            p->fOptState &= OPTST_PERSISTENT_MASK;
Packit Service 4684c1
            p->fOptState |= pOD->fOptState & ~OPTST_PERSISTENT_MASK;
Packit Service 4684c1
            printf(zEquivMode, pOpts->pzPROGNAME, pOD->pz_NAME, p->pz_NAME);
Packit Service 4684c1
            pOD = p;
Packit Service 4684c1
        }
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  If the argument type is a set membership bitmask, then we always
Packit Service 4684c1
         *  emit the thing.  We do this because it will always have some sort
Packit Service 4684c1
         *  of bitmask value and we need to emit the bit values.
Packit Service 4684c1
         */
Packit Service 4684c1
        if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_MEMBERSHIP) {
Packit Service 4684c1
            print_membership(pOpts, pOD);
Packit Service 4684c1
            continue;
Packit Service 4684c1
        }
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  IF the option was either specified or it wakes up enabled,
Packit Service 4684c1
         *  then we will emit information.  Otherwise, skip it.
Packit Service 4684c1
         *  The idea is that if someone defines an option to initialize
Packit Service 4684c1
         *  enabled, we should tell our shell script that it is enabled.
Packit Service 4684c1
         */
Packit Service 4684c1
        if (UNUSED_OPT(pOD) && DISABLED_OPT(pOD))
Packit Service 4684c1
            continue;
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  Handle stacked arguments
Packit Service 4684c1
         */
Packit Service 4684c1
        if (  (pOD->fOptState & OPTST_STACKED)
Packit Service 4684c1
           && (pOD->optCookie != NULL) )  {
Packit Service 4684c1
            print_stacked_arg(pOpts, pOD);
Packit Service 4684c1
            continue;
Packit Service 4684c1
        }
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  If the argument has been disabled,
Packit Service 4684c1
         *  Then set its value to the disablement string
Packit Service 4684c1
         */
Packit Service 4684c1
        if ((pOD->fOptState & OPTST_DISABLED) != 0) {
Packit Service 4684c1
            printf(zOptDisabl, pOpts->pzPROGNAME, pOD->pz_NAME,
Packit Service 4684c1
                   (pOD->pz_DisablePfx != NULL)
Packit Service 4684c1
                   ? pOD->pz_DisablePfx : "false");
Packit Service 4684c1
            continue;
Packit Service 4684c1
        }
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  If the argument type is numeric, the last arg pointer
Packit Service 4684c1
         *  is really the VALUE of the string that was pointed to.
Packit Service 4684c1
         */
Packit Service 4684c1
        if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_NUMERIC) {
Packit Service 4684c1
            printf(zOptNumFmt, pOpts->pzPROGNAME, pOD->pz_NAME,
Packit Service 4684c1
                   (int)pOD->optArg.argInt);
Packit Service 4684c1
            continue;
Packit Service 4684c1
        }
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  If the argument type is an enumeration, then it is much
Packit Service 4684c1
         *  like a text value, except we call the callback function
Packit Service 4684c1
         *  to emit the value corresponding to the "optArg" number.
Packit Service 4684c1
         */
Packit Service 4684c1
        if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_ENUMERATION) {
Packit Service 4684c1
            print_enumeration(pOpts, pOD);
Packit Service 4684c1
            continue;
Packit Service 4684c1
        }
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  If the argument type is numeric, the last arg pointer
Packit Service 4684c1
         *  is really the VALUE of the string that was pointed to.
Packit Service 4684c1
         */
Packit Service 4684c1
        if (OPTST_GET_ARGTYPE(pOD->fOptState) == OPARG_TYPE_BOOLEAN) {
Packit Service 4684c1
            printf(zFullOptFmt, pOpts->pzPROGNAME, pOD->pz_NAME,
Packit Service 4684c1
                   (pOD->optArg.argBool == 0) ? "false" : "true");
Packit Service 4684c1
            continue;
Packit Service 4684c1
        }
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  IF the option has an empty value,
Packit Service 4684c1
         *  THEN we set the argument to the occurrence count.
Packit Service 4684c1
         */
Packit Service 4684c1
        if (  (pOD->optArg.argString == NULL)
Packit Service 4684c1
           || (pOD->optArg.argString[0] == NUL) ) {
Packit Service 4684c1
Packit Service 4684c1
            printf(zOptNumFmt, pOpts->pzPROGNAME, pOD->pz_NAME,
Packit Service 4684c1
                   pOD->optOccCt);
Packit Service 4684c1
            continue;
Packit Service 4684c1
        }
Packit Service 4684c1
Packit Service 4684c1
        /*
Packit Service 4684c1
         *  This option has a text value
Packit Service 4684c1
         */
Packit Service 4684c1
        printf(OPT_VAL_FMT, pOpts->pzPROGNAME, pOD->pz_NAME);
Packit Service 4684c1
        print_quot_str(pOD->optArg.argString);
Packit Service 4684c1
        printf(OPT_END_FMT, pOpts->pzPROGNAME, pOD->pz_NAME);
Packit Service 4684c1
Packit Service 4684c1
    } while (++optIx < pOpts->presetOptCt );
Packit Service 4684c1
Packit Service 4684c1
    if (  ((pOpts->fOptSet & OPTPROC_REORDER) != 0)
Packit Service 4684c1
       && (pOpts->curOptIdx < pOpts->origArgCt))
Packit Service 4684c1
        print_reordering(pOpts);
Packit Service 4684c1
Packit Service 4684c1
    fflush(stdout);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/** @}
Packit Service 4684c1
 *
Packit Service 4684c1
 * Local Variables:
Packit Service 4684c1
 * mode: C
Packit Service 4684c1
 * c-file-style: "stroustrup"
Packit Service 4684c1
 * indent-tabs-mode: nil
Packit Service 4684c1
 * End:
Packit Service 4684c1
 * end of autoopts/putshell.c */