|
1 #include "uint32.h" |
|
2 #include "fmt.h" |
|
3 #include "buffer.h" |
|
4 #include "strerr.h" |
|
5 #include "seek.h" |
|
6 #include "cdb.h" |
|
7 |
|
8 #define FATAL "cdbtest: fatal: " |
|
9 |
|
10 void die_read(void) |
|
11 { |
|
12 strerr_die2sys(111,FATAL,"unable to read input: "); |
|
13 } |
|
14 void die_write(void) |
|
15 { |
|
16 strerr_die2sys(111,FATAL,"unable to write output: "); |
|
17 } |
|
18 void put(char *buf,unsigned int len) |
|
19 { |
|
20 if (buffer_put(buffer_1small,buf,len) == -1) die_write(); |
|
21 } |
|
22 void putflush(void) |
|
23 { |
|
24 if (buffer_flush(buffer_1small) == -1) die_write(); |
|
25 } |
|
26 |
|
27 uint32 pos = 0; |
|
28 |
|
29 void get(char *buf,unsigned int len) |
|
30 { |
|
31 int r; |
|
32 while (len > 0) { |
|
33 r = buffer_get(buffer_0,buf,len); |
|
34 if (r == -1) die_read(); |
|
35 if (r == 0) |
|
36 strerr_die2x(111,FATAL,"unable to read input: truncated file"); |
|
37 pos += r; |
|
38 buf += r; |
|
39 len -= r; |
|
40 } |
|
41 } |
|
42 |
|
43 void getnum(uint32 *num) |
|
44 { |
|
45 char buf[4]; |
|
46 get(buf,4); |
|
47 uint32_unpack(buf,num); |
|
48 } |
|
49 |
|
50 char strnum[FMT_ULONG]; |
|
51 |
|
52 void putnum(char *label,unsigned long count) |
|
53 { |
|
54 put(label,str_len(label)); |
|
55 put(strnum,fmt_ulong(strnum,count)); |
|
56 put("\n",1); |
|
57 } |
|
58 |
|
59 char key[1024]; |
|
60 |
|
61 unsigned long numuntested = 0; |
|
62 unsigned long numnotfound = 0; |
|
63 unsigned long numotherpos = 0; |
|
64 unsigned long numbadlen = 0; |
|
65 unsigned long numfound = 0; |
|
66 |
|
67 static struct cdb c; |
|
68 |
|
69 main() |
|
70 { |
|
71 uint32 eod; |
|
72 uint32 klen; |
|
73 uint32 dlen; |
|
74 seek_pos rest; |
|
75 int r; |
|
76 |
|
77 cdb_init(&c,0); |
|
78 |
|
79 getnum(&eod); |
|
80 while (pos < 2048) getnum(&dlen); |
|
81 |
|
82 while (pos < eod) { |
|
83 getnum(&klen); |
|
84 getnum(&dlen); |
|
85 if (klen > sizeof key) { |
|
86 ++numuntested; |
|
87 while (klen) { get(key,1); --klen; } |
|
88 } |
|
89 else { |
|
90 get(key,klen); |
|
91 rest = seek_cur(0); |
|
92 switch(cdb_find(&c,key,klen)) { |
|
93 case -1: |
|
94 die_read(); |
|
95 case 0: |
|
96 ++numnotfound; |
|
97 break; |
|
98 default: |
|
99 if (cdb_datapos(&c) != pos) |
|
100 ++numotherpos; |
|
101 else |
|
102 if (cdb_datalen(&c) != dlen) |
|
103 ++numbadlen; |
|
104 else |
|
105 ++numfound; |
|
106 } |
|
107 if (seek_set(0,rest) == -1) die_read(); |
|
108 } |
|
109 while (dlen) { get(key,1); --dlen; } |
|
110 } |
|
111 |
|
112 putnum("found: ",numfound); |
|
113 putnum("different record: ",numotherpos); |
|
114 putnum("bad length: ",numbadlen); |
|
115 putnum("not found: ",numnotfound); |
|
116 putnum("untested: ",numuntested); |
|
117 putflush(); |
|
118 _exit(0); |
|
119 } |