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
10 char *progname;
11 extern void oops();
12
13
14 #define empty(page) (((short *) page)[0] == 0)
15
16 int
main(int argc,char ** argv)17 main(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
44 void
sdump(int pagf)45 sdump(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
70 int
dispage(char * pag)71 dispage(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
92 void
dispage(char * pag)93 dispage(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