1/* 2 * dbd - dump a dbm data file 3 */ 4 5#include <stdio.h> 6#include <sys/file.h> 7#include "EXTERN.h" 8#include "sdbm.h" 9 10char *progname; 11extern void oops(); 12 13 14#define empty(page) (((short *) page)[0] == 0) 15 16int 17main(int argc, char **argv) 18{ 19 int n; 20 char *p; 21 char *name; 22 int pagf; 23 24 progname = argv[0]; 25 26 if (p = argv[1]) { 27 name = (char *) malloc((n = strlen(p)) + 5); 28 if (!name) 29 oops("cannot get memory"); 30 31 strcpy(name, p); 32 strcpy(name + n, ".pag"); 33 34 if ((pagf = open(name, O_RDONLY)) < 0) 35 oops("cannot open %s.", name); 36 37 sdump(pagf); 38 } 39 else 40 oops("usage: %s dbname", progname); 41 return 0; 42} 43 44void 45sdump(int pagf) 46{ 47 int r; 48 int n = 0; 49 int o = 0; 50 char pag[PBLKSIZ]; 51 52 while ((r = read(pagf, pag, PBLKSIZ)) > 0) { 53 if (!okpage(pag)) 54 fprintf(stderr, "%d: bad page.\n", n); 55 else if (empty(pag)) 56 o++; 57 else 58 dispage(pag); 59 n++; 60 } 61 62 if (r == 0) 63 fprintf(stderr, "%d pages (%d holes).\n", n, o); 64 else 65 oops("read failed: block %d", n); 66} 67 68 69#ifdef OLD 70int 71dispage(char *pag) 72{ 73 int i, n; 74 int off; 75 int short *ino = (short *) pag; 76 77 off = PBLKSIZ; 78 for (i = 1; i < ino[0]; i += 2) { 79 printf("\t[%d]: ", ino[i]); 80 for (n = ino[i]; n < off; n++) 81 putchar(pag[n]); 82 putchar(' '); 83 off = ino[i]; 84 printf("[%d]: ", ino[i + 1]); 85 for (n = ino[i + 1]; n < off; n++) 86 putchar(pag[n]); 87 off = ino[i + 1]; 88 putchar('\n'); 89 } 90} 91#else 92void 93dispage(char *pag) 94{ 95 int i, n; 96 int off; 97 short *ino = (short *) pag; 98 99 off = PBLKSIZ; 100 for (i = 1; i < ino[0]; i += 2) { 101 for (n = ino[i]; n < off; n++) 102 if (pag[n] != 0) 103 putchar(pag[n]); 104 putchar('\t'); 105 off = ino[i]; 106 for (n = ino[i + 1]; n < off; n++) 107 if (pag[n] != 0) 108 putchar(pag[n]); 109 putchar('\n'); 110 off = ino[i + 1]; 111 } 112} 113#endif 114