git: b1722013af95 - stable/14 - ps(1): Move 'width' field from VAR to VARENT; Remove sizevars()

From: Olivier Certner <olce_at_FreeBSD.org>
Date: Thu, 01 May 2025 19:51:32 UTC
The branch stable/14 has been updated by olce:

URL: https://cgit.FreeBSD.org/src/commit/?id=b1722013af9508b78619dc8aab2324daef22fed6

commit b1722013af9508b78619dc8aab2324daef22fed6
Author:     Olivier Certner <olce@FreeBSD.org>
AuthorDate: 2025-02-28 18:30:54 +0000
Commit:     Olivier Certner <olce@FreeBSD.org>
CommitDate: 2025-05-01 19:37:03 +0000

    ps(1): Move 'width' field from VAR to VARENT; Remove sizevars()
    
    Some column's width depends not only on the information displayed but
    also on the its header, which may have been customized.  Consequently,
    that width is a property of the actual column and should not be attached
    to the keyword specifying which information to print.
    
    This change fixes a bug where multiple columns displaying the same
    information (same keyword) but with different headers would have the
    same width, although they should not if they have long enough headers
    that have different lengths (the width computed from the largest header
    would be applied to all the corresponding keyword's columns).
    
    Remove sizevars(), as the 'width' field is now initialized directly in
    parsefmt(), which creates the VARENT structures.
    
    While here, remove var[]'s sentinel line, and consequently adjust the
    upper limit in showkey()'s loop and findvar()'s binary search.
    
    MFC after:      3 days
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D49610
    
    (cherry picked from commit 490f251bf90dbfda8043e2d1f4a71dd3a91a8628)
---
 bin/ps/keyword.c | 238 +++++++++++++++++++++++++++----------------------------
 bin/ps/print.c   |   4 +-
 bin/ps/ps.c      |  26 +-----
 bin/ps/ps.h      |   3 +-
 4 files changed, 126 insertions(+), 145 deletions(-)

diff --git a/bin/ps/keyword.c b/bin/ps/keyword.c
index 21330ed9e2ac..823018f12ba5 100644
--- a/bin/ps/keyword.c
+++ b/bin/ps/keyword.c
@@ -64,188 +64,187 @@ static int  vcmp(const void *, const void *);
 
 /* PLEASE KEEP THE TABLE BELOW SORTED ALPHABETICALLY!!! */
 static VAR var[] = {
-	{"%cpu", "%CPU", NULL, "percent-cpu", 0, pcpu, 0, CHAR, NULL, 0},
-	{"%mem", "%MEM", NULL, "percent-memory", 0, pmem, 0, CHAR, NULL, 0},
+	{"%cpu", "%CPU", NULL, "percent-cpu", 0, pcpu, 0, CHAR, NULL},
+	{"%mem", "%MEM", NULL, "percent-memory", 0, pmem, 0, CHAR, NULL},
 	{"acflag", "ACFLG", NULL, "accounting-flag", 0, kvar, KOFF(ki_acflag),
-	    USHORT, "x", 0},
-	{"acflg", "", "acflag", NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    USHORT, "x"},
+	{"acflg", "", "acflag", NULL, 0, NULL, 0, CHAR, NULL},
 	{"args", "COMMAND", NULL, "arguments", COMM|LJUST|USER, arguments, 0,
-	    CHAR, NULL, 0},
-	{"blocked", "", "sigmask", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"caught", "", "sigcatch", NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    CHAR, NULL},
+	{"blocked", "", "sigmask", NULL, 0, NULL, 0, CHAR, NULL},
+	{"caught", "", "sigcatch", NULL, 0, NULL, 0, CHAR, NULL},
 	{"class", "CLASS", NULL, "login-class", LJUST, loginclass, 0, CHAR,
-	    NULL, 0},
-	{"comm", "COMMAND", NULL, "command", LJUST, ucomm, 0, CHAR, NULL, 0},
+	    NULL},
+	{"comm", "COMMAND", NULL, "command", LJUST, ucomm, 0, CHAR, NULL},
 	{"command", "COMMAND", NULL, "command", COMM|LJUST|USER, command, 0,
-	    CHAR, NULL, 0},
+	    CHAR, NULL},
 	{"cow", "COW", NULL, "copy-on-write-faults", 0, kvar, KOFF(ki_cow),
-	    UINT, "u", 0},
-	{"cpu", "C", NULL, "on-cpu", 0, cpunum, 0, CHAR, NULL, 0},
-	{"cputime", "", "time", NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    UINT, "u"},
+	{"cpu", "C", NULL, "on-cpu", 0, cpunum, 0, CHAR, NULL},
+	{"cputime", "", "time", NULL, 0, NULL, 0, CHAR, NULL},
 	{"dsiz", "DSIZ", NULL, "data-size", 0, kvar, KOFF(ki_dsize), PGTOK,
-	    "ld", 0},
-	{"egid", "", "gid", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"egroup", "", "group", NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    "ld"},
+	{"egid", "", "gid", NULL, 0, NULL, 0, CHAR, NULL},
+	{"egroup", "", "group", NULL, 0, NULL, 0, CHAR, NULL},
 	{"emul", "EMUL", NULL, "emulation-envirnment", LJUST, emulname, 0,
-	    CHAR, NULL, 0},
+	    CHAR, NULL},
 	{"etime", "ELAPSED", NULL, "elapsed-time", USER, elapsed, 0, CHAR,
-	    NULL, 0},
+	    NULL},
 	{"etimes", "ELAPSED", NULL, "elapsed-times", USER, elapseds, 0, CHAR,
-	    NULL, 0},
-	{"euid", "", "uid", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"f", "F", NULL, "flags", 0, kvar, KOFF(ki_flag), LONG, "lx", 0},
-	{"f2", "F2", NULL, "flags2", 0, kvar, KOFF(ki_flag2), INT, "08x", 0},
-	{"fib", "FIB", NULL, "fib", 0, kvar, KOFF(ki_fibnum), INT, "d", 0},
-	{"flags", "", "f", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"flags2", "", "f2", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"gid", "GID", NULL, "gid", 0, kvar, KOFF(ki_groups), UINT, UIDFMT, 0},
-	{"group", "GROUP", NULL, "group", LJUST, egroupname, 0, CHAR, NULL, 0},
-	{"ignored", "", "sigignore", NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    NULL},
+	{"euid", "", "uid", NULL, 0, NULL, 0, CHAR, NULL},
+	{"f", "F", NULL, "flags", 0, kvar, KOFF(ki_flag), LONG, "lx"},
+	{"f2", "F2", NULL, "flags2", 0, kvar, KOFF(ki_flag2), INT, "08x"},
+	{"fib", "FIB", NULL, "fib", 0, kvar, KOFF(ki_fibnum), INT, "d"},
+	{"flags", "", "f", NULL, 0, NULL, 0, CHAR, NULL},
+	{"flags2", "", "f2", NULL, 0, NULL, 0, CHAR, NULL},
+	{"gid", "GID", NULL, "gid", 0, kvar, KOFF(ki_groups), UINT, UIDFMT},
+	{"group", "GROUP", NULL, "group", LJUST, egroupname, 0, CHAR, NULL},
+	{"ignored", "", "sigignore", NULL, 0, NULL, 0, CHAR, NULL},
 	{"inblk", "INBLK", NULL, "read-blocks", USER, rvar, ROFF(ru_inblock),
-	    LONG, "ld", 0},
-	{"inblock", "", "inblk", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"jail", "JAIL", NULL, "jail-name", LJUST, jailname, 0, CHAR, NULL, 0},
-	{"jid", "JID", NULL, "jail-id", 0, kvar, KOFF(ki_jid), INT, "d", 0},
+	    LONG, "ld"},
+	{"inblock", "", "inblk", NULL, 0, NULL, 0, CHAR, NULL},
+	{"jail", "JAIL", NULL, "jail-name", LJUST, jailname, 0, CHAR, NULL},
+	{"jid", "JID", NULL, "jail-id", 0, kvar, KOFF(ki_jid), INT, "d"},
 	{"jobc", "JOBC", NULL, "job-control-count", 0, kvar, KOFF(ki_jobc),
-	    SHORT, "d", 0},
+	    SHORT, "d"},
 	{"ktrace", "KTRACE", NULL, "ktrace", 0, kvar, KOFF(ki_traceflag), INT,
-	    "x", 0},
-	{"label", "LABEL", NULL, "label", LJUST, label, 0, CHAR, NULL, 0},
-	{"lim", "LIM", NULL, "memory-limit", 0, maxrss, 0, CHAR, NULL, 0},
-	{"lockname", "LOCK", NULL, "lock-name", LJUST, lockname, 0, CHAR, NULL,
-	    0},
-	{"login", "LOGIN", NULL, "login-name", LJUST, logname, 0, CHAR, NULL,
-	    0},
-	{"logname", "", "login", NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    "x"},
+	{"label", "LABEL", NULL, "label", LJUST, label, 0, CHAR, NULL},
+	{"lim", "LIM", NULL, "memory-limit", 0, maxrss, 0, CHAR, NULL},
+	{"lockname", "LOCK", NULL, "lock-name", LJUST, lockname, 0, CHAR, NULL},
+	{"login", "LOGIN", NULL, "login-name", LJUST, logname, 0, CHAR, NULL},
+	{"logname", "", "login", NULL, 0, NULL, 0, CHAR, NULL},
 	{"lstart", "STARTED", NULL, "start-time", LJUST|USER, lstarted, 0,
-	    CHAR, NULL, 0},
+	    CHAR, NULL},
 	{"lwp", "LWP", NULL, "thread-id", 0, kvar, KOFF(ki_tid), UINT,
-	    LWPFMT, 0},
+	    LWPFMT},
 	{"majflt", "MAJFLT", NULL, "major-faults", USER, rvar, ROFF(ru_majflt),
-	    LONG, "ld", 0},
+	    LONG, "ld"},
 	{"minflt", "MINFLT", NULL, "minor-faults", USER, rvar, ROFF(ru_minflt),
-	    LONG, "ld", 0},
+	    LONG, "ld"},
 	{"msgrcv", "MSGRCV", NULL, "received-messages", USER, rvar,
-	    ROFF(ru_msgrcv), LONG, "ld", 0},
+	    ROFF(ru_msgrcv), LONG, "ld"},
 	{"msgsnd", "MSGSND", NULL, "sent-messages", USER, rvar,
-	    ROFF(ru_msgsnd), LONG, "ld", 0},
+	    ROFF(ru_msgsnd), LONG, "ld"},
 	{"mwchan", "MWCHAN", NULL, "wait-channel", LJUST, mwchan, 0, CHAR,
-	    NULL, 0},
-	{"ni", "", "nice", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"nice", "NI", NULL, "nice", 0, kvar, KOFF(ki_nice), CHAR, "d", 0},
+	    NULL},
+	{"ni", "", "nice", NULL, 0, NULL, 0, CHAR, NULL},
+	{"nice", "NI", NULL, "nice", 0, kvar, KOFF(ki_nice), CHAR, "d"},
 	{"nivcsw", "NIVCSW", NULL, "involuntary-context-switches", USER, rvar,
-	    ROFF(ru_nivcsw), LONG, "ld", 0},
+	    ROFF(ru_nivcsw), LONG, "ld"},
 	{"nlwp", "NLWP", NULL, "threads", 0, kvar, KOFF(ki_numthreads), UINT,
-	    NLWPFMT, 0},
-	{"nsignals", "", "nsigs", NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    NLWPFMT},
+	{"nsignals", "", "nsigs", NULL, 0, NULL, 0, CHAR, NULL},
 	{"nsigs", "NSIGS", NULL, "signals-taken", USER, rvar,
-	    ROFF(ru_nsignals), LONG, "ld", 0},
+	    ROFF(ru_nsignals), LONG, "ld"},
 	{"nswap", "NSWAP", NULL, "swaps", USER, rvar, ROFF(ru_nswap), LONG,
-	    "ld", 0},
+	    "ld"},
 	{"nvcsw", "NVCSW", NULL, "voluntary-context-switches", USER, rvar,
-	    ROFF(ru_nvcsw), LONG, "ld", 0},
+	    ROFF(ru_nvcsw), LONG, "ld"},
 	{"nwchan", "NWCHAN", NULL, "wait-channel-address", LJUST, nwchan, 0,
-	    CHAR, NULL, 0},
+	    CHAR, NULL},
 	{"oublk", "OUBLK", NULL, "written-blocks", USER, rvar,
-	    ROFF(ru_oublock), LONG, "ld", 0},
-	{"oublock", "", "oublk", NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    ROFF(ru_oublock), LONG, "ld"},
+	{"oublock", "", "oublk", NULL, 0, NULL, 0, CHAR, NULL},
 	{"paddr", "PADDR", NULL, "process-address", 0, kvar, KOFF(ki_paddr),
-	    KPTR, "lx", 0},
-	{"pagein", "PAGEIN", NULL, "pageins", USER, pagein, 0, CHAR, NULL, 0},
-	{"pcpu", "", "%cpu", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"pending", "", "sig", NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    KPTR, "lx"},
+	{"pagein", "PAGEIN", NULL, "pageins", USER, pagein, 0, CHAR, NULL},
+	{"pcpu", "", "%cpu", NULL, 0, NULL, 0, CHAR, NULL},
+	{"pending", "", "sig", NULL, 0, NULL, 0, CHAR, NULL},
 	{"pgid", "PGID", NULL, "process-group", 0, kvar, KOFF(ki_pgid), UINT,
-	    PIDFMT, 0},
-	{"pid", "PID", NULL, "pid", 0, kvar, KOFF(ki_pid), UINT, PIDFMT, 0},
-	{"pmem", "", "%mem", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"ppid", "PPID", NULL, "ppid", 0, kvar, KOFF(ki_ppid), UINT, PIDFMT, 0},
-	{"pri", "PRI", NULL, "priority", 0, pri, 0, CHAR, NULL, 0},
+	    PIDFMT},
+	{"pid", "PID", NULL, "pid", 0, kvar, KOFF(ki_pid), UINT, PIDFMT},
+	{"pmem", "", "%mem", NULL, 0, NULL, 0, CHAR, NULL},
+	{"ppid", "PPID", NULL, "ppid", 0, kvar, KOFF(ki_ppid), UINT, PIDFMT},
+	{"pri", "PRI", NULL, "priority", 0, pri, 0, CHAR, NULL},
 	{"re", "RE", NULL, "residency-time", INF127, kvar, KOFF(ki_swtime),
-	    UINT, "d", 0},
+	    UINT, "d"},
 	{"rgid", "RGID", NULL, "real-gid", 0, kvar, KOFF(ki_rgid), UINT,
-	    UIDFMT, 0},
+	    UIDFMT},
 	{"rgroup", "RGROUP", NULL, "real-group", LJUST, rgroupname, 0, CHAR,
-	    NULL, 0},
-	{"rss", "RSS", NULL, "rss", 0, kvar, KOFF(ki_rssize), PGTOK, "ld", 0},
+	    NULL},
+	{"rss", "RSS", NULL, "rss", 0, kvar, KOFF(ki_rssize), PGTOK, "ld"},
 	{"rtprio", "RTPRIO", NULL, "realtime-priority", 0, priorityr,
-	    KOFF(ki_pri), CHAR, NULL, 0},
+	    KOFF(ki_pri), CHAR, NULL},
 	{"ruid", "RUID", NULL, "real-uid", 0, kvar, KOFF(ki_ruid), UINT,
-	    UIDFMT, 0},
-	{"ruser", "RUSER", NULL, "real-user", LJUST, runame, 0, CHAR, NULL, 0},
-	{"sid", "SID", NULL, "sid", 0, kvar, KOFF(ki_sid), UINT, PIDFMT, 0},
+	    UIDFMT},
+	{"ruser", "RUSER", NULL, "real-user", LJUST, runame, 0, CHAR, NULL},
+	{"sid", "SID", NULL, "sid", 0, kvar, KOFF(ki_sid), UINT, PIDFMT},
 	{"sig", "PENDING", NULL, "signals-pending", 0, kvar, KOFF(ki_siglist),
-	    INT, "x", 0},
+	    INT, "x"},
 	{"sigcatch", "CAUGHT", NULL, "signals-caught", 0, kvar,
-	    KOFF(ki_sigcatch), UINT, "x", 0},
+	    KOFF(ki_sigcatch), UINT, "x"},
 	{"sigignore", "IGNORED", NULL, "signals-ignored", 0, kvar,
-	    KOFF(ki_sigignore), UINT, "x", 0},
+	    KOFF(ki_sigignore), UINT, "x"},
 	{"sigmask", "BLOCKED", NULL, "signal-mask", 0, kvar, KOFF(ki_sigmask),
-	    UINT, "x", 0},
+	    UINT, "x"},
 	{"sl", "SL", NULL, "sleep-time", INF127, kvar, KOFF(ki_slptime), UINT,
-	    "d", 0},
+	    "d"},
 	{"ssiz", "SSIZ", NULL, "stack-size", 0, kvar, KOFF(ki_ssize), PGTOK,
-	    "ld", 0},
+	    "ld"},
 	{"start", "STARTED", NULL, "start-time", LJUST|USER, started, 0, CHAR,
-	    NULL, 0},
-	{"stat", "", "state", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"state", "STAT", NULL, "state", LJUST, state, 0, CHAR, NULL, 0},
+	    NULL},
+	{"stat", "", "state", NULL, 0, NULL, 0, CHAR, NULL},
+	{"state", "STAT", NULL, "state", LJUST, state, 0, CHAR, NULL},
 	{"svgid", "SVGID", NULL, "saved-gid", 0, kvar, KOFF(ki_svgid), UINT,
-	    UIDFMT, 0},
+	    UIDFMT},
 	{"svuid", "SVUID", NULL, "saved-uid", 0, kvar, KOFF(ki_svuid), UINT,
-	    UIDFMT, 0},
+	    UIDFMT},
 	{"systime", "SYSTIME", NULL, "system-time", USER, systime, 0, CHAR,
-	    NULL, 0},
+	    NULL},
 	{"tdaddr", "TDADDR", NULL, "thread-address", 0, kvar, KOFF(ki_tdaddr),
-	    KPTR, "lx", 0},
-	{"tdev", "TDEV", NULL, "terminal-device", 0, tdev, 0, CHAR, NULL, 0},
-	{"tdnam", "", "tdname", NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    KPTR, "lx"},
+	{"tdev", "TDEV", NULL, "terminal-device", 0, tdev, 0, CHAR, NULL},
+	{"tdnam", "", "tdname", NULL, 0, NULL, 0, CHAR, NULL},
 	{"tdname", "TDNAME", NULL, "thread-name", LJUST, tdnam, 0, CHAR,
-	    NULL, 0},
-	{"tid", "", "lwp", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"time", "TIME", NULL, "cpu-time", USER, cputime, 0, CHAR, NULL, 0},
+	    NULL},
+	{"tid", "", "lwp", NULL, 0, NULL, 0, CHAR, NULL},
+	{"time", "TIME", NULL, "cpu-time", USER, cputime, 0, CHAR, NULL},
 	{"tpgid", "TPGID", NULL, "terminal-process-gid", 0, kvar,
-	    KOFF(ki_tpgid), UINT, PIDFMT, 0},
+	    KOFF(ki_tpgid), UINT, PIDFMT},
 	{"tracer", "TRACER", NULL, "tracer", 0, kvar, KOFF(ki_tracer), UINT,
-	    PIDFMT, 0},
+	    PIDFMT},
 	{"tsid", "TSID", NULL, "terminal-sid", 0, kvar, KOFF(ki_tsid), UINT,
-	    PIDFMT, 0},
+	    PIDFMT},
 	{"tsiz", "TSIZ", NULL, "text-size", 0, kvar, KOFF(ki_tsize), PGTOK,
-	    "ld", 0},
-	{"tt", "TT ", NULL, "terminal-name", 0, tname, 0, CHAR, NULL, 0},
-	{"tty", "TTY", NULL, "tty", LJUST, longtname, 0, CHAR, NULL, 0},
+	    "ld"},
+	{"tt", "TT ", NULL, "terminal-name", 0, tname, 0, CHAR, NULL},
+	{"tty", "TTY", NULL, "tty", LJUST, longtname, 0, CHAR, NULL},
 	{"ucomm", "UCOMM", NULL, "accounting-name", LJUST, ucomm, 0, CHAR,
-	    NULL, 0},
-	{"uid", "UID", NULL, "uid", 0, kvar, KOFF(ki_uid), UINT, UIDFMT, 0},
-	{"upr", "UPR", NULL, "user-priority", 0, upr, 0, CHAR, NULL, 0},
+	    NULL},
+	{"uid", "UID", NULL, "uid", 0, kvar, KOFF(ki_uid), UINT, UIDFMT},
+	{"upr", "UPR", NULL, "user-priority", 0, upr, 0, CHAR, NULL},
 	{"uprocp", "UPROCP", NULL, "process-address", 0, kvar, KOFF(ki_paddr),
-	    KPTR, "lx", 0},
-	{"user", "USER", NULL, "user", LJUST, username, 0, CHAR, NULL, 0},
+	    KPTR, "lx"},
+	{"user", "USER", NULL, "user", LJUST, username, 0, CHAR, NULL},
 	{"usertime", "USERTIME", NULL, "user-time", USER, usertime, 0, CHAR,
-	    NULL, 0},
-	{"usrpri", "", "upr", NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    NULL},
+	{"usrpri", "", "upr", NULL, 0, NULL, 0, CHAR, NULL},
 	{"vmaddr", "VMADDR", NULL, "vmspace-address", 0, kvar, KOFF(ki_vmspace),
-	    KPTR, "lx", 0},
-	{"vsize", "", "vsz", NULL, 0, NULL, 0, CHAR, NULL, 0},
-	{"vsz", "VSZ", NULL, "virtual-size", 0, vsize, 0, CHAR, NULL, 0},
-	{"wchan", "WCHAN", NULL, "wait-channel", LJUST, wchan, 0, CHAR, NULL,
-	    0},
+	    KPTR, "lx"},
+	{"vsize", "", "vsz", NULL, 0, NULL, 0, CHAR, NULL},
+	{"vsz", "VSZ", NULL, "virtual-size", 0, vsize, 0, CHAR, NULL},
+	{"wchan", "WCHAN", NULL, "wait-channel", LJUST, wchan, 0, CHAR, NULL},
 	{"xstat", "XSTAT", NULL, "exit-status", 0, kvar, KOFF(ki_xstat),
-	    USHORT, "x", 0},
-	{"", NULL, NULL, NULL, 0, NULL, 0, CHAR, NULL, 0},
+	    USHORT, "x"},
 };
 
 void
 showkey(void)
 {
-	VAR *v;
+	const VAR *v;
+	const VAR *const end = var + nitems(var);
+	const char *sep;
 	int i;
-	const char *p, *sep;
 
 	i = 0;
 	sep = "";
 	xo_open_list("key");
-	for (v = var; *(p = v->name); ++v) {
-		int len = strlen(p);
+	for (v = var; v < end; ++v) {
+		const char *const p = v->name;
+		const int len = strlen(p);
+
 		if (termwidth && (i += len + 1) > termwidth) {
 			i = len;
 			sep = "\n";
@@ -305,6 +304,7 @@ parsefmt(const char *p, struct velisthead *const var_list,
 			if (hp)
 				vent->header = hp;
 		}
+		vent->width = strlen(vent->header);
 		vent->var = malloc(sizeof(*vent->var));
 		if (vent->var == NULL)
 			xo_errx(1, "malloc failed");
@@ -331,7 +331,7 @@ findvar(char *p, struct velisthead *const var_list, int user, char **header)
 		*hp++ = '\0';
 
 	key.name = p;
-	v = bsearch(&key, var, sizeof(var)/sizeof(VAR) - 1, sizeof(VAR), vcmp);
+	v = bsearch(&key, var, nitems(var), sizeof(VAR), vcmp);
 
 	if (v && v->alias) {
 		/*
diff --git a/bin/ps/print.c b/bin/ps/print.c
index 1ed6afe995c5..d7d3fd1339dc 100644
--- a/bin/ps/print.c
+++ b/bin/ps/print.c
@@ -88,9 +88,9 @@ printheader(void)
 			if (STAILQ_NEXT(vent, next_ve) == NULL)	/* last one */
 				xo_emit("{T:/%hs}", vent->header);
 			else
-				xo_emit("{T:/%-*hs}", v->width, vent->header);
+				xo_emit("{T:/%-*hs}", vent->width, vent->header);
 		} else
-			xo_emit("{T:/%*hs}", v->width, vent->header);
+			xo_emit("{T:/%*hs}", vent->width, vent->header);
 		if (STAILQ_NEXT(vent, next_ve) != NULL)
 			xo_emit("{P: }");
 	}
diff --git a/bin/ps/ps.c b/bin/ps/ps.c
index 14dea797a7f7..44e6ecd32498 100644
--- a/bin/ps/ps.c
+++ b/bin/ps/ps.c
@@ -152,7 +152,6 @@ static char	*kludge_oldps_options(const char *, char *, const char *);
 static int	 pscomp(const void *, const void *);
 static void	 saveuser(KINFO *);
 static void	 scanvars(void);
-static void	 sizevars(void);
 static void	 pidmax_init(void);
 static void	 usage(void);
 
@@ -660,8 +659,6 @@ main(int argc, char *argv[])
 		}
 	}
 
-	sizevars();
-
 	if (nkept == 0) {
 		printheader();
 		if (xo_finish() < 0)
@@ -720,7 +717,7 @@ main(int argc, char *argv[])
 			/* No padding for the last column, if it's LJUST. */
 			fwidthmin = (xo_get_style(NULL) != XO_STYLE_TEXT ||
 			    (STAILQ_NEXT(vent, next_ve) == NULL &&
-			    (vent->var->flag & LJUST))) ? 0 : vent->var->width;
+			    (vent->var->flag & LJUST))) ? 0 : vent->width;
 			snprintf(fmtbuf, sizeof(fmtbuf), "{:%s/%%%s%d..%dhs}",
 			    vent->var->field ? vent->var->field : vent->var->name,
 			    (vent->var->flag & LJUST) ? "-" : "",
@@ -1238,7 +1235,7 @@ format_output(KINFO *ki)
 	VAR *v;
 	KINFO_STR *ks;
 	char *str;
-	int len;
+	u_int len;
 
 	STAILQ_INIT(&ki->ki_ks);
 	STAILQ_FOREACH(vent, &varlist, next_ve) {
@@ -1253,23 +1250,8 @@ format_output(KINFO *ki)
 			len = strlen(str);
 		} else
 			len = 1; /* "-" */
-		if (v->width < len)
-			v->width = len;
-	}
-}
-
-static void
-sizevars(void)
-{
-	struct varent *vent;
-	VAR *v;
-	int i;
-
-	STAILQ_FOREACH(vent, &varlist, next_ve) {
-		v = vent->var;
-		i = strlen(vent->header);
-		if (v->width < i)
-			v->width = i;
+		if (vent->width < len)
+			vent->width = len;
 	}
 }
 
diff --git a/bin/ps/ps.h b/bin/ps/ps.h
index d21bf016bcca..838aea33f3aa 100644
--- a/bin/ps/ps.h
+++ b/bin/ps/ps.h
@@ -60,6 +60,7 @@ typedef struct varent {
 	STAILQ_ENTRY(varent)	 next_ve;
 	const char		*header;
 	struct var		*var;
+	u_int			 width;
 } VARENT;
 STAILQ_HEAD(velisthead, varent);
 
@@ -84,8 +85,6 @@ typedef struct var {
 	size_t	off;		/* offset in structure */
 	enum	type type;	/* type of element */
 	const char *fmt;	/* printf format */
-
-	short	width;		/* calculated width */
 } VAR;
 
 #include "extern.h"