示例#1
0
文件: sgftree.c 项目: Fierralin/gnugo
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;
}
示例#2
0
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;
}