int sgftree_readfile(SGFTree *tree, const char *infilename) { SGFNode *savetree = tree->root; tree->root = readsgffile(infilename); if (tree->root == NULL) { tree->root = savetree; return 0; } sgfFreeNode(savetree); tree->lastnode = NULL; return 1; }
hex_t hex_load_sgf (hex_format_t format, char * filename) { hex_t hex; char * size_str; SGFNode * root; SGFNode * node; if ((root = readsgffile (filename)) == NULL) return NULL; if (! sgfGetCharProperty (root, "SZ", &size_str)) return NULL; hex = hex_new (atoi (size_str)); for (node = root->child; node != NULL; node = node->child) { uint i, x; char * move; char * prop_name; /* Swap isn't supported yet */ switch (format) { case HEX_AUTO: if (sgfGetCharProperty (node, "W ", &move)) format = HEX_LG_SGF; else if (sgfGetCharProperty (node, "B ", &move)) format = HEX_SGF; else return NULL; break; case HEX_SGF: sgfGetCharProperty (node, hex_get_player (hex) == 1 ? "B " : "W ", &move); if (! (strcmp ("swap-sides", move) || strcmp ("swap-pieces", move))) return NULL; if (! strcmp ("resign", move)) goto end; break; case HEX_LG_SGF: sgfGetCharProperty (node, hex_get_player (hex) == 1 ? "W " : "B ", &move); if (! strcmp ("swap", move)) return NULL; if (! strcmp ("resign", move)) goto end; break; default: return NULL; } errno = 0; i = hex_decode_sgf_pos (move[0]); if (errno || i >= hex->size) return NULL; if (format == HEX_SGF) x = atoi (move+1); else if (format == HEX_LG_SGF) x = hex_decode_sgf_pos (move[1]); if (errno || x >= hex->size) return NULL; hex_move (hex, i, hex->size-x-1); } end: sgfFreeNode (root); return hex; }