rem: operation -> jour = g_strtod ( tab_str[2],
add: operation -> jour = my_strtod ( tab_str[2],
context: void traitement_donnees_brutes ( void ){  gint retour;  GtkWidget *dialog;  GtkWidget *label;  GSList *liste_tmp;  GtkWidget *frame;  GtkWidget *vbox;  GSList *liste_comptes_tmp;  gint nb_comptes_ajoutes;  gint nouveau_fichier;  GtkWidget *scrolled_window;  if ( !liste_comptes_qif )    return;  /* on permet ici de rcuprer d'autres comptes */  dialog = gnome_dialog_new ( _("List of the imported accounts"),			      GNOME_STOCK_BUTTON_YES,			      GNOME_STOCK_BUTTON_NO,			      GNOME_STOCK_BUTTON_CANCEL,			      NULL );  gtk_window_set_transient_for ( GTK_WINDOW ( dialog ),				 GTK_WINDOW ( window ));  gnome_dialog_set_default ( GNOME_DIALOG ( dialog ),			     0 );  if ( g_slist_length ( liste_comptes_qif ) == 1 )    label = gtk_label_new ( _("Account to import:\n") );  else    label = gtk_label_new ( _("Accounts to import:\n") );  gtk_box_pack_start ( GTK_BOX ( GNOME_DIALOG ( dialog ) -> vbox ),		       label,		       FALSE,		       FALSE,		       0 );  gtk_widget_show ( label );  frame = gtk_frame_new ( NULL );  gtk_box_pack_start ( GTK_BOX ( GNOME_DIALOG ( dialog ) -> vbox ),		       frame,		       FALSE,		       FALSE,		       0 );  gtk_widget_show ( frame );  scrolled_window = gtk_scrolled_window_new ( NULL,					      NULL );  gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( scrolled_window ),				   GTK_POLICY_AUTOMATIC,				   GTK_POLICY_AUTOMATIC );  gtk_container_add ( GTK_CONTAINER ( frame ),		      scrolled_window );  gtk_widget_show ( scrolled_window );  vbox = gtk_vbox_new ( FALSE,			10 );  gtk_container_set_border_width ( GTK_CONTAINER ( vbox ),				   10 );  gtk_scrolled_window_add_with_viewport ( GTK_SCROLLED_WINDOW ( scrolled_window ),					  vbox );  gtk_widget_set_usize ( scrolled_window,			 200,			 200 );  gtk_widget_show ( vbox );  liste_tmp = liste_comptes_qif;  while ( liste_tmp )    {      label = gtk_label_new ( (( struct donnees_compte * )( liste_tmp -> data )) -> nom_de_compte );      gtk_misc_set_alignment ( GTK_MISC ( label ),			       0,			       0.5 );      gtk_box_pack_start ( GTK_BOX ( vbox ),			   label,			   FALSE,			   FALSE,			   0 );      gtk_widget_show ( label );      liste_tmp = liste_tmp -> next;    }  label = gtk_label_new ( _("Import another account?") );  gtk_box_pack_start ( GTK_BOX ( GNOME_DIALOG ( dialog ) -> vbox ),		       label,		       FALSE,		       FALSE,		       0 );  gtk_widget_show ( label );  retour = gnome_dialog_run_and_close ( GNOME_DIALOG ( dialog ));  /*   si on veut importer un autre compte, on renvoie sur selection_fichier_qif */  if ( !retour )    {      selection_fichier_qif();      return;    }  /*   si on annule : on s'en va */  if ( retour == 2 )    return;  /* on ralise maintenant les transformations pour importer les fichiers *//* fait le ncessaire si aucun compte n'est ouvert */  if ( nb_comptes )      nouveau_fichier = 0;  else    {      init_variables ( FALSE );      init_variables ( TRUE );      creation_liste_categories ();      creation_devises_de_base ();      nom_fichier_comptes = NULL;      nouveau_fichier = 1;      affiche_titre_fenetre();      /*   la taille des colonnes est automatique au dpart, on y met les rapports de base */      etat.largeur_auto_colonnes = 1;      rapport_largeur_colonnes[0] = 11;      rapport_largeur_colonnes[1] = 13;      rapport_largeur_colonnes[2] = 30;      rapport_largeur_colonnes[3] = 3;      rapport_largeur_colonnes[4] = 11;      rapport_largeur_colonnes[5] = 11;      rapport_largeur_colonnes[6] = 11;    }  /* on commence par enregistrer les comptes */  nb_comptes_ajoutes = 0;  liste_comptes_tmp = liste_comptes_qif;  while ( liste_comptes_tmp )    {      struct donnees_compte *compte;      GtkWidget *bouton;      gint compte_visible;      compte = liste_comptes_tmp -> data;      /* enregistre le compte */      compte_visible = p_tab_nom_de_compte_courant - p_tab_nom_de_compte;      p_tab_nom_de_compte = realloc ( p_tab_nom_de_compte, ( nb_comptes + 1 )* sizeof ( gpointer ) );      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + nb_comptes;      nb_comptes++;      *p_tab_nom_de_compte_variable = (gpointer) compte;      p_tab_nom_de_compte_courant = p_tab_nom_de_compte + compte_visible;       /* choix de la devise du compte */      compte -> devise = selection_devise ( compte -> nom_de_compte );      /* met le no de compte */      compte -> no_compte = nb_comptes - 1;      ordre_comptes = g_slist_append ( ordre_comptes,				       GINT_TO_POINTER ( nb_comptes - 1 ));      /* on cre les types d'op par dfaut */      creation_types_par_defaut ( nb_comptes - 1,				  0);      if ( !nouveau_fichier )	{	  /* cre le nouveau bouton du compte et l'ajoute  la liste des comptes */	  bouton = comptes_appel(nb_comptes - 1 );	  gtk_box_pack_start (GTK_BOX (vbox_liste_comptes),			      bouton,			      FALSE,			      FALSE,			      0);	  gtk_widget_show (bouton);	}      nb_comptes_ajoutes++;      liste_comptes_tmp = liste_comptes_tmp -> next;    }  p_tab_nom_de_compte_courant = p_tab_nom_de_compte + compte_courant;  /* on fait maintenant le tour des ops et cette fois on les convertit */  liste_comptes_tmp = liste_comptes_qif;  while ( liste_comptes_tmp )    {      struct donnees_compte *compte;      gdouble solde_courant;      struct structure_operation *operation;      gint format_date;      GSList *save_gsliste;      gint derniere_operation;      GSList *liste_ope_brut;      derniere_operation = 0;      compte = liste_comptes_tmp -> data;      /*       au dbut, on considre que la date est sous forme jjmmaa, si pb, on passe  mmjjaa */      format_date = 0;      liste_ope_brut = compte -> gsliste_operations;      changement_format_date :      compte -> nb_operations = 0;      liste_tmp = liste_ope_brut;      save_gsliste = liste_tmp;      compte -> gsliste_operations = NULL;      solde_courant = compte -> solde_initial;      while ( liste_tmp )	{	  struct struct_operation_qif *operation_qif;	  gchar **tab_str;	  GSList *pointeur_tmp;	  operation_qif = liste_tmp -> data;	  /* 	  vrification qu'il y a une date, sinon ce n'est pas une op, on prend pas */	  if ( operation_qif -> date )	    {	      operation = calloc ( 1, sizeof ( struct structure_operation ));	      /* rcupration du no de l'op */	      operation -> no_operation = ++no_derniere_operation;	      operation -> type_ope = 0;	      /* rcupration de la date qui est du format jj/mm/aaaa ou jj/mm/aa ou jj/mm'aa  partir de 2000 */	      /* 	      si format_date = 0, c'est sous la forme jjmm sinon mmjj */	      tab_str = g_strsplit ( operation_qif -> date,				     "/",				     3 );	      if ( tab_str [2] && tab_str [1] )		{		  /* 		  le format est xx/xx/xx, pas d'apostrophe */		  if ( format_date )		    {		      operation -> mois = g_strtod ( tab_str[0],						     NULL );		      operation -> jour = g_strtod ( tab_str[1],						     NULL );		    }		  else		    {		      operation -> jour = g_strtod ( tab_str[0],						     NULL );		      operation -> mois = g_strtod ( tab_str[1],						     NULL );		    }		  if ( strlen ( tab_str[2] ) == 4 )		    operation -> annee = g_strtod ( tab_str[2],						    NULL );		  else		    {		      operation -> annee = g_strtod ( tab_str[2],						      NULL );		      if ( operation -> annee < 80 )			operation -> annee = operation -> annee + 2000;		      else			operation -> annee = operation -> annee + 1900;		    }		}	      else		{		  if ( tab_str[1] )		    {		      /* le format est xx/xx'xx */		      gchar **tab_str2;		      tab_str2 = g_strsplit ( tab_str[1],					      "'",					      2 );		      if ( format_date )			{			  operation -> mois = g_strtod ( tab_str[0],							 NULL );			  operation -> jour = g_strtod ( tab_str2[0],							 NULL );			}		      else			{			  operation -> jour = g_strtod ( tab_str[0],							 NULL );			  operation -> mois = g_strtod ( tab_str2[0],							 NULL );			}		      /* si on avait 'xx, en fait a peut tre 'xx ou 'xxxx ... */		      if ( strlen ( tab_str2[1] ) == 2 )			operation -> annee = g_strtod ( tab_str2[1],							NULL ) + 2000;		      else			operation -> annee = g_strtod ( tab_str2[1],							NULL );		      g_strfreev ( tab_str2 );		    }		  else		    {		      /* le format est aaaa-mm-jj */		      tab_str = g_strsplit ( operation_qif -> date,					     "-",					     3 );		      operation -> mois = g_strtod ( tab_str[1],						     NULL );		      operation -> jour = g_strtod ( tab_str[2],						     NULL );		      if ( strlen ( tab_str[0] ) == 4 )			operation -> annee = g_strtod ( tab_str[0],							NULL );		      else			{			  operation -> annee = g_strtod ( tab_str[0],							NULL );			if ( operation -> annee < 80 )			  operation -> annee = operation -> annee + 2000;			else			  operation -> annee = operation -> annee + 1900;			}		    }		}	      g_strfreev ( tab_str );	      if ( g_date_valid_dmy ( operation -> jour,				      operation -> mois,				      operation -> annee ))		operation -> date = g_date_new_dmy ( operation -> jour,						     operation -> mois,						     operation -> annee );	      else		{		  if ( format_date )		    {		      dialogue ( _("Problem recovering the dates in the QIF file. Import canceled.") );		      return;		    }		  format_date = 1;		  goto changement_format_date;		}	      /* rcupration du no de compte ( stock pour l'instant dans no_derniere_operation ) */	      operation -> no_compte = compte->no_compte;	      /* rcupration du montant */	      operation -> montant = operation_qif -> montant;	      solde_courant = solde_courant + operation_qif -> montant;	      operation -> devise = compte -> devise;	      /* rcupration du tiers */	      if ( operation_qif -> tiers )		{		  pointeur_tmp = g_slist_find_custom ( liste_struct_tiers,						       g_strstrip ( operation_qif -> tiers ),						       (GCompareFunc) recherche_tiers_par_nom );		  /* si le tiers n'existait pas, on le cre */		  if ( pointeur_tmp )		    operation -> tiers = ((struct struct_tiers *)(pointeur_tmp -> data)) -> no_tiers;		  else		    operation -> tiers = (( struct struct_tiers * )( ajoute_nouveau_tiers ( operation_qif -> tiers ))) -> no_tiers;		}	      /* vrification si c'est ventil, sinon rcupration des catgories */	      if ( operation_qif -> operation_ventilee )		{		  /* l'opration est ventile */		  operation -> operation_ventilee = 1;		}	      else		{		  /* vrification que ce n'est pas un virement */		  if ( operation_qif -> categ && strlen ( g_strstrip (operation_qif -> categ)) )		    {		      if ( operation_qif -> categ[0] == '[' )			{			  /* recherche du compte en relation ( on cherchera l'op ensuite, une fois */			  /* que toutes les ops auront t importes */			  gint i;			  p_tab_nom_de_compte_variable = p_tab_nom_de_compte;			  for ( i = 0 ; i < nb_comptes ; i++ )			    {			      if ( !g_strcasecmp ( g_strconcat ( "[",								 NOM_DU_COMPTE,								 "]",								 NULL ),						   operation_qif -> categ ))				{				  /* on a trouv le compte, met la relation de l'op  -1 pour dire qu'il faut la chercher */				  operation -> relation_no_compte = i;				  operation -> relation_no_operation = -1;				  operation -> type_ope = 1;				}			      p_tab_nom_de_compte_variable++;			    }			}		      else			{			  struct struct_categ *categ;			  struct struct_sous_categ *sous_categ ;			  tab_str = g_strsplit ( operation_qif -> categ,						 ":",						 2 );			  /* rcupration ou cration de la catgorie */			  if ( !g_slist_find_custom ( liste_struct_categories,						      g_strstrip ( tab_str[0] ),						      (GCompareFunc) recherche_categorie_par_nom ))			    {			      categ = calloc ( 1,					       sizeof ( struct struct_categ ));			      categ -> no_categ = ++no_derniere_categorie;			      categ -> nom_categ = g_strdup ( g_strstrip ( tab_str[0] ) );			      if ( operation_qif -> montant < 0 )				categ -> type_categ = 1;			      else				categ -> type_categ = 0;			      nb_enregistrements_categories++;			      liste_struct_categories = g_slist_append ( liste_struct_categories,									 categ );			    }			  else			    categ = g_slist_find_custom ( liste_struct_categories,							  g_strstrip ( tab_str[0] ),							  (GCompareFunc) recherche_categorie_par_nom ) -> data;			  operation -> categorie = categ -> no_categ;			  /* rcupration ou cration de la sous-catgorie */			  if ( tab_str[1] )			    {			      if ( !g_slist_find_custom ( categ -> liste_sous_categ,							  g_strstrip ( tab_str[1] ),							  (GCompareFunc) recherche_sous_categorie_par_nom ))				{				  sous_categ = calloc ( 1,							sizeof ( struct struct_sous_categ ));				  sous_categ -> no_sous_categ = ++( categ -> no_derniere_sous_categ );				  sous_categ -> nom_sous_categ = g_strdup ( g_strstrip ( tab_str[1] ));				  categ -> liste_sous_categ = g_slist_append ( categ -> liste_sous_categ,									       sous_categ );				}			      else				sous_categ = g_slist_find_custom ( categ -> liste_sous_categ,								   g_strstrip ( tab_str[1] ),								   (GCompareFunc) recherche_sous_categorie_par_nom ) -> data;			      operation -> sous_categorie = sous_categ -> no_sous_categ;			    }			  g_strfreev ( tab_str );			}		    }		}	      /* rcupration des notes */	      operation -> notes = operation_qif -> notes;	      p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;	      /* rcupration du chque et mise en forme du type d'opration */	      if ( operation_qif -> cheque )		{		  /* c'est un chque, on va rechercher un type  incrmentation automatique et mettre l'op sous ce type */		  /* si un tel type n'existe pas, on met quand mme le no dans contenu_type et on met le type par dfaut */		  struct struct_type_ope *type_choisi;		  GSList *liste_tmp;		  if ( operation -> montant < 0 )		    operation -> type_ope = TYPE_DEFAUT_DEBIT;		  else		    operation -> type_ope = TYPE_DEFAUT_CREDIT;		  operation -> contenu_type = itoa ( operation_qif -> cheque );		  liste_tmp = TYPES_OPES;		  type_choisi = NULL;		  while ( liste_tmp )		    {		      struct struct_type_ope *type;		      type = liste_tmp -> data;		      /* si l'op on trouve un type  incrmentation automatique et que le signe du type est bon, on l'enregistre */		      /*   et on arrte la recherche, sinon, on l'enregistre mais on continue la recherche dans l'espoir de trouver */		      /* mieux */		      if ( type -> numerotation_auto )			{			  if ( !type -> signe_type			       ||			       ( type -> signe_type == 1 && operation -> montant < 0 )			       ||			       ( type -> signe_type == 2 && operation -> montant > 0 ))			    {			      operation -> type_ope = type -> no_type;			      type_choisi = type;			      liste_tmp = NULL;			    }			  else			    {			      operation -> type_ope = type -> no_type;			      type_choisi = type;			      liste_tmp = liste_tmp -> next;			    }			}		      else			liste_tmp = liste_tmp -> next;		    }		  /* type_choisi contient l'adr du type qui a t utilis, on peut y mettre le dernier no de chque */		  if ( type_choisi )		    type_choisi -> no_en_cours = MAX ( operation_qif -> cheque,						       type_choisi -> no_en_cours );		}	      else		{		  /* comme ce n'est pas un chque, on met sur le type par dfaut */		  if ( operation -> type_ope != 1 )		    {		      if ( operation -> montant < 0 )			operation -> type_ope = TYPE_DEFAUT_DEBIT;		      else			operation -> type_ope = TYPE_DEFAUT_CREDIT;		    }		}	      /* rcupration du point */	      operation -> pointe = operation_qif -> p_r;	      /* si c'est une ope de ventilation, lui ajoute le no de l'opration prcdente */	      if ( operation_qif -> ope_de_ventilation )		operation -> no_operation_ventilee_associee = derniere_operation;	      else		derniere_operation = operation -> no_operation;	      /* ajoute l'opration dans la liste des ops du compte */	      compte -> gsliste_operations = g_slist_append ( compte -> gsliste_operations,							      operation );	      compte -> nb_operations++;	    }	  liste_tmp = liste_tmp -> next;	}      compte -> nb_lignes_ope = 3;      compte -> solde_courant = solde_courant;      compte -> date_releve = NULL;      compte -> operation_selectionnee = GINT_TO_POINTER ( -1 );      liste_comptes_tmp = liste_comptes_tmp -> next;    }  /* on fait maintenant le lien entre les diffrents virements : */  /* on fait le tour de toutes les ops des comptes ajouts, */  /* si une op  un relation_no_operation  -1 , */  /* on recherche dans le compte associ une op avec aussi une relation_no_operation  -1  */  /* le mme jour avec le mme tiers */  liste_comptes_tmp = liste_comptes_qif;  while ( liste_comptes_tmp )    {      struct donnees_compte *compte;      struct structure_operation *operation;      compte = liste_comptes_tmp -> data;      liste_tmp = compte -> gsliste_operations;      while ( liste_tmp )	{	  operation = liste_tmp -> data;	  if ( operation -> relation_no_operation == -1 )	    {	      GSList *pointeur_tmp;	      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> relation_no_compte;	      pointeur_tmp = LISTE_OPERATIONS;	      while ( pointeur_tmp )		{		  struct structure_operation *operation_2;		  operation_2 = pointeur_tmp -> data;		  if ( operation_2 -> relation_no_operation == -1 )		    {		      if ( !g_date_compare ( operation -> date, operation_2 -> date )			   &&			   ( operation -> tiers == operation_2 -> tiers )			   &&			   ( fabs ( operation -> montant ) == fabs ( operation_2 -> montant ) ))			{			  operation -> relation_no_operation = operation_2 -> no_operation;			  operation_2 -> relation_no_operation = operation -> no_operation;			}		    }		  pointeur_tmp = pointeur_tmp -> next;		}	    }	  liste_tmp = liste_tmp -> next;	}      liste_comptes_tmp = liste_comptes_tmp -> next;    }  /* cration des listes d'op */  mise_en_route_attente ( _("Processing the information can be long...") );  if ( nouveau_fichier )    {      creation_fenetre_principale();      creation_listes_operations ();      changement_compte ( GINT_TO_POINTER ( compte_courant ) );      gtk_notebook_set_page ( GTK_NOTEBOOK ( notebook_general ),			      0 );    }  else    while ( nb_comptes_ajoutes )      {	/* trie la liste */	p_tab_nom_de_compte_variable = p_tab_nom_de_compte + nb_comptes - nb_comptes_ajoutes;	LISTE_OPERATIONS = g_slist_sort ( LISTE_OPERATIONS,					  ( GCompareFunc ) comparaison_date_list_ope );	ajoute_nouvelle_liste_operation( nb_comptes - nb_comptes_ajoutes );	nb_comptes_ajoutes--;	p_tab_nom_de_compte_variable = p_tab_nom_de_compte + compte_courant;	MISE_A_JOUR = 1;      }  /* on recre les combofix des tiers et des catgories */  mise_a_jour_tiers ();  mise_a_jour_categ();/* on met  jour l'option menu du formulaire des chances */  gtk_option_menu_set_menu ( GTK_OPTION_MENU ( widget_formulaire_echeancier[5] ),			     creation_option_menu_comptes () );  /* mise  jour de l'accueil */  update_liste_comptes_accueil ();  mise_a_jour_soldes_minimaux ();  affiche_titre_fenetre ();  annulation_attente();  gnome_app_set_contents ( GNOME_APP ( window ), 			   notebook_general );  modification_fichier ( TRUE );}