rem: operation -> montant = g_strtod ( g_strstrip ( (char *) gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_ventilation[3] ))),
add: operation -> montant = my_strtod ( g_strstrip ( (char *) gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_ventilation[3] ))),
context: void fin_edition_ventilation ( void ){  struct struct_ope_ventil *operation;  gint modification;  gchar **tableau_char;  gint compte_vire;  gint perte_ligne_selectionnee;  /* pour viter les warnings lors de la compil */  compte_vire = 0;  tableau_char = NULL;  /* on met le focus sur la liste des ops pour ventuellement faire perdre le focus aux entres des */  /* montants pour faire les modifs ncessaires automatiquement */  gtk_window_set_focus ( GTK_WINDOW ( window ),			 liste_operations_ventilees );  /* perte ligne slectionne sera  1 s'il y a une magouille avec les virements et */  /* qu'on recre une op au lieu de la modifier. dans ce cas on remettra la ligne */  /* slectionn sur la nouvelle op */  perte_ligne_selectionnee = 0;  /*   dans cette fonction, on rcupre les infos du formulaire qu'on met dans une structure */  /* de ventilation, et on ajoute cette structure  celle en cours (ou modifie si elle existait */  /* dj */  /* on vrifie si c'est un virement que le compte est valide et que ce n'est pas un virement sur lui-mme */  if ( gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_ventilation[0] ) -> entry ) == style_entree_formulaire[0] )    {      /*       on split dj les catg, sans librer la variable, pour la rcuprer ensuite pour les categ */      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 ( !strcmp ( tableau_char[0],			 _("Transfer")))	    {	      gint i;	      if ( tableau_char[1] )		{		  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,				     tableau_char[1] ) )			compte_vire = i;		    }		  if ( compte_vire == -1 )		    {		      dialogue ( _("Warning: the associated account for this transfer is invalid") );		      return;		    }		  if ( compte_vire == compte_courant )		    {		      dialogue ( _("Error: it's impossible to transfer an account to itself") );		      return;		    }		}	      else		{		  dialogue ( _("Error: no account associated with the transfer") );		  return;		}	    }	}    }  /*   on rcupre l'adresse de l'opration, soit c'est une modif, soit c'est une nouvelle (-1) */  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 struct_ope_ventil ));      modification = 0;    }  else    modification = 1;  /*   rcupration des catgories / sous-catg, s'ils n'existent pas, on les cre */  /* la variable tableau_char est dj initialise lors des tests du virement */  /*   il y a 3 possibilits en rapport avec les virements : */  /* si l'ancienne op tait un virement, la nouvelle est : */  /* soit virement vers le mme compte */  /* soit virement vers un autre compte */  /* soit ce n'est plus un virement */  /*     pour la 1re, c'est une modif normale d'op */  /*     pour les 2nde et 3me, on supprime cette op et en recre une nouvelle */  /* il faut donc mettre la rcup des catg en premier car il peut y avoir un changement au niveau des */  /* modif avec suppression de l'ancienne et cration d'une nouvelle ope */  if ( gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_ventilation[0] ) -> entry ) == style_entree_formulaire[0] )    {      struct struct_categ *categ;      if ( strlen ( tableau_char[0] ) )	{	  /* on vrifie ici si c'est un virement */	  if ( strcmp ( tableau_char[0],			_("Transfer") ) )	    {	      /* ce n'est pas un virement, recherche les catg */	      GSList *pointeur_liste;	      /* si c'est une modif d'op et que l'ancienne op tait un virement */	      /* on marque cette op comme supprime et on en fait une nouvelle */	      if ( modification		   &&		   operation -> relation_no_operation )		{		  operation -> supprime = 1;		  operation = calloc ( 1,				       sizeof ( struct struct_ope_ventil ));		  modification = 0;		  perte_ligne_selectionnee = 1;		}	      /* 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;	      else		{		  categ = ajoute_nouvelle_categorie ( tableau_char[0] );		  if ( operation -> montant < 0 )		    categ -> type_categ = 1;		  else		    categ -> type_categ = 0;		}	  	      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;		  else		    sous_categ = ajoute_nouvelle_sous_categorie ( tableau_char[1],								  categ );		  		  operation -> sous_categorie = sous_categ -> no_sous_categ;		}	      else		operation -> sous_categorie = 0;	    }	  else	    {	      /* c'est un virement */	      /* si c'est une nouvelle op, on est content et on prend juste le compte de virement */	      /* si c'est une modif d'op et que l'ancienne n'tait pas un virement, idem */	      /* si l'ancienne tait un virement vers le mme compte, idem */	      /* si l'ancienne tait un virement vers un autre compte, c'est qu'on cherche les bugs ... */	      /* dans ce cas, on marque l'op comme supprime et on en recre une nouvelle */	      /* le no de compte du virement est dj dans compte_vire */	      if ( modification		   &&		   operation -> relation_no_operation != -1		   &&		   operation -> relation_no_compte != compte_vire )		{		  /* on supprime donc l'op et en cre une nouvelle */		  operation -> supprime = 1;		  operation = calloc ( 1,				       sizeof ( struct struct_ope_ventil ));		  modification = 0;		  perte_ligne_selectionnee = 1;		}	      /* on met les no de categ  0 */	      operation -> categorie = 0;	      operation -> sous_categorie = 0;	      /* on met le compte en relation si c'est une nouvelle opration */	      if ( !modification )		operation -> relation_no_operation = -1;	      operation -> relation_no_compte = compte_vire;	    }	}      /*       on peut maintenant librer la variable tableau_char, qui ne sera plus utilise */      g_strfreev ( tableau_char );    }  else    {      /* il n'y a aucune catg, si c'est une modif d'op et que cette op tait un virement, */      /* on marque cette op comme supprime et on en recre une nouvelle */      if ( modification	   &&	   operation -> relation_no_operation )	{	  operation -> supprime = 1;	  operation = calloc ( 1,			       sizeof ( struct struct_ope_ventil ));	  modification = 0;	  perte_ligne_selectionnee = 1;	}    }  /* rcupration du type d'op associe s'il est affich */  if ( GTK_WIDGET_VISIBLE ( widget_formulaire_ventilation[5] ))    operation -> no_type_associe = GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_ventilation[5] ) -> menu_item ),									   "no_type" ));  /* rcupration des notes */  if ( gtk_widget_get_style ( widget_formulaire_ventilation[1] ) == style_entree_formulaire[0] )    operation -> notes = g_strdup ( g_strstrip ( (char *) gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_ventilation[1] ))));  else    operation -> notes = NULL;  /* rcupration du montant */  if ( gtk_widget_get_style ( widget_formulaire_ventilation[2] ) == style_entree_formulaire[0] )    /* c'est un dbit */    operation -> montant = -g_strtod ( g_strstrip ( (char *) gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_ventilation[2] ))),				       NULL );  else    operation -> montant = g_strtod ( g_strstrip ( (char *) gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_ventilation[3] ))),				      NULL );  /* rcupration de l'imputation budgtaire */  if ( gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_ventilation[4] ) -> 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[4] )),				  ":",				  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;	}      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 );	  operation -> sous_imputation = sous_imputation -> no_sous_imputation;	}      else	operation -> sous_imputation = 0;      g_strfreev ( tableau_char );    }  /* rcupration de l'exercice */  /* si l'exo est  -1, c'est que c'est sur non affich */  /* soit c'est une modif d'op et on touche pas  l'exo */  /* soit c'est une nouvelle op et on met l'exo  0 */  if ( GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_ventilation[6] ) -> menu_item ),					       "no_exercice" )) == -1 )    {      if ( !operation -> no_operation )	operation -> no_exercice = 0;    }  else    operation -> no_exercice = GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_ventilation[6] ) -> menu_item ),								       "no_exercice" ));/* rcupration du no de pice comptable */  if ( gtk_widget_get_style ( widget_formulaire_ventilation[7] ) == style_entree_formulaire[0] )    operation -> no_piece_comptable = g_strdup ( g_strstrip ( (char *) gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_ventilation[7] ))));  else    operation -> no_piece_comptable = NULL;   /* on a rempli l'opration, on l'ajoute  la liste */  /* si c'est une modif */  if ( !modification )    {      GSList *liste_struct_ventilations;      /* rcupration de la liste de ventilations */      liste_struct_ventilations = gtk_object_get_data ( GTK_OBJECT ( formulaire ),							"liste_adr_ventilation" );      /*   si cette liste est  -1 (ce qui veut dire qu'elle est nulle en ralit mais */      /* qu'elle a dj t dite ), on la met  0 */      if ( liste_struct_ventilations == GINT_TO_POINTER ( -1 ))	liste_struct_ventilations = NULL;      /* on ajoute l'op */      liste_struct_ventilations = g_slist_append ( liste_struct_ventilations,						   operation );      gtk_object_set_data ( GTK_OBJECT ( formulaire ),			    "liste_adr_ventilation",			    liste_struct_ventilations );    }  /*   si perte_ligne_selectionnee = 1, c'est qu'au lieu de modifier une op (virement), on l'a */  /* effac puis recr une nouvelle. comme a se fait que lors d'une modif d'op, on remet */  /* la selection sur cette nouvelle op */  if ( perte_ligne_selectionnee == 1 )    ligne_selectionnee_ventilation = operation;  mise_a_jour_categ ();  mise_a_jour_imputation ();  /* on met  jour la liste des ventilations */  affiche_liste_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 );    }}