int ct_bintree_insert(node_t **rootaddr, PyObject *key, PyObject *value) { int cval; node_t *parent = NULL; while (1) { node_t *root = *rootaddr; if (root == NULL) { node_t *node = ct_new_node(parent, key, value, 0); if (node == NULL) return -1; *rootaddr = node; return 1; } cval = ct_compare(key, KEY(root)); if (cval < 0) { // use left tree rootaddr = &LEFT_NODE(root); } else if (cval > 0) { rootaddr = &RIGHT_NODE(root); } else { /* key exists, replace value object? no! */ // Py_XDECREF(VALUE(root)); /* release old value object */ // VALUE(root) = value; /* set new value object */ // Py_INCREF(value); /* take new value object */ return 0; } parent = root; } }
extern int ct_bintree_insert(node_t **rootaddr, PyObject *key, PyObject *value) { node_t *parent, *node; int direction, cval; node = *rootaddr; if (node == NULL) { node = ct_new_node(key, value, 0); if (node == NULL) return -1; *rootaddr = node; } else { direction = LEFT; parent = NULL; while (1) { if (node == NULL) { node = ct_new_node(key, value, 0); if (node == NULL) return -1; LINK(parent, direction) = node; return 1; } cval = ct_compare(key, KEY(node)); if (cval == 0) { Py_XDECREF(VALUE(node)); VALUE(node) = value; Py_INCREF(value); return 0; } else { parent = node; direction = (cval < 0) ? LEFT : RIGHT; node = LINK(node, direction); } } } return 1; }