| 1252 | prev = node; |
| 1253 | node = node->parent; |
| 1254 | } |
| 1255 | /* Go up while we have a node that is reached from the right. */ |
| 1256 | while (node->right == prev || node->right == NULL); |
| 1257 | node = node->right; |
| 1258 | } |
| 1259 | } |
| 1260 | |
| 1261 | static reg_errcode_t |
| 1262 | preorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)), |
| 1263 | void *extra) |
| 1264 | { |
| 1265 | bin_tree_t *node; |
| 1266 | |
| 1267 | for (node = root; ; ) |
| 1268 | { |
| 1269 | reg_errcode_t err = fn (extra, node); |
| 1270 | if (BE (err != REG_NOERROR, 0)) |
| 1271 | return err; |
| 1272 | |
| 1273 | /* Go to the left node, or up and to the right. */ |
| 1274 | if (node->left) |
| 1275 | node = node->left; |
| 1276 | else |
| 1277 | { |
| 1278 | bin_tree_t *prev = NULL; |
| 1279 | while (node->right == prev || node->right == NULL) |
| 1280 | { |
| 1281 | prev = node; |
| 1282 | node = node->parent; |
| 1283 | if (!node) |
| 1284 | return REG_NOERROR; |
| 1285 | } |