File: cdbstats.c

package info (click to toggle)
freecdb 0.62
  • links: PTS
  • area: main
  • in suites: sarge, woody
  • size: 116 kB
  • ctags: 90
  • sloc: ansic: 614; makefile: 91; sh: 12
file content (103 lines) | stat: -rw-r--r-- 2,529 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <stdio.h>
#include "freecdb.h"

#ifndef SEEK_SET
#define SEEK_SET 0
#endif

void format()
{
  fputs("cdbstats: fatal: bad database format\n",stderr);
  exit(1);
}

void readerror()
{
  if (ferror(stdin)) { perror("cdbstats: fatal: unable to read"); exit(111); }
  format();
}

char pointers[2048];
char buf[8];

int main()
{
  uint32_t pos;
  int i;
  uint32_t len;
  uint32_t slot;
  uint32_t records;
  uint32_t slots;
  uint32_t d0;
  uint32_t d1;
  uint32_t d2;
  uint32_t d3;
  uint32_t d4;
  uint32_t d5;
  uint32_t d6;
  uint32_t d7;
  uint32_t d8;
  uint32_t d9;
  uint32_t dfar;
  uint32_t h;
  uint32_t where;

  if (fread(pointers,1,2048,stdin) < 2048) readerror();
  pos = cdb_unpack(pointers);

  if (fseek(stdin,(unsigned long) pos,SEEK_SET) == -1) {
    perror("cdbstats: fatal: unable to seek");
    exit(111);
  }

  dfar = d9 = d8 = d7 = d6 = d5 = d4 = d3 = d2 = d1 = d0 = records = slots = 0;
  for (i = 0;i < 256;++i) {
    len = cdb_unpack(pointers + 8 * i + 4);
    slots += len;
    for (slot = 0;slot < len;++slot) {
      if (fread(buf,1,8,stdin) < 8) readerror();
      if (cdb_unpack(buf + 4)) {
	++records;
	h = cdb_unpack(buf);
	if ((h & 255) != i) format();
	where = (h >> 8) % len;
	if (where == slot) { ++d0; continue; }
	if (++where == len) where = 0;
	if (where == slot) { ++d1; continue; }
	if (++where == len) where = 0;
	if (where == slot) { ++d2; continue; }
	if (++where == len) where = 0;
	if (where == slot) { ++d3; continue; }
	if (++where == len) where = 0;
	if (where == slot) { ++d4; continue; }
	if (++where == len) where = 0;
	if (where == slot) { ++d5; continue; }
	if (++where == len) where = 0;
	if (where == slot) { ++d6; continue; }
	if (++where == len) where = 0;
	if (where == slot) { ++d7; continue; }
	if (++where == len) where = 0;
	if (where == slot) { ++d8; continue; }
	if (++where == len) where = 0;
	if (where == slot) { ++d9; continue; }
	++dfar;
      }
    }
  }

  printf("slots\t%9lu\n",(unsigned long) slots);
  printf("records\t%9lu\n",(unsigned long) records);
  printf("d0\t%9lu\n",(unsigned long) d0);
  printf("d1\t%9lu\n",(unsigned long) d1);
  printf("d2\t%9lu\n",(unsigned long) d2);
  printf("d3\t%9lu\n",(unsigned long) d3);
  printf("d4\t%9lu\n",(unsigned long) d4);
  printf("d5\t%9lu\n",(unsigned long) d5);
  printf("d6\t%9lu\n",(unsigned long) d6);
  printf("d7\t%9lu\n",(unsigned long) d7);
  printf("d8\t%9lu\n",(unsigned long) d8);
  printf("d9\t%9lu\n",(unsigned long) d9);
  printf(">9\t%9lu\n",(unsigned long) dfar);

  exit(0);
}