#include "declarations.h"

liste *fonction_multiplication(liste *nombre1, liste *nombre2)
{
    str_chiffre *ptr_nb1;                 //pour le nombre 1 
    str_chiffre *ptr_nb2;                 //pour le nombre 2
    str_chiffre *ptr_rslt_temp;                 //pour le resultat_temp 
    str_chiffre *ptr_rslt_final;                 //pour le resultat_final 

    liste *resultat_final;
    liste *resultat_temp;

    char T_Q = 'T';                     //la multiplication normale de deux nombres ce fait en tete

    int nb_tmp;                         //indispensable pour le calcul des retenueS!
    int decalage=0;                     //nombre de zeros à décaler
    int i ;                           //compteur de boucle

////////////////////    [ CREATION DU NOMBRE "RESULTAT" ]    /////////////////////////////
    if(nombre1->longueur > nombre2->longueur)                                           //
       resultat_final = fonction_creation_nombre_vide (nombre1->longueur);              //
    else                                                                                //
       resultat_final = fonction_creation_nombre_vide (nombre2->longueur);              //
                                                                                        //
    resultat_final->signe = '+';                                                        //une multiplication de base donnera un signe '+'
//////////////////////////////////////////////////////////////////////////////////////////


/// ///////////////////////////////       [ BOUCLE DU NOMBRE2 ]         ////////////////////////////////
    ptr_nb2 = nombre2->queue;
    do
    {

////////////////////    [ CREATION DU NOMBRE "RESULTAT_TEMP"  ]    ///////////////
        if(nombre1->longueur > nombre2->longueur)                               //
           resultat_temp = fonction_creation_nombre_vide (nombre1->longueur);   //
        else                                                                    //
           resultat_temp = fonction_creation_nombre_vide (nombre2->longueur);   //
                                                                                //
        resultat_temp->signe = '+';                                             //une multiplication de base donnera un signe '+'
//////////////////////////////////////////////////////////////////////////////////


    //////////////     INITIALISATION DES POINTEURS       ////////
        ptr_nb1 = nombre1->queue;                                 // Le pointeur sur le nombre2
        ptr_rslt_temp = resultat_temp->queue;                           // n'est pas à réinitialisé, la boucle de
        ptr_rslt_final = resultat_final->queue;                          // ce nombre n'est pas finie
    //////////////////////////////////////////////////////////////


    //////////////     DECALAGE D'UN ZERO       //////////
        for(i=0 ; i<decalage ; i++)               //
        {                                               //
            ptr_rslt_temp->chiffre = 0;                         //
            ptr_rslt_temp = ptr_rslt_temp->prec;                        //
        }                                               //
    //////////////////////////////////////////////////////


        //////////////     BOUCLE DU 1er NOMBRE       ////////////////////////////////
        do                                                                          //
        {                                                                           //
            ptr_rslt_temp->chiffre = ptr_rslt_temp->chiffre + (ptr_nb1->chiffre * ptr_nb2->chiffre);    //

            if (ptr_rslt_temp->prec == NULL)                                                //cas où la DERNIERE RETENUE EST EN TETE de liste
            {fonction_creation_cellule(resultat_temp,0,T_Q);}                     //création d'une cellule en tete                                                        //

            if (ptr_rslt_temp->chiffre >= 10)                                               // cas ou il y a une retenue
            {                                                                       //
            nb_tmp = ptr_rslt_temp->chiffre;                                                  // on recopie le resultat dans une variable temporaire
            ptr_rslt_temp->chiffre = (ptr_rslt_temp->chiffre) % 10;                                 // en prenant modulo 10 d'un nombre on ne lui laisse que les unité >>Ex :64 deviendra 4
            ptr_rslt_temp->prec->chiffre = nb_tmp/10;                                       // divise nb_tmp par 10
            }                                                                       //
                                                                                    //
            ptr_nb1 = ptr_nb1->prec;                                                    //
            ptr_rslt_temp = ptr_rslt_temp->prec;                                                    //
        } while (ptr_nb1!=NULL && ptr_rslt_temp!=NULL);                                       //
        //////////////////////////////////////////////////////////////////////////////


        //////////////     AJOUT DU RESULTAT_TEMP AU RESULTAT_FINAL       ////////////
        resultat_final = fonction_addition(resultat_final , resultat_temp);         //
        //////////////////////////////////////////////////////////////////////////////

        decalage ++ ;

        ptr_nb2 = ptr_nb2->prec;
     } while (ptr_nb2!=NULL);

        //////////////     DETERMINATION DU SIGNE      ////////////////////////
if (nombre1->signe == '-' || nombre2->signe == '-')                         //
{                                                                           //
    resultat_final->signe = '-';                                            //
    if (nombre1->signe == '-' && nombre2->signe == '-')                     //
            resultat_final->signe = '+';                                    //
}                                                                           //
        //////////////////////////////////////////////////////////////////////

/// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////


return resultat_final ;
}
