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