Confusing error from perl -e "x'"
[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>
7#include "sdbm.h"
8
9char *progname;
10extern void oops();
11
12int
13main(argc, argv)
14char **argv;
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);
25 strcpy(name, p);
26 strcpy(name + n, ".pag");
27
28 if ((pagf = open(name, O_RDONLY)) < 0)
29 oops("cannot open %s.", name);
30
31 sdump(pagf);
32 }
33 else
34 oops("usage: %s dbname", progname);
35
36 return 0;
37}
38
39sdump(pagf)
40int pagf;
41{
42 register b;
43 register n = 0;
44 register t = 0;
45 register o = 0;
46 register e;
47 char pag[PBLKSIZ];
48
49 while ((b = read(pagf, pag, PBLKSIZ)) > 0) {
50 printf("#%d: ", n);
51 if (!okpage(pag))
52 printf("bad\n");
53 else {
54 printf("ok. ");
55 if (!(e = pagestat(pag)))
56 o++;
57 else
58 t += e;
59 }
60 n++;
61 }
62
63 if (b == 0)
64 printf("%d pages (%d holes): %d entries\n", n, o, t);
65 else
66 oops("read failed: block %d", n);
67}
68
69pagestat(pag)
70char *pag;
71{
72 register n;
73 register free;
74 register short *ino = (short *) pag;
75
76 if (!(n = ino[0]))
77 printf("no entries.\n");
78 else {
79 free = ino[n] - (n + 1) * sizeof(short);
80 printf("%3d entries %2d%% used free %d.\n",
81 n / 2, ((PBLKSIZ - free) * 100) / PBLKSIZ, free);
82 }
83 return n / 2;
84}