529 ptrdiff_t loc_children, |
529 ptrdiff_t loc_children, |
530 ptrdiff_t loc_last_child, |
530 ptrdiff_t loc_last_child, |
531 ptrdiff_t loc_prev, |
531 ptrdiff_t loc_prev, |
532 ptrdiff_t loc_next |
532 ptrdiff_t loc_next |
533 ) { |
533 ) { |
|
534 // iter not valid? cancel... |
|
535 if (!iter->valid(iter)) return 0; |
|
536 |
534 size_t processed = 0; |
537 size_t processed = 0; |
535 void *current_node = *root; |
538 void *current_node = *root; |
|
539 void *elem; |
|
540 |
|
541 // if there is no root, yet - process the first node from the iter |
|
542 // as the new root node |
|
543 if (current_node == NULL) { |
|
544 elem = *(void **) (iter->current(iter)); |
|
545 // no node in tree, yet - add a new one |
|
546 current_node = cfunc(elem, NULL, cdata); |
|
547 // node creation failed - stop processing |
|
548 if (current_node == NULL) return 0; |
|
549 cx_tree_zero_pointers(current_node, cx_tree_ptr_locations); |
|
550 *root = current_node; |
|
551 processed++; |
|
552 iter->next(iter); |
|
553 } |
|
554 |
536 for (void **eptr; |
555 for (void **eptr; |
537 iter->valid(iter) && (eptr = iter->current(iter)) != NULL; |
556 iter->valid(iter) && (eptr = iter->current(iter)) != NULL; |
538 iter->next(iter)) { |
557 iter->next(iter)) { |
539 void *elem = *eptr; |
558 elem = *eptr; |
540 |
|
541 if (current_node == NULL) { |
|
542 // no node in tree, yet - add a new one |
|
543 current_node = cfunc(elem, NULL, cdata); |
|
544 // node creation failed - stop processing |
|
545 if (current_node == NULL) { |
|
546 // but honestly... nothing should have been processed |
|
547 assert(processed == 0); |
|
548 return 0; |
|
549 } |
|
550 cx_tree_zero_pointers(current_node, cx_tree_ptr_locations); |
|
551 *root = current_node; |
|
552 processed++; |
|
553 continue; |
|
554 } |
|
555 |
559 |
556 // start searching from current node |
560 // start searching from current node |
557 void *match; |
561 void *match; |
558 int result; |
562 int result; |
559 unsigned int look_around_retries = cx_tree_add_look_around_depth; |
563 unsigned int look_around_retries = cx_tree_add_look_around_depth; |