add: ope_associee -> imputation = operation -> imputation; ope_associee -> sous_imputation = operation -> sous_imputation; ope_associee -> no_exercice = operation -> no_exercice;  if ( operation -> no_piece_comptable ) ope_associee -> no_piece_comptable = g_strdup ( operation -> no_piece_comptable ); else ope_associee -> no_piece_comptable = NULL;
context: void fin_edition_ventilation ( void ){  struct structure_operation *operation;  gint modification;  gint rafraichir_categ;  gint virement;  gchar *nom_compte_vire;  gint rafraichir_imputation;  rafraichir_categ = 0;  rafraichir_imputation = 0;  virement = 0;  nom_compte_vire = NULL;  p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;  operation = gtk_object_get_data ( GTK_OBJECT ( widget_formulaire_ventilation[0] ),				    "adr_struct_ope" );  if (operation == GINT_TO_POINTER ( -1 ))    {      operation = calloc ( 1,			   sizeof ( struct structure_operation ));      modification = 0;      /*   met la relation de ventilation  -1 car n'est pas encore associe */      operation -> no_operation_ventilee_associee = -1;    }  else    modification = 1;  /* rcupration des notes */  if ( gtk_widget_get_style ( widget_formulaire_ventilation[1] ) == style_entree_formulaire[0] )    operation -> notes = g_strdup ( g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_ventilation[1] ))));  else    operation -> notes = NULL;  /* rcupration du montant */  operation -> montant = g_strtod ( g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_ventilation[2] ))),				    NULL );  /* remplissage du no de compte */  operation -> no_compte = compte_courant;  /*   rcupration des catgories / sous-catg, s'ils n'existent pas, on les cre */  /* si c'est un virement, on  met virement  1 */  if ( gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_ventilation[0] ) -> entry ) == style_entree_formulaire[0] )    {      struct struct_categ *categ;      gchar **tableau_char;      tableau_char = g_strsplit ( g_strstrip ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_ventilation[0] ))),				  ":",				  2 );      if ( tableau_char[0]  )	{	  tableau_char[0] = g_strstrip ( tableau_char[0] );	  if ( tableau_char[1] )	    tableau_char[1] = g_strstrip ( tableau_char[1] );	  if ( strlen ( tableau_char[0] ) )	    {	      /* on vrifie ici si c'est un virement */	      if ( strcmp ( tableau_char[0],			    "Virement" ) )		{		  /* 	      ce n'est pas un virement, recherche les catg */		  GSList *pointeur_liste;		  virement = 0;		  /* si c'est une modif d'op et que l'ancienne op tait un virement, on vire l'op */		  /* associe */		  if ( modification		       &&		       operation -> relation_no_operation )		    {		      struct structure_operation *ope_associee;		      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> relation_no_compte;		      ope_associee = g_slist_find_custom ( LISTE_OPERATIONS,							   GINT_TO_POINTER ( operation -> relation_no_operation ),							   (GCompareFunc) recherche_operation_par_no ) -> data;		      ope_associee -> relation_no_operation = 0;		      supprime_operation ( ope_associee );		      operation -> relation_no_operation = 0;		      operation -> relation_no_compte = 0;		      p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;		    }		  /* recherche des catgories */		  pointeur_liste = g_slist_find_custom ( liste_struct_categories,							 tableau_char[0],							 ( GCompareFunc ) recherche_categorie_par_nom );		  if ( pointeur_liste )		    {		      categ = pointeur_liste -> data;		      rafraichir_categ = 0;		    }		  else		    {		      categ = ajoute_nouvelle_categorie ( tableau_char[0] );		      if ( operation -> montant < 0 )			categ -> type_categ = 1;		      else			categ -> type_categ = 0;		      rafraichir_categ = 1;		    }	  		  operation -> categorie = categ -> no_categ;	  		  if ( tableau_char[1] && strlen (tableau_char[1]) )		    {		      struct struct_sous_categ *sous_categ;		  		      pointeur_liste = g_slist_find_custom ( categ -> liste_sous_categ,							     tableau_char[1],							     ( GCompareFunc ) recherche_sous_categorie_par_nom );	      		      if ( pointeur_liste )			{			  sous_categ = pointeur_liste -> data;			  rafraichir_categ = 0;			}		      else			{			  sous_categ = ajoute_nouvelle_sous_categorie ( tableau_char[1],									categ );			  rafraichir_categ = 1;			}		  		      operation -> sous_categorie = sous_categ -> no_sous_categ;		    }		  else		    operation -> sous_categorie = 0;		}	      else		{		  /* c'est un virement, les no de categ sont dj  0 */		  virement = 1;		  nom_compte_vire = g_strdup ( tableau_char [1] );		}	    }	}      g_strfreev ( tableau_char );    }  /* rcupration de l'imputation budgtaire */  if ( gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_ventilation[3] ) -> entry ) == style_entree_formulaire[0] )    {      struct struct_imputation *imputation;      gchar **tableau_char;      GSList *pointeur_liste;      tableau_char = g_strsplit ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_ventilation[3] )),				  ":",				  2 );            tableau_char[0] = g_strstrip ( tableau_char[0] );      if ( tableau_char[1] )	tableau_char[1] = g_strstrip ( tableau_char[1] );      pointeur_liste = g_slist_find_custom ( liste_struct_imputation,					     tableau_char[0],					     ( GCompareFunc ) recherche_imputation_par_nom );      if ( pointeur_liste )	imputation = pointeur_liste -> data;      else	{	  imputation = ajoute_nouvelle_imputation ( tableau_char[0] );	  if ( operation -> montant < 0 )	    imputation -> type_imputation = 1;	  else	    imputation -> type_imputation = 0;	  rafraichir_imputation = 1;	}      operation -> imputation = imputation -> no_imputation;	        if ( tableau_char[1] && strlen (tableau_char[1]) )	{	  struct struct_sous_imputation *sous_imputation;		  	  pointeur_liste = g_slist_find_custom ( imputation -> liste_sous_imputation,						 tableau_char[1],						 ( GCompareFunc ) recherche_sous_imputation_par_nom );	      	  if ( pointeur_liste )	    sous_imputation = pointeur_liste -> data;	  else	    {	      sous_imputation = ajoute_nouvelle_sous_imputation ( tableau_char[1],								  imputation );	      rafraichir_imputation = 1;	    }	  operation -> sous_imputation = sous_imputation -> no_sous_imputation;	}      else	operation -> sous_imputation = 0;      g_strfreev ( tableau_char );    }  /* rcupration du no d'exercice */  operation -> no_exercice = GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_ventilation[4] ) -> menu_item ),								     "no_exercice" ));/* rcupration du no de pice comptable */  if ( gtk_widget_get_style ( widget_formulaire_ventilation[5] ) == style_entree_formulaire[0] )    operation -> no_piece_comptable = g_strdup ( g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_ventilation[5] ))));  else    operation -> no_piece_comptable = NULL;  /* remplit la date : cree une date bidon qui sera remlit quand l'opration en cours sera valide */  operation -> jour = 1;  operation -> mois = 1;  operation -> annee = 2000;  operation -> date = g_date_new_dmy ( operation -> jour,					  operation -> mois,					  operation -> annee );  /* cre une devise  bidon pour viter un segfault si on russi  changer de compte avant la validation de l'op ventile */  operation -> devise = 1;   /* on a rempli l'opration, on l'ajoute au compte */  /*   le tiers, la date ... seront remplis lors de la validation de l'opration principale */  if ( !modification )    ajout_operation ( operation );  if ( virement )    {      /* 	      c'est un virement ; trois solutions : */      /*  soit c'est une dition d'opration, c'tait un virement et le compte vir n'a pas chang */      /* soit  c'est une dition d'opration, c'tait un virement et le compte vir a chang */      /* soit c'est un nouveau virement, cre l'op associe dans ce cas */      /* recherche du numro de compte entr */      gint compte_vire;      gint i;      compte_vire = -1;      for ( i = 0 ; i < nb_comptes ; i++ )	{	  p_tab_nom_de_compte_variable = p_tab_nom_de_compte + i;	  if ( !strcmp ( NOM_DU_COMPTE,			 nom_compte_vire ) )	    compte_vire = i;	}      if ( compte_vire == -1 )	{	  dialogue ( "Erreur : le compte associ au virement est invalide" );	  return;	}      if ( compte_vire == compte_courant )	{	  dialogue ( "Erreur : impossible de virer un compte sur lui-mme" );	  return;	}      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + compte_vire;      /* la soluce la plus facile : c'est une modif d'op, pas de changement pour le compte vir */      if ( modification	   &&	   ( operation -> relation_no_compte == compte_vire ))	{	  /* rcupre l'opration associe */	  struct structure_operation *ope_associee;	  ope_associee = g_slist_find_custom ( LISTE_OPERATIONS,					       GINT_TO_POINTER ( operation -> relation_no_operation ),					       (GCompareFunc) recherche_operation_par_no ) -> data;	  /* on y met le nouveau montant et la note */	  if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( bouton_credit ) ) )	    ope_associee -> montant = -operation -> montant;	  else	    ope_associee -> montant = operation -> montant;	  if ( operation -> notes )	    ope_associee -> notes = g_strdup ( operation -> notes );	  else	    ope_associee -> notes = NULL;	  MISE_A_JOUR = 1;	}      else	{	  /* deuxime solution, c'est une modif d'op, on a chang le compte vir */		  	  struct structure_operation *ope_associee;	  if ( modification	       &&	       ( operation -> relation_no_compte != compte_vire ))	    {	      /* on supprime l'ancienne op en relation, et on recre ensuite la nouvelle op */	      /* rcupre l'opration associe */		      	      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> relation_no_compte;	      ope_associee = g_slist_find_custom ( LISTE_OPERATIONS,						   GINT_TO_POINTER ( operation -> relation_no_operation ),						   (GCompareFunc) recherche_operation_par_no ) -> data;	      ope_associee -> relation_no_operation = 0;	      supprime_operation ( ope_associee );	    }	  /*  troisime solution : c'est un nouveau virement ( ou si c'tait une modif avec changement */	  /*   de compte vir */	  /* cette fois, on cre la nouvelle op associe */	  /*  ce niveau, si c'est une nouvelle opration qui est cre, son numro sera DERNIER_NO + 1 */	  /* sinon on a dj son numro */	  ope_associee = calloc ( 1,				  sizeof ( struct structure_operation ));	  /* on y met le nouveau montant et la note */	  /* 	  si la ventilation est un crdit, on inverse le montant */	  if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( bouton_credit ) ) )	    ope_associee -> montant = -operation -> montant;	  else	    ope_associee -> montant = operation -> montant;	  if ( operation -> notes )	    ope_associee -> notes = g_strdup ( operation -> notes );	  else	    ope_associee -> notes = NULL;	  ope_associee -> no_compte = compte_vire;	  ope_associee -> type_ope = operation -> type_ope;	  if ( operation -> contenu_type )	    ope_associee -> contenu_type = g_strdup ( operation -> contenu_type );	  ope_associee -> no_exercice = operation -> no_exercice;	  ope_associee -> imputation = operation -> imputation;	  ope_associee -> sous_imputation = operation -> sous_imputation;	  if ( operation -> no_piece_comptable )	    ope_associee -> no_piece_comptable = g_strdup ( operation -> no_piece_comptable );	  /* remplit la date : cree une date bidon qui sera remlit quand l'opration en cours sera valide */	  ope_associee -> jour = 1;	  ope_associee -> mois = 1;	  ope_associee -> annee = 2000;	  ope_associee -> date = g_date_new_dmy ( ope_associee -> jour,						  ope_associee -> mois,						  ope_associee -> annee );	  /* cre une devise  bidon pour viter un segfault si on russi  changer de compte avant la validation de l'op ventile */	  ope_associee -> devise = 1;	  /*   on a fini de remplir l'op, on peut l'ajouter  la liste */	  ajout_operation ( ope_associee );	  /* on met maintenant les relations entre les diffrentes op */	  operation -> relation_no_operation = ope_associee -> no_operation;	  operation -> relation_no_compte = ope_associee -> no_compte;	  ope_associee -> relation_no_operation = operation -> no_operation;	  ope_associee -> relation_no_compte = operation -> no_compte;	}    }  if ( rafraichir_categ )    mise_a_jour_categ ();  if ( rafraichir_imputation )    mise_a_jour_imputation ();  /* si c'est une modif, on supprime l'ancienne ligne de l'op */  if ( modification )    gtk_clist_remove ( GTK_CLIST ( liste_operations_ventilees ),		       gtk_clist_find_row_from_data ( GTK_CLIST ( liste_operations_ventilees ),						      operation ));  /* on met  jour la liste des ventilations */  ajoute_ope_sur_liste_ventilation ( operation );  gtk_clist_sort ( GTK_CLIST ( liste_operations_ventilees ));  mise_a_jour_couleurs_liste_ventilation ();  selectionne_ligne_ventilation ();  calcule_montant_ventilation ();  /* efface le formulaire et prpare l'op suivante */  echap_formulaire_ventilation ();  if ( modification )    gtk_widget_grab_focus ( liste_operations_ventilees );  else    {      clique_champ_formulaire_ventilation ();      gtk_widget_grab_focus ( GTK_COMBOFIX ( widget_formulaire_ventilation[0] ) -> entry );    }}