Module Name:    src
Committed By:   dholland
Date:           Mon Mar 12 00:20:30 UTC 2012

Modified Files:
        src/usr.bin/config: defs.h hash.c lint.c main.c mkheaders.c

Log Message:
Introduce type-safe wrappers around the hash tables. Use them for a
selected set of tables affected by the next nvlist cleanup in the
works.


To generate a diff of this commit:
cvs rdiff -u -r1.40 -r1.41 src/usr.bin/config/defs.h
cvs rdiff -u -r1.6 -r1.7 src/usr.bin/config/hash.c
cvs rdiff -u -r1.10 -r1.11 src/usr.bin/config/lint.c
cvs rdiff -u -r1.45 -r1.46 src/usr.bin/config/main.c
cvs rdiff -u -r1.19 -r1.20 src/usr.bin/config/mkheaders.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.40 src/usr.bin/config/defs.h:1.41
--- src/usr.bin/config/defs.h:1.40	Sun Mar 11 21:16:07 2012
+++ src/usr.bin/config/defs.h	Mon Mar 12 00:20:30 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: defs.h,v 1.40 2012/03/11 21:16:07 dholland Exp $	*/
+/*	$NetBSD: defs.h,v 1.41 2012/03/12 00:20:30 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -460,12 +460,12 @@ struct	hashtab *selecttab;	/* selects th
 struct	hashtab *needcnttab;	/* retains names marked "needs-count" */
 struct	hashtab *opttab;	/* table of configured options */
 struct	hashtab *fsopttab;	/* table of configured file systems */
-struct	hashtab *defopttab;	/* options that have been "defopt"'d */
-struct	hashtab *defflagtab;	/* options that have been "defflag"'d */
-struct	hashtab *defparamtab;	/* options that have been "defparam"'d */
-struct	hashtab *defoptlint;	/* lint values for options */
-struct	hashtab *deffstab;	/* defined file systems */
-struct	hashtab *optfiletab;	/* "defopt"'d option .h files */
+struct	nvhash *defopttab;	/* options that have been "defopt"'d */
+struct	nvhash *defflagtab;	/* options that have been "defflag"'d */
+struct	nvhash *defparamtab;	/* options that have been "defparam"'d */
+struct	nvhash *defoptlint;	/* lint values for options */
+struct	nvhash *deffstab;	/* defined file systems */
+struct	nvhash *optfiletab;	/* "defopt"'d option .h files */
 struct	hashtab *attrtab;	/* attributes (locators, etc.) */
 struct	hashtab *bdevmtab;	/* block devm lookup */
 struct	hashtab *cdevmtab;	/* character devm lookup */
@@ -529,6 +529,19 @@ const char *intern(const char *);
 typedef int (*ht_callback)(const char *, void *, void *);
 int	ht_enumerate(struct hashtab *, ht_callback, void *);
 
+/* typed hash, named struct HT, whose type is string -> struct VT */
+#define DECLHASH(HT, VT) \
+	struct HT;							\
+	struct HT *HT##_create(void);					\
+	int HT##_insert(struct HT *, const char *, struct VT *);	\
+	int HT##_replace(struct HT *, const char *, struct VT *);	\
+	int HT##_remove(struct HT *, const char *);			\
+	struct VT *HT##_lookup(struct HT *, const char *);		\
+	int HT##_enumerate(struct HT *,					\
+			int (*)(const char *, struct VT *, void *),	\
+			void *)
+DECLHASH(nvhash, nvlist);
+
 /* lint.c */
 void	emit_instances(void);
 void	emit_options(void);
@@ -554,11 +567,11 @@ void	setupdirs(void);
 const char *strtolower(const char *);
 
 /* tests on option types */
-#define OPT_FSOPT(n)	(ht_lookup(deffstab, (n)) != NULL)
-#define OPT_DEFOPT(n)	(ht_lookup(defopttab, (n)) != NULL)
-#define OPT_DEFFLAG(n)	(ht_lookup(defflagtab, (n)) != NULL)
-#define OPT_DEFPARAM(n)	(ht_lookup(defparamtab, (n)) != NULL)
-#define OPT_OBSOLETE(n)	(ht_lookup(obsopttab, (n)) != NULL)
+#define OPT_FSOPT(n)	(nvhash_lookup(deffstab, (n)) != NULL)
+#define OPT_DEFOPT(n)	(nvhash_lookup(defopttab, (n)) != NULL)
+#define OPT_DEFFLAG(n)	(nvhash_lookup(defflagtab, (n)) != NULL)
+#define OPT_DEFPARAM(n)	(nvhash_lookup(defparamtab, (n)) != NULL)
+#define OPT_OBSOLETE(n)	(nvhash_lookup(obsopttab, (n)) != NULL)
 #define DEFINED_OPTION(n) (find_declared_option((n)) != NULL)
 
 /* main.c */

Index: src/usr.bin/config/hash.c
diff -u src/usr.bin/config/hash.c:1.6 src/usr.bin/config/hash.c:1.7
--- src/usr.bin/config/hash.c:1.6	Sat Apr 11 12:41:10 2009
+++ src/usr.bin/config/hash.c	Mon Mar 12 00:20:30 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: hash.c,v 1.6 2009/04/11 12:41:10 lukem Exp $	*/
+/*	$NetBSD: hash.c,v 1.7 2012/03/12 00:20:30 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -315,3 +315,75 @@ ht_enumerate(struct hashtab *ht, ht_call
 	}
 	return rval;
 }
+
+/************************************************************/
+
+/*
+ * Type-safe wrappers.
+ */
+
+#define DEFHASH(HT, VT) \
+	struct HT {						\
+		struct hashtab imp;				\
+	};							\
+								\
+	struct HT *						\
+	HT##_create(void)					\
+	{							\
+		struct HT *tbl;					\
+								\
+		tbl = ecalloc(1, sizeof(*tbl));			\
+		ht_init(&tbl->imp, 8);				\
+		return tbl;					\
+	}							\
+								\
+	int							\
+	HT##_insert(struct HT *tbl, const char *name, struct VT *val) \
+	{							\
+		return ht_insert(&tbl->imp, name, val);		\
+	}							\
+								\
+	int							\
+	HT##_replace(struct HT *tbl, const char *name, struct VT *val) \
+	{							\
+		return ht_replace(&tbl->imp, name, val);	\
+	}							\
+								\
+	int							\
+	HT##_remove(struct HT *tbl, const char *name)		\
+	{							\
+		return ht_remove(&tbl->imp, name);		\
+	}							\
+								\
+	struct VT *						\
+	HT##_lookup(struct HT *tbl, const char *name)		\
+	{							\
+		return ht_lookup(&tbl->imp, name);		\
+	}							\
+								\
+	struct HT##_enumcontext {				\
+		int (*func)(const char *, struct VT *, void *);	\
+		void *userctx;					\
+	};							\
+								\
+	static int						\
+	HT##_enumerate_thunk(const char *name, void *value, void *voidctx) \
+	{							\
+		struct HT##_enumcontext *ctx = voidctx;		\
+								\
+		return ctx->func(name, value, ctx->userctx);	\
+	}							\
+								\
+	int							\
+	HT##_enumerate(struct HT *tbl,				\
+		      int (*func)(const char *, struct VT *, void *), \
+		      void *userctx)				\
+	{							\
+		struct HT##_enumcontext ctx;			\
+								\
+		ctx.func = func;				\
+		ctx.userctx = userctx;				\
+		return ht_enumerate(&tbl->imp, HT##_enumerate_thunk, &ctx); \
+	}
+
+DEFHASH(nvhash, nvlist);

Index: src/usr.bin/config/lint.c
diff -u src/usr.bin/config/lint.c:1.10 src/usr.bin/config/lint.c:1.11
--- src/usr.bin/config/lint.c:1.10	Sun Mar 11 21:16:08 2012
+++ src/usr.bin/config/lint.c	Mon Mar 12 00:20:30 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: lint.c,v 1.10 2012/03/11 21:16:08 dholland Exp $	*/
+/*	$NetBSD: lint.c,v 1.11 2012/03/12 00:20:30 dholland Exp $	*/
 
 /*
  *  Copyright (c) 2007 The NetBSD Foundation.
@@ -62,7 +62,7 @@ static struct opt_type {
 };
 
 static int
-do_emit_option(const char *name, void *value, void *v)
+do_emit_option(const char *name, struct nvlist *value, void *v)
 {
 	struct nvlist *nv = value;
 	const struct opt_type *ot = v;
@@ -75,7 +75,7 @@ do_emit_option(const char *name, void *v
 
 	printf("%s\t%s", ot->ot_name, nv->nv_name);
 	if (ot->ot_type == OT_PARAM) {
-		struct nvlist *nv2  = ht_lookup(defoptlint, nv->nv_name);
+		struct nvlist *nv2  = nvhash_lookup(defoptlint, nv->nv_name);
 		if (nv2 == NULL)
 			nv2 = nv;
 		printf("=\"%s\"", nv2->nv_str ? nv2->nv_str : "1");
@@ -87,14 +87,14 @@ do_emit_option(const char *name, void *v
 	
 
 void
-emit_options()
+emit_options(void)
 {
 
-	(void)ht_enumerate(defflagtab, do_emit_option, &opt_types[0]);
+	(void)nvhash_enumerate(defflagtab, do_emit_option, &opt_types[0]);
 	printf("\n");
-	(void)ht_enumerate(defparamtab, do_emit_option, &opt_types[1]);
+	(void)nvhash_enumerate(defparamtab, do_emit_option, &opt_types[1]);
 	printf("\n");
-	(void)ht_enumerate(deffstab, do_emit_option, &opt_types[2]);
+	(void)nvhash_enumerate(deffstab, do_emit_option, &opt_types[2]);
 	printf("\n");
 }
 

Index: src/usr.bin/config/main.c
diff -u src/usr.bin/config/main.c:1.45 src/usr.bin/config/main.c:1.46
--- src/usr.bin/config/main.c:1.45	Sun Mar 11 08:21:53 2012
+++ src/usr.bin/config/main.c	Mon Mar 12 00:20:30 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.45 2012/03/11 08:21:53 dholland Exp $	*/
+/*	$NetBSD: main.c,v 1.46 2012/03/12 00:20:30 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -90,7 +90,7 @@ int	yyparse(void);
 extern int yydebug;
 #endif
 
-static struct hashtab *obsopttab;
+static struct nvhash *obsopttab;
 static struct hashtab *mkopttab;
 static struct nvlist **nextopt;
 static struct nvlist **nextmkopt;
@@ -119,7 +119,7 @@ static	void	do_kill_orphans(struct devba
     struct devbase *, int);
 static	int	kill_orphans_cb(const char *, void *, void *);
 static	int	cfcrosscheck(struct config *, const char *, struct nvlist *);
-void	defopt(struct hashtab *ht, const char *fname,
+void	defopt(struct nvhash *ht, const char *fname,
 	     struct nvlist *opts, struct nvlist *deps, int obs);
 
 #define LOGCONFIG_LARGE "INCLUDE_CONFIG_FILE"
@@ -266,13 +266,13 @@ main(int argc, char **argv)
 	opttab = ht_new();
 	mkopttab = ht_new();
 	fsopttab = ht_new();
-	deffstab = ht_new();
-	defopttab = ht_new();
-	defparamtab = ht_new();
-	defoptlint = ht_new();
-	defflagtab = ht_new();
-	optfiletab = ht_new();
-	obsopttab = ht_new();
+	deffstab = nvhash_create();
+	defopttab = nvhash_create();
+	defparamtab = nvhash_create();
+	defoptlint = nvhash_create();
+	defflagtab = nvhash_create();
+	optfiletab = nvhash_create();
+	obsopttab = nvhash_create();
 	bdevmtab = ht_new();
 	maxbdevm = 0;
 	cdevmtab = ht_new();
@@ -627,7 +627,7 @@ deffilesystem(struct nvlist *fses, struc
 		 * used in "file-system" directives in the config
 		 * file.
 		 */
-		if (ht_insert(deffstab, nv->nv_name, nv))
+		if (nvhash_insert(deffstab, nv->nv_name, nv))
 			panic("file system `%s' already in table?!",
 			    nv->nv_name);
 
@@ -668,10 +668,10 @@ find_declared_option(const char *name)
 {
 	struct nvlist *option = NULL;
 
-	if ((option = ht_lookup(defopttab, name)) != NULL ||
-	    (option = ht_lookup(defparamtab, name)) != NULL ||
-	    (option = ht_lookup(defflagtab, name)) != NULL ||
-	    (option = ht_lookup(deffstab, name)) != NULL) {
+	if ((option = nvhash_lookup(defopttab, name)) != NULL ||
+	    (option = nvhash_lookup(defparamtab, name)) != NULL ||
+	    (option = nvhash_lookup(defflagtab, name)) != NULL ||
+	    (option = nvhash_lookup(deffstab, name)) != NULL) {
 		return (option);
 	}
 
@@ -686,7 +686,7 @@ find_declared_option(const char *name)
  * record the option information in the specified table.
  */
 void
-defopt(struct hashtab *ht, const char *fname, struct nvlist *opts,
+defopt(struct nvhash *ht, const char *fname, struct nvlist *opts,
        struct nvlist *deps, int obs)
 {
 	struct nvlist *nv, *nextnv, *oldnv;
@@ -710,7 +710,7 @@ defopt(struct hashtab *ht, const char *f
 			 * If an entry already exists, then we are about to
 			 * complain, so no worry.
 			 */
-			(void) ht_insert(defoptlint, nextnv->nv_name,
+			(void) nvhash_insert(defoptlint, nextnv->nv_name,
 			    nv);
 			nv = nextnv;
 			nextnv = nextnv->nv_next;
@@ -723,7 +723,7 @@ defopt(struct hashtab *ht, const char *f
 			return;
 		}
 
-		if (ht_insert(ht, nv->nv_name, nv)) {
+		if (nvhash_insert(ht, nv->nv_name, nv)) {
 			cfgerror("file system or option `%s' already defined",
 			    nv->nv_name);
 			return;
@@ -756,7 +756,7 @@ defopt(struct hashtab *ht, const char *f
 		 */
 		if (obs) {
 			nv->nv_flags |= NV_OBSOLETE;
-			(void)ht_insert(obsopttab, nv->nv_name, nv);
+			(void)nvhash_insert(obsopttab, nv->nv_name, nv);
 		}
 
 		/*
@@ -764,8 +764,8 @@ defopt(struct hashtab *ht, const char *f
 		 * Otherwise, append to the list of options already
 		 * associated with this file.
 		 */
-		if ((oldnv = ht_lookup(optfiletab, name)) == NULL) {
-			(void)ht_insert(optfiletab, name, nv);
+		if ((oldnv = nvhash_lookup(optfiletab, name)) == NULL) {
+			(void)nvhash_insert(optfiletab, name, nv);
 		} else {
 			while (oldnv->nv_next != NULL)
 				oldnv = oldnv->nv_next;

Index: src/usr.bin/config/mkheaders.c
diff -u src/usr.bin/config/mkheaders.c:1.19 src/usr.bin/config/mkheaders.c:1.20
--- src/usr.bin/config/mkheaders.c:1.19	Sun Mar 11 21:16:08 2012
+++ src/usr.bin/config/mkheaders.c	Mon Mar 12 00:20:30 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: mkheaders.c,v 1.19 2012/03/11 21:16:08 dholland Exp $	*/
+/*	$NetBSD: mkheaders.c,v 1.20 2012/03/12 00:20:30 dholland Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -61,7 +61,7 @@ static int emitcnt(struct nvlist *);
 static int emitopts(void);
 static int emittime(void);
 static int herr(const char *, const char *, FILE *);
-static int defopts_print(const char *, void *, void *);
+static int defopts_print(const char *, struct nvlist *, void *);
 static char *cntname(const char *);
 
 /*
@@ -221,7 +221,7 @@ fprintstr(FILE *fp, const char *str)
  */
 static int
 /*ARGSUSED*/
-defopts_print(const char *name, void *value, void *arg)
+defopts_print(const char *name, struct nvlist *value, void *arg)
 {
 	char tfname[BUFSIZ];
 	struct nvlist *nv, *option;
@@ -286,7 +286,7 @@ static int
 emitopts(void)
 {
 
-	return (ht_enumerate(optfiletab, defopts_print, NULL));
+	return (nvhash_enumerate(optfiletab, defopts_print, NULL));
 }
 
 /*

Reply via email to