integrate cfgperl changes into mainline
[p5sagit/p5-mst-13.2.git] / ext / SDBM_File / sdbm / dba.c
CommitLineData
463ee0b2 1/*
2 * dba dbm analysis/recovery
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
13int
14main(argc, argv)
15char **argv;
16{
17 int n;
18 char *p;
19 char *name;
20 int pagf;
21
22 progname = argv[0];
23
24 if (p = argv[1]) {
25 name = (char *) malloc((n = strlen(p)) + 5);
26 strcpy(name, p);
27 strcpy(name + n, ".pag");
28
29 if ((pagf = open(name, O_RDONLY)) < 0)
30 oops("cannot open %s.", name);
31
32 sdump(pagf);
33 }
34 else
35 oops("usage: %s dbname", progname);
36
37 return 0;
38}
39
40sdump(pagf)
41int pagf;
42{
43 register b;
44 register n = 0;
45 register t = 0;
46 register o = 0;
47 register e;
48 char pag[PBLKSIZ];
49
50 while ((b = read(pagf, pag, PBLKSIZ)) > 0) {
51 printf("#%d: ", n);
52 if (!okpage(pag))
53 printf("bad\n");
54 else {
55 printf("ok. ");
56 if (!(e = pagestat(pag)))
57 o++;
58 else
59 t += e;
60 }
61 n++;
62 }
63
64 if (b == 0)
65 printf("%d pages (%d holes): %d entries\n", n, o, t);
66 else
67 oops("read failed: block %d", n);
68}
69
70pagestat(pag)
71char *pag;
72{
73 register n;
74 register free;
75 register short *ino = (short *) pag;
76
77 if (!(n = ino[0]))
78 printf("no entries.\n");
79 else {
80 free = ino[n] - (n + 1) * sizeof(short);
81 printf("%3d entries %2d%% used free %d.\n",
82 n / 2, ((PBLKSIZ - free) * 100) / PBLKSIZ, free);
83 }
84 return n / 2;
85}