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