Module Name:    src
Committed By:   joerg
Date:           Sun Jun  3 23:19:11 UTC 2012

Modified Files:
        src/distrib/amd64/cdroms: Makefile.cdrom
        src/distrib/i386/cdroms: Makefile.cdrom
        src/distrib/sets/lists/base: mi
        src/distrib/sets/lists/tests: mi
        src/distrib/sparc64/cdroms/installcd: Makefile
        src/distrib/sparc64/instfs: list
        src/lib/libterminfo: Makefile.hash compile.c term.c term_private.h
            terminfo.5.in
        src/share/man/man7: hier.7
        src/share/terminfo: Makefile
        src/tests/lib/libcurses: Makefile
        src/tests/lib/libcurses/director: director.c
        src/usr.bin/tic: tic.1 tic.c

Log Message:
Switch terminfo(3) to cdb(5).


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/distrib/amd64/cdroms/Makefile.cdrom
cvs rdiff -u -r1.26 -r1.27 src/distrib/i386/cdroms/Makefile.cdrom
cvs rdiff -u -r1.995 -r1.996 src/distrib/sets/lists/base/mi
cvs rdiff -u -r1.471 -r1.472 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.14 -r1.15 src/distrib/sparc64/cdroms/installcd/Makefile
cvs rdiff -u -r1.24 -r1.25 src/distrib/sparc64/instfs/list
cvs rdiff -u -r1.4 -r1.5 src/lib/libterminfo/Makefile.hash
cvs rdiff -u -r1.7 -r1.8 src/lib/libterminfo/compile.c
cvs rdiff -u -r1.14 -r1.15 src/lib/libterminfo/term.c
cvs rdiff -u -r1.9 -r1.10 src/lib/libterminfo/term_private.h
cvs rdiff -u -r1.15 -r1.16 src/lib/libterminfo/terminfo.5.in
cvs rdiff -u -r1.100 -r1.101 src/share/man/man7/hier.7
cvs rdiff -u -r1.2 -r1.3 src/share/terminfo/Makefile
cvs rdiff -u -r1.2 -r1.3 src/tests/lib/libcurses/Makefile
cvs rdiff -u -r1.9 -r1.10 src/tests/lib/libcurses/director/director.c
cvs rdiff -u -r1.9 -r1.10 src/usr.bin/tic/tic.1
cvs rdiff -u -r1.19 -r1.20 src/usr.bin/tic/tic.c

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

Modified files:

Index: src/distrib/amd64/cdroms/Makefile.cdrom
diff -u src/distrib/amd64/cdroms/Makefile.cdrom:1.6 src/distrib/amd64/cdroms/Makefile.cdrom:1.7
--- src/distrib/amd64/cdroms/Makefile.cdrom:1.6	Tue Jun 21 21:49:22 2011
+++ src/distrib/amd64/cdroms/Makefile.cdrom	Sun Jun  3 23:19:09 2012
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.cdrom,v 1.6 2011/06/21 21:49:22 joerg Exp $
+# $NetBSD: Makefile.cdrom,v 1.7 2012/06/03 23:19:09 joerg Exp $
 
 .include <bsd.own.mk>
 
@@ -53,7 +53,7 @@ CDRUNTIME+=	./usr/mdec
 CDRUNTIME+=	./usr/sbin/chroot
 CDRUNTIME+=	./usr/sbin/installboot
 CDRUNTIME+=	./usr/sbin/wiconfig
-CDRUNTIME+=	./usr/share/misc/terminfo.db
+CDRUNTIME+=	./usr/share/misc/terminfo.cdb
 CDRUNTIME+=	./usr/share/locale
 
 image_md_pre:

Index: src/distrib/i386/cdroms/Makefile.cdrom
diff -u src/distrib/i386/cdroms/Makefile.cdrom:1.26 src/distrib/i386/cdroms/Makefile.cdrom:1.27
--- src/distrib/i386/cdroms/Makefile.cdrom:1.26	Tue Jun 21 21:49:23 2011
+++ src/distrib/i386/cdroms/Makefile.cdrom	Sun Jun  3 23:19:09 2012
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.cdrom,v 1.26 2011/06/21 21:49:23 joerg Exp $
+# $NetBSD: Makefile.cdrom,v 1.27 2012/06/03 23:19:09 joerg Exp $
 
 .include <bsd.own.mk>
 
@@ -53,7 +53,7 @@ CDRUNTIME+=	./usr/mdec
 CDRUNTIME+=	./usr/sbin/chroot
 CDRUNTIME+=	./usr/sbin/installboot
 CDRUNTIME+=	./usr/sbin/wiconfig
-CDRUNTIME+=	./usr/share/misc/terminfo.db
+CDRUNTIME+=	./usr/share/misc/terminfo.cdb
 CDRUNTIME+=	./usr/share/locale
 
 image_md_pre:

Index: src/distrib/sets/lists/base/mi
diff -u src/distrib/sets/lists/base/mi:1.995 src/distrib/sets/lists/base/mi:1.996
--- src/distrib/sets/lists/base/mi:1.995	Fri Jun  1 13:19:38 2012
+++ src/distrib/sets/lists/base/mi	Sun Jun  3 23:19:09 2012
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.995 2012/06/01 13:19:38 nonaka Exp $
+# $NetBSD: mi,v 1.996 2012/06/03 23:19:09 joerg Exp $
 #
 # Note:	Don't delete entries from here - mark them as "obsolete" instead,
 #	unless otherwise stated below.
@@ -3773,7 +3773,8 @@
 ./usr/share/misc/more.help			base-obsolete		obsolete
 ./usr/share/misc/nslookup.help			base-obsolete		obsolete
 ./usr/share/misc/terminfo			base-terminfo-share	share
-./usr/share/misc/terminfo.db			base-terminfo-share	share
+./usr/share/misc/terminfo.cdb			base-terminfo-share	share
+./usr/share/misc/terminfo.db			base-obsolete		obsolete
 ./usr/share/misc/units.lib			base-reference-share	share
 ./usr/share/misc/usb_hid_usages			base-reference-share	share
 ./usr/share/misc/vgrindefs.db			base-groff-share	share

Index: src/distrib/sets/lists/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.471 src/distrib/sets/lists/tests/mi:1.472
--- src/distrib/sets/lists/tests/mi:1.471	Fri Jun  1 10:52:38 2012
+++ src/distrib/sets/lists/tests/mi	Sun Jun  3 23:19:10 2012
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.471 2012/06/01 10:52:38 skrll Exp $
+# $NetBSD: mi,v 1.472 2012/06/03 23:19:10 joerg Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -2510,7 +2510,8 @@
 ./usr/tests/lib/libcrypt/t_crypt		tests-lib-tests
 ./usr/tests/lib/libcurses			tests-lib-tests
 ./usr/tests/lib/libcurses/.terminfo.db		tests-obsolete		obsolete
-./usr/tests/lib/libcurses/terminfo.db		tests-lib-tests		atf
+./usr/tests/lib/libcurses/terminfo.cdb		tests-lib-tests		atf
+./usr/tests/lib/libcurses/terminfo.db		tests-obsolete		obsolete
 ./usr/tests/lib/libcurses/Atffile		tests-lib-tests		atf
 ./usr/tests/lib/libcurses/check_files			tests-lib-tests
 ./usr/tests/lib/libcurses/check_files/addch.chk		tests-lib-tests		atf

Index: src/distrib/sparc64/cdroms/installcd/Makefile
diff -u src/distrib/sparc64/cdroms/installcd/Makefile:1.14 src/distrib/sparc64/cdroms/installcd/Makefile:1.15
--- src/distrib/sparc64/cdroms/installcd/Makefile:1.14	Sun Jan 15 22:34:34 2012
+++ src/distrib/sparc64/cdroms/installcd/Makefile	Sun Jun  3 23:19:10 2012
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.14 2012/01/15 22:34:34 jmcneill Exp $
+#	$NetBSD: Makefile,v 1.15 2012/06/03 23:19:10 joerg Exp $
 CDBASE=		sparc64cd		# gives ${CDBASE}.iso
 CDRELEASE=	true			# include $RELEASEDIR/$MACHINE
 
@@ -56,7 +56,7 @@ CDRUNTIME+=	./usr/sbin/chroot
 CDRUNTIME+=	./usr/sbin/installboot
 CDRUNTIME+=	./usr/sbin/pppd
 CDRUNTIME+=	./usr/sbin/wiconfig
-CDRUNTIME+=	./usr/share/misc/terminfo.db
+CDRUNTIME+=	./usr/share/misc/terminfo.cdb
 CDRUNTIME+=	./usr/share/locale
 
 image_md_pre:

Index: src/distrib/sparc64/instfs/list
diff -u src/distrib/sparc64/instfs/list:1.24 src/distrib/sparc64/instfs/list:1.25
--- src/distrib/sparc64/instfs/list:1.24	Sun Jul  3 23:11:34 2011
+++ src/distrib/sparc64/instfs/list	Sun Jun  3 23:19:10 2012
@@ -1,4 +1,4 @@
-#	$NetBSD: list,v 1.24 2011/07/03 23:11:34 tron Exp $
+#	$NetBSD: list,v 1.25 2012/06/03 23:19:10 joerg Exp $
 
 SRCDIRS	bin sbin libexec external/bsd/less/bin usr.bin usr.sbin
 
@@ -85,7 +85,7 @@ COPY	${NETBSDSRCDIR}/etc/master.passwd	e
 COPY	${NETBSDSRCDIR}/etc/netconfig		etc/netconfig
 COPY	${DISTRIBDIR}/common/protocols		etc/protocols
 COPY	${DISTRIBDIR}/common/services		etc/services
-COPY	${DESTDIR}/usr/share/misc/terminfo.db	usr/share/misc/terminfo.db
+COPY	${DESTDIR}/usr/share/misc/terminfo.cdb	usr/share/misc/terminfo.cdb
 
 # we need the boot block in /usr/mdec + the arch specific extras
 COPY	${DESTDIR}/usr/mdec/binstall		usr/mdec/binstall	555

Index: src/lib/libterminfo/Makefile.hash
diff -u src/lib/libterminfo/Makefile.hash:1.4 src/lib/libterminfo/Makefile.hash:1.5
--- src/lib/libterminfo/Makefile.hash:1.4	Thu Nov  3 07:19:39 2011
+++ src/lib/libterminfo/Makefile.hash	Sun Jun  3 23:19:10 2012
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.hash,v 1.4 2011/11/03 07:19:39 joerg Exp $
+#	$NetBSD: Makefile.hash,v 1.5 2012/06/03 23:19:10 joerg Exp $
 
 SCRIPT_ENV=	\
 	TOOL_AWK=${TOOL_AWK:Q} \
@@ -22,6 +22,8 @@ compiled_terms.c: genterms term.h ${NETB
 		@echo "Generating compiled terminfo descriptions"
 		${SCRIPT_ENV} ${HOST_SH} ${.ALLSRC} > ${.TARGET}
 
+compiled_terms.c: ${TOOL_TIC}
+
 DPSRCS+=	hash.c termcap_hash.c compiled_terms.c
 
 CLEANFILES+=	hash.c termcap_hash.c compiled_terms.c

Index: src/lib/libterminfo/compile.c
diff -u src/lib/libterminfo/compile.c:1.7 src/lib/libterminfo/compile.c:1.8
--- src/lib/libterminfo/compile.c:1.7	Fri Jun  1 12:08:40 2012
+++ src/lib/libterminfo/compile.c	Sun Jun  3 23:19:10 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: compile.c,v 1.7 2012/06/01 12:08:40 joerg Exp $ */
+/* $NetBSD: compile.c,v 1.8 2012/06/03 23:19:10 joerg Exp $ */
 
 /*
  * Copyright (c) 2009, 2010, 2011 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: compile.c,v 1.7 2012/06/01 12:08:40 joerg Exp $");
+__RCSID("$NetBSD: compile.c,v 1.8 2012/06/03 23:19:10 joerg Exp $");
 
 #if !HAVE_NBTOOL_CONFIG_H || HAVE_SYS_ENDIAN_H
 #include <sys/endian.h>
@@ -239,12 +239,7 @@ _ti_flatten(uint8_t **buf, const TIC *ti
 		return -1;
 	
 	cap = *buf;
-	if (alen == 0 && dlen == 0 && tic->flags.bufpos == 0 &&
-	    tic->nums.bufpos == 0 && tic->strs.bufpos == 0 &&
-	    tic->extras.bufpos == 0)
-		*cap++ = 0; /* alias */
-	else
-		*cap++ = 2; /* version */
+	*cap++ = 1;
 	le16enc(cap, len);
 	cap += sizeof(uint16_t);
 	memcpy(cap, tic->name, len);

Index: src/lib/libterminfo/term.c
diff -u src/lib/libterminfo/term.c:1.14 src/lib/libterminfo/term.c:1.15
--- src/lib/libterminfo/term.c:1.14	Fri Jun  1 12:02:36 2012
+++ src/lib/libterminfo/term.c	Sun Jun  3 23:19:10 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: term.c,v 1.14 2012/06/01 12:02:36 joerg Exp $ */
+/* $NetBSD: term.c,v 1.15 2012/06/03 23:19:10 joerg Exp $ */
 
 /*
  * Copyright (c) 2009, 2010, 2011 The NetBSD Foundation, Inc.
@@ -28,16 +28,16 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: term.c,v 1.14 2012/06/01 12:02:36 joerg Exp $");
+__RCSID("$NetBSD: term.c,v 1.15 2012/06/03 23:19:10 joerg Exp $");
 
 #include <sys/stat.h>
 
 #include <assert.h>
+#include <cdbr.h>
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
-#include <ndbm.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -62,8 +62,8 @@ _ti_readterm(TERMINAL *term, const char 
 	TERMUSERDEF *ud;
 
 	ver = *cap++;
-	/* Only read version 1 and 2 structures */
-	if (ver != 1 && ver != 2) {
+	/* Only read version 1 structures */
+	if (ver != 1) {
 		errno = EINVAL;
 		return -1;
 	}
@@ -89,17 +89,13 @@ _ti_readterm(TERMINAL *term, const char 
 	cap += sizeof(uint16_t);
 	term->name = cap;
 	cap += len;
-	if (ver == 1)
+	len = le16dec(cap);
+	cap += sizeof(uint16_t);
+	if (len == 0)
 		term->_alias = NULL;
 	else {
-		len = le16dec(cap);
-		cap += sizeof(uint16_t);
-		if (len == 0)
-			term->_alias = NULL;
-		else {
-			term->_alias = cap;
-			cap += len;
-		}
+		term->_alias = cap;
+		cap += len;
 	}
 	len = le16dec(cap);
 	cap += sizeof(uint16_t);
@@ -215,41 +211,55 @@ _ti_readterm(TERMINAL *term, const char 
 static int
 _ti_dbgetterm(TERMINAL *term, const char *path, const char *name, int flags)
 {
-	DBM *db;
-	datum dt;
-	char *p;
+	struct cdbr *db;
+	const void *data;
+	char *db_name;
+	const uint8_t *data8;
+	size_t len, klen;
 	int r;
 
-	db = dbm_open(path, O_RDONLY, 0644);
+	if (asprintf(&db_name, "%s.cdb", path) < 0)
+		return -1;
+
+	db = cdbr_open(db_name, CDBR_DEFAULT);
+	free(db_name);
 	if (db == NULL)
 		return -1;
+
+	klen = strlen(name) + 1;
+	if (cdbr_find(db, name, klen, &data, &len) == -1)
+		goto fail;
+	data8 = data;
+	if (len == 0)
+		goto fail;
+	/* Check for alias first, fall through to processing normal entries. */
+	if (data8[0] == 2) {
+		if (klen + 7 >= len || le16dec(data8 + 5) != klen)
+			goto fail;
+		if (memcmp(data8 + 7, name, klen))
+			goto fail;
+		if (cdbr_get(db, le32dec(data8 + 1), &data, &len))
+			goto fail;
+		data8 = data;
+		if (data8[0] != 1)
+			goto fail;
+	} else 	if (data8[0] != 1)
+		goto fail;
+	else if (klen + 3 >= len || le16dec(data8 + 1) != klen)
+		goto fail;
+	else if (memcmp(data8 + 3, name, klen))
+		goto fail;
+
 	strlcpy(database, path, sizeof(database));
 	_ti_database = database;
-	dt.dptr = (void *)__UNCONST(name);
-	dt.dsize = strlen(name);
-	dt = dbm_fetch(db, dt);
-	if (dt.dptr == NULL) {
-		dbm_close(db);
-		return 0;
-	}
 
-	for (;;) {
-		p = (char *)dt.dptr;
-		if (*p++ != 0) /* not alias */
-			break;
-		dt.dsize = le16dec(p) - 1;
-		p += sizeof(uint16_t);
-		dt.dptr = p;
-		dt = dbm_fetch(db, dt);
-		if (dt.dptr == NULL) {
-			dbm_close(db);
-			return 0;
-		}
-	}
-		
-	r = _ti_readterm(term, (char *)dt.dptr, dt.dsize, flags);
-	dbm_close(db);
+	r = _ti_readterm(term, data, len, flags);
+	cdbr_close(db);
 	return r;
+
+ fail:
+	cdbr_close(db);
+	return 0;
 }
 
 static int

Index: src/lib/libterminfo/term_private.h
diff -u src/lib/libterminfo/term_private.h:1.9 src/lib/libterminfo/term_private.h:1.10
--- src/lib/libterminfo/term_private.h:1.9	Mon Oct  3 19:18:55 2011
+++ src/lib/libterminfo/term_private.h	Sun Jun  3 23:19:10 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: term_private.h,v 1.9 2011/10/03 19:18:55 roy Exp $ */
+/* $NetBSD: term_private.h,v 1.10 2012/06/03 23:19:10 joerg Exp $ */
 
 /*
  * Copyright (c) 2009, 2010 The NetBSD Foundation, Inc.
@@ -42,15 +42,22 @@
  * including the null terminator.
  * The largest capability block we can handle is 65535 bytes.
  * This means that we exceed the current terminfo defined limits.
- * The header is version (char), name.
- * version 0 is an alias, and the name refers to the real terminfo.
- * version 1 capabilities are defined as so:
+ *
+ * Version 1 capabilities are defined as:
+ * header byte (always 1)
+ * name
  * description,
  * cap length, num flags, index, char,
  * cap length, num numbers, index, number,
  * cap length, num strings, index, string,
- * cap lelngth, num undefined caps, name, type (char), flag, number, string
- * The database itself is created using ndbm(3) and the numbers are
+ * cap length, num undefined caps, name, type (char), flag, number, string
+ *
+ * Version 2 entries are aliases and defined as:
+ * header byte (always 2)
+ * 32bit id of the corresponding terminal in the file
+ * name
+ *
+ * The database itself is created using cdbw(3) and the numbers are
  * always stored as little endian.
  */
 

Index: src/lib/libterminfo/terminfo.5.in
diff -u src/lib/libterminfo/terminfo.5.in:1.15 src/lib/libterminfo/terminfo.5.in:1.16
--- src/lib/libterminfo/terminfo.5.in:1.15	Thu Mar 10 10:17:19 2011
+++ src/lib/libterminfo/terminfo.5.in	Sun Jun  3 23:19:10 2012
@@ -1,4 +1,4 @@
-.\"	$NetBSD: terminfo.5.in,v 1.15 2011/03/10 10:17:19 roy Exp $
+.\"	$NetBSD: terminfo.5.in,v 1.16 2012/06/03 23:19:10 joerg Exp $
 .\"
 .\" Copyright (c) 2009, 2010, 2011 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -195,10 +195,10 @@ hts=\eEH, ht=^I,
 .Ed
 .Ss Fetching Compiled Descriptions
 This implementation uses hashed databases managed by
-.Xr ndbm 3
+.Xr cdb 5
 instead of directories.
 To maintain compatability with other implementations,
-.Pa .db
+.Pa .cdb
 is appended to each file checked.
 .Pp
 If the environment variable
@@ -237,12 +237,12 @@ If a matching description is not found t
 searched, which currently holds descriptions for ansi, dumb, vt100, vt220,
 wsvt25, and xterm.
 .Sh FILES
-.Bl -tag -width /usr/share/misc/terminfo.db -compact
-.It Pa $HOME/.terminfo.db
+.Bl -tag -width /usr/share/misc/terminfo.cdb -compact
+.It Pa $HOME/.terminfo.cdb
 Database of terminal descriptions for personal use.
 .It Pa /usr/share/misc/terminfo
 File containing terminal descriptions.
-.It Pa /usr/share/misc/terminfo.db
+.It Pa /usr/share/misc/terminfo.cdb
 Database of terminal descriptions.
 .El
 .Sh SEE ALSO
@@ -250,7 +250,7 @@ Database of terminal descriptions.
 .Xr tic 1 ,
 .Xr tput 1 ,
 .Xr curses 3 ,
-.Xr ndbm 3
+.Xr cdb 5
 .Sh STANDARDS
 .Nm
 complies with the

Index: src/share/man/man7/hier.7
diff -u src/share/man/man7/hier.7:1.100 src/share/man/man7/hier.7:1.101
--- src/share/man/man7/hier.7:1.100	Sat Apr 21 12:27:29 2012
+++ src/share/man/man7/hier.7	Sun Jun  3 23:19:10 2012
@@ -1,4 +1,4 @@
-.\"	$NetBSD: hier.7,v 1.100 2012/04/21 12:27:29 roy Exp $
+.\"	$NetBSD: hier.7,v 1.101 2012/06/03 23:19:10 joerg Exp $
 .\"
 .\" Copyright (c) 1990, 1993, 1994
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"	@(#)hier.7	8.5 (Berkeley) 6/1/94
 .\"
-.Dd April 5, 2012
+.Dd June 3, 2012
 .Dt HIER 7
 .Os
 .Sh NAME
@@ -569,12 +569,12 @@ macro package
 .It Sy misc/
 miscellaneous system-wide text files
 .Pp
-.Bl -tag -width "terminfo.db" -compact
+.Bl -tag -width "terminfo.cdb" -compact
 .It Sy terminfo
 terminal characteristics database;
 see
 .Xr terminfo 5
-.It Sy terminfo.db
+.It Sy terminfo.cdb
 database form of terminfo file; see
 .Xr tic 1
 .El

Index: src/share/terminfo/Makefile
diff -u src/share/terminfo/Makefile:1.2 src/share/terminfo/Makefile:1.3
--- src/share/terminfo/Makefile:1.2	Fri Feb  5 16:34:04 2010
+++ src/share/terminfo/Makefile	Sun Jun  3 23:19:11 2012
@@ -1,13 +1,13 @@
-#	$NetBSD: Makefile,v 1.2 2010/02/05 16:34:04 roy Exp $
+#	$NetBSD: Makefile,v 1.3 2012/06/03 23:19:11 joerg Exp $
 #	from: @(#)Makefile	8.1 (Berkeley) 6/8/93
 
-CLEANFILES= terminfo.db
-realall: terminfo.db
-FILES=terminfo.db terminfo
+CLEANFILES= terminfo.cdb
+realall: terminfo.cdb
+FILES=terminfo.cdb terminfo
 FILESDIR=${BINDIR}/misc
 
-terminfo.db: terminfo
+terminfo.cdb: terminfo ${TOOL_TIC}
 	${_MKTARGET_CREATE}
-	${TOOL_TIC} -ax -o "${.OBJDIR}/terminfo" "${.CURDIR}/terminfo" 
+	${TOOL_TIC} -ax -o ${.TARGET} "${.CURDIR}/terminfo" 
 
 .include <bsd.prog.mk>

Index: src/tests/lib/libcurses/Makefile
diff -u src/tests/lib/libcurses/Makefile:1.2 src/tests/lib/libcurses/Makefile:1.3
--- src/tests/lib/libcurses/Makefile:1.2	Fri Jun 17 16:59:51 2011
+++ src/tests/lib/libcurses/Makefile	Sun Jun  3 23:19:11 2012
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.2 2011/06/17 16:59:51 christos Exp $
+# $NetBSD: Makefile,v 1.3 2012/06/03 23:19:11 joerg Exp $
 
 NOMAN=		# defined
 
@@ -13,18 +13,18 @@ TERMINFO_DB=	terminfo
 TERMINFODIR=	${TESTSDIR}
 
 FILESDIR=	${TESTSDIR}
-FILES=		${TERMINFO_DB}.db
+FILES=		${TERMINFO_DB}.cdb
 
 TESTS_SH=	t_curses
 
 HOME=		${TESTDIR}
 
-CLEANFILES+=	${TERMINFO_DB}.db
+CLEANFILES+=	${TERMINFO_DB}.cdb
 
-realall: ${TERMINFO_DB}.db
+realall: ${TERMINFO_DB}.cdb
 
-${TERMINFO_DB}.db: ${TEST_TERMINFO}
-	${TOOL_TIC} -o ${TERMINFO_DB} ${.CURDIR}/${TEST_TERMINFO}
+${TERMINFO_DB}.cdb: ${TOOL_TIC} ${TEST_TERMINFO}
+	${TOOL_TIC} -o ${.TARGET} ${.CURDIR}/${TEST_TERMINFO}
 
 .include <bsd.test.mk>
 #.include <bsd.subdir.mk>

Index: src/tests/lib/libcurses/director/director.c
diff -u src/tests/lib/libcurses/director/director.c:1.9 src/tests/lib/libcurses/director/director.c:1.10
--- src/tests/lib/libcurses/director/director.c:1.9	Fri Oct  7 13:39:33 2011
+++ src/tests/lib/libcurses/director/director.c	Sun Jun  3 23:19:11 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: director.c,v 1.9 2011/10/07 13:39:33 joerg Exp $	*/
+/*	$NetBSD: director.c,v 1.10 2012/06/03 23:19:11 joerg Exp $	*/
 
 /*-
  * Copyright 2009 Brett Lymn <bl...@netbsd.org>
@@ -103,7 +103,7 @@ usage(void)
 	    "commandfile\n", getprogname());
 	fprintf(stderr, " where:\n");
 	fprintf(stderr, "    -v enables verbose test output\n");
-	fprintf(stderr, "    -T is a directory containing the terminfo.db "
+	fprintf(stderr, "    -T is a directory containing the terminfo.cdb "
 	    "file, or a file holding the terminfo description n");
 	fprintf(stderr, "    -s is the path to the slave executable\n");
 	fprintf(stderr, "    -t is value to set TERM to for the test\n");
@@ -200,11 +200,11 @@ main(int argc, char *argv[])
 	if (S_ISDIR(st.st_mode)) {
 		char tinfo[MAXPATHLEN];
 		int l = snprintf(tinfo, sizeof(tinfo), "%s/%s", termpath,
-		    "terminfo.db");
+		    "terminfo.cdb");
 		if (stat(tinfo, &st) == -1)
 			err(1, "Cannot stat `%s'", tinfo);
-		if (l >= 3)
-			tinfo[l - 3] = '\0';
+		if (l >= 4)
+			tinfo[l - 4] = '\0';
 		if (setenv("TERMINFO", tinfo, 1) != 0)
 			err(1, "Failed to set TERMINFO variable");
 	} else {

Index: src/usr.bin/tic/tic.1
diff -u src/usr.bin/tic/tic.1:1.9 src/usr.bin/tic/tic.1:1.10
--- src/usr.bin/tic/tic.1:1.9	Wed Nov  2 19:21:49 2011
+++ src/usr.bin/tic/tic.1	Sun Jun  3 23:19:11 2012
@@ -1,4 +1,4 @@
-.\"	$NetBSD: tic.1,v 1.9 2011/11/02 19:21:49 pgoyette Exp $
+.\"	$NetBSD: tic.1,v 1.10 2012/06/03 23:19:11 joerg Exp $
 .\"
 .\" Copyright (c) 2009, 2010 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 11, 2010
+.Dd June 3, 2012
 .Dt TIC 1
 .Os
 .Sh NAME
@@ -45,7 +45,7 @@ The
 utility compiles
 .Xr terminfo 5
 source into a database for use by other programs.
-The created database path name is the same as the source but with .db appended.
+The created database path name is the same as the source but with .cdb appended.
 .Pp
 The following options are available:
 .Bl -tag -width Fl
@@ -55,9 +55,9 @@ Do not discard commented out capabilitie
 Only check for errors, don't write the final database.
 .It Fl o Ar file
 Write the database to
-.Ar file Ns .db
+.Ar file
 instead of
-.Ar source Ns .db .
+.Ar source Ns .cdb .
 .It Fl S
 For
 .Ar term1 , term2 , ...

Index: src/usr.bin/tic/tic.c
diff -u src/usr.bin/tic/tic.c:1.19 src/usr.bin/tic/tic.c:1.20
--- src/usr.bin/tic/tic.c:1.19	Fri Jun  1 12:08:40 2012
+++ src/usr.bin/tic/tic.c	Sun Jun  3 23:19:11 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: tic.c,v 1.19 2012/06/01 12:08:40 joerg Exp $ */
+/* $NetBSD: tic.c,v 1.20 2012/06/03 23:19:11 joerg Exp $ */
 
 /*
  * Copyright (c) 2009, 2010 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: tic.c,v 1.19 2012/06/01 12:08:40 joerg Exp $");
+__RCSID("$NetBSD: tic.c,v 1.20 2012/06/03 23:19:11 joerg Exp $");
 
 #include <sys/types.h>
 #include <sys/queue.h>
@@ -41,13 +41,13 @@ __RCSID("$NetBSD: tic.c,v 1.19 2012/06/0
 #include <sys/endian.h>
 #endif
 
+#include <cdbw.h>
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
 #include <getopt.h>
 #include <limits.h>
 #include <fcntl.h>
-#include <ndbm.h>
 #include <search.h>
 #include <stdarg.h>
 #include <stdlib.h>
@@ -63,26 +63,18 @@ __RCSID("$NetBSD: tic.c,v 1.19 2012/06/0
    through the database as the sequential iterator doesn't work
    the the data size stored changes N amount which ours will. */
 typedef struct term {
-	SLIST_ENTRY(term) next;
+	STAILQ_ENTRY(term) next;
 	char *name;
-	char type;
 	TIC *tic;
+	uint32_t id;
+	struct term *base_term;
 } TERM;
-static SLIST_HEAD(, term) terms = SLIST_HEAD_INITIALIZER(terms);
+static STAILQ_HEAD(, term) terms = STAILQ_HEAD_INITIALIZER(terms);
 
 static int error_exit;
 static int Sflag;
-static char *dbname;
 static size_t nterm, nalias;
 
-static void
-do_unlink(void)
-{
-
-	if (dbname != NULL)
-		unlink(dbname);
-}
-
 static void __printflike(1, 2)
 dowarn(const char *fmt, ...)
 {
@@ -106,22 +98,32 @@ grow_tbuf(TBUF *tbuf, size_t len)
 }
 
 static int
-save_term(DBM *db, TERM *term)
+save_term(struct cdbw *db, TERM *term)
 {
 	uint8_t *buf;
 	ssize_t len;
-	datum key, value;
+	size_t slen = strlen(term->name) + 1;
+
+	if (term->base_term != NULL) {
+		len = (ssize_t)slen + 7;
+		buf = emalloc(len);
+		buf[0] = 2;
+		le32enc(buf + 1, term->base_term->id);
+		le16enc(buf + 5, slen);
+		memcpy(buf + 7, term->name, slen);
+		if (cdbw_put(db, term->name, slen, buf, len))
+			err(1, "cdbw_put");
+		return 0;
+	}
 
 	len = _ti_flatten(&buf, term->tic);
 	if (len == -1)
 		return -1;
 
-	key.dptr = term->name;
-	key.dsize = strlen(term->name);
-	value.dptr = buf;
-	value.dsize = len;
-	if (dbm_store(db, key, value, DBM_REPLACE) == -1)
-		err(1, "dbm_store");
+	if (cdbw_put_data(db, buf, len, &term->id))
+		err(1, "cdbw_put_data");
+	if (cdbw_put_key(db, term->name, slen, term->id))
+		err(1, "cdbw_put_key");
 	free(buf);
 	return 0;
 }
@@ -138,20 +140,20 @@ find_term(const char *name)
 }
 
 static TERM *
-store_term(const char *name, char type)
+store_term(const char *name, TERM *base_term)
 {
 	TERM *term;
 	ENTRY elem;
 
 	term = ecalloc(1, sizeof(*term));
 	term->name = estrdup(name);
-	term->type = type;
-	SLIST_INSERT_HEAD(&terms, term, next);
+	STAILQ_INSERT_TAIL(&terms, term, next);
 	elem.key = estrdup(name);
 	elem.data = term;
 	hsearch(elem, ENTER);
 
-	if (type == 'a')
+	term->base_term = base_term;
+	if (base_term != NULL)
 		nalias++;
 	else
 		nterm++;
@@ -185,7 +187,7 @@ process_entry(TBUF *buf, int flags)
 		_ti_freetic(tic);
 		return 0;
 	}
-	term = store_term(tic->name, 't');
+	term = store_term(tic->name, NULL);
 	term->tic = tic;
 
 	/* Create aliased terms */
@@ -199,9 +201,7 @@ process_entry(TBUF *buf, int flags)
 				dowarn("%s: has alias for already assigned"
 				    " term %s", tic->name, p);
 			} else {
-				term = store_term(p, 'a');
-				term->tic = ecalloc(sizeof(*term->tic), 1);
-				term->tic->name = estrdup(tic->name);
+				store_term(p, term);
 			}
 			p = e;
 		}
@@ -319,8 +319,8 @@ merge_use(int flags)
 	TERM *term, *uterm;;
 
 	skipped = merged = 0;
-	SLIST_FOREACH(term, &terms, next) {
-		if (term->type == 'a')
+	STAILQ_FOREACH(term, &terms, next) {
+		if (term->base_term != NULL)
 			continue;
 		rtic = term->tic;
 		while ((cap = _ti_find_extra(&rtic->extras, "use")) != NULL) {
@@ -334,8 +334,8 @@ merge_use(int flags)
 				goto remove;
 			}
 			uterm = find_term(cap);
-			if (uterm != NULL && uterm->type == 'a')
-				uterm = find_term(uterm->tic->name);
+			if (uterm != NULL && uterm->base_term != NULL)
+				uterm = uterm->base_term;
 			if (uterm == NULL) {
 				dowarn("%s: no use record for %s",
 				    rtic->name, cap);
@@ -403,7 +403,7 @@ print_dump(int argc, char **argv)
 			warnx("%s: no description for terminal", argv[i]);
 			continue;
 		}
-		if (term->type == 'a') {
+		if (term->base_term != NULL) {
 			warnx("%s: cannot dump alias", argv[i]);
 			continue;
 		}
@@ -444,17 +444,46 @@ print_dump(int argc, char **argv)
 	return n;
 }
 
+static void
+write_database(const char *dbname)
+{
+	struct cdbw *db;
+	char *tmp_dbname;
+	TERM *term;
+	int fd;
+
+	db = cdbw_open();
+	if (db == NULL)
+		err(1, "cdbw_open failed");
+	/* Save the terms */
+	STAILQ_FOREACH(term, &terms, next)
+		save_term(db, term);
+
+	easprintf(&tmp_dbname, "%s.XXXXXX", dbname);
+	fd = mkstemp(tmp_dbname);
+	if (fd == -1)
+		err(1, "creating temporary database %s failed", tmp_dbname);
+	if (cdbw_output(db, fd, "NetBSD terminfo", cdbw_stable_seeder))
+		err(1, "writing temporary database %s failed", tmp_dbname);
+	if (fchmod(fd, DEFFILEMODE))
+		err(1, "fchmod failed");
+	if (close(fd))
+		err(1, "writing temporary database %s failed", tmp_dbname);
+	if (rename(tmp_dbname, dbname))
+		err(1, "renaming %s to %s failed", tmp_dbname, dbname);
+	free(tmp_dbname);
+	cdbw_close(db);
+}
+
 int
 main(int argc, char **argv)
 {
 	int ch, cflag, sflag, flags;
-	char *source, *p, *buf, *ofile;
+	char *source, *dbname, *buf, *ofile;
 	FILE *f;
-	DBM *db;
 	size_t buflen;
 	ssize_t len;
 	TBUF tbuf;
-	TERM *term;
 
 	cflag = sflag = 0;
 	ofile = NULL;
@@ -495,23 +524,6 @@ main(int argc, char **argv)
 	f = fopen(source, "r");
 	if (f == NULL)
 		err(1, "fopen: %s", source);
-	if (!cflag && !Sflag) {
-		if (ofile == NULL)
-			ofile = source;
-		len = strlen(ofile) + 9;
-		dbname = emalloc(len + 4); /* For adding .db after open */
-		snprintf(dbname, len, "%s.tmp", ofile);
-		db = dbm_open(dbname, O_CREAT | O_RDWR | O_TRUNC, DEFFILEMODE);
-		if (db == NULL)
-			err(1, "dbopen: %s", source);
-		p = dbname + strlen(dbname);
-		*p++ = '.';
-		*p++ = 'd';
-		*p++ = 'b';
-		*p++ = '\0';
-		atexit(do_unlink);
-	} else
-		db = NULL; /* satisfy gcc warning */
 
 	hcreate(HASH_SIZE);
 
@@ -557,28 +569,21 @@ main(int argc, char **argv)
 	if (cflag)
 		return error_exit;
 
-	/* Save the terms */
-	SLIST_FOREACH(term, &terms, next)
-		save_term(db, term);
-
-	/* done! */
-	dbm_close(db);
-
-	/* Rename the tmp db to the real one now */
-	easprintf(&p, "%s.db", ofile);
-	if (rename(dbname, p) == -1)
-		err(1, "rename");
-	free(dbname);
-	dbname = NULL;
+	if (ofile == NULL)
+		easprintf(&dbname, "%s.cdb", source);
+	else
+		dbname = ofile;
+	write_database(dbname);
 
 	if (sflag != 0)
 		fprintf(stderr, "%zu entries and %zu aliases written to %s\n",
-		    nterm, nalias, p);
+		    nterm, nalias, dbname);
 
 #ifdef __VALGRIND__
-	free(p);
-	while ((term = SLIST_FIRST(&terms)) != NULL) {
-		SLIST_REMOVE_HEAD(&terms, next);
+	if (ofile == NULL)
+		free(dbname);
+	while ((term = STAILQ_FIRST(&terms)) != NULL) {
+		STAILQ_REMOVE_HEAD(&terms, next);
 		_ti_freetic(term->tic);
 		free(term->name);
 		free(term);

Reply via email to