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