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