xref: /original-bsd/bin/ps/keyword.c (revision 731b2947)
19b414a1dSbostic /*-
2*731b2947Spendry  * Copyright (c) 1990, 1993, 1994
306194916Sbostic  *	The Regents of the University of California.  All rights reserved.
49b414a1dSbostic  *
59b414a1dSbostic  * %sccs.include.redist.c%
69b414a1dSbostic  */
79b414a1dSbostic 
89b414a1dSbostic #ifndef lint
9*731b2947Spendry static char sccsid[] = "@(#)keyword.c	8.5 (Berkeley) 04/02/94";
109b414a1dSbostic #endif /* not lint */
119b414a1dSbostic 
129b414a1dSbostic #include <sys/param.h>
139b414a1dSbostic #include <sys/time.h>
149b414a1dSbostic #include <sys/resource.h>
159b414a1dSbostic #include <sys/proc.h>
16a27bc48dSbostic 
170e1cfdcbSbostic #include <err.h>
189b414a1dSbostic #include <errno.h>
19a27bc48dSbostic #include <stddef.h>
209b414a1dSbostic #include <stdio.h>
2198d0b374Sbostic #include <stdlib.h>
229b414a1dSbostic #include <string.h>
23a27bc48dSbostic 
249b414a1dSbostic #include "ps.h"
259b414a1dSbostic 
263fc01fceSbostic #ifdef P_PPWAIT
2744c07ee2Skarels #define NEWVM
2844c07ee2Skarels #endif
2944c07ee2Skarels 
3044c07ee2Skarels #ifdef NEWVM
3144c07ee2Skarels #include <sys/ucred.h>
32a27bc48dSbostic #include <sys/sysctl.h>
3344c07ee2Skarels #endif
3444c07ee2Skarels 
3508b8aa43Sbostic static VAR *findvar __P((char *));
3608b8aa43Sbostic static int  vcmp __P((const void *, const void *));
379b414a1dSbostic 
389b414a1dSbostic #ifdef NOTINUSE
399b414a1dSbostic int	utime(), stime(), ixrss(), idrss(), isrss();
409b414a1dSbostic 	{{"utime"}, "UTIME", USER, utime, 4},
419b414a1dSbostic 	{{"stime"}, "STIME", USER, stime, 4},
429b414a1dSbostic 	{{"ixrss"}, "IXRSS", USER, ixrss, 4},
439b414a1dSbostic 	{{"idrss"}, "IDRSS", USER, idrss, 4},
449b414a1dSbostic 	{{"isrss"}, "ISRSS", USER, isrss, 4},
459b414a1dSbostic #endif
469b414a1dSbostic 
479b414a1dSbostic /* Compute offset in common structures. */
489b414a1dSbostic #define	POFF(x)	offsetof(struct proc, x)
499b414a1dSbostic #define	EOFF(x)	offsetof(struct eproc, x)
509b414a1dSbostic #define	UOFF(x)	offsetof(struct usave, x)
519b414a1dSbostic #define	ROFF(x)	offsetof(struct rusage, x)
529b414a1dSbostic 
539b414a1dSbostic #define	UIDFMT	"u"
549b414a1dSbostic #define	UIDLEN	5
559b414a1dSbostic #define	PIDFMT	"d"
569b414a1dSbostic #define	PIDLEN	5
579b414a1dSbostic #define	USERLEN	8
589b414a1dSbostic 
599b414a1dSbostic VAR var[] = {
6044c07ee2Skarels #ifdef NEWVM
6144c07ee2Skarels 	{"%cpu", "%CPU", NULL, 0, pcpu, 4},
6244c07ee2Skarels 	{"%mem", "%MEM", NULL, 0, pmem, 4},
637e070175Smarc 	{"acflag", "ACFLG", NULL, 0, pvar, 3, POFF(p_acflag), USHORT, "x"},
6444c07ee2Skarels 	{"acflg", "", "acflag"},
6544c07ee2Skarels 	{"blocked", "", "sigmask"},
6644c07ee2Skarels 	{"caught", "", "sigcatch"},
67c7fedef8Smarc 	{"command", "COMMAND", NULL, COMM|LJUST|USER, command, 16},
68514cbc2dSbostic 	{"cpu", "CPU", NULL, 0, pvar, 3, POFF(p_estcpu), ULONG, "d"},
6944c07ee2Skarels 	{"cputime", "", "time"},
7044c07ee2Skarels 	{"f", "F", NULL, 0, pvar, 7, POFF(p_flag), LONG, "x"},
7144c07ee2Skarels 	{"flags", "", "f"},
7244c07ee2Skarels 	{"ignored", "", "sigignore"},
7344c07ee2Skarels 	{"inblk", "INBLK", NULL, USER, rvar, 4, ROFF(ru_inblock), LONG, "d"},
7444c07ee2Skarels 	{"inblock", "", "inblk"},
7544c07ee2Skarels 	{"jobc", "JOBC", NULL, 0, evar, 4, EOFF(e_jobc), SHORT, "d"},
7644c07ee2Skarels 	{"ktrace", "KTRACE", NULL, 0, pvar, 8, POFF(p_traceflag), LONG, "x"},
7744c07ee2Skarels 	{"ktracep", "KTRACEP", NULL, 0, pvar, 8, POFF(p_tracep), LONG, "x"},
7844c07ee2Skarels 	{"lim", "LIM", NULL, 0, maxrss, 5},
7944c07ee2Skarels 	{"login", "LOGIN", NULL, LJUST, logname, MAXLOGNAME},
8044c07ee2Skarels 	{"logname", "", "login"},
8144c07ee2Skarels 	{"lstart", "STARTED", NULL, LJUST|USER, lstarted, 28},
8244c07ee2Skarels 	{"majflt", "MAJFLT", NULL, USER, rvar, 4, ROFF(ru_majflt), LONG, "d"},
8344c07ee2Skarels 	{"minflt", "MINFLT", NULL, USER, rvar, 4, ROFF(ru_minflt), LONG, "d"},
8444c07ee2Skarels 	{"msgrcv", "MSGRCV", NULL, USER, rvar, 4, ROFF(ru_msgrcv), LONG, "d"},
8544c07ee2Skarels 	{"msgsnd", "MSGSND", NULL, USER, rvar, 4, ROFF(ru_msgsnd), LONG, "d"},
8644c07ee2Skarels 	{"ni", "", "nice"},
8744c07ee2Skarels 	{"nice", "NI", NULL, 0, pvar, 2, POFF(p_nice), CHAR, "d"},
8844c07ee2Skarels 	{"nivcsw", "NIVCSW", NULL, USER, rvar, 5, ROFF(ru_nivcsw), LONG, "d"},
8944c07ee2Skarels 	{"nsignals", "", "nsigs"},
9044c07ee2Skarels 	{"nsigs", "NSIGS", NULL, USER, rvar, 4, ROFF(ru_nsignals), LONG, "d"},
9144c07ee2Skarels 	{"nswap", "NSWAP", NULL, USER, rvar, 4, ROFF(ru_nswap), LONG, "d"},
9244c07ee2Skarels 	{"nvcsw", "NVCSW", NULL, USER, rvar, 5, ROFF(ru_nvcsw), LONG, "d"},
9344c07ee2Skarels 	{"nwchan", "WCHAN", NULL, 0, pvar, 6, POFF(p_wchan), KPTR, "x"},
9444c07ee2Skarels 	{"oublk", "OUBLK", NULL, USER, rvar, 4, ROFF(ru_oublock), LONG, "d"},
9544c07ee2Skarels 	{"oublock", "", "oublk"},
9644c07ee2Skarels 	{"p_ru", "P_RU", NULL, 0, pvar, 6, POFF(p_ru), KPTR, "x"},
9744c07ee2Skarels 	{"paddr", "PADDR", NULL, 0, evar, 6, EOFF(e_paddr), KPTR, "x"},
9844c07ee2Skarels 	{"pagein", "PAGEIN", NULL, USER, pagein, 6},
9944c07ee2Skarels 	{"pcpu", "", "%cpu"},
10044c07ee2Skarels 	{"pending", "", "sig"},
101a291b5edSbostic 	{"pgid", "PGID", NULL, 0, evar, PIDLEN, EOFF(e_pgid), ULONG, PIDFMT},
10280c68d49Sbostic 	{"pid", "PID", NULL, 0, pvar, PIDLEN, POFF(p_pid), LONG, PIDFMT},
10344c07ee2Skarels 	{"pmem", "", "%mem"},
10480c68d49Sbostic 	{"ppid", "PPID", NULL, 0, evar, PIDLEN, EOFF(e_ppid), LONG, PIDFMT},
10544c07ee2Skarels 	{"pri", "PRI", NULL, 0, pri, 3},
106514cbc2dSbostic 	{"re", "RE", NULL, 0, pvar, 3, POFF(p_swtime), ULONG, "d"},
10744c07ee2Skarels 	{"rgid", "RGID", NULL, 0, evar, UIDLEN, EOFF(e_pcred.p_rgid),
1087e070175Smarc 		ULONG, UIDFMT},
1093fc01fceSbostic 	{"rlink", "RLINK", NULL, 0, pvar, 8, POFF(p_back), KPTR, "x"},
11044c07ee2Skarels 	{"rss", "RSS", NULL, 0, p_rssize, 4},
11144c07ee2Skarels 	{"rssize", "", "rsz"},
11244c07ee2Skarels 	{"rsz", "RSZ", NULL, 0, rssize, 4},
11344c07ee2Skarels 	{"ruid", "RUID", NULL, 0, evar, UIDLEN, EOFF(e_pcred.p_ruid),
1147e070175Smarc 		ULONG, UIDFMT},
11544c07ee2Skarels 	{"ruser", "RUSER", NULL, LJUST, runame, USERLEN},
11644c07ee2Skarels 	{"sess", "SESS", NULL, 0, evar, 6, EOFF(e_sess), KPTR, "x"},
117514cbc2dSbostic 	{"sig", "PENDING", NULL, 0, pvar, 8, POFF(p_siglist), LONG, "x"},
11844c07ee2Skarels 	{"sigcatch", "CAUGHT", NULL, 0, pvar, 8, POFF(p_sigcatch), LONG, "x"},
11944c07ee2Skarels 	{"sigignore", "IGNORED",
12044c07ee2Skarels 		NULL, 0, pvar, 8, POFF(p_sigignore), LONG, "x"},
12144c07ee2Skarels 	{"sigmask", "BLOCKED", NULL, 0, pvar, 8, POFF(p_sigmask), LONG, "x"},
122a291b5edSbostic 	{"sl", "SL", NULL, 0, pvar, 3, POFF(p_slptime), ULONG, "d"},
12344c07ee2Skarels 	{"start", "STARTED", NULL, LJUST|USER, started, 8},
12444c07ee2Skarels 	{"stat", "", "state"},
12544c07ee2Skarels 	{"state", "STAT", NULL, 0, state, 4},
12644c07ee2Skarels 	{"svgid", "SVGID",
1277e070175Smarc 		NULL, 0, evar, UIDLEN, EOFF(e_pcred.p_svgid), ULONG, UIDFMT},
12844c07ee2Skarels 	{"svuid", "SVUID",
1297e070175Smarc 		NULL, 0, evar, UIDLEN, EOFF(e_pcred.p_svuid), ULONG, UIDFMT},
13044c07ee2Skarels 	{"tdev", "TDEV", NULL, 0, tdev, 4},
13144c07ee2Skarels 	{"time", "TIME", NULL, USER, cputime, 9},
132a291b5edSbostic 	{"tpgid", "TPGID", NULL, 0, evar, 4, EOFF(e_tpgid), ULONG, PIDFMT},
13344c07ee2Skarels 	{"tsess", "TSESS", NULL, 0, evar, 6, EOFF(e_tsess), KPTR, "x"},
13444c07ee2Skarels 	{"tsiz", "TSIZ", NULL, 0, tsize, 4},
13544c07ee2Skarels 	{"tt", "TT", NULL, LJUST, tname, 3},
13644c07ee2Skarels 	{"tty", "TTY", NULL, LJUST, longtname, 8},
13744c07ee2Skarels 	{"ucomm", "UCOMM", NULL, LJUST, ucomm, MAXCOMLEN},
13844c07ee2Skarels 	{"uid", "UID", NULL, 0, evar, UIDLEN, EOFF(e_ucred.cr_uid),
1397e070175Smarc 		ULONG, UIDFMT},
14044c07ee2Skarels 	{"upr", "UPR", NULL, 0, pvar, 3, POFF(p_usrpri), CHAR, "d"},
14144c07ee2Skarels 	{"user", "USER", NULL, LJUST, uname, USERLEN},
14244c07ee2Skarels 	{"usrpri", "", "upr"},
14344c07ee2Skarels 	{"vsize", "", "vsz"},
14444c07ee2Skarels 	{"vsz", "VSZ", NULL, 0, vsize, 5},
14544c07ee2Skarels 	{"wchan", "WCHAN", NULL, LJUST, wchan, 6},
14644c07ee2Skarels 	{"xstat", "XSTAT", NULL, 0, pvar, 4, POFF(p_xstat), USHORT, "x"},
14744c07ee2Skarels #else
1489b414a1dSbostic 	{"%cpu", "%CPU", NULL, 0, pcpu, 4},
1499b414a1dSbostic 	{"%mem", "%MEM", NULL, 0, pmem, 4},
1509b414a1dSbostic 	{"acflag", "ACFLG", NULL, USER, uvar, 3, UOFF(u_acflag), SHORT, "x"},
1519b414a1dSbostic 	{"acflg", "", "acflag"},
1529b414a1dSbostic 	{"blocked", "", "sigmask"},
1539b414a1dSbostic 	{"caught", "", "sigcatch"},
1549b414a1dSbostic 	{"command", "COMMAND", NULL, COMM|LJUST|USER, command, 16},
1555a4d8735Storek 	{"cpu", "CPU", NULL, 0, pvar, 3, POFF(p_cpu), ULONG, "d"},
1569b414a1dSbostic 	{"cputime", "", "time"},
1579b414a1dSbostic 	{"f", "F", NULL, 0, pvar, 7, POFF(p_flag), LONG, "x"},
1589b414a1dSbostic 	{"flags", "", "f"},
1599b414a1dSbostic 	{"ignored", "", "sigignore"},
1609b414a1dSbostic 	{"inblk", "INBLK", NULL, USER, rvar, 4, ROFF(ru_inblock), LONG, "d"},
1619b414a1dSbostic 	{"inblock", "", "inblk"},
1629b414a1dSbostic 	{"jobc", "JOBC", NULL, 0, evar, 4, EOFF(e_jobc), SHORT, "d"},
1639b414a1dSbostic 	{"ktrace", "KTRACE", NULL, 0, pvar, 8, POFF(p_traceflag), LONG, "x"},
1649b414a1dSbostic 	{"ktracep", "KTRACEP", NULL, 0, pvar, 8, POFF(p_tracep), LONG, "x"},
1659b414a1dSbostic 	{"lim", "LIM", NULL, 0, maxrss, 5},
1669b414a1dSbostic 	{"logname", "LOGNAME", NULL, LJUST, logname, MAXLOGNAME},
1679b414a1dSbostic 	{"lstart", "STARTED", NULL, LJUST|USER, lstarted, 28},
1689b414a1dSbostic 	{"majflt", "MAJFLT", NULL, USER, rvar, 4, ROFF(ru_majflt), LONG, "d"},
1699b414a1dSbostic 	{"minflt", "MINFLT", NULL, USER, rvar, 4, ROFF(ru_minflt), LONG, "d"},
1709b414a1dSbostic 	{"msgrcv", "MSGRCV", NULL, USER, rvar, 4, ROFF(ru_msgrcv), LONG, "d"},
1719b414a1dSbostic 	{"msgsnd", "MSGSND", NULL, USER, rvar, 4, ROFF(ru_msgsnd), LONG, "d"},
1729b414a1dSbostic 	{"ni", "", "nice"},
1739b414a1dSbostic 	{"nice", "NI", NULL, 0, pvar, 2, POFF(p_nice), CHAR, "d"},
1749b414a1dSbostic 	{"nivcsw", "NIVCSW", NULL, USER, rvar, 5, ROFF(ru_nivcsw), LONG, "d"},
1759b414a1dSbostic 	{"nsignals", "", "nsigs"},
1769b414a1dSbostic 	{"nsigs", "NSIGS", NULL, USER, rvar, 4, ROFF(ru_nsignals), LONG, "d"},
1779b414a1dSbostic 	{"nswap", "NSWAP", NULL, USER, rvar, 4, ROFF(ru_nswap), LONG, "d"},
1789b414a1dSbostic 	{"nvcsw", "NVCSW", NULL, USER, rvar, 5, ROFF(ru_nvcsw), LONG, "d"},
1799b414a1dSbostic 	{"nwchan", "WCHAN", NULL, 0, pvar, 6, POFF(p_wchan), KPTR, "x"},
1809b414a1dSbostic 	{"oublk", "OUBLK", NULL, USER, rvar, 4, ROFF(ru_oublock), LONG, "d"},
1819b414a1dSbostic 	{"oublock", "", "oublk"},
1829b414a1dSbostic 	{"p_ru", "P_RU", NULL, 0, pvar, 6, POFF(p_ru), KPTR, "x"},
1839b414a1dSbostic 	{"paddr", "PADDR", NULL, 0, evar, 6, EOFF(e_paddr), KPTR, "x"},
1849b414a1dSbostic 	{"pagein", "PAGEIN", NULL, USER, pagein, 6},
1859b414a1dSbostic 	{"pcpu", "", "%cpu"},
1869b414a1dSbostic 	{"pending", "", "sig"},
187a291b5edSbostic 	{"pgid", "PGID", NULL, 0, evar, PIDLEN, EOFF(e_pgid), ULONG, PIDFMT},
18880c68d49Sbostic 	{"pid", "PID", NULL, 0, pvar, PIDLEN, POFF(p_pid), LONG, PIDFMT},
1899b414a1dSbostic 	{"pmem", "", "%mem"},
1909b414a1dSbostic 	{"poip", "POIP", NULL, 0, pvar, 4, POFF(p_poip), SHORT, "d"},
19180c68d49Sbostic 	{"ppid", "PPID", NULL, 0, pvar, PIDLEN, POFF(p_ppid), LONG, PIDFMT},
1929b414a1dSbostic 	{"pri", "PRI", NULL, 0, pri, 3},
193514cbc2dSbostic 	{"re", "RE", NULL, 0, pvar, 3, POFF(p_swtime), ULONG, "d"},
1949b414a1dSbostic 	{"rgid", "RGID", NULL, 0, pvar, UIDLEN, POFF(p_rgid), USHORT, UIDFMT},
1959b414a1dSbostic 	{"rlink", "RLINK", NULL, 0, pvar, 8, POFF(p_rlink), KPTR, "x"},
1969b414a1dSbostic 	{"rss", "RSS", NULL, 0, p_rssize, 4},
1979b414a1dSbostic 	{"rssize", "", "rsz"},
1989b414a1dSbostic 	{"rsz", "RSZ", NULL, 0, rssize, 4},
1999b414a1dSbostic 	{"ruid", "RUID", NULL, 0, pvar, UIDLEN, POFF(p_ruid), USHORT, UIDFMT},
2009b414a1dSbostic 	{"ruser", "RUSER", NULL, LJUST, runame, USERLEN},
2019b414a1dSbostic 	{"sess", "SESS", NULL, 0, evar, 6, EOFF(e_sess), KPTR, "x"},
2029b414a1dSbostic 	{"sig", "PENDING", NULL, 0, pvar, 8, POFF(p_sig), LONG, "x"},
2039b414a1dSbostic 	{"sigcatch", "CAUGHT", NULL, 0, pvar, 8, POFF(p_sigcatch), LONG, "x"},
2049b414a1dSbostic 	{"sigignore", "IGNORED",
2059b414a1dSbostic 		NULL, 0, pvar, 8, POFF(p_sigignore), LONG, "x"},
2069b414a1dSbostic 	{"sigmask", "BLOCKED", NULL, 0, pvar, 8, POFF(p_sigmask), LONG, "x"},
207a291b5edSbostic 	{"sl", "SL", NULL, 0, pvar, 3, POFF(p_slptime), ULONG, "d"},
2089b414a1dSbostic 	{"start", "STARTED", NULL, LJUST|USER, started, 8},
2099b414a1dSbostic 	{"stat", "", "state"},
2109b414a1dSbostic 	{"state", "STAT", NULL, 0, state, 4},
2119b414a1dSbostic 	{"svgid", "SVGID",
2129b414a1dSbostic 		NULL, 0, pvar, UIDLEN, POFF(p_svgid), USHORT, UIDFMT},
2139b414a1dSbostic 	{"svuid", "SVUID",
2149b414a1dSbostic 		NULL, 0, pvar, UIDLEN, POFF(p_svuid), USHORT, UIDFMT},
2159b414a1dSbostic 	{"tdev", "TDEV", NULL, 0, tdev, 4},
2169b414a1dSbostic 	{"time", "TIME", NULL, USER, cputime, 9},
217a291b5edSbostic 	{"tpgid", "TPGID", NULL, 0, evar, 4, EOFF(e_tpgid), ULONG, PIDFMT},
2189b414a1dSbostic 	{"trs", "TRS", NULL, 0, trss, 3},
2199b414a1dSbostic 	{"tsess", "TSESS", NULL, 0, evar, 6, EOFF(e_tsess), KPTR, "x"},
2209b414a1dSbostic 	{"tsiz", "TSIZ", NULL, 0, tsize, 4},
2219b414a1dSbostic 	{"tt", "TT", NULL, LJUST, tname, 3},
2229b414a1dSbostic 	{"tty", "TTY", NULL, LJUST, longtname, 8},
2239b414a1dSbostic 	{"ucomm", "UCOMM", NULL, LJUST, ucomm, MAXCOMLEN},
2249b414a1dSbostic 	{"uid", "UID", NULL, 0, pvar, UIDLEN, POFF(p_uid),USHORT, UIDFMT},
2259b414a1dSbostic 	{"upr", "UPR", NULL, 0, pvar, 3, POFF(p_usrpri), CHAR, "d"},
2269b414a1dSbostic 	{"uprocp", "UPROCP", NULL, USER, uvar, 6, UOFF(u_procp), KPTR, "x"},
2279b414a1dSbostic 	{"user", "USER", NULL, LJUST, uname, USERLEN},
2289b414a1dSbostic 	{"usrpri", "", "upr"},
2299b414a1dSbostic 	{"vsize", "", "vsz"},
2309b414a1dSbostic 	{"vsz", "VSZ", NULL, 0, vsize, 5},
2319b414a1dSbostic 	{"wchan", "WCHAN", NULL, LJUST, wchan, 6},
2329b414a1dSbostic 	{"xstat", "XSTAT", NULL, 0, pvar, 4, POFF(p_xstat), USHORT, "x"},
23344c07ee2Skarels #endif
2349b414a1dSbostic 	{""},
2359b414a1dSbostic };
2369b414a1dSbostic 
23708b8aa43Sbostic void
showkey()2389b414a1dSbostic showkey()
2399b414a1dSbostic {
240f45a138dSpendry 	VAR *v;
241f45a138dSpendry 	int i;
242f45a138dSpendry 	char *p, *sep;
2439b414a1dSbostic 
2449b414a1dSbostic 	i = 0;
2455042d174Sbostic 	sep = "";
2469b414a1dSbostic 	for (v = var; *(p = v->name); ++v) {
247f45a138dSpendry 		int len = strlen(p);
2489b414a1dSbostic 		if (termwidth && (i += len + 1) > termwidth) {
2499b414a1dSbostic 			i = len;
2509b414a1dSbostic 			sep = "\n";
2515042d174Sbostic 		}
2524e4b9bd7Sbostic 		(void) printf("%s%s", sep, p);
2535042d174Sbostic 		sep = " ";
2549b414a1dSbostic 	}
2559b414a1dSbostic 	(void) printf("\n");
2569b414a1dSbostic }
2579b414a1dSbostic 
25808b8aa43Sbostic void
parsefmt(p)2599b414a1dSbostic parsefmt(p)
2609b414a1dSbostic 	char *p;
2619b414a1dSbostic {
262631623d7Sbostic 	static struct varent *vtail;
2639b414a1dSbostic 
2649b414a1dSbostic #define	FMTSEP	" \t,\n"
265631623d7Sbostic 	while (p && *p) {
266f45a138dSpendry 		char *cp;
267f45a138dSpendry 		VAR *v;
268f45a138dSpendry 		struct varent *vent;
269f45a138dSpendry 
2700cd3261cSmarc 		while ((cp = strsep(&p, FMTSEP)) != NULL && *cp == '\0')
2710cd3261cSmarc 			/* void */;
2729b414a1dSbostic 		if (!(v = findvar(cp)))
2739b414a1dSbostic 			continue;
27498d0b374Sbostic 		if ((vent = malloc(sizeof(struct varent))) == NULL)
2750e1cfdcbSbostic 			err(1, NULL);
2760cd3261cSmarc 		vent->var = v;
2770cd3261cSmarc 		vent->next = NULL;
2789b414a1dSbostic 		if (vhead == NULL)
2790cd3261cSmarc 			vhead = vtail = vent;
2809b414a1dSbostic 		else {
2810cd3261cSmarc 			vtail->next = vent;
2820cd3261cSmarc 			vtail = vent;
2839b414a1dSbostic 		}
2849b414a1dSbostic 	}
28598d0b374Sbostic 	if (!vhead)
2860e1cfdcbSbostic 		errx(1, "no valid keywords");
2879b414a1dSbostic }
2889b414a1dSbostic 
2899b414a1dSbostic static VAR *
findvar(p)2909b414a1dSbostic findvar(p)
2919b414a1dSbostic 	char *p;
2929b414a1dSbostic {
2939b414a1dSbostic 	VAR *v, key;
2949b414a1dSbostic 	char *hp;
2959b414a1dSbostic 	int vcmp();
2969b414a1dSbostic 
2979b414a1dSbostic 	key.name = p;
2989b414a1dSbostic 
2990e1cfdcbSbostic 	hp = strchr(p, '=');
3009b414a1dSbostic 	if (hp)
3019b414a1dSbostic 		*hp++ = '\0';
3029b414a1dSbostic 
3039b414a1dSbostic 	key.name = p;
30408b8aa43Sbostic 	v = bsearch(&key, var, sizeof(var)/sizeof(VAR) - 1, sizeof(VAR), vcmp);
3059b414a1dSbostic 
3069b414a1dSbostic 	if (v && v->alias) {
3079b414a1dSbostic 		if (hp) {
3080e1cfdcbSbostic 			warnx("%s: illegal keyword specification", p);
3099b414a1dSbostic 			eval = 1;
3109b414a1dSbostic 		}
3119b414a1dSbostic 		parsefmt(v->alias);
3129b414a1dSbostic 		return ((VAR *)NULL);
3139b414a1dSbostic 	}
3149b414a1dSbostic 	if (!v) {
3150e1cfdcbSbostic 		warnx("%s: keyword not found", p);
3169b414a1dSbostic 		eval = 1;
3179b414a1dSbostic 	}
3189b414a1dSbostic 	if (hp)
3199b414a1dSbostic 		v->header = hp;
3209b414a1dSbostic 	return (v);
3219b414a1dSbostic }
3229b414a1dSbostic 
32308b8aa43Sbostic static int
vcmp(a,b)3249b414a1dSbostic vcmp(a, b)
32508b8aa43Sbostic         const void *a, *b;
3269b414a1dSbostic {
32708b8aa43Sbostic         return (strcmp(((VAR *)a)->name, ((VAR *)b)->name));
3289b414a1dSbostic }
329