/*=export_func optionOnlyUsage * * what: Print usage text for just the options * arg: + tOptions* + pOpts + program options descriptor + * arg: + int + ex_code + exit code for calling exit(3) + * * doc: * This routine will print only the usage for each option. * This function may be used when the emitted usage must incorporate * information not available to AutoOpts. =*/ void optionOnlyUsage(tOptions * pOpts, int ex_code) { char const * pOptTitle = NULL; set_usage_flags(pOpts, NULL); if ((ex_code != EXIT_SUCCESS) && skip_misuse_usage(pOpts)) return; /* * Determine which header and which option formatting strings to use */ if (do_gnu_usage(pOpts)) (void)setGnuOptFmts(pOpts, &pOptTitle); else (void)setStdOptFmts(pOpts, &pOptTitle); prt_opt_usage(pOpts, ex_code, pOptTitle); fflush(option_usage_fp); if (ferror(option_usage_fp) != 0) fserr_exit(pOpts->pzProgName, zwriting, (option_usage_fp == stderr) ? zstderr_name : zstdout_name); }
/*=export_func optionOnlyUsage * * what: Print usage text for just the options * arg: + tOptions* + pOpts + program options descriptor + * arg: + int + ex_code + exit code for calling exit(3) + * * doc: * This routine will print only the usage for each option. * This function may be used when the emitted usage must incorporate * information not available to AutoOpts. =*/ void optionOnlyUsage(tOptions * pOpts, int ex_code) { char const * pOptTitle = NULL; set_usage_flags(pOpts, NULL); if ((ex_code != EXIT_SUCCESS) && skip_misuse_usage(pOpts)) return; /* * Determine which header and which option formatting strings to use */ if (do_gnu_usage(pOpts)) { (void)setGnuOptFmts(pOpts, &pOptTitle); } else { (void)setStdOptFmts(pOpts, &pOptTitle); } prt_opt_usage(pOpts, ex_code, pOptTitle); fflush(option_usage_fp); if (ferror(option_usage_fp) != 0) { fputs(zOutputFail, stderr); exit(EXIT_FAILURE); } }
/*=export_func optionOnlyUsage * * what: Print usage text for just the options * arg: + tOptions* + pOpts + program options descriptor + * arg: + int + ex_code + exit code for calling exit(3) + * * doc: * This routine will print only the usage for each option. * This function may be used when the emitted usage must incorporate * information not available to AutoOpts. =*/ void optionOnlyUsage( tOptions* pOpts, int ex_code ) { tCC* pOptTitle = NULL; /* * Determine which header and which option formatting strings to use */ if (checkGNUUsage(pOpts)) { (void)setGnuOptFmts( pOpts, &pOptTitle ); } else { (void)setStdOptFmts( pOpts, &pOptTitle ); } printOptionUsage( pOpts, ex_code, pOptTitle ); }
/** * Print information about each option. * * @param[in] opts the program options * @param[in] exit_code whether or not there was a usage error reported. * used to select full usage versus abbreviated. */ static void print_usage_details(tOptions * opts, int exit_code) { { char const * pOptTitle = NULL; int flen; /* * Determine which header and which option formatting strings to use */ if (do_gnu_usage(opts)) { flen = setGnuOptFmts(opts, &pOptTitle); sprintf(line_fmt_buf, zFmtFmt, flen); fputc(NL, option_usage_fp); } else { flen = setStdOptFmts(opts, &pOptTitle); sprintf(line_fmt_buf, zFmtFmt, flen); /* * When we exit with EXIT_SUCCESS and the first option is a doc * option, we do *NOT* want to emit the column headers. * Otherwise, we do. */ if ( (exit_code != EXIT_SUCCESS) || ((opts->pOptDesc->fOptState & OPTST_DOCUMENT) == 0) ) fputs(pOptTitle, option_usage_fp); } flen = 4 - ((flen + 15) / 8); if (flen > 0) tab_skip_ct = flen; prt_opt_usage(opts, exit_code, pOptTitle); } /* * Describe the mechanics of denoting the options */ switch (opts->fOptSet & OPTPROC_L_N_S) { case OPTPROC_L_N_S: fputs(zFlagOkay, option_usage_fp); break; case OPTPROC_SHORTOPT: break; case OPTPROC_LONGOPT: fputs(zNoFlags, option_usage_fp); break; case 0: fputs(zOptsOnly, option_usage_fp); break; } if ((opts->fOptSet & OPTPROC_NUM_OPT) != 0) fputs(zNumberOpt, option_usage_fp); if ((opts->fOptSet & OPTPROC_REORDER) != 0) fputs(zReorder, option_usage_fp); if (opts->pzExplain != NULL) fputs(opts->pzExplain, option_usage_fp); /* * IF the user is asking for help (thus exiting with SUCCESS), * THEN see what additional information we can provide. */ if (exit_code == EXIT_SUCCESS) prt_prog_detail(opts); /* * Give bug notification preference to the packager information */ if (HAS_pzPkgDataDir(opts) && (opts->pzPackager != NULL)) fputs(opts->pzPackager, option_usage_fp); else if (opts->pzBugAddr != NULL) fprintf(option_usage_fp, zPlsSendBugs, opts->pzBugAddr); fflush(option_usage_fp); if (ferror(option_usage_fp) != 0) fserr_exit(opts->pzProgName, zwriting, (option_usage_fp == stderr) ? zstderr_name : zstdout_name); }
/*=export_func optionUsage * private: * * what: Print usage text * arg: + tOptions* + pOptions + program options descriptor + * arg: + int + exitCode + exit code for calling exit(3) + * * doc: * This routine will print usage in both GNU-standard and AutoOpts-expanded * formats. The descriptor specifies the default, but AUTOOPTS_USAGE will * over-ride this, providing the value of it is set to either "gnu" or * "autoopts". This routine will @strong{not} return. * * If "exitCode" is "EX_USAGE" (normally 64), then output will to to stdout * and the actual exit code will be "EXIT_SUCCESS". =*/ void optionUsage( tOptions* pOptions, int usage_exit_code ) { int actual_exit_code = (usage_exit_code == EX_USAGE) ? EXIT_SUCCESS : usage_exit_code; displayEnum = AG_FALSE; /* * Paged usage will preset option_usage_fp to an output file. * If it hasn't already been set, then set it to standard output * on successful exit (help was requested), otherwise error out. */ if (option_usage_fp == NULL) option_usage_fp = (actual_exit_code != EXIT_SUCCESS) ? stderr : stdout; fprintf( option_usage_fp, pOptions->pzUsageTitle, pOptions->pzProgName ); { tCC* pOptTitle = NULL; /* * Determine which header and which option formatting strings to use */ if (checkGNUUsage(pOptions)) { int flen = setGnuOptFmts( pOptions, &pOptTitle ); sprintf( zOptFmtLine, zFmtFmt, flen ); fputc( '\n', option_usage_fp ); } else { int flen = setStdOptFmts( pOptions, &pOptTitle ); sprintf( zOptFmtLine, zFmtFmt, flen ); /* * When we exit with EXIT_SUCCESS and the first option is a doc * option, we do *NOT* want to emit the column headers. * Otherwise, we do. */ if ( (usage_exit_code != EXIT_SUCCESS) || ((pOptions->pOptDesc->fOptState & OPTST_DOCUMENT) == 0) ) fputs( pOptTitle, option_usage_fp ); } printOptionUsage( pOptions, usage_exit_code, pOptTitle ); } /* * Describe the mechanics of denoting the options */ switch (pOptions->fOptSet & OPTPROC_L_N_S) { case OPTPROC_L_N_S: fputs( zFlagOkay, option_usage_fp ); break; case OPTPROC_SHORTOPT: break; case OPTPROC_LONGOPT: fputs( zNoFlags, option_usage_fp ); break; case 0: fputs( zOptsOnly, option_usage_fp ); break; } if ((pOptions->fOptSet & OPTPROC_NUM_OPT) != 0) { fputs( zNumberOpt, option_usage_fp ); } if ((pOptions->fOptSet & OPTPROC_REORDER) != 0) { fputs( zReorder, option_usage_fp ); } if (pOptions->pzExplain != NULL) fputs( pOptions->pzExplain, option_usage_fp ); /* * IF the user is asking for help (thus exiting with SUCCESS), * THEN see what additional information we can provide. */ if (usage_exit_code == EXIT_SUCCESS) printProgramDetails( pOptions ); if (pOptions->pzBugAddr != NULL) fprintf( option_usage_fp, zPlsSendBugs, pOptions->pzBugAddr ); fflush( option_usage_fp ); exit( actual_exit_code ); }