rem: devise_categ_etat = g_slist_find_custom ( liste_struct_devises, GINT_TO_POINTER ( etat_courant -> devise_de_calcul_categ ), ( GCompareFunc ) recherche_devise_par_no) -> data;  devise_ib_etat = g_slist_find_custom ( liste_struct_devises, GINT_TO_POINTER ( etat_courant -> devise_de_calcul_ib ), ( GCompareFunc ) recherche_devise_par_no) -> data;  devise_tiers_etat = g_slist_find_custom ( liste_struct_devises, GINT_TO_POINTER ( etat_courant -> devise_de_calcul_tiers ), ( GCompareFunc ) recherche_devise_par_no) -> data;  devise_generale_etat = g_slist_find_custom ( liste_struct_devises, GINT_TO_POINTER ( etat_courant -> devise_de_calcul_general ), ( GCompareFunc ) recherche_devise_par_no) -> data;
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;  /* on commence par sparer la liste revenus et de dpenses */  /*   si le classement racine est la catgorie, on spare par catgorie */  /* de revenu ou de dpense */  /* si c'est un autre, on spare par montant positif ou ngatif */  pointeur_glist = etat_courant -> type_classement;  liste_ope_revenus = NULL;  liste_ope_depenses = NULL;  pointeur_tmp = ope_selectionnees;  while ( pointeur_tmp )    {      struct structure_operation *operation;      operation = pointeur_tmp -> data;      if ( GPOINTER_TO_INT ( pointeur_glist -> data ) == 1 )	{	  /* le classement racine est la catgorie */	  /* s'il n'y a pas de catg, c'est un virement ou une ventilation */	  /*       dans ce cas, on classe en fonction du montant */	  if ( operation -> categorie )	    {	      struct struct_categ *categ;	      categ = g_slist_find_custom ( liste_struct_categories,					    GINT_TO_POINTER ( operation -> categorie ),					    (GCompareFunc) recherche_categorie_par_no ) -> data;	      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	       ||	       ( fabs ( operation -> montant ) < 0.01		 &&		 etat_courant -> choix_montant_nul == 2 ))		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 catg, on spare en fonction du montant */	  if ( operation -> montant < 0	       ||	       ( fabs ( operation -> montant ) < 0.01		 &&		 etat_courant -> choix_montant_nul == 2 ))	    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;    }  /* on va maintenant classer ces 2 listes dans l'ordre adquat */  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 dcalage pour chaque classement */  /* c'est une chaine vide qu'on ajoute devant le nom du */  /*   classement ( tiers, ib ...) */   /* on met 2 espaces par dcalage */  /*   normalement, pointeur_glist est dj 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 ))	{	  /* dcalage de la catgorie */	case 1:	  if ( etat_courant -> utilise_categ )	    decalage_categ = g_strconcat ( decalage_base,					   "    ",					   NULL );	  else	    {	      decalage_categ = decalage_base;	      goto pas_decalage;	    }	  break;	  /* dcalage de la ss-catgorie */	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;	  /* dcalage 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;	  /* dcalage 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;	  /* dcalage 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;	  /* dcalage 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 : */  /* 1re pour les titres de structure */  /* la dernire pour les montants */  /* et entre les 2 pour l'affichage des ops -> 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 sparations */      nb_colonnes = 2 * nb_colonnes;    }  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 (! affichage -> init (ope_selectionnees))    {      return;    }  /* on commence  remplir le tableau */  /* on met le titre */  total_general = 0;  ligne = affichage -> afficher_titre ( 0 );  /* sparation */  ligne = affichage -> afficher_separateur (ligne);  /*   si ncessaire, on met les titres des colonnes */  if ( etat_courant -> afficher_opes       &&       etat_courant -> afficher_titre_colonnes       &&       !etat_courant -> type_affichage_titres )    ligne = affichage -> affiche_titres_colonnes ( ligne );  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;      total_partie = 0;      date_debut_periode = NULL;      changement_de_groupe_etat = 0;      debut_affichage_etat = 1;      devise_compte_en_cours_etat = NULL;      /*       on met directement les adr des devises de categ, ib et tiers en global pour */      /* gagner de la vitesse */      devise_categ_etat = g_slist_find_custom ( liste_struct_devises,						GINT_TO_POINTER ( etat_courant -> devise_de_calcul_categ ),						( GCompareFunc ) recherche_devise_par_no) -> data;      devise_ib_etat = g_slist_find_custom ( liste_struct_devises,						GINT_TO_POINTER ( etat_courant -> devise_de_calcul_ib ),						( GCompareFunc ) recherche_devise_par_no) -> data;      devise_tiers_etat = g_slist_find_custom ( liste_struct_devises,						GINT_TO_POINTER ( etat_courant -> devise_de_calcul_tiers ),						( GCompareFunc ) recherche_devise_par_no) -> data;      devise_generale_etat = g_slist_find_custom ( liste_struct_devises,						   GINT_TO_POINTER ( etat_courant -> devise_de_calcul_general ),						   ( GCompareFunc ) recherche_devise_par_no) -> data;      /* on met ici le pointeur sur les revenus ou sur les dpenses */      /* en vrifiant qu'il y en a */      if ( !i )	{	  /* on met le pointeur sur les revenus */	  if ( liste_ope_revenus )	    {	      pointeur_tmp = liste_ope_revenus;	      ligne = affichage -> affiche_titre_revenus_etat ( ligne );	    }	  else	    {	      /* il n'y a pas de revenus, on saute directement aux dpenses */	      i++;	      pointeur_tmp = liste_ope_depenses;	      /* 	      s'il n'y a pas de dpenses non plus, on sort de la boucle */ 	      if ( !liste_ope_depenses )		goto fin_boucle_affichage_etat;	      ligne = affichage -> affiche_titre_depenses_etat ( ligne );	    }	}      else	{	  /* on met le pointeur sur les dpenses */	  if ( liste_ope_depenses )	    {	      /* sparation */	      ligne = affichage -> afficher_separateur (ligne);	      pointeur_tmp = liste_ope_depenses;	      ligne = affichage -> affiche_titre_depenses_etat ( ligne );	    }	  else	    goto fin_boucle_affichage_etat;	}      /* 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 = affichage -> affiche_categ_etat ( operation,							    decalage_categ,							    ligne );		  break;		case 2:		  ligne = affichage -> affiche_sous_categ_etat ( operation,								 decalage_sous_categ,								 ligne );		  break;		case 3:		  ligne = affichage -> affiche_ib_etat ( operation,							 decalage_ib,							 ligne );		  break;		case 4:		  ligne = affichage -> affiche_sous_ib_etat ( operation,							      decalage_sous_ib,							      ligne );		  break;		case 5:		  ligne = affichage -> affiche_compte_etat ( operation,							     decalage_compte,							     ligne );		  break;		case 6:		  ligne = affichage -> affiche_tiers_etat ( operation,							    decalage_tiers,							    ligne );		}	      pointeur_glist = pointeur_glist -> next;	    }	  /* on affiche si ncessaire le total de la priode */	  ligne = gtktable_affiche_total_periode ( operation,						   ligne,						   0 );	  ligne = affichage -> affichage_ligne_ope ( operation,						     ligne );	  /* on ajoute les montants que pour ceux affichs */	  /* 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 = g_slist_find_custom ( liste_struct_devises,							   GINT_TO_POINTER ( operation -> devise ),							   ( GCompareFunc ) recherche_devise_par_no ) -> data;		  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;	    }	  /* 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 = g_slist_find_custom ( liste_struct_devises,							   GINT_TO_POINTER ( operation -> devise ),							   ( GCompareFunc ) recherche_devise_par_no ) -> data;		  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;	    }	  /* calcule le montant du tiers */	  if ( etat_courant -> utilise_tiers )	    {	      if ( operation -> devise == devise_tiers_etat -> no_devise )		montant = operation -> montant;	      else		{		  devise_operation = g_slist_find_custom ( liste_struct_devises,							   GINT_TO_POINTER ( operation -> devise ),							   ( GCompareFunc ) recherche_devise_par_no ) -> data;		  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;	    }	  /* 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 = g_slist_find_custom ( liste_struct_devises,								    GINT_TO_POINTER ( DEVISE ),								    ( GCompareFunc ) recherche_devise_par_no) -> data;	      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 stocke dans l'op */		  devise_operation = g_slist_find_custom ( liste_struct_devises,							   GINT_TO_POINTER ( operation -> devise ),							   ( GCompareFunc ) recherche_devise_par_no ) -> data;		  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;	    }	  /* calcule les montants totaux */	  if ( operation -> devise == devise_generale_etat -> no_devise )	    montant = operation -> montant;	  else	    {	      devise_operation = g_slist_find_custom ( liste_struct_devises,						       GINT_TO_POINTER ( operation -> devise ),						       ( GCompareFunc ) recherche_devise_par_no ) -> data;	      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;	    }	  /* 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 = g_slist_find_custom ( liste_struct_devises,							   GINT_TO_POINTER ( operation -> devise ),							   ( GCompareFunc ) recherche_devise_par_no ) -> data;		  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;	    }	  total_partie = total_partie + montant;	  total_general = total_general + montant;	  changement_de_groupe_etat = 0;	  pointeur_tmp = pointeur_tmp -> next;	}      /*    la fin, on affiche les totaux des dernires lignes */      /* on affiche le total de la priode en le forant */      ligne = gtktable_affiche_total_periode ( NULL,					       ligne,					       1 );      ligne = affichage -> 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 = affichage -> affiche_total_categories ( ligne );	  break;	case 2:	  ligne = affichage -> affiche_total_sous_categ ( ligne );	  break;	case 3:	  ligne = affichage -> affiche_total_ib ( ligne );	  break;	case 4:	  ligne = affichage -> affiche_total_sous_ib ( ligne );	  break;	case 5:	  ligne = affichage -> affiche_total_compte ( ligne );	  break;	case 6:	  ligne = affichage -> affiche_total_tiers ( ligne );	  break;	}      /* on affiche le total de la partie en cours */      ligne = affichage -> affiche_total_partiel ( total_partie,				      ligne,				      i );    fin_boucle_affichage_etat:    }  /* on affiche maintenant le total gnral */  ligne = affichage -> affiche_total_general ( total_general,				  ligne );  affichage -> finish ();}