// File: /workspace/github_c_makefile_star2_O2/trumabrat[P]GrandProjet/ArbreQuat.c
// Function: rechercheCreeNoeudArbre
Noeud *rechercheCreeNoeudArbre(Reseau *R, ArbreQuat **a, ArbreQuat *parent, double x, double y){
    if ((*a)==NULL){
        //On doit insérér le noeud x,y dans l'arbre ainsi que dans reseau

        //insertion dans le reseau
        R->nbNoeuds++;
        CellNoeud *new = (CellNoeud*) calloc(1, sizeof(CellNoeud));
        new->nd = creerNoeud(R->nbNoeuds, x, y);
        new->suiv = R->noeuds;
        R->noeuds = new;


        //insertion dans l'arbre
        insererNoeudArbre(new->nd, a, parent);

        return new->nd;
    }

    else{
        if ((*a)->noeud != NULL){
            if (fabs((*a)->noeud->x - x) < DOUBLE_PRECISION  && fabs((*a)->noeud->y - y) < DOUBLE_PRECISION){
                //Le noeud existe dans l'arbre et donc dans le réseau, on retourne le noeud
                return (*a)->noeud;
            }
            else{
                //Le noeud n'existe pas dans l'arbre car on est arrivé a une feuille et le if n'est pas vérifié.
                //On ajoute au réseau
                R->nbNoeuds++;
                CellNoeud *new = (CellNoeud*) calloc(1,sizeof(CellNoeud));
                new->nd = creerNoeud(R->nbNoeuds, x, y);
                new->suiv = R->noeuds;
                R->noeuds = new;

                //On ajoute dans l'arbre
                insererNoeudArbre(new->nd, a, parent);

                return new->nd;
            }
        }
        else{
            //On continue de chercher jusqu'a ce qu'on arrive a une feuille ou place libre
            //On doit déterminer dans lequel des enfants on doit chercher

            //cas sud-ouest
            if (x < (*a)->xc && y < (*a)->yc)
            {
                return rechercheCreeNoeudArbre(R, &((*a)->so), *a, x, y);
            }

            //cas sud-est
            if (x >= (*a)->xc && y < (*a)->yc){
               return rechercheCreeNoeudArbre(R, &((*a)->se), *a, x, y);
            }

            //cas nord-ouest
            if (x < (*a)->xc && y >= (*a)->yc){
                return rechercheCreeNoeudArbre(R, &((*a)->no), *a, x, y);
            }

            //cas nord-est
            if(x >= (*a)->xc && y >= (*a)->yc){
                return rechercheCreeNoeudArbre(R, &((*a)->ne), *a, x, y);
            }
        }
    }

    //Pour que le compilateur ne fait pas de pb, j'amais verifié
    return NULL;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x10, %rsp
movq %rsi, %r14
movq %rdi, %rbx
pushq $0x28
popq %rcx
pushq $0x38
popq %rsi
pushq $0x40
popq %rdi
pushq $0x30
popq %r8
movq %rdx, %r15
movq (%r14), %rdx
testq %rdx, %rdx
je 0x2afe
movq 0x20(%rdx), %rax
testq %rax, %rax
jne 0x2ac8
movsd (%rdx), %xmm3
ucomisd %xmm0, %xmm3
jbe 0x2a87
movsd 0x8(%rdx), %xmm2
ucomisd %xmm1, %xmm2
movq %rcx, %r14
ja 0x2ac3
ucomisd %xmm3, %xmm0
jb 0x2a9b
movsd 0x8(%rdx), %xmm2
ucomisd %xmm1, %xmm2
movq %r8, %r14
ja 0x2ac3
ucomisd %xmm0, %xmm3
jbe 0x2aab
ucomisd 0x8(%rdx), %xmm1
movq %rsi, %r14
jae 0x2ac3
ucomisd %xmm3, %xmm0
jb 0x2b54
ucomisd 0x8(%rdx), %xmm1
movq %rdi, %r14
jb 0x2b54
addq %rdx, %r14
jmp 0x2a57
movsd 0x8(%rax), %xmm2
subsd %xmm0, %xmm2
andpd 0x667(%rip), %xmm2      # 0x3140
movsd 0x66f(%rip), %xmm3      # 0x3150
ucomisd %xmm2, %xmm3
jbe 0x2afe
movsd 0x10(%rax), %xmm2
subsd %xmm1, %xmm2
andpd 0x648(%rip), %xmm2      # 0x3140
ucomisd %xmm2, %xmm3
ja 0x2b56
movl (%rbx), %ebp
incl %ebp
movl %ebp, (%rbx)
pushq $0x1
popq %rdi
pushq $0x10
popq %rsi
movsd %xmm1, 0x8(%rsp)
movsd %xmm0, (%rsp)
callq 0x10c0
movq %rax, %r12
movl %ebp, %edi
movsd (%rsp), %xmm0
movsd 0x8(%rsp), %xmm1
callq 0x1c7f
movq %rax, (%r12)
movq 0x8(%rbx), %rcx
movq %rcx, 0x8(%r12)
movq %r12, 0x8(%rbx)
movq %rax, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x27a2
movq (%r12), %rax
jmp 0x2b56
xorl %eax, %eax
addq $0x10, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq