add: if ( !operation ) { dialogue_error ( _("Cannot allocate memory, bad things will happen soon") ); return; }
context: void fin_edition ( void ){  struct structure_operation *operation;  gint modification;  GSList *liste_no_tiers;  GSList *liste_tmp;  /* rcupration de l'opration : soit l'adr de la struct, soit NULL si nouvelle */  operation = gtk_object_get_data ( GTK_OBJECT ( formulaire ),				    "adr_struct_ope" );  if ( operation )    modification = 1;  else    modification = 0;  /* on commence par vrifier que les donnes entres sont correctes */  /* si la fonction renvoie false, c'est qu'on doit arrter l */  if ( !verification_validation_operation ( operation ))    return;  /* si le tiers est un tat, on va faire autant d'oprations qu'il y a de tiers     dans l'tat concern. On va crer une liste avec les nos de tiers     ( ou -1, le tiers n'est pas un tat), puis on fera une boucle sur cette liste     pour ajouter autant d'oprations que de tiers */  liste_no_tiers = NULL;  if ( strncmp ( g_strstrip ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_operations[TRANSACTION_FORM_PARTY] ))),		 COLON(_("Report")),		 7 ))    /*     ce n'est pas un tat, on met -1 comme no de tiers */    liste_no_tiers = g_slist_append (liste_no_tiers,				     GINT_TO_POINTER ( -1 ));  else    {      /* c'est bien un tat */      /* on commence par retrouver le nom de l'tat */      /* toutes les vrifications ont t faites prcdemment */      gchar **tableau_char;      struct struct_etat *etat;      GSList *liste_opes_selectionnees;      tableau_char = g_strsplit ( g_strstrip ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_operations[TRANSACTION_FORM_PARTY] ))),				  ":",				  2 );      tableau_char[1] = g_strstrip ( tableau_char[1] );      liste_tmp = liste_struct_etats;      etat = NULL;      while ( liste_tmp )	{	  etat = liste_tmp -> data;	  if ( !strcmp ( etat -> nom_etat,			 tableau_char[1] ))	    liste_tmp = NULL;	  else	    liste_tmp = liste_tmp -> next;	}      g_strfreev ( tableau_char );      /*  ce niveau, etat contient l'adr le la struct de l'tat choisi */      liste_opes_selectionnees = recupere_opes_etat ( etat );      liste_tmp = liste_opes_selectionnees;      while ( liste_tmp )	{	  struct structure_operation *operation;	  operation = liste_tmp -> data;	  if ( !g_slist_find ( liste_no_tiers,			       GINT_TO_POINTER ( operation -> tiers )))	    liste_no_tiers = g_slist_append ( liste_no_tiers,					      GINT_TO_POINTER ( operation -> tiers ));	  liste_tmp = liste_tmp -> next;	}      g_slist_free ( liste_opes_selectionnees );    }  /*  ce niveau, liste_no_tiers contient la liste des no de tiers pour chacun desquels on */  /* fera une op, ou -1 si on utilise que le tiers dans l'entre du formulaire */  /* on fait donc le tour de cette liste en ajoutant l'op  chaque fois */  liste_tmp = liste_no_tiers;  while ( liste_tmp )    {      /* soit on va chercher le tiers dans la liste des no de tiers et on le met dans le formulaire, */      /* soit on laisse tel quel et on met liste_tmp  NULL */      if ( liste_tmp -> data == GINT_TO_POINTER ( -1 ) )	liste_tmp = NULL;      else if ( liste_tmp -> data == NULL )	{	  dialogue ( _("Error: no third party selected for this report."));	  return;	}      else	{	  struct struct_tiers *tiers;	  tiers = g_slist_find_custom ( liste_struct_tiers,					liste_tmp -> data,					(GCompareFunc) recherche_tiers_par_no ) -> data;	  gtk_combofix_set_text ( GTK_COMBOFIX ( widget_formulaire_operations[TRANSACTION_FORM_PARTY] ),				  tiers -> nom_tiers );	  /* si le moyen de paiement est  incrmentation automatique,  partir de la 2me op, */	  /* on incrmente le contenu (no de chque en gnral) */	  /* comme c'est une liste de tiers, c'est forcemment une nouvelle op */	  /* donc si operation n'est pas nul, c'est qu'on n'est pas sur la 1re */	  /* donc on peut incrmenter si ncessaire le contenu */	  /* et on peut rcuprer le no_type de l'ancienne op */	  if ( operation )	    {	      GSList *pointeur_tmp;	      p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;	      pointeur_tmp = g_slist_find_custom ( TYPES_OPES,						   GINT_TO_POINTER ( operation -> type_ope ),						   (GCompareFunc) recherche_type_ope_par_no );	      if ( pointeur_tmp )		{		  struct struct_type_ope *type;		  type = pointeur_tmp -> data;		  if ( type -> affiche_entree &&		       type -> numerotation_auto )		    gtk_entry_set_text ( GTK_ENTRY ( widget_formulaire_operations[TRANSACTION_FORM_CHEQUE] ),					 itoa ( type -> no_en_cours + 1 ));		}	    }	  liste_tmp = liste_tmp -> next;	}      /* si c'est une nouvelle op, on la cre en mettant tout  0 sauf le no de compte */      if ( !modification )	{	  operation = calloc ( 1,			       sizeof ( struct structure_operation ) );	  operation -> no_compte = compte_courant;	}      /* on rcupre les donnes du formulaire sauf la categ qui est traite plus tard */      recuperation_donnees_generales_formulaire ( operation );      p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;      /* il faut ajouter l'opration  la liste  ce niveau pour lui attribuer un numro */      /* celui ci sera utilis si c'est un virement ou si c'est une ventil qui contient des */      /* virements */      ajout_operation ( operation );      /*   rcupration des catgories / sous-catg, s'ils n'existent pas, on les cre */      /*  mettre en dernier car si c'est une op ventile, chaque op de ventil va rcuprer les donnes du dessus */      recuperation_categorie_formulaire ( operation,					  modification );    }  /* on libre la liste des no tiers */  g_slist_free ( liste_no_tiers );  /* si on est en train d'quilibrer => recalcule le total point */  if ( etat.equilibrage )    {      calcule_total_pointe_compte ( compte_courant );      if ( fabs ( solde_final - solde_initial - operations_pointees ) < 0.01 )	{	  gtk_label_set_text ( GTK_LABEL ( label_equilibrage_ecart ),			       g_strdup_printf ( "%4.2f",						 0.0 ));	  gtk_widget_set_sensitive ( GTK_WIDGET ( bouton_ok_equilibrage ),				     TRUE );	}      else	{	  gtk_label_set_text ( GTK_LABEL ( label_equilibrage_ecart ),			       g_strdup_printf ( "%4.2f",						 solde_final - solde_initial - operations_pointees ));	  gtk_widget_set_sensitive ( GTK_WIDGET ( bouton_ok_equilibrage ),				     FALSE );	}    }  /* si c'tait une nouvelle opration, on efface le formulaire,     on remet la date pour la suivante,     si c'tait une modification, on redonne le focus  la liste */  p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> no_compte;  if ( gtk_object_get_data ( GTK_OBJECT ( formulaire ),			     "adr_struct_ope" ) )    {      gtk_widget_grab_focus ( GTK_WIDGET ( CLIST_OPERATIONS ));      formulaire_a_zero ();      if ( !etat.formulaire_toujours_affiche )	gtk_widget_hide ( frame_droite_bas );    }  else    {      formulaire_a_zero ();      clique_champ_formulaire ( widget_formulaire_operations[TRANSACTION_FORM_DATE],				NULL,				GINT_TO_POINTER ( TRANSACTION_FORM_DATE ) );      gtk_entry_select_region ( GTK_ENTRY ( widget_formulaire_operations[TRANSACTION_FORM_DATE] ),				0,				-1);      gtk_widget_grab_focus ( GTK_WIDGET ( widget_formulaire_operations[TRANSACTION_FORM_DATE] ) );    }  /* on raffiche la liste courante pour afficher les categ qui ont t ajoute aprs */  /* l'ajout d'opration */  MISE_A_JOUR = 1;  verification_mise_a_jour_liste ();  /* met  jour les listes ( nouvelle opration associe au tiers et  la catgorie ) */  mise_a_jour_tiers ();  mise_a_jour_categ ();  mise_a_jour_imputation ();  modification_fichier ( TRUE );}