Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / perl5 / 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                 strcpy(name, p);
30                 strcpy(name + n, ".pag");
31
32                 if ((pagf = open(name, O_RDONLY)) < 0)
33                         oops("cannot open %s.", name);
34
35                 sdump(pagf);
36         }
37         else
38                 oops("usage: %s dbname", progname);
39         return 0;
40 }
41
42 sdump(pagf)
43 int pagf;
44 {
45         register r;
46         register n = 0;
47         register o = 0;
48         char pag[PBLKSIZ];
49
50         while ((r = read(pagf, pag, PBLKSIZ)) > 0) {
51                 if (!okpage(pag))
52                         fprintf(stderr, "%d: bad page.\n", n);
53                 else if (empty(pag))
54                         o++;
55                 else
56                         dispage(pag);
57                 n++;
58         }
59
60         if (r == 0)
61                 fprintf(stderr, "%d pages (%d holes).\n", n, o);
62         else
63                 oops("read failed: block %d", n);
64 }
65
66
67 #ifdef OLD
68 dispage(pag)
69 char *pag;
70 {
71         register i, n;
72         register off;
73         register short *ino = (short *) pag;
74
75         off = PBLKSIZ;
76         for (i = 1; i < ino[0]; i += 2) {
77                 printf("\t[%d]: ", ino[i]);
78                 for (n = ino[i]; n < off; n++)
79                         putchar(pag[n]);
80                 putchar(' ');
81                 off = ino[i];
82                 printf("[%d]: ", ino[i + 1]);
83                 for (n = ino[i + 1]; n < off; n++)
84                         putchar(pag[n]);
85                 off = ino[i + 1];
86                 putchar('\n');
87         }
88 }
89 #else
90 dispage(pag)
91 char *pag;
92 {
93         register i, n;
94         register off;
95         register short *ino = (short *) pag;
96
97         off = PBLKSIZ;
98         for (i = 1; i < ino[0]; i += 2) {
99                 for (n = ino[i]; n < off; n++)
100                         if (pag[n] != 0)
101                                 putchar(pag[n]);
102                 putchar('\t');
103                 off = ino[i];
104                 for (n = ino[i + 1]; n < off; n++)
105                         if (pag[n] != 0)
106                                 putchar(pag[n]);
107                 putchar('\n');
108                 off = ino[i + 1];
109         }
110 }
111 #endif