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