/* 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> #ifdef HAVE_NDBM #include <ndbm.h> #else #ifdef HAVE_DBM #include <dbm.h> #else #include "myndbm.h" #endif #endif /* This struct should match the one in udb_ochunk.c */ struct hrec { off_t off; /* Where it lives in the chunkfile */ int siz; /* How long it really is, in bytes */ unsigned int blox; /* How manu blocks it owns now */ }; #ifdef HAVE_DBM static int dbp = 0; #else static DBM *dbp = (DBM *) NULL; #endif int main(ac, av) int ac; char *av[]; { int obj; datum key, dat; struct hrec hbuf; if(ac != 2) { fprintf(stderr, "usage: %s <database name>\n"); exit (0); } /* open hash table */ #ifdef HAVE_DBM if ((dbp = dbminit(av[1])) < 0) { fprintf(stderr, "Can't open dbm database %s\n", av[1]); exit (0); } #else if ((dbp = dbm_open(av[1], O_RDONLY, 0600)) == (DBM *) NULL) { fprintf(stderr, "Can't open dbm database %s\n", av[1]); exit (0); } #endif #ifdef HAVE_DBM key = firstkey(); #else key = dbm_firstkey(dbp); #endif while (key.dptr != (char *) NULL) { #ifdef HAVE_DBM dat = fetch(key); #else dat = dbm_fetch(dbp, key); #endif if (dat.dptr == (char *) NULL) { fprintf(stderr,"dbm database %s inconsistent\n", av[1]); exit (0); } bcopy(dat.dptr, (char *) &hbuf, sizeof(hbuf)); /* alignment */ bcopy(key.dptr, (char *) &obj, sizeof(obj)); printf("Object %d resides at offset %d and takes %d bytes\n", obj, hbuf.off, hbuf.siz); #ifdef HAVE_DBM key = nextkey(key); #else key = dbm_nextkey(dbp); #endif } exit (1); }