rem: tab_char = g_strsplit ( pointeur_char, ":", 2 );  if ( strcmp ( g_strstrip (tab_char[1]), "Cash" ) ) if ( strcmp ( g_strstrip ( tab_char[1]), "Oth L" ))
add: if ( strchr(pointeur_char, ':') ) tab_char = g_strsplit ( pointeur_char, ":", 2 ); else if ( strchr(pointeur_char, ' ') ) tab_char = g_strsplit ( pointeur_char, " ", 2 ); else tab_char = NULL;  if ( tab_char && strcmp ( g_strstrip (tab_char[1]), "Cash" ) ) if ( strcmp ( g_strstrip ( tab_char[1]), "Oth L" ))
context: void fichier_choisi_importation_qif ( GtkWidget *fenetre ){  gchar *nom_fichier_qif;  FILE *fichier_qif;  gchar *pointeur_char;  gchar **tab_char;  struct donnees_compte *compte;  GSList *liste_ope_brut;  gint retour;  gchar ** selection, **iter;  /* on met le rpertoire courant dans la variable correspondante */  dernier_chemin_de_travail = g_strconcat ( GTK_LABEL ( GTK_BIN ( GTK_OPTION_MENU ( GTK_FILE_SELECTION ( fenetre ) -> history_pulldown )) -> child ) -> label,					    "/",					    NULL );  /* on va rcuprer tous les fichiers slectionns puis proposer d'en importer d'autres */  selection = gtk_file_selection_get_selections ( GTK_FILE_SELECTION(fenetre) );  iter = selection;  while ( iter && *iter )    {      gchar *fichier;/*       separation = g_strsplit ( GTK_LABEL ( GTK_FILE_SELECTION ( fenetre ) -> selection_text ) -> label, *//* 				":", *//* 				2 ); *//*       nom_fichier_qif = g_strconcat ( g_strstrip ( separation[1] ), *//* 				      "/", *//* 				      fichier[0], *//* 				      NULL ); *//*       g_strfreev ( separation ); */      nom_fichier_qif = (char*) *iter;      if ( !( fichier_qif = fopen ( nom_fichier_qif,				    "r" ) ))	{	  dialogue ( g_strconcat ("cannot open ", nom_fichier_qif, ": ",				  latin2utf8 ( strerror(errno) ), NULL ));	  return;	}      /* rcupration des donnes du compte */      fscanf ( fichier_qif,	       "%a[^\n]\n",	       &pointeur_char );      if ( strncmp ( pointeur_char,		     "!Type",		     5 )	   &&	   strncmp ( pointeur_char,		     "!type",		     5 )	   &&	   strncmp ( pointeur_char,		     "!Account",		     8 )	   &&	   strncmp ( pointeur_char,		     "!Option",		     7 ))	{	  dialogue ( g_strdup_printf ( _("The file \"%s\" is not a QIF file"),				       nom_fichier_qif ));	  free ( pointeur_char );	  return;	}      else	gtk_signal_handler_block_by_func ( GTK_OBJECT ( fenetre ),					   GTK_SIGNAL_FUNC ( traitement_donnees_brutes ),					   NULL );      /* c'est bien un fichier qif, on peut commencer */      /* 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_qif,		       "%a[^\n]\n",		       &pointeur_char );	    }	  while ( strncmp ( pointeur_char,			    "!Type",			    5 ));	  goto retour;	}	          /* rafraichit la fenetre d'attente */      if ( patience_en_cours )	while ( g_main_iteration ( FALSE ) );      compte = calloc ( 1,			sizeof ( struct donnees_compte ));      /* ajoute ce compte aux autres comptes imports */       liste_comptes_qif = g_slist_append ( liste_comptes_qif,					   compte );      /* rcupration du type de compte */      tab_char = g_strsplit ( pointeur_char,			      ":",			      2 );      if ( strcmp ( g_strstrip (tab_char[1]),		    "Cash" ) )	if ( strcmp ( g_strstrip ( tab_char[1]),		      "Oth L" ))	  compte -> type_de_compte = 0;	else	  compte -> type_de_compte = 2;      else	compte -> type_de_compte = 1;      /* 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 */	  do	    {	      free ( pointeur_char );	      retour = fscanf ( fichier_qif,				"%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' )		{		  gchar **tab;		  tab = g_strsplit ( pointeur_char,				     ".",				     2 );		  if( tab[1] )		    {		      gchar **tab_char;		      tab_char = g_strsplit ( pointeur_char,					      ",",					      FALSE );		      pointeur_char = g_strjoinv ( NULL,						   tab_char );		      compte -> solde_initial = my_strtod ( pointeur_char + 1,							   NULL );		      g_strfreev ( tab_char );		    }		  else		    compte -> solde_initial = my_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 */		  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 ));		}	    }	  while ( pointeur_char[0] != '^' && retour != EOF );	}      else	{	  /* c'est un compte ccard */	  compte -> nom_de_compte = _("Credit card");	  compte -> solde_initial = 0;	  retour = 0;	}      /* 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!") );	  return;	}      /* rcupration des oprations en brut, on les traitera ensuite */      liste_ope_brut = NULL;      do	{	  struct struct_operation_qif *operation;	  struct struct_operation_qif *ventilation;	  ventilation = NULL;	  operation = calloc ( 1, sizeof ( struct struct_operation_qif ));	  do	    {	      retour = fscanf ( fichier_qif,				"%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 */		  if ( pointeur_char[0] == 'D' )		    operation -> date = 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 = latin2utf8 (g_strstrip ( g_strdelimit ( pointeur_char + 1,								       ";", '/' )));		      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' )		    {		      gchar **tab;		      tab = g_strsplit ( pointeur_char,					 ".",					 2 );		      if( tab[1] )			{			  gchar **tab_char;			  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' )		    operation -> tiers = latin2utf8 (g_strdup ( pointeur_char + 1 ));		  /* rcupration des catg */		  if ( pointeur_char[0] == 'L' )		    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 */		      /* ALAIN-FIXME : je ne comprends pas du tout ce test.		         D'abord, normalement, on est dans une boucle o			 retour != EOF.			 Ensuite, pourquoi tester la date de l'opration ?			 le bug #180 survient car operation n'existe pas,			 on a donc un segment fault lorsqu'on essaye d'accder			 au membre date *//*		      if ( retour != EOF && operation -> date ) */		      if ( retour != EOF && operation )			{			  if ( !ventilation )			    liste_ope_brut = g_slist_append ( liste_ope_brut, 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 )			liste_ope_brut = g_slist_append ( liste_ope_brut, ventilation );		      if ( operation )			{			  ventilation = calloc ( 1, sizeof ( struct struct_operation_qif ));			  operation -> operation_ventilee = 1;			  /* rcupration des donnes de l'opration en cours */			  ventilation -> date = operation -> date;			  ventilation -> tiers = operation -> tiers;			  ventilation -> cheque = operation -> cheque;			  ventilation -> p_r = operation -> p_r;			  ventilation -> ope_de_ventilation = 1;			  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 ( !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 . */		  /* comme money enregistre en ngatif ou en positif */		  /* soit c'est du mme signe que l'op et on prend la valeur absolue */		  /* soit c'est de signe contraire et on prend la vraie valeur */		  if ( pointeur_char[0] == '$'		       &&		       ventilation )		    {		      gchar **tab;		      tab = g_strsplit ( pointeur_char, ".", 2 );		      if( tab[1] )			{			  gchar **tab_char;			  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 )	    {	      liste_ope_brut = g_slist_append ( liste_ope_brut, ventilation );	      ventilation = NULL;	    }	  else	    {	      if ( retour != EOF && operation -> date )		liste_ope_brut = g_slist_append ( liste_ope_brut, operation );	      else		free ( operation );	    }	}      while ( retour != EOF );      fclose ( fichier_qif );      /* pour l'instant, on met la liste cre dans la liste des ops du compte */      compte -> gsliste_operations = liste_ope_brut;      iter++;    }  g_strfreev(selection);  gtk_widget_hide ( fenetre );  traitement_donnees_brutes();}