diff --git a/bin/ps/extern.h b/bin/ps/extern.h index 7e877f485624..08b6d9bce630 100644 --- a/bin/ps/extern.h +++ b/bin/ps/extern.h @@ -40,7 +40,7 @@ extern int cflag, eval, fscale, nlistread, rawcpu; extern unsigned long mempages; extern time_t now; extern int sumrusage, termwidth, totwidth; -extern VARENT *vhead; +extern STAILQ_HEAD(velisthead, varent) varlist; __BEGIN_DECLS void arguments(KINFO *, VARENT *); diff --git a/bin/ps/keyword.c b/bin/ps/keyword.c index 8a1726a741da..60e9e2e1eb59 100644 --- a/bin/ps/keyword.c +++ b/bin/ps/keyword.c @@ -235,7 +235,6 @@ showkey(void) void parsefmt(const char *p, int user) { - static struct varent *vtail; char *tempstr, *tempstr1; #define FMTSEP " \t,\n" @@ -282,16 +281,10 @@ parsefmt(const char *p, int user) if (vent->var == NULL) errx(1, "malloc failed"); memcpy(vent->var, v, sizeof(*vent->var)); - vent->next = NULL; - if (vhead == NULL) - vhead = vtail = vent; - else { - vtail->next = vent; - vtail = vent; - } + STAILQ_INSERT_TAIL(&varlist, vent, next_ve); } free(tempstr1); - if (!vhead) { + if (STAILQ_EMPTY(&varlist)) { warnx("no valid keywords; valid keywords:"); showkey(); exit(1); diff --git a/bin/ps/print.c b/bin/ps/print.c index da8f2e0ab35d..00394fcb73a7 100644 --- a/bin/ps/print.c +++ b/bin/ps/print.c @@ -69,26 +69,23 @@ printheader(void) { VAR *v; struct varent *vent; - int allempty; - allempty = 1; - for (vent = vhead; vent; vent = vent->next) - if (*vent->header != '\0') { - allempty = 0; + STAILQ_FOREACH(vent, &varlist, next_ve) + if (*vent->header != '\0') break; - } - if (allempty) + if (!vent) return; - for (vent = vhead; vent; vent = vent->next) { + + STAILQ_FOREACH(vent, &varlist, next_ve) { v = vent->var; if (v->flag & LJUST) { - if (vent->next == NULL) /* last one */ + if (STAILQ_NEXT(vent, next_ve) == NULL) /* last one */ (void)printf("%s", vent->header); else (void)printf("%-*s", v->width, vent->header); } else (void)printf("%*s", v->width, vent->header); - if (vent->next != NULL) + if (STAILQ_NEXT(vent, next_ve) != NULL) (void)putchar(' '); } (void)putchar('\n'); @@ -105,7 +102,7 @@ arguments(KINFO *k, VARENT *ve) if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL) errx(1, "malloc failed"); strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH); - if (ve->next == NULL) { + if (STAILQ_NEXT(ve, next_ve) == NULL) { /* last field */ if (termwidth == UNLIMITED) { (void)printf("%s", vis_args); @@ -131,7 +128,8 @@ command(KINFO *k, VARENT *ve) v = ve->var; if (cflag) { - if (ve->next == NULL) /* last field, don't pad */ + /* If it is the last field, then don't pad */ + if (STAILQ_NEXT(ve, next_ve) == NULL) (void)printf("%s", k->ki_p->ki_comm); else (void)printf("%-*s", v->width, k->ki_p->ki_comm); @@ -147,7 +145,7 @@ command(KINFO *k, VARENT *ve) } else vis_env = NULL; - if (ve->next == NULL) { + if (STAILQ_NEXT(ve, next_ve) == NULL) { /* last field */ if (termwidth == UNLIMITED) { if (vis_env) @@ -180,7 +178,7 @@ ucomm(KINFO *k, VARENT *ve) VAR *v; v = ve->var; - if (ve->next == NULL) /* last field, don't pad */ + if (STAILQ_NEXT(ve, next_ve) == NULL) /* last field, don't pad */ (void)printf("%s", k->ki_p->ki_comm); else (void)printf("%-*s", v->width, k->ki_p->ki_comm); diff --git a/bin/ps/ps.c b/bin/ps/ps.c index f4b0208bb942..7d091312f7c3 100644 --- a/bin/ps/ps.c +++ b/bin/ps/ps.c @@ -98,7 +98,7 @@ int sumrusage; /* -S */ int termwidth; /* Width of the screen (0 == infinity). */ int totwidth; /* Calculated-width of requested variables. */ -struct varent *vhead; +struct velisthead varlist = STAILQ_HEAD_INITIALIZER(varlist); static int forceuread = DEF_UREAD; /* Do extra work to get u-area. */ static kvm_t *kd; @@ -600,9 +600,9 @@ main(int argc, char *argv[]) * For each process, call each variable output function. */ for (i = lineno = 0; i < nkept; i++) { - for (vent = vhead; vent; vent = vent->next) { + STAILQ_FOREACH(vent, &varlist, next_ve) { (vent->var->oproc)(&kinfo[i], vent); - if (vent->next != NULL) + if (STAILQ_NEXT(vent, next_ve) != NULL) (void)putchar(' '); } (void)putchar('\n'); @@ -886,7 +886,7 @@ find_varentry(VAR *v) { struct varent *vent; - for (vent = vhead; vent; vent = vent->next) { + STAILQ_FOREACH(vent, &varlist, next_ve) { if (strcmp(vent->var->name, v->name) == 0) return vent; } @@ -899,7 +899,7 @@ scanvars(void) struct varent *vent; VAR *v; - for (vent = vhead; vent; vent = vent->next) { + STAILQ_FOREACH(vent, &varlist, next_ve) { v = vent->var; if (v->flag & DSIZ) { v->dwidth = v->width; @@ -919,7 +919,7 @@ dynsizevars(KINFO *ki) VAR *v; int i; - for (vent = vhead; vent; vent = vent->next) { + STAILQ_FOREACH(vent, &varlist, next_ve) { v = vent->var; if (!(v->flag & DSIZ)) continue; @@ -938,7 +938,7 @@ sizevars(void) VAR *v; int i; - for (vent = vhead; vent; vent = vent->next) { + STAILQ_FOREACH(vent, &varlist, next_ve) { v = vent->var; i = strlen(vent->header); if (v->width < i) diff --git a/bin/ps/ps.h b/bin/ps/ps.h index 817719d3f01b..03adc0a35c18 100644 --- a/bin/ps/ps.h +++ b/bin/ps/ps.h @@ -30,6 +30,8 @@ * $FreeBSD$ */ +#include + #define UNLIMITED 0 /* unlimited terminal width */ enum type { CHAR, UCHAR, SHORT, USHORT, INT, UINT, LONG, ULONG, KPTR, PGTOK }; @@ -44,8 +46,8 @@ typedef struct kinfo { /* Variables. */ typedef struct varent { + STAILQ_ENTRY(varent) next_ve; const char *header; - struct varent *next; struct var *var; } VARENT;