add: montant = calcule_montant_devise_renvoi ( ope_test -> montant, DEVISE, operation -> devise, operation -> une_devise_compte_egale_x_devise_ope, operation -> taux_change, operation -> frais_change );
context: void exporter_fichier_qif ( void ){  GtkWidget *dialog;  GtkWidget *label;  GtkWidget *frame;  GtkWidget *table;  GtkWidget *entree;  GtkWidget *check_button;  gint i;  gint resultat;  GSList *liste_tmp;  gchar *nom_fichier_qif;  FILE *fichier_qif;  gchar *montant_tmp;    if ( !nom_fichier_comptes )    {      dialogue ( _("Your file must have a name (saved) to be exported.") );      return;    }  dialogue ( _("Carreful, the QIF format cannot use currencies,\nall the transactions will be convert in the currencie of their account."));   dialog = gnome_dialog_new ( _("Exporter des fichiers QIF"),			      GNOME_STOCK_BUTTON_OK,			      GNOME_STOCK_BUTTON_CANCEL,			      NULL );  gtk_window_set_transient_for ( GTK_WINDOW ( dialog ),				 GTK_WINDOW ( window ));  gtk_signal_connect ( GTK_OBJECT ( dialog ),		       "destroy",		       GTK_SIGNAL_FUNC ( gtk_signal_emit_stop_by_name ),		        "destroy" );  label = gtk_label_new ( COLON(_("Select the accounts to export")) );  gtk_box_pack_start ( GTK_BOX ( GNOME_DIALOG ( dialog ) -> vbox ),		       label,		       FALSE,		       FALSE,		       5 );  gtk_widget_show ( label );  frame = gtk_frame_new ( NULL );  gtk_box_pack_start ( GTK_BOX ( GNOME_DIALOG ( dialog ) -> vbox ),		       frame,		       FALSE,		       FALSE,		       5 );  gtk_widget_show ( frame );  table = gtk_table_new ( 3,			  nb_comptes,			  FALSE );  gtk_container_set_border_width ( GTK_CONTAINER ( table ),				   10 );  gtk_table_set_col_spacings ( GTK_TABLE ( table ),			       10 );  gtk_container_add ( GTK_CONTAINER ( frame ),		      table );  gtk_widget_show ( table );  /* on met chaque compte dans la table */  p_tab_nom_de_compte_variable = p_tab_nom_de_compte;  for ( i = 0 ; i < nb_comptes ; i++ )    {      check_button = gtk_check_button_new ();      gtk_table_attach ( GTK_TABLE ( table ),			 check_button,			 0, 1,			 i, i+1,			 GTK_SHRINK | GTK_FILL,			 GTK_SHRINK | GTK_FILL,			 0, 0 );      gtk_widget_show ( check_button );      label = gtk_label_new ( NOM_DU_COMPTE );      gtk_misc_set_alignment ( GTK_MISC ( label ),			       0,			       0.5 );      gtk_table_attach ( GTK_TABLE ( table ),			 label,			 1, 2,			 i, i+1,			 GTK_SHRINK | GTK_FILL,			 GTK_SHRINK | GTK_FILL,			 0, 0 );      gtk_widget_show ( label );      entree = gnome_file_entry_new ("qif", _("Exportation of a QIF file"));      gtk_widget_set_usize ( GTK_WIDGET ( gnome_file_entry_gtk_entry ( GNOME_FILE_ENTRY ( entree ) )),			     300,			     FALSE );      gnome_file_entry_set_default_path ( GNOME_FILE_ENTRY ( entree ),					  dernier_chemin_de_travail );      gtk_entry_set_text ( GTK_ENTRY (gnome_file_entry_gtk_entry ( GNOME_FILE_ENTRY ( entree ) ) ),			   g_strconcat ( nom_fichier_comptes,					 "-",					 g_strdelimit ( g_strdup ( NOM_DU_COMPTE) , " ", '_' ),					 ".qif",					 NULL ));      gtk_widget_set_sensitive ( entree,				 FALSE );      gtk_object_set_data ( GTK_OBJECT ( gnome_file_entry_gtk_entry ( GNOME_FILE_ENTRY ( entree ) ) ),			    "no_compte",			    GINT_TO_POINTER ( i ));      gtk_table_attach ( GTK_TABLE ( table ),			 entree,			 2, 3,			 i, i+1,			 GTK_SHRINK | GTK_FILL,			 GTK_SHRINK | GTK_FILL,			 0, 0 );      gtk_widget_show ( entree );      /*       si on clique sur le check bouton, a rend ditable l'entre */      gtk_signal_connect ( GTK_OBJECT ( check_button ),			   "toggled",			   GTK_SIGNAL_FUNC ( click_compte_export_qif ),			   entree );      p_tab_nom_de_compte_variable++;    }  liste_entrees_exportation = NULL; choix_liste_fichier:  resultat = gnome_dialog_run ( GNOME_DIALOG ( dialog ));  if ( resultat || !liste_entrees_exportation )    {      if ( liste_entrees_exportation )	g_slist_free ( liste_entrees_exportation );      gnome_dialog_close ( GNOME_DIALOG ( dialog ));      return;    }  /* vrification que tous les fichiers sont enregistrables */  liste_tmp = liste_entrees_exportation;  while ( liste_tmp )    {      struct stat test_fichier;      nom_fichier_qif = g_strdup ( gtk_entry_get_text ( GTK_ENTRY ( liste_tmp -> data )));      if ( stat ( nom_fichier_qif,		  &test_fichier ) != -1 )	{	  if ( S_ISREG ( test_fichier.st_mode ) )	    {	      GtkWidget *etes_vous_sur;	      etes_vous_sur = gnome_dialog_new ( _("Save the file"),						 GNOME_STOCK_BUTTON_YES,						 GNOME_STOCK_BUTTON_NO,						 NULL );	      label = gtk_label_new ( g_strdup_printf ( _("The file '%s' exists.\n Do you want to continue ?"),				      nom_fichier_qif ));	      gtk_box_pack_start ( GTK_BOX ( GNOME_DIALOG ( etes_vous_sur ) -> vbox ),				   label,				   TRUE,				   TRUE,				   5 );	      gtk_widget_show ( label );	      gnome_dialog_set_default ( GNOME_DIALOG ( etes_vous_sur ),					 1 );	      gtk_window_set_transient_for ( GTK_WINDOW ( etes_vous_sur ),					     GTK_WINDOW ( dialog ));	      if ( gnome_dialog_run_and_close ( GNOME_DIALOG ( etes_vous_sur ) ) )		goto choix_liste_fichier;	    }	  else	    {	      dialogue ( g_strdup_printf ( _("File name \"%s\" invalid !"),					   nom_fichier_qif ));	      goto choix_liste_fichier;	    }	}      liste_tmp = liste_tmp -> next;    }  /* on est sr de l'enregistrement, c'est parti ... */  liste_tmp = liste_entrees_exportation;  while ( liste_tmp )    {      /*       ouverture du fichier, si pb, on marque l'erreur et passe au fichier suivant */      nom_fichier_qif = g_strdup ( gtk_entry_get_text ( GTK_ENTRY ( liste_tmp -> data )));      if ( !( fichier_qif = fopen ( nom_fichier_qif,				    "w" ) ))	dialogue ( g_strdup_printf ( _("Error for the file \"%s\" :\n%s"),				     nom_fichier_qif, strerror ( errno ) ));      else	{	  GSList *pointeur_tmp;	  struct structure_operation *operation;	  p_tab_nom_de_compte_variable = 	    p_tab_nom_de_compte	    +	    GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( liste_tmp -> data ),						    "no_compte" ));	  /* met le type de compte */	  if ( TYPE_DE_COMPTE == 1 )	    fprintf ( fichier_qif,		      "!Type:Cash\n" );	  else	    if ( TYPE_DE_COMPTE == 2		 ||		 TYPE_DE_COMPTE == 3 )	      fprintf ( fichier_qif,			"!Type:Oth L\n" );	    else	      fprintf ( fichier_qif,			"!Type:Bank\n" );	  if ( LISTE_OPERATIONS )	    {	      /* met la date de la 1re opration comme dte d'ouverture de compte */	      operation = LISTE_OPERATIONS -> data;	      fprintf ( fichier_qif,			"D%d/%d/%d\n",			operation -> jour,			operation -> mois,			operation -> annee );	      /* met le solde initial */	      montant_tmp = g_strdup_printf ( "%4.2f",					      SOLDE_INIT );	      montant_tmp = g_strdelimit ( montant_tmp,					   ",",					   '.' );	      fprintf ( fichier_qif,			"T%s\n",			montant_tmp );	      fprintf ( fichier_qif,			"CX\nPOpening Balance\n" );	      /* met le nom du compte */	      fprintf ( fichier_qif,			"L%s\n^\n",			g_strconcat ( "[",				      NOM_DU_COMPTE,				      "]",				      NULL ) );	      /* on met toutes les oprations */	      pointeur_tmp = LISTE_OPERATIONS;	      while ( pointeur_tmp )		{		  GSList *pointeur;		  gdouble montant;		  struct struct_type_ope *type;		  operation = pointeur_tmp -> data;		  /* si c'est une op de ventilation, on la saute pas elle sera recherche quand */		  /* son op ventile sera exporte */		  if ( !operation -> no_operation_ventilee_associee )		    {		      /* met la date */		      fprintf ( fichier_qif,				"D%d/%d/%d\n",				operation -> jour,				operation -> mois,				operation -> annee );		      /* met le pointage */		      if ( operation -> pointe == 1			   ||			   operation -> pointe == 3 )			fprintf ( fichier_qif,				  "C*\n" );		      else			if ( operation -> pointe == 2 )			  fprintf ( fichier_qif,				    "CX\n" );		      /* met les notes */		      if ( operation -> notes )			fprintf ( fichier_qif,				  "M%s\n",				  operation -> notes );		      /* met le montant, transforme la devise si necessaire */		      montant = calcule_montant_devise_renvoi ( operation -> montant,								DEVISE,								operation -> devise,								operation -> une_devise_compte_egale_x_devise_ope,								operation -> taux_change,								operation -> frais_change );		      montant_tmp = g_strdup_printf ( "%4.2f",						      montant );		      montant_tmp = g_strdelimit ( montant_tmp,						   ",",						   '.' );		      fprintf ( fichier_qif,				"T%s\n",				montant_tmp );		      /* met le chque si c'est un type  numrotation automatique */		      pointeur = g_slist_find_custom ( TYPES_OPES,						       GINT_TO_POINTER ( operation -> type_ope ),						       (GCompareFunc) recherche_type_ope_par_no );		      		      if ( pointeur )			{			  type = pointeur -> data;			  if ( type -> numerotation_auto )			    fprintf ( fichier_qif,				      "N%s\n",				      operation -> contenu_type );			}		      /* met le tiers */		      pointeur = g_slist_find_custom ( liste_struct_tiers,						       GINT_TO_POINTER ( operation -> tiers ),						       (GCompareFunc) recherche_tiers_par_no );		      if ( pointeur )			fprintf ( fichier_qif,				  "P%s\n",				  ((struct struct_tiers *)(pointeur -> data )) -> nom_tiers );		      /*  on met soit un virement, soit une ventilation, soit les catgories */		      /* si c'est une ventilation, on recherche toutes les ops de cette ventilation */		      /* et les met  la suite */		      /* la catgorie de l'op sera celle de la premire op de ventilation */		      if ( operation -> operation_ventilee )			{			  GSList *liste_ventil;			  gint categ_ope_mise;			  categ_ope_mise = 0;			  liste_ventil = LISTE_OPERATIONS;			  while ( liste_ventil )			    {			      struct structure_operation *ope_test;			      ope_test = liste_ventil -> data;			      if ( ope_test -> no_operation_ventilee_associee == operation -> no_operation				   &&				   ( ope_test -> categorie				     ||				     ope_test -> relation_no_operation ))				{				  /* on commence par mettre la catg et sous categ de l'op et de l'op de ventilation */				  if ( ope_test -> relation_no_operation )				    {				      /* c'est un virement */				      				      gpointer **save_ptab;				      save_ptab = p_tab_nom_de_compte_variable;				      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + ope_test -> relation_no_compte;				      if ( !categ_ope_mise )					{					  fprintf ( fichier_qif,						    "L%s\n",						    g_strconcat ( "[",								  NOM_DU_COMPTE,								  "]",								  NULL ));					  categ_ope_mise = 1;					}				      fprintf ( fichier_qif,						"S%s\n",						g_strconcat ( "[",							      NOM_DU_COMPTE,							      "]",							      NULL ));				      p_tab_nom_de_compte_variable = save_ptab;				    }				  else				    {				      /* c'est du type categ : sous categ */				      pointeur = g_slist_find_custom ( liste_struct_categories,								       GINT_TO_POINTER ( ope_test -> categorie ),								       (GCompareFunc) recherche_categorie_par_no );				      if ( pointeur )					{					  GSList *pointeur_2;					  struct struct_categ *categorie;					  categorie = pointeur -> data;					  pointeur_2 = g_slist_find_custom ( categorie -> liste_sous_categ,									     GINT_TO_POINTER ( ope_test -> sous_categorie ),									     (GCompareFunc) recherche_sous_categorie_par_no );					  if ( pointeur_2 )					    {					      if ( !categ_ope_mise )						{						  fprintf ( fichier_qif,							    "L%s\n",							    g_strconcat ( categorie -> nom_categ,									  ":",									  ((struct struct_sous_categ *)(pointeur_2->data)) -> nom_sous_categ,									  NULL ));						  categ_ope_mise = 1;						}					      fprintf ( fichier_qif,							"S%s\n",							g_strconcat ( categorie -> nom_categ,								      ":",								      ((struct struct_sous_categ *)(pointeur_2->data)) -> nom_sous_categ,								      NULL ));					    }					  else					    {					      if ( !categ_ope_mise )						{						  fprintf ( fichier_qif,							    "L%s\n",							    categorie -> nom_categ );						  categ_ope_mise = 1;						}					      fprintf ( fichier_qif,							"S%s\n",							categorie -> nom_categ );					    }					}				    }				/* met les notes de la ventilation */				  if ( ope_test -> notes )				    fprintf ( fichier_qif,					      "E%s\n",					      ope_test -> notes );				/* met le montant de la ventilation */				  montant_tmp = g_strdup_printf ( "%4.2f",								  ope_test -> montant );				  montant_tmp = g_strdelimit ( montant_tmp,							       ",",							       '.' );				  fprintf ( fichier_qif,					    "$%s\n",					    montant_tmp );				}			      liste_ventil = liste_ventil -> next;			    }			}		      else			{			  /* si c'est un virement vers un compte supprim, a sera pris comme categ normale vide */			  if ( operation -> relation_no_operation			       &&			       operation -> relation_no_compte >= 0 )			    {			      /* c'est un virement */			      gpointer **save_ptab;			      save_ptab = p_tab_nom_de_compte_variable;			      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> relation_no_compte;			      fprintf ( fichier_qif,					"L%s\n",					g_strconcat ( "[",						      NOM_DU_COMPTE,						      "]",						      NULL ));			      p_tab_nom_de_compte_variable = save_ptab;			    }			  else			    {			      /* c'est du type categ : sous-categ */			    			      pointeur = g_slist_find_custom ( liste_struct_categories,							       GINT_TO_POINTER ( operation -> categorie ),							       (GCompareFunc) recherche_categorie_par_no );			      if ( pointeur )				{				  GSList *pointeur_2;				  struct struct_categ *categorie;				  categorie = pointeur -> data;				  pointeur_2 = g_slist_find_custom ( categorie -> liste_sous_categ,								     GINT_TO_POINTER ( operation -> sous_categorie ),								     (GCompareFunc) recherche_sous_categorie_par_no );				  if ( pointeur_2 )				    fprintf ( fichier_qif,					      "L%s\n",					      g_strconcat ( categorie -> nom_categ,							    ":",							    ((struct struct_sous_categ *)(pointeur_2->data)) -> nom_sous_categ,							    NULL ));				  else				    fprintf ( fichier_qif,					      "L%s\n",					      categorie -> nom_categ );				}			    }			}		    		      fprintf ( fichier_qif,				"^\n" );		    }		  pointeur_tmp = pointeur_tmp -> next;		}	    }	  else	    {	      /* le compte n'a aucune opration enregistre : on ne met pas de date, mais on fait l'ouverture du compte */	      /* met le solde initial */	      montant_tmp = g_strdup_printf ( "%4.2f",					      SOLDE_INIT );	      montant_tmp = g_strdelimit ( montant_tmp,					   ",",					   '.' );	      fprintf ( fichier_qif,			"T%s\n",			montant_tmp );	      fprintf ( fichier_qif,			"CX\nPOpening Balance\n" );	      /* met le nom du compte */	      fprintf ( fichier_qif,			"L%s\n^\n",			g_strconcat ( "[",				      NOM_DU_COMPTE,				      "]",				      NULL ) );	    }	  fclose ( fichier_qif );	}      liste_tmp = liste_tmp -> next;    }  gnome_dialog_close ( GNOME_DIALOG ( dialog ));}