Initial commit of GNU Go v3.8.
[sgk-go] / patterns / mkmcpat.c
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* This is GNU Go, a Go program. Contact gnugo@gnu.org, or see *
* http://www.gnu.org/software/gnugo/ for more information. *
* *
* Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, *
* 2008 and 2009 by the Free Software Foundation. *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation - version 3 or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License in file COPYING for more details. *
* *
* You should have received a copy of the GNU General Public *
* License along with this program; if not, write to the Free *
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02111, USA. *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Compile Monte Carlo local pattern database. This produces mcpat.c. */
/* See also mc_*.db and engine/montecarlo.c. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "liberty.h"
/* Trim leading path, a possible mc_ prefix, and a possible .db suffix
* from the filename. The caller has to free the returned pointer when
* it's no longer needed.
*
* FIXME: This code is quite ugly and should be possible to clean up.
*/
static char *
copy_and_trim_name(const char *filename)
{
int name_length = strlen(filename);
char *name = malloc(name_length + 1);
char *start = name;
char *p;
char *name2;
strcpy(name, filename);
p = strrchr(name, '/');
if (p) {
p++;
name_length -= (p - name);
start = p;
}
if (strncmp(start, "mc_", 3) == 0) {
start += 3;
name_length -= 3;
}
if (strncmp(start + name_length - 3, ".db", 3) == 0)
start[name_length - 3] = '\0';
name2 = malloc(name_length + 1);
strcpy(name2, start);
free(name);
return name2;
}
int
main(int argc, char *argv[])
{
int N = mc_get_size_of_pattern_values_table();
unsigned int *values;
int i;
int k;
char *name;
if (argc < 2) {
fprintf(stderr, "Usage: ...\n");
exit(EXIT_FAILURE);
}
printf("\
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\\\n\
* This is GNU Go, a Go program. Contact gnugo@gnu.org, or see *\n\
* http://www.gnu.org/software/gnugo/ for more information. *\n\
* *\n\
* Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, *\n\
* 2008 and 2009 by the Free Software Foundation. *\n\
* *\n\
* This program is free software; you can redistribute it and/or *\n\
* modify it under the terms of the GNU General Public License as *\n\
* published by the Free Software Foundation - version 3 *\n\
* or (at your option) any later version *\n\
* *\n\
* This program is distributed in the hope that it will be useful, *\n\
* but WITHOUT ANY WARRANTY; without even the implied warranty of *\n\
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *\n\
* GNU General Public License in file COPYING for more details. *\n\
* *\n\
* You should have received a copy of the GNU General Public *\n\
* License along with this program; if not, write to the Free *\n\
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *\n\
* Boston, MA 02111, USA. *\n\
\\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n");
printf("/* This file is automatically generated by mkmcpat. Do not\n");
printf(" * edit it directly. Instead, edit the pattern databases\n");
printf(" * mc_*.db.\n");
printf(" */\n\n");
printf("#include <stdio.h> /* for NULL */\n");
printf("#include \"liberty.h\"\n\n");
printf("#include \"patterns.h\"\n\n");
values = malloc(N * sizeof(*values));
for (i = 1; i < argc; i++) {
if (!mc_load_patterns_from_db(argv[i], values))
exit(EXIT_FAILURE);
name = copy_and_trim_name(argv[i]);
printf("static const unsigned int %s_values[] = {\n", name);
for (k = 0; k < N; k++) {
printf("%u, ", values[k]);
if (k % 16 == 15)
printf("\n");
}
printf("\n};\n\n");
free(name);
}
printf("struct mc_pattern_database mc_pattern_databases[] = {\n");
for (i = 1; i < argc; i++) {
name = copy_and_trim_name(argv[i]);
printf(" {\"%s\", %s_values},\n", name, name);
free(name);
}
printf(" {NULL, NULL}};\n");
return 0;
}
/*
* Local Variables:
* tab-width: 8
* c-basic-offset: 2
* End:
*/