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
This commit is contained in:
Olivier Certner 2025-02-28 19:30:54 +01:00
parent c1e5a7fdad
commit 490f251bf9
No known key found for this signature in database
GPG key ID: 8CA13040971E2627
4 changed files with 126 additions and 145 deletions

View file

@ -58,188 +58,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";
@ -299,6 +298,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");
@ -325,7 +325,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) {
/*

View file

@ -81,9 +81,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: }");
}

View file

@ -130,7 +130,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);
@ -635,8 +634,6 @@ main(int argc, char *argv[])
}
}
sizevars();
if (nkept == 0) {
printheader();
if (xo_finish() < 0)
@ -695,7 +692,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) ? "-" : "",
@ -1213,7 +1210,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) {
@ -1228,23 +1225,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;
}
}

View file

@ -58,6 +58,7 @@ typedef struct varent {
STAILQ_ENTRY(varent) next_ve;
const char *header;
struct var *var;
u_int width;
} VARENT;
STAILQ_HEAD(velisthead, varent);
@ -82,8 +83,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"