rem: total_partie = total_partie + montant; nb_ope_partie_etat++;
context: void etape_finale_affichage_etat ( GSList *ope_selectionnees,				   struct struct_etat_affichage *affichage){    GSList *liste_ope_revenus;    GSList *liste_ope_depenses;    GSList *pointeur_tmp;    gint i;    gint ligne;    gdouble total_partie;    gdouble total_general;    gchar *decalage_base;    gchar *decalage_categ;    gchar *decalage_sous_categ;    gchar *decalage_ib;    gchar *decalage_sous_ib;    gchar *decalage_compte;    gchar *decalage_tiers;    GList *pointeur_glist;    /*   soit on sépare en revenus et dépenses, soit non */    liste_ope_revenus = NULL;    liste_ope_depenses = NULL;    pointeur_tmp = ope_selectionnees;    pointeur_glist = etat_courant -> type_classement;    if ( etat_courant -> separer_revenus_depenses )    {	/* on commence par séparer la liste revenus et de dépenses */	/*   si le classement racine est la catégorie, on sépare par catégorie */	/* de revenu ou de dépense */	/* si c'est un autre, on sépare par montant positif ou négatif */	while ( pointeur_tmp )	{	    struct structure_operation *operation;	    operation = pointeur_tmp -> data;	    if ( GPOINTER_TO_INT ( pointeur_glist -> data ) == 1 )	    {		/* le classement racine est la catégorie */		/* s'il n'y a pas de catég, c'est un virement ou une ventilation */		/*       dans ce cas, on classe en fonction du montant */		if ( operation -> categorie )		{		    struct struct_categ *categ;		    categ = categ_par_no ( operation -> categorie );		    if ( categ -> type_categ )			liste_ope_depenses = g_slist_append ( liste_ope_depenses,							      operation );		    else			liste_ope_revenus = g_slist_append ( liste_ope_revenus,							     operation );		}		else		{		    if ( operation -> montant < 0 )			liste_ope_depenses = g_slist_append ( liste_ope_depenses,							      operation );		    else			liste_ope_revenus = g_slist_append ( liste_ope_revenus,							     operation );		}	    }	    else	    {		/* le classement racine n'est pas la catég, on sépare en fonction du montant */		if ( operation -> montant < 0 )		    liste_ope_depenses = g_slist_append ( liste_ope_depenses,							  operation );		else		    liste_ope_revenus = g_slist_append ( liste_ope_revenus,							 operation );	    }	    pointeur_tmp = pointeur_tmp -> next;	}    }    else	/*     on ne veut pas séparer en revenus et dépenses, on garde juste la liste d'opé telle quelle */	liste_ope_revenus = ope_selectionnees;    /* on va maintenant classer ces 2 listes dans l'ordre adéquat */    liste_ope_depenses = g_slist_sort ( liste_ope_depenses,					(GCompareFunc) classement_liste_opes_etat );    liste_ope_revenus = g_slist_sort ( liste_ope_revenus,				       (GCompareFunc) classement_liste_opes_etat );    /* calcul du décalage pour chaque classement */    /* c'est une chaine vide qu'on ajoute devant le nom du */    /*   classement ( tiers, ib ...) */    /* on met 2 espaces par décalage */    /*   normalement, pointeur_glist est déjà positionné */    decalage_base = "";    /*   pour éviter le warning lors de la compilation, on met */    /* toutes les var char à "" */    decalage_categ = "";    decalage_sous_categ = "";    decalage_ib = "";    decalage_sous_ib = "";    decalage_compte = "";    decalage_tiers = "";    while ( pointeur_glist )    {	switch ( GPOINTER_TO_INT ( pointeur_glist -> data ))	{	    /* décalage de la catégorie */	    case 1:		if ( etat_courant -> utilise_categ )		    decalage_categ = g_strconcat ( decalage_base,						   "    ",						   NULL );		else		{		    decalage_categ = decalage_base;		    goto pas_decalage;		}		break;		/* décalage de la ss-catégorie */	    case 2:		if ( etat_courant -> utilise_categ		     &&		     etat_courant -> afficher_sous_categ )		    decalage_sous_categ = g_strconcat ( decalage_base,							"    ",							NULL );		else		{		    decalage_sous_categ = decalage_base;		    goto pas_decalage;		}		break;		/* décalage de l'ib */	    case 3:		if ( etat_courant -> utilise_ib )		    decalage_ib = g_strconcat ( decalage_base,						"    ",						NULL );		else		{		    decalage_ib = decalage_base;		    goto pas_decalage;		}		break;		/* décalage de la ss-ib */	    case 4:		if ( etat_courant -> utilise_ib		     &&		     etat_courant -> afficher_sous_ib )		    decalage_sous_ib = g_strconcat ( decalage_base,						     "    ",						     NULL );		else		{		    decalage_sous_ib = decalage_base;		    goto pas_decalage;		}		break;		/* décalage du compte */	    case 5:		if ( etat_courant -> regroupe_ope_par_compte )		    decalage_compte = g_strconcat ( decalage_base,						    "    ",						    NULL );		else		{		    decalage_compte = decalage_base;		    goto pas_decalage;		}		break;		/* décalage du tiers */	    case 6:		if ( etat_courant -> utilise_tiers )		    decalage_tiers = g_strconcat ( decalage_base,						   "    ",						   NULL );		else		{		    decalage_tiers = decalage_base;		    goto pas_decalage;		}		break;	}	decalage_base = g_strconcat ( decalage_base,				      "    ",				      NULL );pas_decalage:	pointeur_glist = pointeur_glist -> next;    }    /*   calcul du nb de colonnes : */    /* 1ère pour les titres de structure */    /* la dernière pour les montants */    /* et entre les 2 pour l'affichage des opés -> variable */    nb_colonnes = 0;    if ( etat_courant -> afficher_opes )    {	nb_colonnes = nb_colonnes + etat_courant -> afficher_date_ope;	nb_colonnes = nb_colonnes + etat_courant -> afficher_tiers_ope;	nb_colonnes = nb_colonnes + etat_courant -> afficher_categ_ope;	nb_colonnes = nb_colonnes + etat_courant -> afficher_ib_ope;	nb_colonnes = nb_colonnes + etat_courant -> afficher_notes_ope;	nb_colonnes = nb_colonnes + etat_courant -> afficher_pc_ope;	nb_colonnes = nb_colonnes + etat_courant -> afficher_infobd_ope;	nb_colonnes = nb_colonnes + etat_courant -> afficher_no_ope;	nb_colonnes = nb_colonnes + etat_courant -> afficher_type_ope;	nb_colonnes = nb_colonnes + etat_courant -> afficher_cheque_ope;	nb_colonnes = nb_colonnes + etat_courant -> afficher_rappr_ope;	nb_colonnes = nb_colonnes + etat_courant -> afficher_exo_ope;	/* on ajoute les séparations */	nb_colonnes = 2 * nb_colonnes - 1;    }    nb_colonnes = nb_colonnes + 3;    ligne_debut_partie = -1;    nom_categ_en_cours = NULL;    nom_ss_categ_en_cours = NULL;    nom_ib_en_cours = NULL;    nom_ss_ib_en_cours = NULL;    nom_compte_en_cours = NULL;    nom_tiers_en_cours = NULL;    if (! etat_affiche_initialise (ope_selectionnees))	return;    /* on commence à remplir le tableau */    /* on met le titre */    total_general = 0;    nb_ope_general_etat = 0;    ligne = etat_affiche_affiche_titre ( 0 );    /* séparation */    ligne = etat_affiche_affiche_separateur (ligne);    /*   si nécessaire, on met les titres des colonnes */    if ( etat_courant -> afficher_opes	 &&	 etat_courant -> afficher_titre_colonnes	 &&	 !etat_courant -> type_affichage_titres )	ligne = etat_affiche_affiche_titres_colonnes ( ligne );    /*       on met directement les adr des devises de categ, ib et tiers en global pour */    /* gagner de la vitesse */    devise_categ_etat = devise_par_no ( etat_courant -> devise_de_calcul_categ );    devise_ib_etat = devise_par_no ( etat_courant -> devise_de_calcul_ib );    devise_tiers_etat = devise_par_no ( etat_courant -> devise_de_calcul_tiers );    devise_generale_etat = devise_par_no ( etat_courant -> devise_de_calcul_general );    for ( i=0 ; i<2 ; i++ )    {	ancienne_categ_etat = -1;	ancienne_categ_speciale_etat = 0;	ancienne_sous_categ_etat = -1;	ancienne_ib_etat = -1;	ancienne_sous_ib_etat = -1;	ancien_compte_etat = -1;	ancien_tiers_etat = -1;	montant_categ_etat = 0;	montant_sous_categ_etat = 0;	montant_ib_etat = 0;	montant_sous_ib_etat = 0;	montant_compte_etat = 0;	montant_tiers_etat = 0;	montant_periode_etat = 0;	montant_exo_etat = 0;	total_partie = 0;	date_debut_periode = NULL;	exo_en_cours_etat = -1;	nb_ope_categ_etat = 0;	nb_ope_sous_categ_etat = 0;	nb_ope_ib_etat = 0;	nb_ope_sous_ib_etat = 0;	nb_ope_compte_etat = 0;	nb_ope_tiers_etat = 0;	nb_ope_partie_etat = 0;	nb_ope_periode_etat = 0;	nb_ope_exo_etat = 0;	changement_de_groupe_etat = 0;	debut_affichage_etat = 1;	devise_compte_en_cours_etat = NULL;	/* on met ici le pointeur sur les revenus ou sur les dépenses */	/* en vérifiant qu'il y en a */	if ( i )	{	    /* c'est le second passage */	    /* on met le pointeur sur les dépenses */	    if ( liste_ope_depenses )	    {		/* séparation */		ligne = etat_affiche_affiche_separateur (ligne);		pointeur_tmp = liste_ope_depenses;		ligne = etat_affiche_affiche_titre_depenses_etat ( ligne );	    }	    else		continue;	}	else	{	    /* c'est le premier passage */	    /* on met le pointeur sur les revenus */	    /* si on n'a pas demandé de séparer les débits et crédits, on ne met pas de titre */	    if ( etat_courant -> separer_revenus_depenses )	    {		/* on sépare les revenus des débits */		if ( liste_ope_revenus )		{		    pointeur_tmp = liste_ope_revenus;		    ligne = etat_affiche_affiche_titre_revenus_etat ( ligne );		}		else		{		    /* il n'y a pas de revenus, on saute directement aux dépenses */		    i++;		    pointeur_tmp = liste_ope_depenses;		    /* 	      s'il n'y a pas de dépenses non plus, on sort de la boucle */		    if ( !liste_ope_depenses )			continue;		    ligne = etat_affiche_affiche_titre_depenses_etat ( ligne );		}	    }	    else	    {		/* 	      on ne sépare pas les débits et les crédits, donc pas de titre, juste */		/* une vérification qu'il y a des opérations */		if ( liste_ope_revenus )		    pointeur_tmp = liste_ope_revenus;		else		    continue;	    }	}	/* on commence la boucle qui fait le tour de chaque opé */	while ( pointeur_tmp )	{	    struct structure_operation *operation;	    struct struct_devise *devise_operation;	    gdouble montant;	    operation = pointeur_tmp -> data;	    pointeur_glist = etat_courant -> type_classement;	    while ( pointeur_glist )	    {		switch ( GPOINTER_TO_INT ( pointeur_glist -> data ))		{		    case 1:			ligne = etat_affiche_affiche_categ_etat ( operation,								  decalage_categ,								  ligne );			break;		    case 2:			ligne = etat_affiche_affiche_sous_categ_etat ( operation,								       decalage_sous_categ,								       ligne );			break;		    case 3:			ligne = etat_affiche_affiche_ib_etat ( operation,							       decalage_ib,							       ligne );			break;		    case 4:			ligne = etat_affiche_affiche_sous_ib_etat ( operation,								    decalage_sous_ib,								    ligne );			break;		    case 5:			ligne = etat_affiche_affiche_compte_etat ( operation,								   decalage_compte,								   ligne );			break;		    case 6:			ligne = etat_affiche_affiche_tiers_etat ( operation,								  decalage_tiers,								  ligne );		}		pointeur_glist = pointeur_glist -> next;	    }	    /* on affiche si nécessaire le total de la période */	    ligne = etat_affiche_affiche_total_periode ( operation,							 ligne,							 0 );	    /* on affiche si nécessaire le total de  l'exercice */	    ligne = etat_affiche_affiche_total_exercice ( operation,							 ligne,							 0 );	    ligne = etat_affiche_affichage_ligne_ope ( operation,						       ligne );	    /* on ajoute les montants que pour ceux affichés */	    /* calcule le montant de la categ */	    if ( etat_courant -> utilise_categ )	    {		if ( operation -> devise == devise_categ_etat -> no_devise )		    montant = operation -> montant;		else		{		    devise_operation = devise_par_no ( operation -> devise );		    if ( devise_categ_etat -> passage_euro			 &&			 !strcmp ( devise_operation -> nom_devise, _("Euro") ) )			montant = operation -> montant * devise_categ_etat -> change;		    else			if ( devise_operation -> passage_euro			     &&			     !strcmp ( devise_categ_etat -> nom_devise, _("Euro") ))			    montant = operation -> montant / devise_operation -> change;			else			    if ( operation -> une_devise_compte_egale_x_devise_ope )				montant = operation -> montant / operation -> taux_change - operation -> frais_change;			    else				montant = operation -> montant * operation -> taux_change - operation -> frais_change;		    montant = ( rint (montant * 100 )) / 100;		}		montant_categ_etat = montant_categ_etat + montant;		montant_sous_categ_etat = montant_sous_categ_etat + montant;		nb_ope_categ_etat++;		nb_ope_sous_categ_etat++;	    }	    /* calcule le montant de l'ib */	    if ( etat_courant -> utilise_ib )	    {		if ( operation -> devise == devise_ib_etat -> no_devise )		    montant = operation -> montant;		else		{		    devise_operation = devise_par_no ( operation -> devise );		    if ( devise_ib_etat -> passage_euro			 &&			 !strcmp ( devise_operation -> nom_devise, _("Euro") ) )			montant = operation -> montant * devise_ib_etat -> change;		    else			if ( devise_operation -> passage_euro			     &&			     !strcmp ( devise_ib_etat -> nom_devise, _("Euro") ))			    montant = operation -> montant / devise_operation -> change;			else			    if ( operation -> une_devise_compte_egale_x_devise_ope )				montant = operation -> montant / operation -> taux_change - operation -> frais_change;			    else				montant = operation -> montant * operation -> taux_change - operation -> frais_change;		    montant = ( rint (montant * 100 )) / 100;		}		montant_ib_etat = montant_ib_etat + montant;		montant_sous_ib_etat = montant_sous_ib_etat + montant;		nb_ope_ib_etat++;		nb_ope_sous_ib_etat++;	    }	    /* calcule le montant du tiers */	    if ( etat_courant -> utilise_tiers )	    {		if ( operation -> devise == devise_tiers_etat -> no_devise )		    montant = operation -> montant;		else		{		    devise_operation = devise_par_no ( operation -> devise );		    if ( devise_tiers_etat -> passage_euro			 &&			 !strcmp ( devise_operation -> nom_devise, _("Euro") ) )			montant = operation -> montant * devise_tiers_etat -> change;		    else			if ( devise_operation -> passage_euro			     &&			     !strcmp ( devise_tiers_etat -> nom_devise, _("Euro") ))			    montant = operation -> montant / devise_operation -> change;			else			    if ( operation -> une_devise_compte_egale_x_devise_ope )				montant = operation -> montant / operation -> taux_change - operation -> frais_change;			    else				montant = operation -> montant * operation -> taux_change - operation -> frais_change;		    montant = ( rint (montant * 100 )) / 100;		}		montant_tiers_etat = montant_tiers_etat + montant;		nb_ope_tiers_etat++;	    }	    /* calcule le montant du compte */	    if ( etat_courant -> affiche_sous_total_compte )	    {		/* on modifie le montant s'il n'est pas de la devise du compte en cours */		p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> no_compte;		if ( !devise_compte_en_cours_etat		     ||		     DEVISE != devise_compte_en_cours_etat -> no_devise )		    devise_compte_en_cours_etat = devise_par_no ( DEVISE );		if ( operation -> devise == DEVISE )		    montant = operation -> montant;		else		{		    /* ce n'est pas la devise du compte, si le compte passe à l'euro et que la devise est l'euro, */		    /* utilise la conversion du compte, */		    /* si c'est une devise qui passe à l'euro et que la devise du compte est l'euro, utilise la conversion du compte */		    /* sinon utilise la conversion stockée dans l'opé */		    devise_operation = devise_par_no ( operation -> devise );		    if ( devise_compte_en_cours_etat -> passage_euro			 &&			 !strcmp ( devise_operation -> nom_devise, _("Euro") ) )			montant = operation -> montant * devise_compte_en_cours_etat -> change;		    else			if ( devise_operation -> passage_euro			     &&			     !strcmp ( devise_compte_en_cours_etat -> nom_devise, _("Euro") ))			    montant = operation -> montant / devise_operation -> change;			else			    if ( operation -> une_devise_compte_egale_x_devise_ope )				montant = operation -> montant / operation -> taux_change - operation -> frais_change;			    else				montant = operation -> montant * operation -> taux_change - operation -> frais_change;		    montant = ( rint (montant * 100 )) / 100;		}		montant_compte_etat = montant_compte_etat + montant;		nb_ope_compte_etat++;	    }	    /* calcule les montants totaux */	    if ( operation -> devise == devise_generale_etat -> no_devise )		montant = operation -> montant;	    else	    {		devise_operation = devise_par_no ( operation -> devise );		if ( devise_generale_etat -> passage_euro		     &&		     !strcmp ( devise_operation -> nom_devise, _("Euro") ) )		    montant = operation -> montant * devise_generale_etat -> change;		else		    if ( devise_operation -> passage_euro			 &&			 !strcmp ( devise_generale_etat -> nom_devise, _("Euro") ))			montant = operation -> montant / devise_operation -> change;		    else			if ( operation -> une_devise_compte_egale_x_devise_ope )			    montant = operation -> montant / operation -> taux_change - operation -> frais_change;			else			    montant = operation -> montant * operation -> taux_change - operation -> frais_change;		montant = ( rint (montant * 100 )) / 100;	    }	    total_general = total_general + montant;	    nb_ope_general_etat++;	    /* calcule le montant de la periode */	    if ( etat_courant -> separation_par_plage )	    {		if ( operation -> devise == devise_categ_etat -> no_devise )		    montant = operation -> montant;		else		{		    devise_operation = devise_par_no ( operation -> devise );		    if ( devise_categ_etat -> passage_euro			 &&			 !strcmp ( devise_operation -> nom_devise, _("Euro") ) )			montant = operation -> montant * devise_categ_etat -> change;		    else			if ( devise_operation -> passage_euro			     &&			     !strcmp ( devise_categ_etat -> nom_devise, _("Euro") ))			    montant = operation -> montant / devise_operation -> change;			else			    if ( operation -> une_devise_compte_egale_x_devise_ope )				montant = operation -> montant / operation -> taux_change - operation -> frais_change;			    else				montant = operation -> montant * operation -> taux_change - operation -> frais_change;		    montant = ( rint (montant * 100 )) / 100;		}		montant_periode_etat = montant_periode_etat + montant;		nb_ope_periode_etat++;	    }	    total_partie = total_partie + montant;	    nb_ope_partie_etat++;	    /* calcule le montant de l'exo */	    if ( etat_courant -> separation_par_exo )	    {		if ( operation -> devise == devise_categ_etat -> no_devise )		    montant = operation -> montant;		else		{		    devise_operation = devise_par_no ( operation -> devise );		    if ( devise_categ_etat -> passage_euro			 &&			 !strcmp ( devise_operation -> nom_devise, _("Euro") ) )			montant = operation -> montant * devise_categ_etat -> change;		    else			if ( devise_operation -> passage_euro			     &&			     !strcmp ( devise_categ_etat -> nom_devise, _("Euro") ))			    montant = operation -> montant / devise_operation -> change;			else			    if ( operation -> une_devise_compte_egale_x_devise_ope )				montant = operation -> montant / operation -> taux_change - operation -> frais_change;			    else				montant = operation -> montant * operation -> taux_change - operation -> frais_change;		    montant = ( rint (montant * 100 )) / 100;		}		montant_exo_etat = montant_exo_etat + montant;		nb_ope_exo_etat++;	    }	    total_partie = total_partie + montant;	    nb_ope_partie_etat++;	    changement_de_groupe_etat = 0;	    pointeur_tmp = pointeur_tmp -> next;	}	/*   à la fin, on affiche les totaux des dernières lignes */	/* on affiche le total de la période en le forçant */	ligne = etat_affiche_affiche_total_periode ( NULL,						     ligne,						     1 );	/* on affiche le total de l'exercice en le forçant */	ligne = etat_affiche_affiche_total_exercice ( NULL,						     ligne,						     1 );	ligne = etat_affiche_affiche_totaux_sous_jaccent ( GPOINTER_TO_INT ( etat_courant -> type_classement -> data ),							   ligne );	/* on ajoute le total de la structure racine */	switch ( GPOINTER_TO_INT ( etat_courant -> type_classement -> data ))	{	    case 1:		ligne = etat_affiche_affiche_total_categories ( ligne );		break;	    case 2:		ligne = etat_affiche_affiche_total_sous_categ ( ligne );		break;	    case 3:		ligne = etat_affiche_affiche_total_ib ( ligne );		break;	    case 4:		ligne = etat_affiche_affiche_total_sous_ib ( ligne );		break;	    case 5:		ligne = etat_affiche_affiche_total_compte ( ligne );		break;	    case 6:		ligne = etat_affiche_affiche_total_tiers ( ligne );		break;	}	/* on affiche le total de la partie en cours */	/* si les revenus et dépenses ne sont pas mÃ©langés */	if ( etat_courant -> separer_revenus_depenses )	    ligne = etat_affiche_affiche_total_partiel ( total_partie,							 ligne,							 i );    }    /* on affiche maintenant le total génÃ©ral */    ligne = etat_affiche_affiche_total_general ( total_general,						 ligne );    etat_affiche_finish ();}