// File: /workspace/github_c_makefile_star2_O1/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 %rdx, %r15
movq %rsi, %r14
movq %rdi, %rbx
movq (%r14), %rcx
testq %rcx, %rcx
je 0x2ff8
movq 0x20(%rcx), %rax
testq %rax, %rax
jne 0x2fc2
movsd (%rcx), %xmm3
ucomisd %xmm0, %xmm3
jbe 0x2f71
movsd 0x8(%rcx), %xmm2
ucomisd %xmm1, %xmm2
jbe 0x2f71
leaq 0x28(%rcx), %r14
movq %rcx, %r15
jmp 0x2f3e
ucomisd %xmm3, %xmm0
jb 0x2f8b
movsd 0x8(%rcx), %xmm2
ucomisd %xmm1, %xmm2
jbe 0x2f8b
leaq 0x30(%rcx), %r14
movq %rcx, %r15
jmp 0x2f3e
ucomisd %xmm0, %xmm3
jbe 0x2f98
ucomisd 0x8(%rcx), %xmm1
jae 0x2fb6
ucomisd %xmm3, %xmm0
jb 0x3052
ucomisd 0x8(%rcx), %xmm1
jb 0x3052
leaq 0x40(%rcx), %r14
movq %rcx, %r15
jmp 0x2f3e
leaq 0x38(%rcx), %r14
movq %rcx, %r15
jmp 0x2f3e
movsd 0x8(%rax), %xmm2
subsd %xmm0, %xmm2
andpd 0x115d(%rip), %xmm2     # 0x4130
movsd 0x1165(%rip), %xmm3     # 0x4140
ucomisd %xmm2, %xmm3
jbe 0x2ff8
movsd 0x10(%rax), %xmm2
subsd %xmm1, %xmm2
andpd 0x113e(%rip), %xmm2     # 0x4130
ucomisd %xmm2, %xmm3
ja 0x3054
movl (%rbx), %ebp
incl %ebp
movl %ebp, (%rbx)
movl $0x1, %edi
movl $0x10, %esi
movsd %xmm1, 0x8(%rsp)
movsd %xmm0, (%rsp)
callq 0x10c0
movq %rax, %r12
movl %ebp, %edi
movsd (%rsp), %xmm0
movsd 0x8(%rsp), %xmm1
callq 0x1e74
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 0x2b34
movq (%r12), %rax
jmp 0x3054
xorl %eax, %eax
addq $0x10, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq