rem: list_tmp = list_struct_accounts;
add: list_tmp = gsb_account_get_list_accounts ();
context: GSList *recupere_opes_etat ( struct struct_etat *etat ){    GSList *liste_operations_etat;    gint no_exercice_recherche;    GSList *liste_tmp;    GSList *list_tmp;    liste_operations_etat = NULL;    /* si on utilise l'exercice courant ou précédent, on cherche ici */    /* le numéro de l'exercice correspondant */    no_exercice_recherche = 0;    if ( etat -> exo_date )    {	GDate *date_jour;	struct struct_exercice *exo;	struct struct_exercice *exo_courant;	struct struct_exercice *exo_precedent;	liste_tmp = liste_struct_exercices;	date_jour = g_date_new ();	g_date_set_time ( date_jour,			  time ( NULL ));	exo_courant = NULL;	exo_precedent = NULL;	/*  dans tous les cas, on recherche l'exo courant */	while ( liste_tmp )	{	    exo = liste_tmp -> data;	    if ( g_date_compare ( date_jour,				  exo -> date_debut ) >= 0		 &&		 g_date_compare ( date_jour,				  exo -> date_fin ) <= 0 )	    {		exo_courant = exo;		liste_tmp = NULL;	    }	    else		liste_tmp = liste_tmp -> next;	}	/* si on veut l'exo précédent, c'est ici */	switch ( etat -> utilise_detail_exo )	{	    case 1:		/* on recherche l'exo courant */		if ( exo_courant )		    no_exercice_recherche = exo_courant -> no_exercice;		break;	    case 2:		/* on recherche l'exo précédent */		liste_tmp = liste_struct_exercices;		while ( liste_tmp )		{		    struct struct_exercice *exo;		    exo = liste_tmp -> data;		    if ( exo_courant )		    {			/* si l'exo est avant exo_courant et après exo_precedent, c'est le nouvel exo_precedent */			if ( g_date_compare ( exo -> date_fin,					      exo_courant -> date_debut ) <= 0 )			{			    if ( exo_precedent )			    {				if ( g_date_compare ( exo -> date_debut,						      exo_precedent -> date_fin ) >= 0 )				    exo_precedent = exo;			    }			    else				exo_precedent = exo;			}		    }		    else		    {			/* 		      il n'y a pas d'exo courant, donc si l'exo est en date inférieur à la date du jour, */			/* et après l'exo_precedent, c'est le nouvel exo précédent */			if ( g_date_compare ( exo -> date_fin,					      date_jour ) <= 0 )			{			    if ( exo_precedent )			    {				if ( g_date_compare ( exo -> date_debut,						      exo_precedent -> date_fin ) >= 0 )				    exo_precedent = exo;			    }			    else				exo_precedent = exo;			}		    }		    liste_tmp = liste_tmp -> next;		}		if ( exo_precedent )		    no_exercice_recherche = exo_precedent -> no_exercice;		break;	}    }    /*   si on a utilisé "le plus grand" dans la recherche de texte, c'est ici qu'on recherche */    /*     les plus grands no de chq, de rappr et de pc dans les comptes choisis */    /* commence par rechercher si on a utilisé "le plus grand" */    liste_tmp = etat -> liste_struct_comparaison_textes;    while ( liste_tmp )    {	struct struct_comparaison_textes_etat *comp_textes;	comp_textes = liste_tmp -> data;	if ( comp_textes -> comparateur_1 == 6	     ||	     comp_textes -> comparateur_2 == 6 )	{	    /* on utilise "le plus grand" qque part, donc on va remplir les 3 variables */	    dernier_chq = 0;	    dernier_pc = 0;	    dernier_no_rappr = 0;	    list_tmp = list_struct_accounts;	    while ( list_tmp )	    {		gint i;		i = gsb_account_get_no_account ( list_tmp -> data );		/* on commence par vérifier que le compte fait partie de l'état */		if ( !etat -> utilise_detail_comptes		     ||		     g_slist_index ( etat -> no_comptes,				     GINT_TO_POINTER ( i )) != -1 )		{		    GSList *pointeur_tmp;		    /* on fait le tour de la liste des opés en recherchant le plus grand ds les 3 variables */		    pointeur_tmp = gsb_account_get_transactions_list (i);		    while ( pointeur_tmp )		    {			struct structure_operation *operation;			operation = pointeur_tmp -> data;			/* commence par le cheque, il faut que le type opé soit à incrémentation auto */			/* et le no le plus grand */			/* on ne recherche le type d'opé que si l'opé a un contenu du type et que celui ci */			/* est > que dernier_chq */			if ( operation -> contenu_type 			     &&			     my_atoi ( operation -> contenu_type ) > dernier_chq			     &&			     operation -> type_ope )			{			    struct struct_type_ope *type_ope;			    type_ope = type_ope_par_no ( operation -> type_ope,							 i );			    if ( type_ope				 &&				 type_ope -> affiche_entree				 &&				 type_ope -> numerotation_auto )				dernier_chq = my_atoi ( operation -> contenu_type );			}			/* on récupère maintenant la plus grande pc */			if ( operation -> no_piece_comptable			     &&			     my_atoi ( operation -> no_piece_comptable ) > dernier_pc )			    dernier_pc = my_atoi ( operation -> no_piece_comptable );			/* on récupère maintenant le dernier relevé */			if ( operation -> no_rapprochement > dernier_no_rappr )			    dernier_no_rappr = operation -> no_rapprochement;			pointeur_tmp = pointeur_tmp -> next;		    }		}		list_tmp = list_tmp -> next;	    }	    liste_tmp = NULL;	}	else	    liste_tmp = liste_tmp -> next;    }    list_tmp = list_struct_accounts;    while ( list_tmp )    {	gint i;	i = gsb_account_get_no_account ( list_tmp -> data );	if ( !etat -> utilise_detail_comptes	     ||	     g_slist_index ( etat -> no_comptes,			     GINT_TO_POINTER ( i )) != -1 )	{	    /* 	  le compte est bon, passe à la suite de la sélection */	    /* on va faire le tour de toutes les opés du compte */	    GSList *pointeur_tmp;	    pointeur_tmp = gsb_account_get_transactions_list (i);	    while ( pointeur_tmp )	    {		struct structure_operation *operation;		operation = pointeur_tmp -> data;		/* si c'est une opé ventilée, dépend de la conf */		if ( operation -> operation_ventilee		     &&		     !etat -> pas_detailler_ventilation )		    goto operation_refusee;		if ( operation -> no_operation_ventilee_associee		     &&		     etat -> pas_detailler_ventilation )		    goto operation_refusee;		/* on vérifie ensuite si un texte est recherché */		if ( etat -> utilise_texte )		{		    gint garde_ope;		    liste_tmp = etat -> liste_struct_comparaison_textes;		    garde_ope = 0;		    while ( liste_tmp )		    {			gchar *texte;			struct struct_comparaison_textes_etat *comp_textes;			gint ope_dans_test;			comp_textes = liste_tmp -> data;			/* on commence par récupérer le texte du champs recherché */			texte = recupere_texte_test_etat ( operation,							   comp_textes -> champ );			/* à ce niveau, texte est soit null, soit contient le texte dans lequel on effectue la recherche */			/* on vérifie maintenant en fontion de l'opérateur */			/* si c'est un chq ou une pc et que utilise_txt, on utilise leur no */			if ( ( comp_textes -> champ == 8			       ||			       comp_textes -> champ == 9			       ||			       comp_textes -> champ == 10 )			     &&			     !comp_textes -> utilise_txt )			{			    if ( texte )				ope_dans_test = verifie_chq_test_etat ( comp_textes,									texte );			    else				ope_dans_test = 0;			}			else			    ope_dans_test = verifie_texte_test_etat ( comp_textes,								      texte );			/* à ce niveau, ope_dans_test=1 si l'opé a passé ce test */			/* il faut qu'on fasse le lien avec la ligne précédente */			switch ( comp_textes -> lien_struct_precedente )			{			    case -1:				/* 1ère ligne  */				garde_ope = ope_dans_test;				break;			    case 0:				/* et  */				garde_ope = garde_ope && ope_dans_test;				break;			    case 1:				/* ou  */				garde_ope = garde_ope || ope_dans_test;				break;			    case 2:				/* sauf  */				garde_ope = garde_ope && (!ope_dans_test);				break;			}			liste_tmp = liste_tmp -> next;		    }		    /* on ne garde l'opération que si garde_ope = 1 */		    if ( !garde_ope )			goto operation_refusee;		}		/* on vérifie les R */		if ( etat -> afficher_r )		{		    if ( ( etat -> afficher_r == 1			   &&			   operation -> pointe == 3 )			 ||			 ( etat -> afficher_r == 2			   &&			   operation -> pointe != 3 ))			goto operation_refusee;		}		/*    vérification du montant nul */		if ( etat -> exclure_montants_nuls		     &&		     fabs ( operation -> montant ) < 0.01 )		    goto operation_refusee;		/* vérification des montants */		if ( etat -> utilise_montant )		{		    gint garde_ope;		    liste_tmp = etat -> liste_struct_comparaison_montants;		    garde_ope = 0;		    while ( liste_tmp )		    {			gdouble montant;			gint ope_dans_premier_test;			gint ope_dans_second_test;			struct struct_comparaison_montants_etat *comp_montants;			gint ope_dans_test;			comp_montants = liste_tmp -> data;			montant = calcule_montant_devise_renvoi ( operation -> montant,								  etat -> choix_devise_montant,								  operation -> devise,								  operation -> une_devise_compte_egale_x_devise_ope,								  operation -> taux_change,								  operation -> frais_change );			/* on vérifie maintenant en fonction de la ligne de test si on garde cette opé */			ope_dans_premier_test = compare_montants_etat ( montant,									comp_montants -> montant_1,									comp_montants -> comparateur_1 );			if ( comp_montants -> lien_1_2 != 3 )			    ope_dans_second_test = compare_montants_etat ( montant,									   comp_montants -> montant_2,									   comp_montants -> comparateur_2 );			else			    /* pour éviter les warning lors de la compil */			    ope_dans_second_test = 0;			switch ( comp_montants -> lien_1_2 )			{			    case 0:				/* et  */				ope_dans_test = ope_dans_premier_test && ope_dans_second_test;				break;			    case 1:				/*  ou */				ope_dans_test = ope_dans_premier_test || ope_dans_second_test;				break;			    case 2:				/* sauf  */				ope_dans_test = ope_dans_premier_test && (!ope_dans_second_test);				break;			    case 3:				/* aucun  */				ope_dans_test = ope_dans_premier_test;				break;			    default:				ope_dans_test = 0;			}			/* à ce niveau, ope_dans_test=1 si l'opé a passé ce test */			/* il faut qu'on fasse le lien avec la ligne précédente */			switch ( comp_montants -> lien_struct_precedente )			{			    case -1:				/* 1ère ligne  */				garde_ope = ope_dans_test;				break;			    case 0:				/* et  */				garde_ope = garde_ope && ope_dans_test;				break;			    case 1:				/* ou  */				garde_ope = garde_ope || ope_dans_test;				break;			    case 2:				/* sauf  */				garde_ope = garde_ope && (!ope_dans_test);				break;			}			liste_tmp = liste_tmp -> next;		    }		    /* on ne garde l'opération que si garde_ope = 1 */		    if ( !garde_ope )			goto operation_refusee;		}		/* 	      on vérifie les virements */		if ( operation -> relation_no_operation )		{		    if ( !etat -> type_virement )			goto operation_refusee;		    if ( etat -> type_virement == 1 )		    {			/* on inclue l'opé que si le compte de virement */			/* est un compte de passif ou d'actif */			if ( gsb_account_get_kind (operation -> relation_no_compte) != GSB_TYPE_LIABILITIES			     &&			     gsb_account_get_kind (operation -> relation_no_compte) != GSB_TYPE_ASSET )			    goto operation_refusee;		    }		    else		    {			if ( etat -> type_virement == 2 )			{			    /* on inclut l'opé que si le compte de virement n'est */			    /* pas présent dans l'état */			    /*    si on ne détaille pas les comptes, on ne cherche pas, l'opé est refusée */			    if ( etat -> utilise_detail_comptes )			    {				if ( g_slist_index ( etat -> no_comptes,						     GINT_TO_POINTER ( operation -> relation_no_compte )) != -1 )				    goto operation_refusee;			    }			    else				goto operation_refusee;			}			else			{			    /* on inclut l'opé que si le compte de virement est dans la liste */			    if ( g_slist_index ( etat -> no_comptes_virements,						 GINT_TO_POINTER ( operation -> relation_no_compte )) == -1 )				goto operation_refusee;			}		    }		}		else		{		    /* 		  l'opé n'est pas un virement, si on doit exclure les non virement, c'est ici */		    if ( etat -> type_virement			 &&			 etat -> exclure_ope_non_virement )			goto operation_refusee;		}		/* on va maintenant vérifier que les catég sont bonnes */		/* si on exclut les opés sans categ, on vérifie que c'est pas un virement ni une ventilation */		if ((( etat -> utilise_detail_categ		       &&		       g_slist_index ( etat -> no_categ,				       GINT_TO_POINTER ( operation -> categorie )) == -1 )		     ||		     ( etat -> exclure_ope_sans_categ		       &&		       !operation -> categorie ))		    &&		    !operation -> operation_ventilee		    &&		    !operation -> relation_no_operation )		    goto operation_refusee;		/* vérification de l'imputation budgétaire */		if ( etat -> exclure_ope_sans_ib && !operation -> imputation )		    goto operation_refusee;		if ((etat -> utilise_detail_ib &&		     g_slist_index(etat-> no_ib,				   GINT_TO_POINTER(operation->imputation)) == -1) &&		    operation -> imputation)		    goto operation_refusee;		/* vérification du tiers */		if ( etat -> utilise_detail_tiers		     &&		     g_slist_index ( etat -> no_tiers,				     GINT_TO_POINTER ( operation -> tiers )) == -1 )		    goto operation_refusee;		/* vérification du type d'opération */		if ( etat -> utilise_mode_paiement )		{		    struct struct_type_ope *type_ope;		    if ( ! operation -> type_ope )			goto operation_refusee;		    /* normalement p_tab... est sur le compte en cours */		    type_ope = type_ope_par_no ( operation -> type_ope,						 i );		    if ( !type_ope )			goto operation_refusee;		    if ( !g_slist_find_custom ( etat -> noms_modes_paiement,						type_ope -> nom_type,						(GCompareFunc) cherche_string_equivalente_dans_slist ))			goto operation_refusee;		}		/* vérifie la plage de date */		if ( etat -> exo_date )		{		    /* on utilise l'exercice */		    if ( (( etat -> utilise_detail_exo == 1			    ||			    etat -> utilise_detail_exo == 2 )			  &&			  ( operation -> no_exercice != no_exercice_recherche			    ||			    !operation -> no_exercice ))			 ||			 ( etat -> utilise_detail_exo == 3			   &&			   ( g_slist_index ( etat -> no_exercices,					     GINT_TO_POINTER ( operation -> no_exercice )) == -1			     ||			     !operation -> no_exercice )))			goto operation_refusee;		}		else		{		    /* on utilise une plage de dates */		    GDate *date_jour;		    GDate *date_tmp;		    date_jour = g_date_new ();		    g_date_set_time ( date_jour,				      time ( NULL ));		    switch ( etat -> no_plage_date )		    {			case 0:			    /* toutes */			    break;			case 1:			    /* plage perso */			    if ( !etat -> date_perso_debut				 ||				 !etat -> date_perso_fin				 ||				 g_date_compare ( etat -> date_perso_debut,						  operation -> date ) > 0				 ||				 g_date_compare ( etat -> date_perso_fin,						  operation -> date ) < 0 )				goto operation_refusee;			    break;			case 2:			    /* cumul à ce jour */			    if ( g_date_compare ( date_jour,						  operation -> date ) < 0 )				goto operation_refusee;			    break;			case 3:			    /* mois en cours */			    if ( g_date_month ( date_jour ) != g_date_month ( operation -> date )				 ||				 g_date_year ( date_jour ) != g_date_year ( operation -> date ))				goto operation_refusee;			    break;			case 4:			    /* année en cours */			    if ( g_date_year ( date_jour ) != g_date_year ( operation -> date ))				goto operation_refusee;			    break;			case 5:			    /* cumul mensuel */			    if ( g_date_month ( date_jour ) != g_date_month ( operation -> date )				 ||				 g_date_year ( date_jour ) != g_date_year ( operation -> date )				 ||				 g_date_compare ( date_jour,						  operation -> date ) < 0 )				goto operation_refusee;			    break;			case 6:			    /* cumul annuel */			    if ( g_date_year ( date_jour ) != g_date_year ( operation -> date )				 ||				 g_date_compare ( date_jour,						  operation -> date ) < 0 )				goto operation_refusee;			    break;			case 7:			    /* mois précédent */			    g_date_subtract_months ( date_jour,						     1 );			    if ( g_date_month ( date_jour ) != g_date_month ( operation -> date )				 ||				 g_date_year ( date_jour ) != g_date_year ( operation -> date ))				goto operation_refusee;			    break;			case 8:			    /* année précédente */			    g_date_subtract_years ( date_jour,						    1 );			    if ( g_date_year ( date_jour ) != g_date_year ( operation -> date ))				goto operation_refusee;			    break;			case 9:			    /* 30 derniers jours */			    date_tmp = g_date_new_dmy ( g_date_day ( date_jour ),							g_date_month ( date_jour ),							g_date_year ( date_jour ) );			    g_date_subtract_days ( date_tmp,						   30 );			    if ( g_date_compare ( date_tmp,						  operation -> date ) > 0				 ||				 g_date_compare ( date_jour,						  operation -> date ) < 0 )				goto operation_refusee;			    break;			case 10:			    /* 3 derniers mois */			    date_tmp = g_date_new_dmy ( g_date_day ( date_jour ),							g_date_month ( date_jour ),							g_date_year ( date_jour ) );			    g_date_subtract_months ( date_tmp,						     3 );			    if ( g_date_compare ( date_tmp,						  operation -> date ) > 0				 ||				 g_date_compare ( date_jour,						  operation -> date ) < 0 )				goto operation_refusee;			    break;			case 11:			    /* 6 derniers mois */			    date_tmp = g_date_new_dmy ( g_date_day ( date_jour ),							g_date_month ( date_jour ),							g_date_year ( date_jour ) );			    g_date_subtract_months ( date_tmp,						     6 );			    if ( g_date_compare ( date_tmp,						  operation -> date ) > 0				 ||				 g_date_compare ( date_jour,						  operation -> date ) < 0 )				goto operation_refusee;			    break;			case 12:			    /* 12 derniers mois */			    date_tmp = g_date_new_dmy ( g_date_day ( date_jour ),							g_date_month ( date_jour ),							g_date_year ( date_jour ) );			    g_date_subtract_months ( date_tmp,						     12 );			    if ( g_date_compare ( date_tmp,						  operation -> date ) > 0				 ||				 g_date_compare ( date_jour,						  operation -> date ) < 0 )				goto operation_refusee;			    break;		    }		}		liste_operations_etat = g_slist_append ( liste_operations_etat,							 operation );operation_refusee:		pointeur_tmp = pointeur_tmp -> next;	    }	}	list_tmp = list_tmp -> next;    }    return ( liste_operations_etat );}