From bdf8ab4692a4f24cc321f4876f4d0c8b39dff4c9 Mon Sep 17 00:00:00 2001
From: Garance A Drosehn <gad@FreeBSD.org>
Date: Wed, 23 Jun 2004 23:48:09 +0000
Subject: [PATCH] Change "struct varent" to use the standard queue(8) macros,
 instead of using it's own version of the same basic algorithm.

Submitted by:	part by Cyrille Lefevre, part of it done by me
---
 bin/ps/extern.h  |  2 +-
 bin/ps/keyword.c | 11 ++---------
 bin/ps/print.c   | 26 ++++++++++++--------------
 bin/ps/ps.c      | 14 +++++++-------
 bin/ps/ps.h      |  4 +++-
 5 files changed, 25 insertions(+), 32 deletions(-)

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 <sys/queue.h>
+
 #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;