rem: jour = g_strtod ( tab_str2[0],
add: jour = my_strtod ( tab_str2[0],
context: gboolean recuperation_donnees_qif ( FILE *fichier ){  gchar *pointeur_char;  gchar **tab_char;  struct struct_compte_importation *compte;  gint retour;  gint format_date;  GSList *liste_tmp;  gchar **tab;  /* fichier pointe sur le fichier qui a t reconnu comme qif */  rewind ( fichier );  fscanf ( fichier,	   "%a[^\n]\n",	   &pointeur_char );  /* si a commence par !Option ou !Account ou !Type:Cat, on avance jusqu' ce qu'on */  /* trouve un autre !Type */ retour:  if ( !strncmp ( pointeur_char,		  "!Option",		  7 )       ||       !strncmp ( pointeur_char,		  "!Account",		  8 )       ||       !strncmp ( pointeur_char,		  "!Type:Cat",		  9 ))    {      do	{	  fscanf ( fichier,		   "%a[^\n]\n",		   &pointeur_char );	}      while ( strncmp ( pointeur_char,			"!Type",			5 )		&&		strncmp ( pointeur_char,			"!type",			5 ) );      goto retour;    }  compte = calloc ( 1,		    sizeof ( struct struct_compte_importation ));  /* c'est une importation qif */  compte -> origine = 0;  /* rcupration du type de compte */  /* on n'a pas autant de types que dans le format ofx, mais on peut dj */  /* en classer une partie */  tab_char = g_strsplit ( pointeur_char,			  ":",			  2 );  if ( !strcmp ( g_strstrip (tab_char[1]),		 "Cash" ))    compte -> type_de_compte = 7;  else    {      if ( !strcmp ( g_strstrip (tab_char[1]),		     "Bank" ))	compte -> type_de_compte = 0;      else	{	  if ( !strcmp ( g_strstrip (tab_char[1]),			 "Oth A" ))	    compte -> type_de_compte = 2;	  else	    {	      if ( !strcmp ( g_strstrip (tab_char[1]),			     "Oth L" ))		compte -> type_de_compte = 3;	      else		/* CCard */		compte -> type_de_compte = 5;	    }	}    }  /* rcupre les autres donnes du compte */  /*       pour un type CCard, le qif commence directement une op sans donner les */  /* 	caractristiques de dpart du compte, on cre donc un compte du nom */  /* "carte de crdit" avec un solde init de 0 */  if ( strcmp ( g_strstrip (tab_char[1]),		"CCard" ))    {      /* ce n'est pas une ccard, on rcupre les infos */	g_strfreev ( tab_char );	      do	{	  free ( pointeur_char );	  retour = fscanf ( fichier,			    "%a[^\n]\n",			    &pointeur_char );	  /* rcupration du solde initial ( on doit virer la , que money met pour sparer les milliers ) */	  /* on ne vire la , que s'il y a un . */	  if ( pointeur_char[0] == 'T' )	    {	      tab = g_strsplit ( pointeur_char,				 ".",				 2 );	      if( tab[1] )		{		  tab_char = g_strsplit ( pointeur_char,					  ",",					  FALSE );		  pointeur_char = g_strjoinv ( NULL,					       tab_char );		  compte -> solde = my_strtod ( pointeur_char + 1,					       NULL );		  g_strfreev ( tab_char );		}	      else		compte -> solde = g_strtod ( pointeur_char + 1,					     NULL );	      	      g_strfreev ( tab );	    }	  /* rcupration du nom du compte */	  /* 	      parfois, le nom est entre crochet et parfois non ... */	  if ( pointeur_char[0] == 'L' )	    {	      sscanf ( pointeur_char,		       "L%a[^\n]",		       &compte -> nom_de_compte );	      /* on vire les crochets s'ils y sont */	      if ( g_utf8_validate ( compte -> nom_de_compte,-1,NULL ))		{		compte -> nom_de_compte = g_strdelimit ( compte -> nom_de_compte,						       "[",						       ' ' );	      compte -> nom_de_compte =  g_strdelimit ( compte -> nom_de_compte,						       "]",						       ' ' );	      compte -> nom_de_compte =  g_strstrip ( compte -> nom_de_compte );			}	      else	      {		compte -> nom_de_compte = latin2utf8 ( g_strdelimit ( compte -> nom_de_compte,						       "[",						       ' ' ));	      compte -> nom_de_compte =  latin2utf8 (g_strdelimit ( compte -> nom_de_compte,						       "]",						       ' ' ));	      compte -> nom_de_compte =  latin2utf8 (g_strstrip ( compte -> nom_de_compte ));	      }	    }	  /* on rcupre la date du fichier */	  /*  on ne la traite pas maintenant mais quand on traitera toutes les dates */	  if ( pointeur_char[0] == 'D' )	    sscanf ( pointeur_char,		     "D%a[^\n]",		     &compte -> date_solde_qif );	}      while ( pointeur_char[0] != '^'	      &&	      retour != EOF );    }  else    {      /* c'est un compte ccard */      compte -> nom_de_compte = g_strdup ( _("Credit card"));      compte -> solde = 0;      retour = 0;	g_strfreev ( tab_char );    }  /* si le compte n'a pas de nom, on en met un ici */  if ( !compte -> nom_de_compte )    compte -> nom_de_compte = g_strdup ( _("Imported account with no name" ));  if ( retour == EOF )    {      dialogue ( _("This file is empty!") );      free (compte);      return (FALSE);    }  /* rcupration des oprations en brut, on les traitera ensuite */  do    {      struct struct_ope_importation *operation;      struct struct_ope_importation *ventilation;      ventilation = NULL;      operation = calloc ( 1,			   sizeof ( struct struct_ope_importation ));      do	{	  retour = fscanf ( fichier,			    "%a[^\n]\n",			    &pointeur_char );	  if ( retour != EOF )	    {	      /* on vire le 0d  la fin de la chane s'il y est  */	      if ( pointeur_char [ strlen (pointeur_char)-1 ] == 13 )		pointeur_char [ strlen (pointeur_char)-1 ] = 0;	      /* rcupration de la date */	      /* on la met pour l'instant dans date_tmp, et aprs avoir rcupr toutes */	      /* les ops on transformera les dates en gdate */	      if ( pointeur_char[0] == 'D' )		operation -> date_tmp = g_strdup ( pointeur_char + 1 );	      /* rcupration du pointage */	      if ( pointeur_char[0] == 'C' )		{		  if ( pointeur_char[1] == '*' )		    operation -> p_r = 1;		  else		    operation -> p_r = 2;		}	      /* rcupration de la note */	      if ( pointeur_char[0] == 'M' )		{		  operation -> notes = g_strstrip ( g_strdelimit ( pointeur_char + 1,								   ";",								   '/' ));	      	if ( !g_utf8_validate ( operation -> notes ,-1,NULL ))		  operation -> notes = latin2utf8 (operation -> notes ); 				  if ( !strlen ( operation -> notes ))		    operation -> notes = NULL;			}	      /* rcupration du montant ( on doit virer la , que money met pour sparer les milliers ) */	      /* on ne vire la , que s'il y a un . */	      if ( pointeur_char[0] == 'T' )		{		  tab = g_strsplit ( pointeur_char,				     ".",				     2 );		  if( tab[1] )		    {		      tab_char = g_strsplit ( pointeur_char,					      ",",					      FALSE );		      pointeur_char = g_strjoinv ( NULL,						   tab_char );		        operation -> montant = my_strtod ( pointeur_char + 1,							NULL ); 		       		      g_strfreev ( tab_char );		    }		    else		    operation -> montant = my_strtod ( pointeur_char + 1,						      NULL );		   		  g_strfreev ( tab );		}	      /* rcupration du chque */	        if ( pointeur_char[0] == 'N' )		operation -> cheque = my_strtod ( pointeur_char + 1,						 NULL ); 	       	      /* rcupration du tiers */	  	        if ( pointeur_char[0] == 'P' )		{			if ( g_utf8_validate ( pointeur_char+1,-1,NULL ))			{			   operation -> tiers = g_strdup ( pointeur_char + 1 );			}			else			  operation -> tiers = latin2utf8 (g_strdup ( pointeur_char + 1 )); 		}		      /* rcupration des catg */	        if ( pointeur_char[0] == 'L' )		{	      		if ( g_utf8_validate ( pointeur_char+1,-1,NULL ))			{			   operation -> categ = g_strdup ( pointeur_char + 1 );			}			else			  operation -> categ = latin2utf8 (g_strdup ( pointeur_char + 1 )); 		}	      /* rcupration de la ventilation et de sa categ */	      if ( pointeur_char[0] == 'S' )		{		  /* on commence une ventilation, si une op tait en cours, on l'enregistre */		  if ( retour != EOF && operation && operation -> date_tmp )		    {		      if ( !ventilation )			compte -> operations_importees = g_slist_append ( compte -> operations_importees,									  operation );		    }		  else		    {		      /*c'est la fin du fichier ou l'op n'est pas valide, donc les ventils ne sont pas valides non plus */		      free ( operation );		      if ( ventilation )			free ( ventilation );		      operation = NULL;		      ventilation = NULL;		    }		  /* si une ventilation tait en cours, on l'enregistre */		  if ( ventilation )		    compte -> operations_importees = g_slist_append ( compte -> operations_importees,								      ventilation );		  ventilation = calloc ( 1,					 sizeof ( struct struct_ope_importation ));		  if ( operation )		    {		      operation -> operation_ventilee = 1;		      /* rcupration des donnes de l'opration en cours */		      ventilation -> date_tmp = g_strdup ( operation -> date_tmp );		      ventilation -> tiers = operation -> tiers;		      ventilation -> cheque = operation -> cheque;		      ventilation -> p_r = operation -> p_r;		      ventilation -> ope_de_ventilation = 1;		    }	      	if ( g_utf8_validate ( pointeur_char+1,-1,NULL ))		{		   ventilation -> categ = g_strdup ( pointeur_char + 1 );		}		else		  ventilation -> categ = latin2utf8 (g_strdup ( pointeur_char + 1 )); 		   		}	      /* rcupration de la note de ventilation */	      if ( pointeur_char[0] == 'E'		   &&		   ventilation )		{		  ventilation -> notes = g_strstrip ( g_strdelimit ( pointeur_char + 1,								     ";",								     '/' ));		 if ( !g_utf8_validate ( ventilation -> notes ,-1,NULL ))		  ventilation -> notes = latin2utf8 (ventilation -> notes ); 					  if ( !strlen ( ventilation -> notes ))		    ventilation -> notes = NULL;		}	      /* rcupration du montant de la ventilation */	      /* rcupration du montant ( on doit virer la , que money met pour sparer les milliers ) */	      /* on ne vire la , que s'il y a un . */	      if ( pointeur_char[0] == '$'		   &&		   ventilation )		{		  tab = g_strsplit ( pointeur_char,				     ".",				     2 );		  if( tab[1] )		    {		      tab_char = g_strsplit ( pointeur_char,					      ",",					      FALSE );		      pointeur_char = g_strjoinv ( NULL,						   tab_char );		        ventilation -> montant = my_strtod ( pointeur_char + 1,							  NULL ); 		       		      g_strfreev ( tab_char );		    }		    else		    ventilation -> montant = my_strtod ( pointeur_char + 1,							NULL );		   		  g_strfreev ( tab );		}	    }	}      while ( pointeur_char[0] != '^' && retour != EOF );      /* on n'enregistre l'opration que si elle est date */        if ( ventilation )	{	  compte -> operations_importees = g_slist_append ( compte -> operations_importees,							       ventilation );	  ventilation = NULL;	}      else	{	  if ( retour != EOF	       &&	       operation -> date_tmp )	   compte -> operations_importees = g_slist_append ( compte -> operations_importees,								 operation );	  else	    free ( operation );	}    }          while ( retour != EOF );  /* toutes les oprations ont t rcupres */  /* on peut maintenant transformer la date_tmp en gdate */  format_date = 0;  changement_format_date:  liste_tmp = compte -> operations_importees;  while ( liste_tmp )    {      struct struct_ope_importation *operation;      gchar **tab_str;      gint jour, mois, annee;      operation = liste_tmp -> data;      /*   vrification qu'il y a une date, sinon on vire l'op de toute manire */      if ( operation -> date_tmp )	{	      	  /* 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 -> date_tmp,				 "/",				 3 );	  if ( tab_str [2] && tab_str [1] )	    {	      /* 		  le format est xx/xx/xx, pas d'apostrophe */	      if ( format_date )		{		  mois = g_strtod ( tab_str[0],				    NULL );		  jour = g_strtod ( tab_str[1],				    NULL );		}	      else		{		  jour = g_strtod ( tab_str[0],				    NULL );		  mois = g_strtod ( tab_str[1],				    NULL );		}	      if ( strlen ( tab_str[2] ) == 4 )		annee = g_strtod ( tab_str[2],				   NULL );	      else		{		  annee = g_strtod ( tab_str[2],				     NULL );		  if ( annee < 80 )		    annee = annee + 2000;		  else		    annee = 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 )		    {		      mois = g_strtod ( tab_str[0],					NULL );		      jour = g_strtod ( tab_str2[0],					NULL );		    }		  else		    {		      jour = g_strtod ( tab_str[0],					NULL );		      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 )		    annee = g_strtod ( tab_str2[1],				       NULL ) + 2000;		  else		    annee = g_strtod ( tab_str2[1],				       NULL );		  g_strfreev ( tab_str2 );		}	      else		{		  /* le format est aaaa-mm-jj */		  tab_str = g_strsplit ( operation -> date_tmp,					 "-",					 3 );		  mois = g_strtod ( tab_str[1],				    NULL );		  jour = g_strtod ( tab_str[2],				    NULL );		  if ( strlen ( tab_str[0] ) == 4 )		    annee = g_strtod ( tab_str[0],				       NULL );		  else		    {		      annee = g_strtod ( tab_str[0],					 NULL );		      if ( annee < 80 )			annee = annee + 2000;		      else			annee = annee + 1900;		    }		}	    }	  g_strfreev ( tab_str );	  if ( g_date_valid_dmy ( jour,				  mois,				  annee ))	    operation -> date = g_date_new_dmy ( jour,						 mois,						 annee );	  else	    {	      if ( format_date )		{		  dialogue ( _("Problme dans la rcupration des dates du fichier QIF.") );		  return (FALSE);		}	      format_date = 1;	      goto changement_format_date;	    }	}      else	{	  /* il n'y a pas de date, on vire l'op de la liste */	  compte -> operations_importees = g_slist_remove ( compte -> operations_importees,							    liste_tmp -> data );	}      liste_tmp = liste_tmp -> next;    }  /* rcupration de la date du fichier  */  /* si format_date = 0, c'est sous la forme jjmm sinon mmjj */  if ( compte -> date_solde_qif )    {      gchar **tab_str;      gint jour, mois, annee;      tab_str = g_strsplit ( compte -> date_solde_qif,			     "/",			     3 );      if ( tab_str [2] && tab_str [1] )	{	  /* 		  le format est xx/xx/xx, pas d'apostrophe */	  if ( format_date )	    {	      mois = g_strtod ( tab_str[0],				NULL );	      jour = g_strtod ( tab_str[1],				NULL );	    }	  else	    {	      jour = g_strtod ( tab_str[0],				NULL );	      mois = g_strtod ( tab_str[1],				NULL );	    }	  if ( strlen ( tab_str[2] ) == 4 )	    annee = g_strtod ( tab_str[2],			       NULL );	  else	    {	      annee = g_strtod ( tab_str[2],				 NULL );	      if ( annee < 80 )		annee = annee + 2000;	      else		annee = 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 )		{		  mois = g_strtod ( tab_str[0],				    NULL );		  jour = g_strtod ( tab_str2[0],				    NULL );		}	      else		{		  jour = g_strtod ( tab_str[0],				    NULL );		  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 )		annee = g_strtod ( tab_str2[1],				   NULL ) + 2000;	      else		annee = g_strtod ( tab_str2[1],				   NULL );	      g_strfreev ( tab_str2 );	    }	  else	    {	      /* le format est aaaa-mm-jj */	      tab_str = g_strsplit ( compte -> date_solde_qif,				     "-",				     3 );	      mois = g_strtod ( tab_str[1],				NULL );	      jour = g_strtod ( tab_str[2],				NULL );	      if ( strlen ( tab_str[0] ) == 4 )		annee = g_strtod ( tab_str[0],				   NULL );	      else		{		  annee = g_strtod ( tab_str[0],				     NULL );		  if ( annee < 80 )		    annee = annee + 2000;		  else		    annee = annee + 1900;		}	    }	}      g_strfreev ( tab_str );      if ( g_date_valid_dmy ( jour,			      mois,			      annee ))	compte -> date_solde = g_date_new_dmy ( jour,						mois,						annee );    }      /* ajoute ce compte aux autres comptes imports */  liste_comptes_importes = g_slist_append ( liste_comptes_importes,					    compte );  return ( TRUE );}