static int showShortOptions(const struct poptOption * opt, FILE * f, char * str) { char s[300]; /* this is larger then the ascii set, so it should do just fine */ if (!str) { str = s; memset(str, 0, sizeof(str)); } while (opt->longName || opt->shortName || opt->arg) { if (opt->shortName && !(opt->argInfo & POPT_ARG_MASK)) str[strlen(str)] = opt->shortName; else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) showShortOptions(opt->arg, f, str); opt++; } if (s != str || !*s) return 0; fprintf(f, " [-%s]", s); return strlen(s) + 4; }
void poptPrintUsage(poptContext con, FILE * fp, /*@unused@*/ int flags) { poptDone done = (poptDone)memset(alloca(sizeof(*done)), 0, sizeof(*done)); int cursor; done->nopts = 0; done->maxopts = 64; cursor = done->maxopts * sizeof(*done->opts); /*@-boundswrite@*/ done->opts = (const void **)memset(alloca(cursor), 0, cursor); done->opts[done->nopts++] = (const void *) con->options; /*@=boundswrite@*/ cursor = showHelpIntro(con, fp); cursor += showShortOptions(con->options, fp, NULL); cursor = singleTableUsage(con, fp, cursor, con->options, NULL, done); cursor = itemUsage(fp, cursor, con->aliases, con->numAliases, NULL); cursor = itemUsage(fp, cursor, con->execs, con->numExecs, NULL); if (con->otherHelp) { cursor += strlen(con->otherHelp) + 1; if (cursor > 79) fprintf(fp, "\n "); fprintf(fp, " %s", con->otherHelp); } fprintf(fp, "\n"); }
/** * Return concatenated short options for display. * @todo Sub-tables should be recursed. * @param opt option(s) * @param fp output file handle * @retval str concatenation of short options * @return length of display string */ static int showShortOptions(const struct poptOption * opt, FILE * fp, /*@null@*/ char * str) /*@globals fileSystem @*/ /*@modifies *str, *fp, fileSystem @*/ /*@requires maxRead(str) >= 0 @*/ { /* bufsize larger then the ascii set, lazy alloca on top level call. */ char * s = (str != NULL ? str : (char *)memset(alloca(300), 0, 300)); int len = 0; /*@-boundswrite@*/ if (opt != NULL) for (; (opt->longName || opt->shortName || opt->arg); opt++) { if (opt->shortName && !(opt->argInfo & POPT_ARG_MASK)) s[strlen(s)] = opt->shortName; else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) if (opt->arg) /* XXX program error */ len = showShortOptions( (const struct poptOption *)opt->arg, fp, s); } /*@=boundswrite@*/ /* On return to top level, print the short options, return print length. */ if (s == str && *s != '\0') { fprintf(fp, " [-%s]", s); len = strlen(s) + sizeof(" [-]")-1; } return len; }
/** * Return concatenated short options for display. * @todo Sub-tables should be recursed. * @param opt option(s) * @param fp output file handle * @retval str concatenation of short options * @return length of display string */ static int showShortOptions(const struct poptOption * opt, FILE * fp, /*@null@*/ char * str) /*@globals fileSystem @*/ /*@modifies *str, *fp, fileSystem @*/ { size_t size = 300; /* larger then the ascii set */ char * s = alloca(size); s[0] = '\0'; /*@-branchstate@*/ /* FIX: W2DO? */ if (str == NULL) { memset(s, 0, size); str = s; } /*@=branchstate@*/ /*@-boundswrite@*/ if (opt != NULL) for (; (opt->longName || opt->shortName || opt->arg); opt++) { if (opt->shortName && !(opt->argInfo & POPT_ARG_MASK)) str[strlen(str)] = opt->shortName; else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) if (opt->arg) /* XXX program error */ (void) showShortOptions(opt->arg, fp, str); } /*@=boundswrite@*/ if (s != str || *s != '\0') return 0; fprintf(fp, " [-%s]", s); return strlen(s) + 4; }
void poptPrintUsage(poptContext con, FILE * f, int flags) { int cursor; cursor = showHelpIntro(con, f); cursor += showShortOptions(con->options, f, NULL); singleTableUsage(f, cursor, con->options); if (con->otherHelp) { cursor += strlen(con->otherHelp) + 1; if (cursor > 79) fprintf(f, "\n "); fprintf(f, " %s", con->otherHelp); } fprintf(f, "\n [LIBRARIES]\n"); }
/** * Return concatenated short options for display. * @todo Sub-tables should be recursed. * @param opt option(s) * @param fp output file handle * @retval str concatenation of short options * @return length of display string */ static size_t showShortOptions(const struct poptOption * opt, FILE * fp, /*@null@*/ char * str) /*@globals fileSystem @*/ /*@modifies str, *fp, fileSystem @*/ /*@requires maxRead(str) >= 0 @*/ { /* bufsize larger then the ascii set, lazy allocation on top level call. */ size_t nb = (size_t)300; char * s = (str != NULL ? str : (char*) calloc((size_t)1, nb)); size_t len = (size_t)0; assert(s); /* XXX can't happen */ if (s == NULL) return 0; if (opt != NULL) for (; (opt->longName || opt->shortName || opt->arg); opt++) { if (!F_ISSET(opt, DOC_HIDDEN) && opt->shortName && !poptArgType(opt)) { /* Display shortName iff unique printable non-space. */ if (!strchr(s, opt->shortName) && isprint((int)opt->shortName) && opt->shortName != ' ') s[strlen(s)] = opt->shortName; } else if (poptArgType(opt) == POPT_ARG_INCLUDE_TABLE) if (opt->arg) /* XXX program error */ len = showShortOptions(opt->arg, fp, s); } /* On return to top level, print the short options, return print length. */ if (s != str && *s != '\0') { fprintf(fp, " [-%s]", s); len = strlen(s) + sizeof(" [-]")-1; } /*@-temptrans@*/ /* LCL: local s, not str arg, is being freed. */ if (s != str) free(s); /*@=temptrans@*/ return len; }
void poptPrintUsage(poptContext con, FILE * fp, /*@unused@*/ UNUSED(int flags)) { columns_t columns = (columns_t) xcalloc((size_t)1, sizeof(*columns)); struct poptDone_s done_buf; poptDone done = &done_buf; assert(columns); /* XXX can't happen */ memset(done, 0, sizeof(*done)); done->nopts = 0; done->maxopts = 64; if (columns) { columns->cur = done->maxopts * sizeof(*done->opts); columns->max = maxColumnWidth(fp); done->opts = (const void**) xcalloc((size_t)1, columns->cur); assert(done->opts); /* XXX can't happen */ /*@-keeptrans@*/ if (done->opts != NULL) done->opts[done->nopts++] = (const void *) con->options; /*@=keeptrans@*/ columns->cur = showHelpIntro(con, fp); columns->cur += showShortOptions(con->options, fp, NULL); columns->cur = singleTableUsage(con, fp, columns, con->options, NULL, done); columns->cur = itemUsage(fp, columns, con->aliases, con->numAliases, NULL); columns->cur = itemUsage(fp, columns, con->execs, con->numExecs, NULL); if (con->otherHelp) { columns->cur += strlen(con->otherHelp) + 1; if (columns->cur > columns->max) fprintf(fp, "\n "); fprintf(fp, " %s", con->otherHelp); } fprintf(fp, "\n"); if (done->opts != NULL) free(done->opts); free(columns); } }