This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl 5.0 alpha 4
[perl5.git] / ext / dbm / sdbm / dbd.c
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