void pr_list(char * const *ap) { size_t acols = 0, aocts = 0, i; unsigned int n; char * const *pp; for (n = 0, pp = ap; *pp; n++, pp++) { i = strlen(*pp); if (i > aocts) aocts = i; i = utf_mbswidth(*pp); if (i > acols) acols = i; } print_columns(shl_out, n, plain_fmt_entry, (const void *)ap, aocts, acols, false); }
/* * print a select style menu */ void pr_menu(const char * const *ap) { struct select_menu_info smi; const char * const *pp; size_t acols = 0, aocts = 0, i; unsigned int n; /* * width/column calculations were done once and saved, but this * means select can't be used recursively so we re-calculate * each time (could save in a structure that is returned, but * it's probably not worth the bother) */ /* * get dimensions of the list */ for (n = 0, pp = ap; *pp; n++, pp++) { i = strlen(*pp); if (i > aocts) aocts = i; i = utf_mbswidth(*pp); if (i > acols) acols = i; } /* * we will print an index of the form "%d) " in front of * each entry, so get the maximum width of this */ for (i = n, smi.num_width = 1; i >= 10; i /= 10) smi.num_width++; smi.args = ap; print_columns(shl_out, n, select_fmt_entry, (void *)&smi, smi.num_width + 2 + aocts, smi.num_width + 2 + acols, true); }
static void printoptions(bool verbose) { int i = 0; if (verbose) { int n = 0, len, octs = 0; struct options_info oi; /* verbose version */ shf_puts("Current option settings\n", shl_stdout); oi.opt_width = 0; while (i < (int)NELEM(options)) { if (options[i].name) { oi.opts[n++] = i; len = strlen(options[i].name); if (len > octs) octs = len; len = utf_mbswidth(options[i].name); if (len > oi.opt_width) oi.opt_width = len; } ++i; } print_columns(shl_stdout, n, options_fmt_entry, &oi, octs + 4, oi.opt_width + 4, true); } else { /* short version á la AT&T ksh93 */ shf_puts("set", shl_stdout); while (i < (int)NELEM(options)) { if (Flag(i) && options[i].name) shprintf(" -o %s", options[i].name); ++i; } shf_putc('\n', shl_stdout); } }
static void printoptions(bool verbose) { size_t i = 0; if (verbose) { size_t n = 0, len, octs = 0; struct options_info oi; /* verbose version */ shf_puts("Current option settings\n", shl_stdout); oi.opt_width = 0; while (i < NELEM(options)) { if ((len = strlen(OFN(i)))) { oi.opts[n++] = i; if (len > octs) octs = len; len = utf_mbswidth(OFN(i)); if ((int)len > oi.opt_width) oi.opt_width = (int)len; } ++i; } print_columns(shl_stdout, n, options_fmt_entry, &oi, octs + 4, oi.opt_width + 4, true); } else { /* short version like AT&T ksh93 */ shf_puts(Tset, shl_stdout); while (i < NELEM(options)) { if (Flag(i) && OFN(i)[0]) shprintf(" -o %s", OFN(i)); ++i; } shf_putc('\n', shl_stdout); } }
static char * formatstr(struct tbl *vp, const char *s) { int olen, nlen; char *p, *q; size_t psiz; olen = (int)utf_mbswidth(s); if (vp->flag & (RJUST|LJUST)) { if (!vp->u2.field) /* default field width */ vp->u2.field = olen; nlen = vp->u2.field; } else nlen = olen; p = alloc((psiz = nlen * /* MB_LEN_MAX */ 3 + 1), ATEMP); if (vp->flag & (RJUST|LJUST)) { int slen = olen, i = 0; if (vp->flag & RJUST) { const char *qq = s; int n = 0; while (i < slen) i += utf_widthadj(qq, &qq); /* strip trailing spaces (AT&T uses qq[-1] == ' ') */ while (qq > s && ksh_isspace(qq[-1])) { --qq; --slen; } if (vp->flag & ZEROFIL && vp->flag & INTEGER) { if (!s[0] || !s[1]) goto uhm_no; if (s[1] == '#') n = 2; else if (s[2] == '#') n = 3; uhm_no: if (vp->u2.field <= n) n = 0; } if (n) { memcpy(p, s, n); s += n; } while (slen > vp->u2.field) slen -= utf_widthadj(s, &s); if (vp->u2.field - slen) memset(p + n, (vp->flag & ZEROFIL) ? '0' : ' ', vp->u2.field - slen); slen -= n; shf_snprintf(p + vp->u2.field - slen, psiz - (vp->u2.field - slen), "%.*s", slen, s); } else { /* strip leading spaces/zeros */ while (ksh_isspace(*s)) s++; if (vp->flag & ZEROFIL) while (*s == '0') s++; shf_snprintf(p, nlen + 1, "%-*.*s", vp->u2.field, vp->u2.field, s); } } else memcpy(p, s, strlen(s) + 1); if (vp->flag & UCASEV_AL) { for (q = p; *q; q++) *q = ksh_toupper(*q); } else if (vp->flag & LCASEV) { for (q = p; *q; q++) *q = ksh_tolower(*q); } return (p); }