void sgftreeCreateHeaderNode(SGFTree *tree, int boardsize, float komi, int handicap) { SGFNode *root = sgfNewNode(); sgfAddPropertyInt(root, "SZ", boardsize); sgfAddPropertyFloat(root, "KM", komi); sgfAddPropertyInt(root, "HA", handicap); tree->root = root; tree->lastnode = root; }
static SGFNodeP sequence(SGFNodeP n) { node(n); while (lookahead == ';') { SGFNodeP new_ = sgfNewNode(); new_->parent = n; n->child = new_; n = new_; node(n); } return n; }
static void gametree(SGFNodeP *p, SGFNodeP parent, int mode) { if (mode == STRICT) match('('); else for (;;) { if (lookahead == -1) { parse_error("Empty file?", 0); break; } if (lookahead == '(') { while (lookahead == '(') nexttoken(); if (lookahead == ';') break; } nexttoken(); } /* The head is parsed */ { SGFNodeP head = sgfNewNode(); SGFNodeP last; head->parent = parent; *p = head; last = sequence(head); p = &last->child; while (lookahead == '(') { gametree(p, last->parent, STRICT); p = &((*p)->next); } if (mode == STRICT) match(')'); } }