This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
make MULTICALL handle list context
[perl5.git] / ext / SDBM_File / dba.c
CommitLineData
463ee0b2
LW
1/*
2 * dba dbm analysis/recovery
3 */
4
5#include <stdio.h>
6#include <sys/file.h>
17f28c40 7#include "EXTERN.h"
463ee0b2
LW
8#include "sdbm.h"
9
10char *progname;
11extern void oops();
12
13int
ba106d47 14main(int argc, char **argv)
463ee0b2
LW
15{
16 int n;
17 char *p;
18 char *name;
19 int pagf;
20
21 progname = argv[0];
22
23 if (p = argv[1]) {
24 name = (char *) malloc((n = strlen(p)) + 5);
db7c17d7
GS
25 if (!name)
26 oops("cannot get memory");
27
463ee0b2
LW
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
39 return 0;
40}
41
ba106d47
GS
42void
43sdump(int pagf)
463ee0b2 44{
5aaab254
KW
45 int b;
46 int n = 0;
47 int t = 0;
48 int o = 0;
49 int e;
463ee0b2
LW
50 char pag[PBLKSIZ];
51
52 while ((b = read(pagf, pag, PBLKSIZ)) > 0) {
53 printf("#%d: ", n);
54 if (!okpage(pag))
55 printf("bad\n");
56 else {
57 printf("ok. ");
58 if (!(e = pagestat(pag)))
59 o++;
60 else
61 t += e;
62 }
63 n++;
64 }
65
66 if (b == 0)
67 printf("%d pages (%d holes): %d entries\n", n, o, t);
68 else
69 oops("read failed: block %d", n);
70}
71
ba106d47
GS
72int
73pagestat(char *pag)
463ee0b2 74{
5aaab254
KW
75 int n;
76 int free;
77 short *ino = (short *) pag;
463ee0b2
LW
78
79 if (!(n = ino[0]))
80 printf("no entries.\n");
81 else {
82 free = ino[n] - (n + 1) * sizeof(short);
83 printf("%3d entries %2d%% used free %d.\n",
84 n / 2, ((PBLKSIZ - free) * 100) / PBLKSIZ, free);
85 }
86 return n / 2;
87}