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