pachi_py/pachi/joseki/base.c (71 lines of code) (raw):
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#define DEBUG
#include "board.h"
#include "debug.h"
#include "move.h"
#include "joseki/base.h"
struct joseki_dict *
joseki_init(int bsize)
{
struct joseki_dict *jd = calloc(1, sizeof(*jd));
jd->bsize = bsize;
jd->patterns = calloc(1 << joseki_hash_bits, sizeof(jd->patterns[0]));
return jd;
}
struct joseki_dict *
joseki_load(int bsize)
{
char fname[1024];
snprintf(fname, 1024, "joseki%d.pdict", bsize - 2);
FILE *f = fopen(fname, "r");
if (!f) {
if (DEBUGL(3))
perror(fname);
return NULL;
}
struct joseki_dict *jd = joseki_init(bsize);
char linebuf[1024];
while (fgets(linebuf, 1024, f)) {
char *line = linebuf;
while (isspace(*line)) line++;
if (*line == '#')
continue;
hash_t h = strtoull(line, &line, 16);
while (isspace(*line)) line++;
enum stone color = *line++ == 'b' ? S_BLACK : S_WHITE;
while (isspace(*line)) line++;
/* Get count. */
char *cs = strrchr(line, ' '); assert(cs);
*cs++ = 0;
int count = atoi(cs);
coord_t **ccp = &jd->patterns[h].moves[color - 1];
assert(!*ccp);
*ccp = calloc2(count + 1, sizeof(coord_t));
coord_t *cc = *ccp;
while (*line) {
assert(cc - *ccp < count);
coord_t *c = str2coord(line, bsize);
*cc++ = *c;
coord_done(c);
line += strcspn(line, " ");
line += strspn(line, " ");
}
*cc = pass;
}
fclose(f);
if (DEBUGL(2))
fprintf(stderr, "Joseki dictionary for board size %d loaded.\n", bsize - 2);
return jd;
}
void
joseki_done(struct joseki_dict *jd)
{
if (!jd) return;
for( unsigned long pid = 0; pid < 1<<joseki_hash_bits ; pid++){
free(jd->patterns[pid].moves[0]);
free(jd->patterns[pid].moves[1]);
}
free(jd->patterns);
free(jd);
}