Module Name:    src
Committed By:   dholland
Date:           Sun Mar 11 21:16:08 UTC 2012

Modified Files:
        src/usr.bin/config: defs.h gram.y lint.c mkheaders.c mkioconf.c sem.c
            sem.h util.c

Log Message:
Move locator lists to their own data structure. This can use more tidying;
it is not clear to me at the moment what the "string" and "num" values
pushed around in locator lists are supposed to actually mean.


To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/usr.bin/config/defs.h
cvs rdiff -u -r1.35 -r1.36 src/usr.bin/config/gram.y
cvs rdiff -u -r1.9 -r1.10 src/usr.bin/config/lint.c src/usr.bin/config/sem.h
cvs rdiff -u -r1.18 -r1.19 src/usr.bin/config/mkheaders.c
cvs rdiff -u -r1.20 -r1.21 src/usr.bin/config/mkioconf.c
cvs rdiff -u -r1.40 -r1.41 src/usr.bin/config/sem.c
cvs rdiff -u -r1.12 -r1.13 src/usr.bin/config/util.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/config/defs.h
diff -u src/usr.bin/config/defs.h:1.39 src/usr.bin/config/defs.h:1.40
--- src/usr.bin/config/defs.h:1.39	Sun Mar 11 08:21:53 2012
+++ src/usr.bin/config/defs.h	Sun Mar 11 21:16:07 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: defs.h,v 1.39 2012/03/11 08:21:53 dholland Exp $	*/
+/*	$NetBSD: defs.h,v 1.40 2012/03/11 21:16:07 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -157,7 +157,7 @@ struct attr {
 	const char *a_name;		/* name of this attribute */
 	int	a_iattr;		/* true => allows children */
 	const char *a_devclass;		/* device class described */
-	struct	nvlist *a_locs;		/* locators required */
+	struct	loclist *a_locs;	/* locators required */
 	int	a_loclen;		/* length of above list */
 	struct	nvlist *a_devs;		/* children */
 	struct	nvlist *a_refs;		/* parents */
@@ -174,6 +174,20 @@ struct attrlist {
 };
 
 /*
+ * List of locators. (Either definitions or uses...)
+ *
+ * XXX it would be nice if someone could clarify wtf ll_string and ll_num
+ * are actually holding. (This stuff was previously stored in a very ad
+ * hoc fashion, and the code is far from clear.)
+ */
+struct loclist {
+	const char *ll_name;
+	const char *ll_string;
+	long long ll_num;
+	struct loclist *ll_next;
+};
+
+/*
  * Parent specification.  Multiple device instances may share a
  * given parent spec.  Parent specs are emitted only if there are
  * device instances which actually reference it.
@@ -604,6 +618,8 @@ struct attrlist *attrlist_create(void);
 struct attrlist *attrlist_cons(struct attrlist *, struct attr *);
 void attrlist_destroy(struct attrlist *);
 void attrlist_destroyall(struct attrlist *);
+struct loclist *loclist_create(const char *, const char *, long long);
+void loclist_destroy(struct loclist *);
 struct condexpr *condexpr_create(enum condexpr_types);
 void condexpr_destroy(struct condexpr *);
 

Index: src/usr.bin/config/gram.y
diff -u src/usr.bin/config/gram.y:1.35 src/usr.bin/config/gram.y:1.36
--- src/usr.bin/config/gram.y:1.35	Sun Mar 11 19:27:26 2012
+++ src/usr.bin/config/gram.y	Sun Mar 11 21:16:08 2012
@@ -1,5 +1,5 @@
 %{
-/*	$NetBSD: gram.y,v 1.35 2012/03/11 19:27:26 dholland Exp $	*/
+/*	$NetBSD: gram.y,v 1.36 2012/03/11 21:16:08 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -70,8 +70,9 @@ static void wrap_cleanup(void);
  * Allocation wrapper type codes
  */
 #define WRAP_CODE_nvlist	1
-#define WRAP_CODE_attrlist	2
-#define WRAP_CODE_condexpr	3
+#define WRAP_CODE_loclist	2
+#define WRAP_CODE_attrlist	3
+#define WRAP_CODE_condexpr	4
 
 /*
  * The allocation wrappers themselves
@@ -79,10 +80,12 @@ static void wrap_cleanup(void);
 #define DECL_ALLOCWRAP(t)	static struct t *wrap_mk_##t(struct t *arg)
 
 DECL_ALLOCWRAP(nvlist);
+DECL_ALLOCWRAP(loclist);
 DECL_ALLOCWRAP(attrlist);
 DECL_ALLOCWRAP(condexpr);
 
 /* allow shorter names */
+#define wrap_mk_loc(p) wrap_mk_loclist(p)
 #define wrap_mk_cx(p) wrap_mk_condexpr(p)
 
 /*
@@ -108,6 +111,7 @@ DECL_ALLOCWRAP(condexpr);
 #define MK0(t)		wrap_mk_##t(mk_##t())
 #define MK1(t, a0)	wrap_mk_##t(mk_##t(a0))
 #define MK2(t, a0, a1)	wrap_mk_##t(mk_##t(a0, a1))
+#define MK3(t, a0, a1, a2)	wrap_mk_##t(mk_##t(a0, a1, a2))
 
 #define MKF0(t, f)		wrap_mk_##t(mk_##t##_##f())
 #define MKF1(t, f, a0)		wrap_mk_##t(mk_##t##_##f(a0))
@@ -117,6 +121,8 @@ DECL_ALLOCWRAP(condexpr);
  * Data constructors
  */
 
+static struct loclist *mk_loc(const char *, const char *, long long);
+static struct loclist *mk_loc_val(const char *, struct loclist *);
 static struct attrlist *mk_attrlist(struct attrlist *, struct attr *);
 static struct condexpr *mk_cx_atom(const char *);
 static struct condexpr *mk_cx_not(struct condexpr *);
@@ -130,10 +136,10 @@ static struct condexpr *mk_cx_or(struct 
 static	void	setmachine(const char *, const char *, struct nvlist *, int);
 static	void	check_maxpart(void);
 
-static	void	app(struct nvlist *, struct nvlist *);
-
-static	struct nvlist *mk_nsis(const char *, int, struct nvlist *, int);
-static	struct nvlist *mk_ns(const char *, struct nvlist *);
+static struct loclist *present_loclist(struct loclist *ll);
+static void app(struct loclist *, struct loclist *);
+static struct loclist *locarray(const char *, int, struct loclist *, int);
+static struct loclist *namelocvals(const char *, struct loclist *);
 
 %}
 
@@ -142,6 +148,7 @@ static	struct nvlist *mk_ns(const char *
 	struct	devbase *devb;
 	struct	deva *deva;
 	struct	nvlist *list;
+	struct loclist *loclist;
 	struct attrlist *attrlist;
 	struct condexpr *condexpr;
 	const char *str;
@@ -180,13 +187,14 @@ static	struct nvlist *mk_ns(const char *
 %type	<attr>	depend
 %type	<devb>	devbase
 %type	<deva>	devattach_opt
-%type	<list>	atlist interface_opt
+%type	<list>	atlist
+%type	<loclist> interface_opt
 %type	<str>	atname
-%type	<list>	loclist locdef
+%type	<loclist>	loclist locdef
 %type	<str>	locdefault
-%type	<list>	values locdefaults
+%type	<loclist>	values locdefaults
 %type	<attrlist>	depend_list depends
-%type	<list>	locators locator
+%type	<loclist>	locators locator
 %type	<list>	dev_spec
 %type	<str>	device_instance
 %type	<str>	attachment
@@ -442,8 +450,8 @@ deffs:
 /* optional locator specification */
 interface_opt:
 	  /* empty */			{ $$ = NULL; }
-	| '{' '}'			{ $$ = new_nx("", NULL); }
-	| '{' loclist '}'		{ $$ = new_nx("", $2); }
+	| '{' '}'			{ $$ = present_loclist(NULL); }
+	| '{' loclist '}'		{ $$ = present_loclist($2); }
 ;
 
 /*
@@ -463,14 +471,14 @@ loclist:
 
 /* one locator definition */
 locdef:
-	  locname locdefault 		{ $$ = new_nsi($1, $2, 0); }
-	| locname			{ $$ = new_nsi($1, NULL, 0); }
-	| '[' locname locdefault ']'	{ $$ = new_nsi($2, $3, 1); }
-	| locname '[' NUMBER ']'	{ $$ = mk_nsis($1, $3.val, NULL, 0); }
+	  locname locdefault 		{ $$ = MK3(loc, $1, $2, 0); }
+	| locname			{ $$ = MK3(loc, $1, NULL, 0); }
+	| '[' locname locdefault ']'	{ $$ = MK3(loc, $2, $3, 1); }
+	| locname '[' NUMBER ']'	{ $$ = locarray($1, $3.val, NULL, 0); }
 	| locname '[' NUMBER ']' locdefaults
-					{ $$ = mk_nsis($1, $3.val, $5, 0); }
+					{ $$ = locarray($1, $3.val, $5, 0); }
 	| '[' locname '[' NUMBER ']' locdefaults ']'
-					{ $$ = mk_nsis($2, $4.val, $6, 1); }
+					{ $$ = locarray($2, $4.val, $6, 1); }
 ;
 
 /* locator name */
@@ -779,8 +787,8 @@ locators:
 
 /* one locator */
 locator:
-	  WORD '?'			{ $$ = new_ns($1, NULL); }
-	| WORD values			{ $$ = mk_ns($1, $2); }
+	  WORD '?'			{ $$ = MK3(loc, $1, NULL, 0); }
+	| WORD values			{ $$ = namelocvals($1, $2); }
 ;
 
 /* optional device flags */
@@ -880,8 +888,8 @@ stringvalue:
 /* comma-separated list of values */
 /* XXX why right-recursive? */
 values:
-	  value				{ $$ = new_s($1); }
-	| value ',' values		{ $$ = new_sx($1, $3); }
+	  value				{ $$ = MKF2(loc, val, $1, NULL); }
+	| value ',' values		{ $$ = MKF2(loc, val, $1, $3); }
 ;
 
 /* possibly negative number */
@@ -956,24 +964,45 @@ wrap_cleanup(void)
 {
 	unsigned i;
 
+	/*
+	 * Destroy each item. Note that because everything allocated
+	 * is entered on the list separately, lists and trees need to
+	 * have their links blanked before being destroyed. Also note
+	 * that strings are interned elsewhere and not handled by this
+	 * mechanism.
+	 */
+
 	for (i=0; i<wrap_depth; i++) {
 		switch (wrapstack[i].typecode) {
 		    case WRAP_CODE_nvlist:
 			nvfree(wrapstack[i].ptr);
 			break;
+		    case WRAP_CODE_loclist:
+			{
+				struct loclist *ll = wrapstack[i].ptr;
+
+				ll->ll_next = NULL;
+				loclist_destroy(ll);
+			}
+			break;
 		    case WRAP_CODE_attrlist:
 			{
 				struct attrlist *al = wrapstack[i].ptr;
 
-				/*
-				 * Contents got wrapped separately;
-				 * just blank it out to destroy.
-				 */
 				al->al_next = NULL;
 				al->al_this = NULL;
 				attrlist_destroy(al);
 			}
 			break;
+		    case WRAP_CODE_condexpr:
+			{
+				struct condexpr *cx = wrapstack[i].ptr;
+
+				cx->cx_type = CX_ATOM;
+				cx->cx_atom = NULL;
+				condexpr_destroy(cx);
+			}
+			break;
 		    default:
 			panic("invalid code %u on allocation wrapper stack",
 			      wrapstack[i].typecode);
@@ -999,6 +1028,7 @@ wrap_cleanup(void)
 	}
 
 DEF_ALLOCWRAP(nvlist);
+DEF_ALLOCWRAP(loclist);
 DEF_ALLOCWRAP(attrlist);
 DEF_ALLOCWRAP(condexpr);
 
@@ -1006,8 +1036,26 @@ DEF_ALLOCWRAP(condexpr);
 
 /*
  * Data constructors
+ *
+ * (These are *beneath* the allocation wrappers.)
  */
 
+static struct loclist *
+mk_loc(const char *name, const char *str, long long num)
+{
+	return loclist_create(name, str, num);
+}
+
+static struct loclist *
+mk_loc_val(const char *str, struct loclist *next)
+{
+	struct loclist *ll;
+
+	ll = mk_loc(NULL, str, 0);
+	ll->ll_next = next;
+	return ll;
+}
+
 static struct attrlist *
 mk_attrlist(struct attrlist *next, struct attr *a)
 {
@@ -1148,19 +1196,34 @@ check_version(void)
 		stop("your sources are out of date -- please update.");
 }
 
+/*
+ * Prepend a blank entry to the locator definitions so the code in
+ * sem.c can distinguish "empty locator list" from "no locator list".
+ * XXX gross.
+ */
+static struct loclist *
+present_loclist(struct loclist *ll)
+{
+	struct loclist *ret;
+
+	ret = MK3(loc, "", NULL, 0);
+	ret->ll_next = ll;
+	return ret;
+}
+
 static void
-app(struct nvlist *p, struct nvlist *q)
+app(struct loclist *p, struct loclist *q)
 {
-	while (p->nv_next)
-		p = p->nv_next;
-	p->nv_next = q;
+	while (p->ll_next)
+		p = p->ll_next;
+	p->ll_next = q;
 }
 
-static struct nvlist *
-mk_nsis(const char *name, int count, struct nvlist *adefs, int opt)
+static struct loclist *
+locarray(const char *name, int count, struct loclist *adefs, int opt)
 {
-	struct nvlist *defs = adefs;
-	struct nvlist **p;
+	struct loclist *defs = adefs;
+	struct loclist **p;
 	char buf[200];
 	int i;
 
@@ -1171,27 +1234,27 @@ mk_nsis(const char *name, int count, str
 	p = &defs;
 	for(i = 0; i < count; i++) {
 		if (*p == NULL)
-			*p = new_s("0");
+			*p = MK3(loc, NULL, "0", 0);
 		snprintf(buf, sizeof(buf), "%s%c%d", name, ARRCHR, i);
-		(*p)->nv_name = i == 0 ? name : intern(buf);
-		(*p)->nv_num = i > 0 || opt;
-		p = &(*p)->nv_next;
+		(*p)->ll_name = i == 0 ? name : intern(buf);
+		(*p)->ll_num = i > 0 || opt;
+		p = &(*p)->ll_next;
 	}
 	*p = 0;
 	return defs;
 }
 
 
-static struct nvlist *
-mk_ns(const char *name, struct nvlist *vals)
+static struct loclist *
+namelocvals(const char *name, struct loclist *vals)
 {
-	struct nvlist *p;
+	struct loclist *p;
 	char buf[200];
 	int i;
 
-	for(i = 0, p = vals; p; i++, p = p->nv_next) {
+	for (i = 0, p = vals; p; i++, p = p->ll_next) {
 		snprintf(buf, sizeof(buf), "%s%c%d", name, ARRCHR, i);
-		p->nv_name = i == 0 ? name : intern(buf);
+		p->ll_name = i == 0 ? name : intern(buf);
 	}
 	return vals;
 }

Index: src/usr.bin/config/lint.c
diff -u src/usr.bin/config/lint.c:1.9 src/usr.bin/config/lint.c:1.10
--- src/usr.bin/config/lint.c:1.9	Sun Mar 11 07:32:41 2012
+++ src/usr.bin/config/lint.c	Sun Mar 11 21:16:08 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: lint.c,v 1.9 2012/03/11 07:32:41 dholland Exp $	*/
+/*	$NetBSD: lint.c,v 1.10 2012/03/11 21:16:08 dholland Exp $	*/
 
 /*
  *  Copyright (c) 2007 The NetBSD Foundation.
@@ -101,7 +101,8 @@ emit_options()
 static void
 do_emit_instances(struct devbase *d, struct attr *at)
 {
-	struct nvlist *nv, *nv1;
+	struct nvlist *nv1;
+	struct loclist *ll;
 	struct attrlist *al;
 	struct attr *a;
 	struct deva *da;
@@ -130,10 +131,10 @@ do_emit_instances(struct devbase *d, str
 	else if (at != NULL && !d->d_ispseudo && da->d_ihead == NULL) {
 		printf("%s0\tat\t%s?", d->d_name, at->a_name);
 
-		for (nv = at->a_locs; nv != NULL; nv = nv->nv_next) {
-			if (nv->nv_num == 0)
-				printf(" %s %c", nv->nv_name,
-				    nv->nv_str ? '?' : '0');
+		for (ll = at->a_locs; ll != NULL; ll = ll->ll_next) {
+			if (ll->ll_num == 0)
+				printf(" %s %c", ll->ll_name,
+				    ll->ll_string ? '?' : '0');
 		}
 
 		printf("\n");
Index: src/usr.bin/config/sem.h
diff -u src/usr.bin/config/sem.h:1.9 src/usr.bin/config/sem.h:1.10
--- src/usr.bin/config/sem.h:1.9	Sun Mar 11 08:21:53 2012
+++ src/usr.bin/config/sem.h	Sun Mar 11 21:16:08 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: sem.h,v 1.9 2012/03/11 08:21:53 dholland Exp $	*/
+/*	$NetBSD: sem.h,v 1.10 2012/03/11 21:16:08 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -46,8 +46,8 @@ void		setversion(int);
 void		setdefmaxusers(int, int, int);
 void		setmaxusers(int);
 void		setident(const char *);
-int		defattr(const char *, struct nvlist *, struct attrlist *, int);
-void		defdev(struct devbase *, struct nvlist *, struct attrlist *, int);
+int		defattr(const char *, struct loclist *, struct attrlist *, int);
+void		defdev(struct devbase *, struct loclist *, struct attrlist *, int);
 void		defdevattach(struct deva *, struct devbase *, struct nvlist *,
 			     struct attrlist *);
 struct devbase *getdevbase(const char *);
@@ -60,7 +60,7 @@ void		addconf(struct config *);
 void		setconf(struct nvlist **, const char *, struct nvlist *);
 void		delconf(const char *);
 void		setfstype(const char **, const char *);
-void		adddev(const char *, const char *, struct nvlist *, int);
+void		adddev(const char *, const char *, struct loclist *, int);
 void		deldevi(const char *, const char *);
 void		deldeva(const char *);
 void		deldev(const char *);

Index: src/usr.bin/config/mkheaders.c
diff -u src/usr.bin/config/mkheaders.c:1.18 src/usr.bin/config/mkheaders.c:1.19
--- src/usr.bin/config/mkheaders.c:1.18	Mon Mar 22 14:40:54 2010
+++ src/usr.bin/config/mkheaders.c	Sun Mar 11 21:16:08 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: mkheaders.c,v 1.18 2010/03/22 14:40:54 pooka Exp $	*/
+/*	$NetBSD: mkheaders.c,v 1.19 2012/03/11 21:16:08 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -298,7 +298,7 @@ static int
 locators_print(const char *name, void *value, void *arg)
 {
 	struct attr *a;
-	struct nvlist *nv;
+	struct loclist *ll;
 	int i;
 	char *locdup, *namedup;
 	char *cp;
@@ -316,24 +316,24 @@ locators_print(const char *name, void *v
 		for (cp = locdup; *cp; cp++)
 			if (islower((unsigned char)*cp))
 				*cp = toupper((unsigned char)*cp);
-		for (i = 0, nv = a->a_locs; nv; nv = nv->nv_next, i++) {
-			if (strchr(nv->nv_name, ' ') != NULL ||
-			    strchr(nv->nv_name, '\t') != NULL)
+		for (i = 0, ll = a->a_locs; ll; ll = ll->ll_next, i++) {
+			if (strchr(ll->ll_name, ' ') != NULL ||
+			    strchr(ll->ll_name, '\t') != NULL)
 				/*
 				 * name contains a space; we can't generate
 				 * usable defines, so ignore it.
 				 */
 				continue;
-			namedup = estrdup(nv->nv_name);
+			namedup = estrdup(ll->ll_name);
 			for (cp = namedup; *cp; cp++)
 				if (islower((unsigned char)*cp))
 					*cp = toupper((unsigned char)*cp);
 				else if (*cp == ARRCHR)
 					*cp = '_';
 			fprintf(fp, "#define %sCF_%s %d\n", locdup, namedup, i);
-			if (nv->nv_str != NULL)
+			if (ll->ll_string != NULL)
 				fprintf(fp, "#define %sCF_%s_DEFAULT %s\n",
-				    locdup, namedup, nv->nv_str);
+				    locdup, namedup, ll->ll_string);
 			free(namedup);
 		}
 		/* assert(i == a->a_loclen) */

Index: src/usr.bin/config/mkioconf.c
diff -u src/usr.bin/config/mkioconf.c:1.20 src/usr.bin/config/mkioconf.c:1.21
--- src/usr.bin/config/mkioconf.c:1.20	Sun Mar 11 07:32:41 2012
+++ src/usr.bin/config/mkioconf.c	Sun Mar 11 21:16:08 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: mkioconf.c,v 1.20 2012/03/11 07:32:41 dholland Exp $	*/
+/*	$NetBSD: mkioconf.c,v 1.21 2012/03/11 21:16:08 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -168,7 +168,7 @@ static int
 cf_locators_print(const char *name, void *value, void *arg)
 {
 	struct attr *a;
-	struct nvlist *nv;
+	struct loclist *ll;
 	FILE *fp = arg;
 
 	a = value;
@@ -180,11 +180,11 @@ cf_locators_print(const char *name, void
 		    "static const struct cfiattrdata %scf_iattrdata = {\n",
 			    name);
 		fprintf(fp, "\t\"%s\", %d,\n\t{\n", name, a->a_loclen);
-		for (nv = a->a_locs; nv; nv = nv->nv_next)
+		for (ll = a->a_locs; ll; ll = ll->ll_next)
 			fprintf(fp, "\t\t{ \"%s\", \"%s\", %s },\n",
-				nv->nv_name,
-				(nv->nv_str ? nv->nv_str : "NULL"),
-				(nv->nv_str ? nv->nv_str : "0"));
+				ll->ll_name,
+				(ll->ll_string ? ll->ll_string : "NULL"),
+				(ll->ll_string ? ll->ll_string : "0"));
 		fprintf(fp, "\t}\n};\n");
 	} else {
 		fprintf(fp,
@@ -363,7 +363,7 @@ emitcfdata(FILE *fp)
 	struct pspec *ps;
 	int unit, v;
 	const char *state, *basename, *attachment;
-	struct nvlist *nv;
+	struct loclist *ll;
 	struct attr *a;
 	const char *loc;
 	char locbuf[20];
@@ -394,16 +394,16 @@ emitcfdata(FILE *fp)
 			}
 
 			a = ps->p_iattr;
-			for (nv = a->a_locs, v = 0; nv != NULL;
-			     nv = nv->nv_next, v++) {
-				if (ARRNAME(nv->nv_name, lastname)) {
+			for (ll = a->a_locs, v = 0; ll != NULL;
+			     ll = ll->ll_next, v++) {
+				if (ARRNAME(ll->ll_name, lastname)) {
 					fprintf(fp, " %s %s",
-					    nv->nv_name, i->i_locs[v]);
+					    ll->ll_name, i->i_locs[v]);
 				} else {
 					fprintf(fp, " %s %s",
-						    nv->nv_name,
+						    ll->ll_name,
 						    i->i_locs[v]);
-					lastname = nv->nv_name;
+					lastname = ll->ll_name;
 				}
 			}
 		} else {

Index: src/usr.bin/config/sem.c
diff -u src/usr.bin/config/sem.c:1.40 src/usr.bin/config/sem.c:1.41
--- src/usr.bin/config/sem.c:1.40	Sun Mar 11 08:21:53 2012
+++ src/usr.bin/config/sem.c	Sun Mar 11 21:16:08 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: sem.c,v 1.40 2012/03/11 08:21:53 dholland Exp $	*/
+/*	$NetBSD: sem.c,v 1.41 2012/03/11 21:16:08 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -82,7 +82,7 @@ static const char *concat(const char *, 
 static char *extend(char *, const char *);
 static int split(const char *, size_t, char *, size_t, int *);
 static void selectbase(struct devbase *, struct deva *);
-static const char **fixloc(const char *, struct attr *, struct nvlist *);
+static const char **fixloc(const char *, struct attr *, struct loclist *);
 static const char *makedevstr(devmajor_t, devminor_t);
 static const char *major2name(devmajor_t);
 static devmajor_t dev2major(struct devbase *);
@@ -194,12 +194,12 @@ setident(const char *i)
  * all locator lists include a dummy head node, which we discard here.
  */
 int
-defattr(const char *name, struct nvlist *locs, struct attrlist *deps,
+defattr(const char *name, struct loclist *locs, struct attrlist *deps,
     int devclass)
 {
 	struct attr *a, *dep;
 	struct attrlist *al;
-	struct nvlist *nv;
+	struct loclist *ll;
 	int len;
 
 	if (locs != NULL && devclass)
@@ -225,15 +225,17 @@ defattr(const char *name, struct nvlist 
 	if (ht_insert(attrtab, name, a)) {
 		free(a);
 		cfgerror("attribute `%s' already defined", name);
-		nvfreel(locs);
+		loclist_destroy(locs);
 		return (1);
 	}
 
 	a->a_name = name;
 	if (locs != NULL) {
 		a->a_iattr = 1;
-		a->a_locs = locs->nv_next;
-		nvfree(locs);
+		/* unwrap */
+		a->a_locs = locs->ll_next;
+		locs->ll_next = NULL;
+		loclist_destroy(locs);
 	} else {
 		a->a_iattr = 0;
 		a->a_locs = NULL;
@@ -257,7 +259,7 @@ defattr(const char *name, struct nvlist 
 	} else
 		a->a_devclass = NULL;
 	len = 0;
-	for (nv = a->a_locs; nv != NULL; nv = nv->nv_next)
+	for (ll = a->a_locs; ll != NULL; ll = ll->ll_next)
 		len++;
 	a->a_loclen = len;
 	a->a_devs = NULL;
@@ -322,10 +324,10 @@ addtoattr(struct nvlist *l, struct devba
  * attribute and/or refer to existing attributes.
  */
 void
-defdev(struct devbase *dev, struct nvlist *loclist, struct attrlist *attrs,
+defdev(struct devbase *dev, struct loclist *loclist, struct attrlist *attrs,
        int ispseudo)
 {
-	struct nvlist *nv;
+	struct loclist *ll;
 	struct attrlist *al;
 	struct attr *a;
 
@@ -347,9 +349,9 @@ defdev(struct devbase *dev, struct nvlis
 	 * (where you can plug in a foo-bus extender to a foo-bus).
 	 */
 	if (loclist != NULL) {
-		nv = loclist;
+		ll = loclist;
 		loclist = NULL;	/* defattr disposes of them for us */
-		if (defattr(dev->d_name, nv, NULL, 0))
+		if (defattr(dev->d_name, ll, NULL, 0))
 			goto bad;
 		attrs = attrlist_cons(attrs, getattr(dev->d_name));
 		/* This used to be stored but was never used */
@@ -407,7 +409,7 @@ defdev(struct devbase *dev, struct nvlis
 	}
 	return;
  bad:
-	nvfreel(loclist);
+	loclist_destroy(loclist);
 	attrlist_destroyall(attrs);
 }
 
@@ -936,7 +938,7 @@ newdevi(const char *name, int unit, stru
  * another device instead) plus unit number.
  */
 void
-adddev(const char *name, const char *at, struct nvlist *loclist, int flags)
+adddev(const char *name, const char *at, struct loclist *loclist, int flags)
 {
 	struct devi *i;		/* the new instance */
 	struct pspec *p;	/* and its pspec */
@@ -1076,7 +1078,7 @@ adddev(const char *name, const char *at,
 
 	/* all done, fall into ... */
  bad:
-	nvfreel(loclist);
+	loclist_destroy(loclist);
 	return;
 }
 
@@ -1818,9 +1820,9 @@ extend(char *p, const char *name)
  * given as "?" and have defaults.  Return 0 on success.
  */
 static const char **
-fixloc(const char *name, struct attr *attr, struct nvlist *got)
+fixloc(const char *name, struct attr *attr, struct loclist *got)
 {
-	struct nvlist *m, *n;
+	struct loclist *m, *n;
 	int ord;
 	const char **lp;
 	int nmissing, nextra, nnodefault;
@@ -1837,23 +1839,23 @@ fixloc(const char *name, struct attr *at
 		lp = nullvec;
 	else
 		lp = emalloc((attr->a_loclen + 1) * sizeof(const char *));
-	for (n = got; n != NULL; n = n->nv_next)
-		n->nv_num = -1;
+	for (n = got; n != NULL; n = n->ll_next)
+		n->ll_num = -1;
 	nmissing = 0;
 	mp = missing;
 	/* yes, this is O(mn), but m and n should be small */
-	for (ord = 0, m = attr->a_locs; m != NULL; m = m->nv_next, ord++) {
-		for (n = got; n != NULL; n = n->nv_next) {
-			if (n->nv_name == m->nv_name) {
-				n->nv_num = ord;
+	for (ord = 0, m = attr->a_locs; m != NULL; m = m->ll_next, ord++) {
+		for (n = got; n != NULL; n = n->ll_next) {
+			if (n->ll_name == m->ll_name) {
+				n->ll_num = ord;
 				break;
 			}
 		}
-		if (n == NULL && m->nv_num == 0) {
+		if (n == NULL && m->ll_num == 0) {
 			nmissing++;
-			mp = extend(mp, m->nv_name);
+			mp = extend(mp, m->ll_name);
 		}
-		lp[ord] = m->nv_str;
+		lp[ord] = m->ll_string;
 	}
 	if (ord != attr->a_loclen)
 		panic("fixloc");
@@ -1862,17 +1864,17 @@ fixloc(const char *name, struct attr *at
 	ep = extra;
 	nnodefault = 0;
 	ndp = nodefault;
-	for (n = got; n != NULL; n = n->nv_next) {
-		if (n->nv_num >= 0) {
-			if (n->nv_str != NULL)
-				lp[n->nv_num] = n->nv_str;
-			else if (lp[n->nv_num] == NULL) {
+	for (n = got; n != NULL; n = n->ll_next) {
+		if (n->ll_num >= 0) {
+			if (n->ll_string != NULL)
+				lp[n->ll_num] = n->ll_string;
+			else if (lp[n->ll_num] == NULL) {
 				nnodefault++;
-				ndp = extend(ndp, n->nv_name);
+				ndp = extend(ndp, n->ll_name);
 			}
 		} else {
 			nextra++;
-			ep = extend(ep, n->nv_name);
+			ep = extend(ep, n->ll_name);
 		}
 	}
 	if (nextra) {

Index: src/usr.bin/config/util.c
diff -u src/usr.bin/config/util.c:1.12 src/usr.bin/config/util.c:1.13
--- src/usr.bin/config/util.c:1.12	Sun Mar 11 20:02:55 2012
+++ src/usr.bin/config/util.c	Sun Mar 11 21:16:08 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: util.c,v 1.12 2012/03/11 20:02:55 dholland Exp $	*/
+/*	$NetBSD: util.c,v 1.13 2012/03/11 21:16:08 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -205,6 +205,36 @@ nvcat(struct nvlist *nv1, struct nvlist 
 }
 
 /*
+ * Locator lists
+ */
+
+struct loclist *
+loclist_create(const char *name, const char *string, long long num)
+{
+	struct loclist *ll;
+
+	ll = emalloc(sizeof(*ll));
+	ll->ll_name = name;
+	ll->ll_string = string;
+	ll->ll_num = num;
+	ll->ll_next = NULL;
+	return ll;
+}
+
+void
+loclist_destroy(struct loclist *ll)
+{
+	struct loclist *next;
+
+	while (ll != NULL) {
+		next = ll->ll_next;
+		ll->ll_next = NULL;
+		free(ll);
+		ll = next;
+	}
+}
+
+/*
  * Attribute lists
  */
 

Reply via email to