GNU Shogi 1.1.pl01
[gnushogi.git] / src / gdxbkstats.c
blob2b19635d11d0fc3ec133a0353f6145b05a5641db
1 #include <stdio.h>
2 #include <fcntl.h>
3 #include "gnushogi.h"
4 #undef rxx
5 #undef cxx
6 #undef scanz
7 #undef printz
9 #define rxx "ihgfedcba"
10 #define cxx "987654321"
12 static char pchar[NO_PIECES] =
13 { 'P','L','N','S','G','B','R','P','L','N','S','B','R','K' };
15 char xmvstr[12];
18 char *
19 cvt (m,flags)
20 unsigned int m;
21 short flags;
23 unsigned int f, t;
24 short piece = 0, flag = 0;
25 char *s;
26 f = m >> 8 & 0x7f;
27 t = m & 0xff;
28 /* algebraic notation */
29 if ( f > NO_SQUARES )
30 { short piece = f - NO_SQUARES;
31 if ( f > NO_PIECES ) f -= NO_PIECES;
32 flag = (dropmask | piece );
34 if ( t & 0x80 )
36 flag |= promote;
37 t &= 0x7f;
39 s = xmvstr;
40 if ( flag & dropmask )
42 *s = pchar[piece]; s++;
43 *s = '*'; s++;
44 *s = cxx[column (t)]; s++;
45 *s = rxx[row (t)]; s++;
47 else
49 *s = cxx[column (f)]; s++;
50 *s = rxx[row (f)]; s++;
51 *s = cxx[column (t)]; s++;
52 *s = rxx[row (t)]; s++;
53 if ( flag & promote )
55 *s = '+'; s++;
58 if (m & DONTUSE)
60 *s = '?'; s++;
62 if (flags & LASTMOVE)
64 *s = '.'; s++;
66 *s = '\0';
67 return xmvstr;
70 /* #define lts(x) (x>>16) */ /* long to short to convert hashkey to short */
72 #ifdef LONG64
73 #define lts(x) (((x>>48)&0xfffe)|(x&0x1))
74 #else
75 #define lts(x) (((x>>16)&0xfffe)|(x&0x1))
76 #endif
78 int gfd;
79 struct gdxadmin
81 unsigned int bookcount;
82 unsigned int booksize;
83 unsigned long maxoffset;
84 } ADMIN;
86 #define N 2
87 struct gdxdata
89 unsigned int hashbd;
90 unsigned short hashkey;
91 unsigned short bmove;
92 unsigned short flags;
93 unsigned short hint;
94 unsigned short count;
95 } DATA;
96 void
97 usage (char *x)
99 printf ("usage %s binbookfile [ -h key bd]\n", x);
100 exit ();
103 int i;
104 int c1 = 0;
105 int in = 0;
106 int max = -9999;
107 int min = 9999999;
108 int n = 0;
109 int sum = 0;
110 int sumc = 0;
111 unsigned long key, bd;
112 int hk = false;
113 main (argc, argv)
114 int argc;
115 char **argv;
117 if (argc == 5)
119 if (strcmp (argv[2], "-h") != 0)
120 usage (argv[0]);
121 key = strtol (argv[3], NULL, 16);
122 bd = strtol (argv[4], NULL, 16);
123 hk = true;
125 else if (argc != 2)
126 usage (argv[0]);
127 gfd = open (argv[1], O_RDONLY);
128 if (gfd >= 0)
130 read (gfd, &ADMIN, sizeof (struct gdxadmin));
131 printf ("entrysize %d\nbooksize %d\nbookcount %d\nmaxoffset %ld\n", sizeof (struct gdxdata), ADMIN.booksize, ADMIN.bookcount, ADMIN.maxoffset);
132 for (i = 0; i < ADMIN.booksize; i++)
134 if (0 > read (gfd, &DATA, sizeof (struct gdxdata)))
136 perror ("fread");
137 exit (1);
139 if (hk)
141 #if 1
142 if (DATA.count)
144 printf ("bd = %ld key = %ld: ",DATA.hashbd,DATA.hashkey);
145 #else
146 if (DATA.count && DATA.hashbd == bd && lts (key) == DATA.hashkey)
148 #endif
149 printf ("%s ", cvt (DATA.bmove,DATA.flags));
150 printf ("%s ", cvt (DATA.hint,0));
151 printf ("%d\n", DATA.count);
154 if (in && DATA.bmove)
156 c1++;
158 else if (DATA.bmove)
160 in = 1;
161 c1 = 1;
163 else if (c1)
165 /*printf ("out %d\n", c1);*/
166 n++;
167 if (c1 < min)
168 min = c1;
169 if (c1 > max)
170 max = c1;
171 sum += c1;
172 c1 = 0;
173 in = 0;
176 close (gfd);
177 if (in)
179 /*printf ("out %d\n", c1);*/
180 n++;
181 if (c1 < min)
182 min = c1;
183 if (c1 > max)
184 max = c1;
185 sum += c1;
187 printf ("max %d\nmin %d\navg %f\nsumc %d\n", max, min, (float) sum / (float) n, sumc);