/* * A tool to open and traverse the dbm database that goes with * your game, and dump out a raw report of where every object lives in * the chunkfile, and how many bytes it takes up. */ #include "autoconf.h" #include "config.h" #include <sys/types.h> #include <sys/file.h> #include <stdio.h> #include "gdbmdefs.h" /* #include "gdbm.h" */ static gdbm_file_info *dbp = NULL; static void gdbm_panic(mesg) { fprintf(stderr, "GDBM panic: %s\n", mesg); } int main(ac, av) int ac; char *av[]; { int obj; datum key, dat; int new_hash_val; /* temp stuff for findkey operation */ char *temp; int elem_loc, ofs, siz; if (ac != 2) { fprintf(stderr, "usage: %s <database name>\n", av[0]); exit(0); } /* * open hash table */ if ((dbp = gdbm_open(av[1], 8192, GDBM_WRCREAT, 0600, gdbm_panic)) == NULL) { fprintf(stderr, "Can't open gdbm database %s\n", av[1]); exit(0); } key = gdbm_firstkey(dbp); while (key.dptr != (char *)NULL) { elem_loc = _gdbm_findkey(dbp, key, &temp, &new_hash_val); if (elem_loc == -1) { fprintf(stderr, "gdbm database %s inconsistent\n", av[1]); exit(0); } ofs = dbp->bucket->h_table[elem_loc].data_pointer; siz = (dbp->bucket->h_table[elem_loc].key_size + dbp->bucket->h_table[elem_loc].data_size); bcopy(key.dptr, (char *)&obj, sizeof(obj)); printf("Object %d resides at offset %d and takes %d bytes\n", obj, ofs, siz); key = gdbm_nextkey(dbp, key); } exit(1); }