xref: /freebsd/lib/libc/db/test/btree.tests/main.c (revision dc36d6f9bb1753f3808552f3afd30eda9a7b206a)
158f0484fSRodney W. Grimes /*-
2*8a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
3*8a16b7a1SPedro F. Giffuni  *
458f0484fSRodney W. Grimes  * Copyright (c) 1990, 1993
558f0484fSRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
658f0484fSRodney W. Grimes  *
758f0484fSRodney W. Grimes  * This code is derived from software contributed to Berkeley by
858f0484fSRodney W. Grimes  * Mike Olson.
958f0484fSRodney W. Grimes  *
1058f0484fSRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
1158f0484fSRodney W. Grimes  * modification, are permitted provided that the following conditions
1258f0484fSRodney W. Grimes  * are met:
1358f0484fSRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
1458f0484fSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
1558f0484fSRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
1658f0484fSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
1758f0484fSRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
18fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
1958f0484fSRodney W. Grimes  *    may be used to endorse or promote products derived from this software
2058f0484fSRodney W. Grimes  *    without specific prior written permission.
2158f0484fSRodney W. Grimes  *
2258f0484fSRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2358f0484fSRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2458f0484fSRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2558f0484fSRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2658f0484fSRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2758f0484fSRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2858f0484fSRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2958f0484fSRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3058f0484fSRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3158f0484fSRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3258f0484fSRodney W. Grimes  * SUCH DAMAGE.
3358f0484fSRodney W. Grimes  */
3458f0484fSRodney W. Grimes 
3558f0484fSRodney W. Grimes #include <sys/param.h>
3658f0484fSRodney W. Grimes #include <fcntl.h>
3758f0484fSRodney W. Grimes #include <db.h>
3858f0484fSRodney W. Grimes #include <errno.h>
3958f0484fSRodney W. Grimes #include <stdio.h>
4058f0484fSRodney W. Grimes #include <ctype.h>
4158f0484fSRodney W. Grimes #include <stdlib.h>
4258f0484fSRodney W. Grimes #include <string.h>
4358f0484fSRodney W. Grimes #include "btree.h"
4458f0484fSRodney W. Grimes 
4558f0484fSRodney W. Grimes typedef struct cmd_table {
4658f0484fSRodney W. Grimes 	char *cmd;
4758f0484fSRodney W. Grimes 	int nargs;
4858f0484fSRodney W. Grimes 	int rconv;
49c05ac53bSDavid E. O'Brien 	void (*func)(DB *, char **);
5058f0484fSRodney W. Grimes 	char *usage, *descrip;
5158f0484fSRodney W. Grimes } cmd_table;
5258f0484fSRodney W. Grimes 
5358f0484fSRodney W. Grimes int stopstop;
5458f0484fSRodney W. Grimes DB *globaldb;
5558f0484fSRodney W. Grimes 
56c05ac53bSDavid E. O'Brien void append(DB *, char **);
57c05ac53bSDavid E. O'Brien void bstat(DB *, char **);
58c05ac53bSDavid E. O'Brien void cursor(DB *, char **);
59c05ac53bSDavid E. O'Brien void delcur(DB *, char **);
60c05ac53bSDavid E. O'Brien void delete(DB *, char **);
61c05ac53bSDavid E. O'Brien void dump(DB *, char **);
62c05ac53bSDavid E. O'Brien void first(DB *, char **);
63c05ac53bSDavid E. O'Brien void get(DB *, char **);
64c05ac53bSDavid E. O'Brien void help(DB *, char **);
65c05ac53bSDavid E. O'Brien void iafter(DB *, char **);
66c05ac53bSDavid E. O'Brien void ibefore(DB *, char **);
67c05ac53bSDavid E. O'Brien void icursor(DB *, char **);
68c05ac53bSDavid E. O'Brien void insert(DB *, char **);
69c05ac53bSDavid E. O'Brien void keydata(DBT *, DBT *);
70c05ac53bSDavid E. O'Brien void last(DB *, char **);
71c05ac53bSDavid E. O'Brien void list(DB *, char **);
72c05ac53bSDavid E. O'Brien void load(DB *, char **);
73c05ac53bSDavid E. O'Brien void mstat(DB *, char **);
74c05ac53bSDavid E. O'Brien void next(DB *, char **);
75c05ac53bSDavid E. O'Brien int  parse(char *, char **, int);
76c05ac53bSDavid E. O'Brien void previous(DB *, char **);
77c05ac53bSDavid E. O'Brien void show(DB *, char **);
78c05ac53bSDavid E. O'Brien void usage(void);
79c05ac53bSDavid E. O'Brien void user(DB *);
8058f0484fSRodney W. Grimes 
8158f0484fSRodney W. Grimes cmd_table commands[] = {
8258f0484fSRodney W. Grimes 	"?",	0, 0, help, "help", NULL,
8358f0484fSRodney W. Grimes 	"a",	2, 1, append, "append key def", "append key with data def",
8458f0484fSRodney W. Grimes 	"b",	0, 0, bstat, "bstat", "stat btree",
8558f0484fSRodney W. Grimes 	"c",	1, 1, cursor,  "cursor word", "move cursor to word",
8658f0484fSRodney W. Grimes 	"delc",	0, 0, delcur, "delcur", "delete key the cursor references",
8758f0484fSRodney W. Grimes 	"dele",	1, 1, delete, "delete word", "delete word",
8858f0484fSRodney W. Grimes 	"d",	0, 0, dump, "dump", "dump database",
8958f0484fSRodney W. Grimes 	"f",	0, 0, first, "first", "move cursor to first record",
9058f0484fSRodney W. Grimes 	"g",	1, 1, get, "get key", "locate key",
9158f0484fSRodney W. Grimes 	"h",	0, 0, help, "help", "print command summary",
9258f0484fSRodney W. Grimes 	"ia",	2, 1, iafter, "iafter key data", "insert data after key",
9358f0484fSRodney W. Grimes 	"ib",	2, 1, ibefore, "ibefore key data", "insert data before key",
9458f0484fSRodney W. Grimes 	"ic",	2, 1, icursor, "icursor key data", "replace cursor",
9558f0484fSRodney W. Grimes 	"in",	2, 1, insert, "insert key def", "insert key with data def",
9658f0484fSRodney W. Grimes 	"la",	0, 0, last, "last", "move cursor to last record",
9758f0484fSRodney W. Grimes 	"li",	1, 1, list, "list file", "list to a file",
9858f0484fSRodney W. Grimes 	"loa",	1, 0, load, "load file", NULL,
9958f0484fSRodney W. Grimes 	"loc",	1, 1, get, "get key", NULL,
10058f0484fSRodney W. Grimes 	"m",	0, 0, mstat, "mstat", "stat memory pool",
10158f0484fSRodney W. Grimes 	"n",	0, 0, next, "next", "move cursor forward one record",
10258f0484fSRodney W. Grimes 	"p",	0, 0, previous, "previous", "move cursor back one record",
10358f0484fSRodney W. Grimes 	"q",	0, 0, NULL, "quit", "quit",
10458f0484fSRodney W. Grimes 	"sh",	1, 0, show, "show page", "dump a page",
10558f0484fSRodney W. Grimes 	{ NULL },
10658f0484fSRodney W. Grimes };
10758f0484fSRodney W. Grimes 
10858f0484fSRodney W. Grimes int recno;					/* use record numbers */
10958f0484fSRodney W. Grimes char *dict = "words";				/* default dictionary */
11058f0484fSRodney W. Grimes char *progname;
11158f0484fSRodney W. Grimes 
11258f0484fSRodney W. Grimes int
main(argc,argv)11358f0484fSRodney W. Grimes main(argc, argv)
11458f0484fSRodney W. Grimes 	int argc;
11558f0484fSRodney W. Grimes 	char **argv;
11658f0484fSRodney W. Grimes {
11758f0484fSRodney W. Grimes 	int c;
11858f0484fSRodney W. Grimes 	DB *db;
11958f0484fSRodney W. Grimes 	BTREEINFO b;
12058f0484fSRodney W. Grimes 
12158f0484fSRodney W. Grimes 	progname = *argv;
12258f0484fSRodney W. Grimes 
12358f0484fSRodney W. Grimes 	b.flags = 0;
12458f0484fSRodney W. Grimes 	b.cachesize = 0;
12558f0484fSRodney W. Grimes 	b.maxkeypage = 0;
12658f0484fSRodney W. Grimes 	b.minkeypage = 0;
12758f0484fSRodney W. Grimes 	b.psize = 0;
12858f0484fSRodney W. Grimes 	b.compare = NULL;
12958f0484fSRodney W. Grimes 	b.prefix = NULL;
13058f0484fSRodney W. Grimes 	b.lorder = 0;
13158f0484fSRodney W. Grimes 
1328f9872ccSKevin Lo 	while ((c = getopt(argc, argv, "bc:di:lp:ru")) != -1) {
13358f0484fSRodney W. Grimes 		switch (c) {
13458f0484fSRodney W. Grimes 		case 'b':
13558f0484fSRodney W. Grimes 			b.lorder = BIG_ENDIAN;
13658f0484fSRodney W. Grimes 			break;
13758f0484fSRodney W. Grimes 		case 'c':
13858f0484fSRodney W. Grimes 			b.cachesize = atoi(optarg);
13958f0484fSRodney W. Grimes 			break;
14058f0484fSRodney W. Grimes 		case 'd':
14158f0484fSRodney W. Grimes 			b.flags |= R_DUP;
14258f0484fSRodney W. Grimes 			break;
14358f0484fSRodney W. Grimes 		case 'i':
14458f0484fSRodney W. Grimes 			dict = optarg;
14558f0484fSRodney W. Grimes 			break;
14658f0484fSRodney W. Grimes 		case 'l':
14758f0484fSRodney W. Grimes 			b.lorder = LITTLE_ENDIAN;
14858f0484fSRodney W. Grimes 			break;
14958f0484fSRodney W. Grimes 		case 'p':
15058f0484fSRodney W. Grimes 			b.psize = atoi(optarg);
15158f0484fSRodney W. Grimes 			break;
15258f0484fSRodney W. Grimes 		case 'r':
15358f0484fSRodney W. Grimes 			recno = 1;
15458f0484fSRodney W. Grimes 			break;
15558f0484fSRodney W. Grimes 		case 'u':
15658f0484fSRodney W. Grimes 			b.flags = 0;
15758f0484fSRodney W. Grimes 			break;
15858f0484fSRodney W. Grimes 		default:
15958f0484fSRodney W. Grimes 			usage();
16058f0484fSRodney W. Grimes 		}
16158f0484fSRodney W. Grimes 	}
16258f0484fSRodney W. Grimes 	argc -= optind;
16358f0484fSRodney W. Grimes 	argv += optind;
16458f0484fSRodney W. Grimes 
16558f0484fSRodney W. Grimes 	if (recno)
16658f0484fSRodney W. Grimes 		db = dbopen(*argv == NULL ? NULL : *argv, O_RDWR,
16758f0484fSRodney W. Grimes 		    0, DB_RECNO, NULL);
16858f0484fSRodney W. Grimes 	else
16958f0484fSRodney W. Grimes 		db = dbopen(*argv == NULL ? NULL : *argv, O_CREAT|O_RDWR,
17058f0484fSRodney W. Grimes 		    0600, DB_BTREE, &b);
17158f0484fSRodney W. Grimes 
17258f0484fSRodney W. Grimes 	if (db == NULL) {
17358f0484fSRodney W. Grimes 		(void)fprintf(stderr, "dbopen: %s\n", strerror(errno));
17458f0484fSRodney W. Grimes 		exit(1);
17558f0484fSRodney W. Grimes 	}
17658f0484fSRodney W. Grimes 	globaldb = db;
17758f0484fSRodney W. Grimes 	user(db);
17858f0484fSRodney W. Grimes 	exit(0);
17958f0484fSRodney W. Grimes 	/* NOTREACHED */
18058f0484fSRodney W. Grimes }
18158f0484fSRodney W. Grimes 
18258f0484fSRodney W. Grimes void
user(db)18358f0484fSRodney W. Grimes user(db)
18458f0484fSRodney W. Grimes 	DB *db;
18558f0484fSRodney W. Grimes {
18658f0484fSRodney W. Grimes 	FILE *ifp;
18758f0484fSRodney W. Grimes 	int argc, i, last;
18858f0484fSRodney W. Grimes 	char *lbuf, *argv[4], buf[512];
18958f0484fSRodney W. Grimes 
19058f0484fSRodney W. Grimes 	if ((ifp = fopen("/dev/tty", "r")) == NULL) {
19158f0484fSRodney W. Grimes 		(void)fprintf(stderr,
19258f0484fSRodney W. Grimes 		    "/dev/tty: %s\n", strerror(errno));
19358f0484fSRodney W. Grimes 		exit(1);
19458f0484fSRodney W. Grimes 	}
19558f0484fSRodney W. Grimes 	for (last = 0;;) {
19658f0484fSRodney W. Grimes 		(void)printf("> ");
19758f0484fSRodney W. Grimes 		(void)fflush(stdout);
19858f0484fSRodney W. Grimes 		if ((lbuf = fgets(&buf[0], 512, ifp)) == NULL)
19958f0484fSRodney W. Grimes 			break;
20058f0484fSRodney W. Grimes 		if (lbuf[0] == '\n') {
20158f0484fSRodney W. Grimes 			i = last;
20258f0484fSRodney W. Grimes 			goto uselast;
20358f0484fSRodney W. Grimes 		}
20458f0484fSRodney W. Grimes 		lbuf[strlen(lbuf) - 1] = '\0';
20558f0484fSRodney W. Grimes 
20658f0484fSRodney W. Grimes 		if (lbuf[0] == 'q')
20758f0484fSRodney W. Grimes 			break;
20858f0484fSRodney W. Grimes 
20958f0484fSRodney W. Grimes 		argc = parse(lbuf, &argv[0], 3);
21058f0484fSRodney W. Grimes 		if (argc == 0)
21158f0484fSRodney W. Grimes 			continue;
21258f0484fSRodney W. Grimes 
21358f0484fSRodney W. Grimes 		for (i = 0; commands[i].cmd != NULL; i++)
21458f0484fSRodney W. Grimes 			if (strncmp(commands[i].cmd, argv[0],
21558f0484fSRodney W. Grimes 			    strlen(commands[i].cmd)) == 0)
21658f0484fSRodney W. Grimes 				break;
21758f0484fSRodney W. Grimes 
21858f0484fSRodney W. Grimes 		if (commands[i].cmd == NULL) {
21958f0484fSRodney W. Grimes 			(void)fprintf(stderr,
22058f0484fSRodney W. Grimes 			    "%s: command unknown ('help' for help)\n", lbuf);
22158f0484fSRodney W. Grimes 			continue;
22258f0484fSRodney W. Grimes 		}
22358f0484fSRodney W. Grimes 
22458f0484fSRodney W. Grimes 		if (commands[i].nargs != argc - 1) {
22558f0484fSRodney W. Grimes 			(void)fprintf(stderr, "usage: %s\n", commands[i].usage);
22658f0484fSRodney W. Grimes 			continue;
22758f0484fSRodney W. Grimes 		}
22858f0484fSRodney W. Grimes 
22958f0484fSRodney W. Grimes 		if (recno && commands[i].rconv) {
23058f0484fSRodney W. Grimes 			static recno_t nlong;
23158f0484fSRodney W. Grimes 			nlong = atoi(argv[1]);
23258f0484fSRodney W. Grimes 			argv[1] = (char *)&nlong;
23358f0484fSRodney W. Grimes 		}
23458f0484fSRodney W. Grimes uselast:	last = i;
23558f0484fSRodney W. Grimes 		(*commands[i].func)(db, argv);
23658f0484fSRodney W. Grimes 	}
23758f0484fSRodney W. Grimes 	if ((db->sync)(db) == RET_ERROR)
23858f0484fSRodney W. Grimes 		perror("dbsync");
23958f0484fSRodney W. Grimes 	else if ((db->close)(db) == RET_ERROR)
24058f0484fSRodney W. Grimes 		perror("dbclose");
24158f0484fSRodney W. Grimes }
24258f0484fSRodney W. Grimes 
24358f0484fSRodney W. Grimes int
parse(lbuf,argv,maxargc)24458f0484fSRodney W. Grimes parse(lbuf, argv, maxargc)
24558f0484fSRodney W. Grimes 	char *lbuf, **argv;
24658f0484fSRodney W. Grimes 	int maxargc;
24758f0484fSRodney W. Grimes {
24858f0484fSRodney W. Grimes 	int argc = 0;
24958f0484fSRodney W. Grimes 	char *c;
25058f0484fSRodney W. Grimes 
25158f0484fSRodney W. Grimes 	c = lbuf;
25258f0484fSRodney W. Grimes 	while (isspace(*c))
25358f0484fSRodney W. Grimes 		c++;
25458f0484fSRodney W. Grimes 	while (*c != '\0' && argc < maxargc) {
25558f0484fSRodney W. Grimes 		*argv++ = c;
25658f0484fSRodney W. Grimes 		argc++;
25758f0484fSRodney W. Grimes 		while (!isspace(*c) && *c != '\0') {
25858f0484fSRodney W. Grimes 			c++;
25958f0484fSRodney W. Grimes 		}
26058f0484fSRodney W. Grimes 		while (isspace(*c))
26158f0484fSRodney W. Grimes 			*c++ = '\0';
26258f0484fSRodney W. Grimes 	}
26358f0484fSRodney W. Grimes 	return (argc);
26458f0484fSRodney W. Grimes }
26558f0484fSRodney W. Grimes 
26658f0484fSRodney W. Grimes void
append(db,argv)26758f0484fSRodney W. Grimes append(db, argv)
26858f0484fSRodney W. Grimes 	DB *db;
26958f0484fSRodney W. Grimes 	char **argv;
27058f0484fSRodney W. Grimes {
27158f0484fSRodney W. Grimes 	DBT key, data;
27258f0484fSRodney W. Grimes 	int status;
27358f0484fSRodney W. Grimes 
27458f0484fSRodney W. Grimes 	if (!recno) {
27558f0484fSRodney W. Grimes 		(void)fprintf(stderr,
27658f0484fSRodney W. Grimes 		    "append only available for recno db's.\n");
27758f0484fSRodney W. Grimes 		return;
27858f0484fSRodney W. Grimes 	}
27958f0484fSRodney W. Grimes 	key.data = argv[1];
28058f0484fSRodney W. Grimes 	key.size = sizeof(recno_t);
28158f0484fSRodney W. Grimes 	data.data = argv[2];
28258f0484fSRodney W. Grimes 	data.size = strlen(data.data);
28358f0484fSRodney W. Grimes 	status = (db->put)(db, &key, &data, R_APPEND);
28458f0484fSRodney W. Grimes 	switch (status) {
28558f0484fSRodney W. Grimes 	case RET_ERROR:
28658f0484fSRodney W. Grimes 		perror("append/put");
28758f0484fSRodney W. Grimes 		break;
28858f0484fSRodney W. Grimes 	case RET_SPECIAL:
28958f0484fSRodney W. Grimes 		(void)printf("%s (duplicate key)\n", argv[1]);
29058f0484fSRodney W. Grimes 		break;
29158f0484fSRodney W. Grimes 	case RET_SUCCESS:
29258f0484fSRodney W. Grimes 		break;
29358f0484fSRodney W. Grimes 	}
29458f0484fSRodney W. Grimes }
29558f0484fSRodney W. Grimes 
29658f0484fSRodney W. Grimes void
cursor(db,argv)29758f0484fSRodney W. Grimes cursor(db, argv)
29858f0484fSRodney W. Grimes 	DB *db;
29958f0484fSRodney W. Grimes 	char **argv;
30058f0484fSRodney W. Grimes {
30158f0484fSRodney W. Grimes 	DBT data, key;
30258f0484fSRodney W. Grimes 	int status;
30358f0484fSRodney W. Grimes 
30458f0484fSRodney W. Grimes 	key.data = argv[1];
30558f0484fSRodney W. Grimes 	if (recno)
30658f0484fSRodney W. Grimes 		key.size = sizeof(recno_t);
30758f0484fSRodney W. Grimes 	else
30858f0484fSRodney W. Grimes 		key.size = strlen(argv[1]) + 1;
30958f0484fSRodney W. Grimes 	status = (*db->seq)(db, &key, &data, R_CURSOR);
31058f0484fSRodney W. Grimes 	switch (status) {
31158f0484fSRodney W. Grimes 	case RET_ERROR:
31258f0484fSRodney W. Grimes 		perror("cursor/seq");
31358f0484fSRodney W. Grimes 		break;
31458f0484fSRodney W. Grimes 	case RET_SPECIAL:
31558f0484fSRodney W. Grimes 		(void)printf("key not found\n");
31658f0484fSRodney W. Grimes 		break;
31758f0484fSRodney W. Grimes 	case RET_SUCCESS:
31858f0484fSRodney W. Grimes 		keydata(&key, &data);
31958f0484fSRodney W. Grimes 		break;
32058f0484fSRodney W. Grimes 	}
32158f0484fSRodney W. Grimes }
32258f0484fSRodney W. Grimes 
32358f0484fSRodney W. Grimes void
delcur(db,argv)32458f0484fSRodney W. Grimes delcur(db, argv)
32558f0484fSRodney W. Grimes 	DB *db;
32658f0484fSRodney W. Grimes 	char **argv;
32758f0484fSRodney W. Grimes {
32858f0484fSRodney W. Grimes 	int status;
32958f0484fSRodney W. Grimes 
33058f0484fSRodney W. Grimes 	status = (*db->del)(db, NULL, R_CURSOR);
33158f0484fSRodney W. Grimes 
33258f0484fSRodney W. Grimes 	if (status == RET_ERROR)
33358f0484fSRodney W. Grimes 		perror("delcur/del");
33458f0484fSRodney W. Grimes }
33558f0484fSRodney W. Grimes 
33658f0484fSRodney W. Grimes void
delete(db,argv)33758f0484fSRodney W. Grimes delete(db, argv)
33858f0484fSRodney W. Grimes 	DB *db;
33958f0484fSRodney W. Grimes 	char **argv;
34058f0484fSRodney W. Grimes {
34158f0484fSRodney W. Grimes 	DBT key;
34258f0484fSRodney W. Grimes 	int status;
34358f0484fSRodney W. Grimes 
34458f0484fSRodney W. Grimes 	key.data = argv[1];
34558f0484fSRodney W. Grimes 	if (recno)
34658f0484fSRodney W. Grimes 		key.size = sizeof(recno_t);
34758f0484fSRodney W. Grimes 	else
34858f0484fSRodney W. Grimes 		key.size = strlen(argv[1]) + 1;
34958f0484fSRodney W. Grimes 
35058f0484fSRodney W. Grimes 	status = (*db->del)(db, &key, 0);
35158f0484fSRodney W. Grimes 	switch (status) {
35258f0484fSRodney W. Grimes 	case RET_ERROR:
35358f0484fSRodney W. Grimes 		perror("delete/del");
35458f0484fSRodney W. Grimes 		break;
35558f0484fSRodney W. Grimes 	case RET_SPECIAL:
35658f0484fSRodney W. Grimes 		(void)printf("key not found\n");
35758f0484fSRodney W. Grimes 		break;
35858f0484fSRodney W. Grimes 	case RET_SUCCESS:
35958f0484fSRodney W. Grimes 		break;
36058f0484fSRodney W. Grimes 	}
36158f0484fSRodney W. Grimes }
36258f0484fSRodney W. Grimes 
36358f0484fSRodney W. Grimes void
dump(db,argv)36458f0484fSRodney W. Grimes dump(db, argv)
36558f0484fSRodney W. Grimes 	DB *db;
36658f0484fSRodney W. Grimes 	char **argv;
36758f0484fSRodney W. Grimes {
36858f0484fSRodney W. Grimes 	__bt_dump(db);
36958f0484fSRodney W. Grimes }
37058f0484fSRodney W. Grimes 
37158f0484fSRodney W. Grimes void
first(db,argv)37258f0484fSRodney W. Grimes first(db, argv)
37358f0484fSRodney W. Grimes 	DB *db;
37458f0484fSRodney W. Grimes 	char **argv;
37558f0484fSRodney W. Grimes {
37658f0484fSRodney W. Grimes 	DBT data, key;
37758f0484fSRodney W. Grimes 	int status;
37858f0484fSRodney W. Grimes 
37958f0484fSRodney W. Grimes 	status = (*db->seq)(db, &key, &data, R_FIRST);
38058f0484fSRodney W. Grimes 
38158f0484fSRodney W. Grimes 	switch (status) {
38258f0484fSRodney W. Grimes 	case RET_ERROR:
38358f0484fSRodney W. Grimes 		perror("first/seq");
38458f0484fSRodney W. Grimes 		break;
38558f0484fSRodney W. Grimes 	case RET_SPECIAL:
38658f0484fSRodney W. Grimes 		(void)printf("no more keys\n");
38758f0484fSRodney W. Grimes 		break;
38858f0484fSRodney W. Grimes 	case RET_SUCCESS:
38958f0484fSRodney W. Grimes 		keydata(&key, &data);
39058f0484fSRodney W. Grimes 		break;
39158f0484fSRodney W. Grimes 	}
39258f0484fSRodney W. Grimes }
39358f0484fSRodney W. Grimes 
39458f0484fSRodney W. Grimes void
get(db,argv)39558f0484fSRodney W. Grimes get(db, argv)
39658f0484fSRodney W. Grimes 	DB *db;
39758f0484fSRodney W. Grimes 	char **argv;
39858f0484fSRodney W. Grimes {
39958f0484fSRodney W. Grimes 	DBT data, key;
40058f0484fSRodney W. Grimes 	int status;
40158f0484fSRodney W. Grimes 
40258f0484fSRodney W. Grimes 	key.data = argv[1];
40358f0484fSRodney W. Grimes 	if (recno)
40458f0484fSRodney W. Grimes 		key.size = sizeof(recno_t);
40558f0484fSRodney W. Grimes 	else
40658f0484fSRodney W. Grimes 		key.size = strlen(argv[1]) + 1;
40758f0484fSRodney W. Grimes 
40858f0484fSRodney W. Grimes 	status = (*db->get)(db, &key, &data, 0);
40958f0484fSRodney W. Grimes 
41058f0484fSRodney W. Grimes 	switch (status) {
41158f0484fSRodney W. Grimes 	case RET_ERROR:
41258f0484fSRodney W. Grimes 		perror("get/get");
41358f0484fSRodney W. Grimes 		break;
41458f0484fSRodney W. Grimes 	case RET_SPECIAL:
41558f0484fSRodney W. Grimes 		(void)printf("key not found\n");
41658f0484fSRodney W. Grimes 		break;
41758f0484fSRodney W. Grimes 	case RET_SUCCESS:
41858f0484fSRodney W. Grimes 		keydata(&key, &data);
41958f0484fSRodney W. Grimes 		break;
42058f0484fSRodney W. Grimes 	}
42158f0484fSRodney W. Grimes }
42258f0484fSRodney W. Grimes 
42358f0484fSRodney W. Grimes void
help(db,argv)42458f0484fSRodney W. Grimes help(db, argv)
42558f0484fSRodney W. Grimes 	DB *db;
42658f0484fSRodney W. Grimes 	char **argv;
42758f0484fSRodney W. Grimes {
42858f0484fSRodney W. Grimes 	int i;
42958f0484fSRodney W. Grimes 
43058f0484fSRodney W. Grimes 	for (i = 0; commands[i].cmd; i++)
43158f0484fSRodney W. Grimes 		if (commands[i].descrip)
43258f0484fSRodney W. Grimes 			(void)printf("%s: %s\n",
43358f0484fSRodney W. Grimes 			    commands[i].usage, commands[i].descrip);
43458f0484fSRodney W. Grimes }
43558f0484fSRodney W. Grimes 
43658f0484fSRodney W. Grimes void
iafter(db,argv)43758f0484fSRodney W. Grimes iafter(db, argv)
43858f0484fSRodney W. Grimes 	DB *db;
43958f0484fSRodney W. Grimes 	char **argv;
44058f0484fSRodney W. Grimes {
44158f0484fSRodney W. Grimes 	DBT key, data;
44258f0484fSRodney W. Grimes 	int status;
44358f0484fSRodney W. Grimes 
44458f0484fSRodney W. Grimes 	if (!recno) {
44558f0484fSRodney W. Grimes 		(void)fprintf(stderr,
44658f0484fSRodney W. Grimes 		    "iafter only available for recno db's.\n");
44758f0484fSRodney W. Grimes 		return;
44858f0484fSRodney W. Grimes 	}
44958f0484fSRodney W. Grimes 	key.data = argv[1];
45058f0484fSRodney W. Grimes 	key.size = sizeof(recno_t);
45158f0484fSRodney W. Grimes 	data.data = argv[2];
45258f0484fSRodney W. Grimes 	data.size = strlen(data.data);
45358f0484fSRodney W. Grimes 	status = (db->put)(db, &key, &data, R_IAFTER);
45458f0484fSRodney W. Grimes 	switch (status) {
45558f0484fSRodney W. Grimes 	case RET_ERROR:
45658f0484fSRodney W. Grimes 		perror("iafter/put");
45758f0484fSRodney W. Grimes 		break;
45858f0484fSRodney W. Grimes 	case RET_SPECIAL:
45958f0484fSRodney W. Grimes 		(void)printf("%s (duplicate key)\n", argv[1]);
46058f0484fSRodney W. Grimes 		break;
46158f0484fSRodney W. Grimes 	case RET_SUCCESS:
46258f0484fSRodney W. Grimes 		break;
46358f0484fSRodney W. Grimes 	}
46458f0484fSRodney W. Grimes }
46558f0484fSRodney W. Grimes 
46658f0484fSRodney W. Grimes void
ibefore(db,argv)46758f0484fSRodney W. Grimes ibefore(db, argv)
46858f0484fSRodney W. Grimes 	DB *db;
46958f0484fSRodney W. Grimes 	char **argv;
47058f0484fSRodney W. Grimes {
47158f0484fSRodney W. Grimes 	DBT key, data;
47258f0484fSRodney W. Grimes 	int status;
47358f0484fSRodney W. Grimes 
47458f0484fSRodney W. Grimes 	if (!recno) {
47558f0484fSRodney W. Grimes 		(void)fprintf(stderr,
47658f0484fSRodney W. Grimes 		    "ibefore only available for recno db's.\n");
47758f0484fSRodney W. Grimes 		return;
47858f0484fSRodney W. Grimes 	}
47958f0484fSRodney W. Grimes 	key.data = argv[1];
48058f0484fSRodney W. Grimes 	key.size = sizeof(recno_t);
48158f0484fSRodney W. Grimes 	data.data = argv[2];
48258f0484fSRodney W. Grimes 	data.size = strlen(data.data);
48358f0484fSRodney W. Grimes 	status = (db->put)(db, &key, &data, R_IBEFORE);
48458f0484fSRodney W. Grimes 	switch (status) {
48558f0484fSRodney W. Grimes 	case RET_ERROR:
48658f0484fSRodney W. Grimes 		perror("ibefore/put");
48758f0484fSRodney W. Grimes 		break;
48858f0484fSRodney W. Grimes 	case RET_SPECIAL:
48958f0484fSRodney W. Grimes 		(void)printf("%s (duplicate key)\n", argv[1]);
49058f0484fSRodney W. Grimes 		break;
49158f0484fSRodney W. Grimes 	case RET_SUCCESS:
49258f0484fSRodney W. Grimes 		break;
49358f0484fSRodney W. Grimes 	}
49458f0484fSRodney W. Grimes }
49558f0484fSRodney W. Grimes 
49658f0484fSRodney W. Grimes void
icursor(db,argv)49758f0484fSRodney W. Grimes icursor(db, argv)
49858f0484fSRodney W. Grimes 	DB *db;
49958f0484fSRodney W. Grimes 	char **argv;
50058f0484fSRodney W. Grimes {
50158f0484fSRodney W. Grimes 	int status;
50258f0484fSRodney W. Grimes 	DBT data, key;
50358f0484fSRodney W. Grimes 
50458f0484fSRodney W. Grimes 	key.data = argv[1];
50558f0484fSRodney W. Grimes 	if (recno)
50658f0484fSRodney W. Grimes 		key.size = sizeof(recno_t);
50758f0484fSRodney W. Grimes 	else
50858f0484fSRodney W. Grimes 		key.size = strlen(argv[1]) + 1;
50958f0484fSRodney W. Grimes 	data.data = argv[2];
51058f0484fSRodney W. Grimes 	data.size = strlen(argv[2]) + 1;
51158f0484fSRodney W. Grimes 
51258f0484fSRodney W. Grimes 	status = (*db->put)(db, &key, &data, R_CURSOR);
51358f0484fSRodney W. Grimes 	switch (status) {
51458f0484fSRodney W. Grimes 	case RET_ERROR:
51558f0484fSRodney W. Grimes 		perror("icursor/put");
51658f0484fSRodney W. Grimes 		break;
51758f0484fSRodney W. Grimes 	case RET_SPECIAL:
51858f0484fSRodney W. Grimes 		(void)printf("%s (duplicate key)\n", argv[1]);
51958f0484fSRodney W. Grimes 		break;
52058f0484fSRodney W. Grimes 	case RET_SUCCESS:
52158f0484fSRodney W. Grimes 		break;
52258f0484fSRodney W. Grimes 	}
52358f0484fSRodney W. Grimes }
52458f0484fSRodney W. Grimes 
52558f0484fSRodney W. Grimes void
insert(db,argv)52658f0484fSRodney W. Grimes insert(db, argv)
52758f0484fSRodney W. Grimes 	DB *db;
52858f0484fSRodney W. Grimes 	char **argv;
52958f0484fSRodney W. Grimes {
53058f0484fSRodney W. Grimes 	int status;
53158f0484fSRodney W. Grimes 	DBT data, key;
53258f0484fSRodney W. Grimes 
53358f0484fSRodney W. Grimes 	key.data = argv[1];
53458f0484fSRodney W. Grimes 	if (recno)
53558f0484fSRodney W. Grimes 		key.size = sizeof(recno_t);
53658f0484fSRodney W. Grimes 	else
53758f0484fSRodney W. Grimes 		key.size = strlen(argv[1]) + 1;
53858f0484fSRodney W. Grimes 	data.data = argv[2];
53958f0484fSRodney W. Grimes 	data.size = strlen(argv[2]) + 1;
54058f0484fSRodney W. Grimes 
54158f0484fSRodney W. Grimes 	status = (*db->put)(db, &key, &data, R_NOOVERWRITE);
54258f0484fSRodney W. Grimes 	switch (status) {
54358f0484fSRodney W. Grimes 	case RET_ERROR:
54458f0484fSRodney W. Grimes 		perror("insert/put");
54558f0484fSRodney W. Grimes 		break;
54658f0484fSRodney W. Grimes 	case RET_SPECIAL:
54758f0484fSRodney W. Grimes 		(void)printf("%s (duplicate key)\n", argv[1]);
54858f0484fSRodney W. Grimes 		break;
54958f0484fSRodney W. Grimes 	case RET_SUCCESS:
55058f0484fSRodney W. Grimes 		break;
55158f0484fSRodney W. Grimes 	}
55258f0484fSRodney W. Grimes }
55358f0484fSRodney W. Grimes 
55458f0484fSRodney W. Grimes void
last(db,argv)55558f0484fSRodney W. Grimes last(db, argv)
55658f0484fSRodney W. Grimes 	DB *db;
55758f0484fSRodney W. Grimes 	char **argv;
55858f0484fSRodney W. Grimes {
55958f0484fSRodney W. Grimes 	DBT data, key;
56058f0484fSRodney W. Grimes 	int status;
56158f0484fSRodney W. Grimes 
56258f0484fSRodney W. Grimes 	status = (*db->seq)(db, &key, &data, R_LAST);
56358f0484fSRodney W. Grimes 
56458f0484fSRodney W. Grimes 	switch (status) {
56558f0484fSRodney W. Grimes 	case RET_ERROR:
56658f0484fSRodney W. Grimes 		perror("last/seq");
56758f0484fSRodney W. Grimes 		break;
56858f0484fSRodney W. Grimes 	case RET_SPECIAL:
56958f0484fSRodney W. Grimes 		(void)printf("no more keys\n");
57058f0484fSRodney W. Grimes 		break;
57158f0484fSRodney W. Grimes 	case RET_SUCCESS:
57258f0484fSRodney W. Grimes 		keydata(&key, &data);
57358f0484fSRodney W. Grimes 		break;
57458f0484fSRodney W. Grimes 	}
57558f0484fSRodney W. Grimes }
57658f0484fSRodney W. Grimes 
57758f0484fSRodney W. Grimes void
list(db,argv)57858f0484fSRodney W. Grimes list(db, argv)
57958f0484fSRodney W. Grimes 	DB *db;
58058f0484fSRodney W. Grimes 	char **argv;
58158f0484fSRodney W. Grimes {
58258f0484fSRodney W. Grimes 	DBT data, key;
58358f0484fSRodney W. Grimes 	FILE *fp;
58458f0484fSRodney W. Grimes 	int status;
58558f0484fSRodney W. Grimes 
58658f0484fSRodney W. Grimes 	if ((fp = fopen(argv[1], "w")) == NULL) {
58758f0484fSRodney W. Grimes 		(void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno));
58858f0484fSRodney W. Grimes 		return;
58958f0484fSRodney W. Grimes 	}
59058f0484fSRodney W. Grimes 	status = (*db->seq)(db, &key, &data, R_FIRST);
59158f0484fSRodney W. Grimes 	while (status == RET_SUCCESS) {
59258f0484fSRodney W. Grimes 		(void)fprintf(fp, "%s\n", key.data);
59358f0484fSRodney W. Grimes 		status = (*db->seq)(db, &key, &data, R_NEXT);
59458f0484fSRodney W. Grimes 	}
59558f0484fSRodney W. Grimes 	if (status == RET_ERROR)
59658f0484fSRodney W. Grimes 		perror("list/seq");
59758f0484fSRodney W. Grimes }
59858f0484fSRodney W. Grimes 
59958f0484fSRodney W. Grimes DB *BUGdb;
60058f0484fSRodney W. Grimes void
load(db,argv)60158f0484fSRodney W. Grimes load(db, argv)
60258f0484fSRodney W. Grimes 	DB *db;
60358f0484fSRodney W. Grimes 	char **argv;
60458f0484fSRodney W. Grimes {
6058fb3f3f6SDavid E. O'Brien 	char *p, *t;
60658f0484fSRodney W. Grimes 	FILE *fp;
60758f0484fSRodney W. Grimes 	DBT data, key;
60858f0484fSRodney W. Grimes 	recno_t cnt;
60958f0484fSRodney W. Grimes 	size_t len;
61058f0484fSRodney W. Grimes 	int status;
61158f0484fSRodney W. Grimes 	char *lp, buf[16 * 1024];
61258f0484fSRodney W. Grimes 
61358f0484fSRodney W. Grimes 	BUGdb = db;
61458f0484fSRodney W. Grimes 	if ((fp = fopen(argv[1], "r")) == NULL) {
61558f0484fSRodney W. Grimes 		(void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno));
61658f0484fSRodney W. Grimes 		return;
61758f0484fSRodney W. Grimes 	}
61858f0484fSRodney W. Grimes 	(void)printf("loading %s...\n", argv[1]);
61958f0484fSRodney W. Grimes 
62058f0484fSRodney W. Grimes 	for (cnt = 1; (lp = fgetline(fp, &len)) != NULL; ++cnt) {
62158f0484fSRodney W. Grimes 		if (recno) {
62258f0484fSRodney W. Grimes 			key.data = &cnt;
62358f0484fSRodney W. Grimes 			key.size = sizeof(recno_t);
62458f0484fSRodney W. Grimes 			data.data = lp;
62558f0484fSRodney W. Grimes 			data.size = len + 1;
62658f0484fSRodney W. Grimes 		} else {
62758f0484fSRodney W. Grimes 			key.data = lp;
62858f0484fSRodney W. Grimes 			key.size = len + 1;
62958f0484fSRodney W. Grimes 			for (p = lp + len - 1, t = buf; p >= lp; *t++ = *p--);
63058f0484fSRodney W. Grimes 			*t = '\0';
63158f0484fSRodney W. Grimes 			data.data = buf;
63258f0484fSRodney W. Grimes 			data.size = len + 1;
63358f0484fSRodney W. Grimes 		}
63458f0484fSRodney W. Grimes 
63558f0484fSRodney W. Grimes 		status = (*db->put)(db, &key, &data, R_NOOVERWRITE);
63658f0484fSRodney W. Grimes 		switch (status) {
63758f0484fSRodney W. Grimes 		case RET_ERROR:
63858f0484fSRodney W. Grimes 			perror("load/put");
63958f0484fSRodney W. Grimes 			exit(1);
64058f0484fSRodney W. Grimes 		case RET_SPECIAL:
64158f0484fSRodney W. Grimes 			if (recno)
64258f0484fSRodney W. Grimes 				(void)fprintf(stderr,
64358f0484fSRodney W. Grimes 				    "duplicate: %ld {%s}\n", cnt, data.data);
64458f0484fSRodney W. Grimes 			else
64558f0484fSRodney W. Grimes 				(void)fprintf(stderr,
64658f0484fSRodney W. Grimes 				    "duplicate: %ld {%s}\n", cnt, key.data);
64758f0484fSRodney W. Grimes 			exit(1);
64858f0484fSRodney W. Grimes 		case RET_SUCCESS:
64958f0484fSRodney W. Grimes 			break;
65058f0484fSRodney W. Grimes 		}
65158f0484fSRodney W. Grimes 	}
65258f0484fSRodney W. Grimes 	(void)fclose(fp);
65358f0484fSRodney W. Grimes }
65458f0484fSRodney W. Grimes 
65558f0484fSRodney W. Grimes void
next(db,argv)65658f0484fSRodney W. Grimes next(db, argv)
65758f0484fSRodney W. Grimes 	DB *db;
65858f0484fSRodney W. Grimes 	char **argv;
65958f0484fSRodney W. Grimes {
66058f0484fSRodney W. Grimes 	DBT data, key;
66158f0484fSRodney W. Grimes 	int status;
66258f0484fSRodney W. Grimes 
66358f0484fSRodney W. Grimes 	status = (*db->seq)(db, &key, &data, R_NEXT);
66458f0484fSRodney W. Grimes 
66558f0484fSRodney W. Grimes 	switch (status) {
66658f0484fSRodney W. Grimes 	case RET_ERROR:
66758f0484fSRodney W. Grimes 		perror("next/seq");
66858f0484fSRodney W. Grimes 		break;
66958f0484fSRodney W. Grimes 	case RET_SPECIAL:
67058f0484fSRodney W. Grimes 		(void)printf("no more keys\n");
67158f0484fSRodney W. Grimes 		break;
67258f0484fSRodney W. Grimes 	case RET_SUCCESS:
67358f0484fSRodney W. Grimes 		keydata(&key, &data);
67458f0484fSRodney W. Grimes 		break;
67558f0484fSRodney W. Grimes 	}
67658f0484fSRodney W. Grimes }
67758f0484fSRodney W. Grimes 
67858f0484fSRodney W. Grimes void
previous(db,argv)67958f0484fSRodney W. Grimes previous(db, argv)
68058f0484fSRodney W. Grimes 	DB *db;
68158f0484fSRodney W. Grimes 	char **argv;
68258f0484fSRodney W. Grimes {
68358f0484fSRodney W. Grimes 	DBT data, key;
68458f0484fSRodney W. Grimes 	int status;
68558f0484fSRodney W. Grimes 
68658f0484fSRodney W. Grimes 	status = (*db->seq)(db, &key, &data, R_PREV);
68758f0484fSRodney W. Grimes 
68858f0484fSRodney W. Grimes 	switch (status) {
68958f0484fSRodney W. Grimes 	case RET_ERROR:
69058f0484fSRodney W. Grimes 		perror("previous/seq");
69158f0484fSRodney W. Grimes 		break;
69258f0484fSRodney W. Grimes 	case RET_SPECIAL:
69358f0484fSRodney W. Grimes 		(void)printf("no more keys\n");
69458f0484fSRodney W. Grimes 		break;
69558f0484fSRodney W. Grimes 	case RET_SUCCESS:
69658f0484fSRodney W. Grimes 		keydata(&key, &data);
69758f0484fSRodney W. Grimes 		break;
69858f0484fSRodney W. Grimes 	}
69958f0484fSRodney W. Grimes }
70058f0484fSRodney W. Grimes 
70158f0484fSRodney W. Grimes void
show(db,argv)70258f0484fSRodney W. Grimes show(db, argv)
70358f0484fSRodney W. Grimes 	DB *db;
70458f0484fSRodney W. Grimes 	char **argv;
70558f0484fSRodney W. Grimes {
70658f0484fSRodney W. Grimes 	BTREE *t;
70758f0484fSRodney W. Grimes 	PAGE *h;
70858f0484fSRodney W. Grimes 	pgno_t pg;
70958f0484fSRodney W. Grimes 
71058f0484fSRodney W. Grimes 	pg = atoi(argv[1]);
71158f0484fSRodney W. Grimes 	t = db->internal;
71258f0484fSRodney W. Grimes 	if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL) {
71358f0484fSRodney W. Grimes 		(void)printf("getpage of %ld failed\n", pg);
71458f0484fSRodney W. Grimes 		return;
71558f0484fSRodney W. Grimes 	}
71658f0484fSRodney W. Grimes 	if (pg == 0)
71758f0484fSRodney W. Grimes 		__bt_dmpage(h);
71858f0484fSRodney W. Grimes 	else
71958f0484fSRodney W. Grimes 		__bt_dpage(h);
72058f0484fSRodney W. Grimes 	mpool_put(t->bt_mp, h, 0);
72158f0484fSRodney W. Grimes }
72258f0484fSRodney W. Grimes 
72358f0484fSRodney W. Grimes void
bstat(db,argv)72458f0484fSRodney W. Grimes bstat(db, argv)
72558f0484fSRodney W. Grimes 	DB *db;
72658f0484fSRodney W. Grimes 	char **argv;
72758f0484fSRodney W. Grimes {
72858f0484fSRodney W. Grimes 	(void)printf("BTREE\n");
72958f0484fSRodney W. Grimes 	__bt_stat(db);
73058f0484fSRodney W. Grimes }
73158f0484fSRodney W. Grimes 
73258f0484fSRodney W. Grimes void
mstat(db,argv)73358f0484fSRodney W. Grimes mstat(db, argv)
73458f0484fSRodney W. Grimes 	DB *db;
73558f0484fSRodney W. Grimes 	char **argv;
73658f0484fSRodney W. Grimes {
73758f0484fSRodney W. Grimes 	(void)printf("MPOOL\n");
73858f0484fSRodney W. Grimes 	mpool_stat(((BTREE *)db->internal)->bt_mp);
73958f0484fSRodney W. Grimes }
74058f0484fSRodney W. Grimes 
74158f0484fSRodney W. Grimes void
keydata(key,data)74258f0484fSRodney W. Grimes keydata(key, data)
74358f0484fSRodney W. Grimes 	DBT *key, *data;
74458f0484fSRodney W. Grimes {
74558f0484fSRodney W. Grimes 	if (!recno && key->size > 0)
74658f0484fSRodney W. Grimes 		(void)printf("%s/", key->data);
74758f0484fSRodney W. Grimes 	if (data->size > 0)
74858f0484fSRodney W. Grimes 		(void)printf("%s", data->data);
74958f0484fSRodney W. Grimes 	(void)printf("\n");
75058f0484fSRodney W. Grimes }
75158f0484fSRodney W. Grimes 
75258f0484fSRodney W. Grimes void
usage()75358f0484fSRodney W. Grimes usage()
75458f0484fSRodney W. Grimes {
75558f0484fSRodney W. Grimes 	(void)fprintf(stderr,
75658f0484fSRodney W. Grimes 	    "usage: %s [-bdlu] [-c cache] [-i file] [-p page] [file]\n",
75758f0484fSRodney W. Grimes 	    progname);
75858f0484fSRodney W. Grimes 	exit (1);
75958f0484fSRodney W. Grimes }
760