// File: /workspace/github_c_makefile_star2_O0/CarlosLunaMota[P]BinaryTrees/BinaryTrees.c
// Function: rb_tree_copy
rb_tree *rb_tree_copy(const rb_tree *tree) {

    rb_tree *new_tree = NULL;
    rb_node *pred;
    rb_node *node;
    void    *data;
    
    // Sanity check:
    assert(tree != NULL);
    
    // Create a new tree:
    new_tree = new_rb_tree(tree->comp);
    if (new_tree == NULL) { return NULL; }

    // Go to the smallest element of tree while right-threading your path:
    node = tree->root;
    if (node != NULL) {
        while (node->left != NULL) {
            pred = node->left;
            while (pred->right != NULL) { pred = pred->right; }
            pred->right = node;
            node        = node->left;
        }
    }

    // Insert all data from tree into new_tree:
    while (node != NULL) {

        // insert node->data in new_tree ///////////////////////////////////////
        data = node->data;
        data = rb_tree_insert_max(new_tree, data);
        assert(data == NULL);
        ////////////////////////////////////////////////////////////////////////

        // advance node ////////////////////////////////////////////////////////
        node = node->right;
        if (node != NULL) {
            while (node->left != NULL) {
                pred = node->left;
                while (pred->right != NULL && pred->right != node) {
                    pred = pred->right;
                }
                if (pred->right == NULL) {
                    pred->right = node;
                    node        = node->left;
                } else {
                    pred->right = NULL;
                    break;
                }
            }
        }
        ////////////////////////////////////////////////////////////////////////
    }
    
    // Return the new_tree:
    return new_tree;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movq $0x0, -0x18(%rbp)
cmpq $0x0, -0x10(%rbp)
je 0xfeed
jmp 0xff0c
leaq 0x637e(%rip), %rdi      # 0x16272
leaq 0x6301(%rip), %rsi      # 0x161fc
movl $0x8c7, %edx            # imm = 0x8C7
leaq 0x682b(%rip), %rcx      # 0x16732
callq 0x1060
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0xfe40
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0xff31
movq $0x0, -0x8(%rbp)
jmp 0x10092
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0xff91
jmp 0xff45
movq -0x28(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0xff8f
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xff75
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0xff5c
movq -0x28(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0xff45
jmp 0xff91
jmp 0xff93
cmpq $0x0, -0x28(%rbp)
je 0x1008a
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x100a0
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
jne 0xffc3
jmp 0xffe2
leaq 0x678f(%rip), %rdi      # 0x16759
leaq 0x622b(%rip), %rsi      # 0x161fc
movl $0x8de, %edx            # imm = 0x8DE
leaq 0x6755(%rip), %rcx      # 0x16732
callq 0x1060
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x10085
jmp 0xfffb
movq -0x28(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x10083
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rcx
xorl %eax, %eax
cmpq $0x0, 0x10(%rcx)
movb %al, -0x31(%rbp)
je 0x10034
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
cmpq -0x28(%rbp), %rax
setne %al
movb %al, -0x31(%rbp)
movb -0x31(%rbp), %al
testb $0x1, %al
jne 0x1003d
jmp 0x1004b
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x10012
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
jne 0x10070
movq -0x28(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x1007e
movq -0x20(%rbp), %rax
movq $0x0, 0x10(%rax)
jmp 0x10083
jmp 0xfffb
jmp 0x10085
jmp 0xff93
movq -0x18(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x40, %rsp
popq %rbp
retq
nopl (%rax)