rem: doc->root = xmlNewDocNode ( doc,
add: doc->children = xmlNewDocNode ( doc,
context: gboolean enregistre_etat ( gchar *nom_etat ){  xmlDocPtr doc;  xmlNodePtr node;  xmlNodePtr node_2;  gint resultat;  gchar *pointeur_char;  GSList *pointeur_liste;  GList *pointeur_list;  /* creation de l'arbre xml en memoire */  doc = xmlNewDoc("1.0");  /* la racine est grisbi */  doc->root = xmlNewDocNode ( doc,			      NULL,			      "Grisbi_etat",			      NULL );  /* on commence  ajouter les generalites */  node = xmlNewChild ( doc->root,		       NULL,		       "Generalites",		       NULL );  xmlNewTextChild ( node,		    NULL,		    "Version_fichier_etat",		    VERSION_FICHIER_ETAT );  xmlNewTextChild ( node,		    NULL,		    "Version_grisbi",		    VERSION );  xmlNewTextChild ( node,		    NULL,		    "Nom",		    etat_courant -> nom_etat );  node = xmlNewChild ( doc->root,		       NULL,		       "Details",		       NULL );  pointeur_list = etat_courant -> type_classement;  pointeur_char = NULL;  while ( pointeur_list )    {      if ( pointeur_char )	pointeur_char = g_strconcat ( pointeur_char,				      "/",				      itoa ( GPOINTER_TO_INT ( pointeur_list -> data )),				      NULL );      else	pointeur_char = itoa ( GPOINTER_TO_INT ( pointeur_list -> data ));      pointeur_list = pointeur_list -> next;    }  xmlNewTextChild ( node,		    NULL,	       "Type_classement",	       pointeur_char );  xmlNewTextChild ( node,		    NULL,	       "Aff_r",	       itoa ( etat_courant -> afficher_r ));  xmlNewTextChild ( node,		    NULL,	       "Aff_ope",	       itoa ( etat_courant -> afficher_opes ));  xmlNewTextChild ( node,		    NULL,	       "Aff_nb_ope",	       itoa ( etat_courant -> afficher_nb_opes ));  xmlNewTextChild ( node,		    NULL,	       "Aff_no_ope",	       itoa ( etat_courant -> afficher_no_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_date_ope",	       itoa ( etat_courant -> afficher_date_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_tiers_ope",	       itoa ( etat_courant -> afficher_tiers_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_categ_ope",	       itoa ( etat_courant -> afficher_categ_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_ss_categ_ope",	       itoa ( etat_courant -> afficher_sous_categ_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_type_ope",	       itoa ( etat_courant -> afficher_type_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_ib_ope",	       itoa ( etat_courant -> afficher_ib_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_ss_ib_ope",	       itoa ( etat_courant -> afficher_sous_ib_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_cheque_ope",	       itoa ( etat_courant -> afficher_cheque_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_notes_ope",	       itoa ( etat_courant -> afficher_notes_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_pc_ope",	       itoa ( etat_courant -> afficher_pc_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_rappr_ope",	       itoa ( etat_courant -> afficher_rappr_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_infobd_ope",	       itoa ( etat_courant -> afficher_infobd_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_exo_ope",	       itoa ( etat_courant -> afficher_exo_ope ));  xmlNewTextChild ( node,		    NULL,	       "Class_ope",	       itoa ( etat_courant -> type_classement_ope ));  xmlNewTextChild ( node,		    NULL,	       "Aff_titres_col",	       itoa ( etat_courant -> afficher_titre_colonnes ));  xmlNewTextChild ( node,		    NULL,	       "Aff_titres_chgt",	       itoa ( etat_courant -> type_affichage_titres ));  xmlNewTextChild ( node,		    NULL,	       "Pas_detail_ventil",	       itoa ( etat_courant -> pas_detailler_ventilation ));  xmlNewTextChild ( node,		    NULL,	       "Sep_rev_dep",	       itoa ( etat_courant -> separer_revenus_depenses ));  xmlNewTextChild ( node,		    NULL,		    "Devise_gen",		    ((struct struct_devise *)(g_slist_find_custom ( liste_struct_devises,								       GINT_TO_POINTER ( etat_courant -> devise_de_calcul_general ),								       (GCompareFunc) recherche_devise_par_no ) -> data ))->nom_devise);  xmlNewTextChild ( node,		    NULL,		    "Incl_tiers",		    itoa ( etat_courant -> inclure_dans_tiers ));  xmlNewTextChild ( node,		    NULL,		    "Ope_click",		    itoa ( etat_courant -> ope_clickables ));  xmlNewTextChild ( node,		    NULL,		    "Exo_date",		    itoa ( etat_courant -> exo_date ));  xmlNewTextChild ( node,		    NULL,		    "Detail_exo",		    itoa ( etat_courant -> utilise_detail_exo ));  node_2 = xmlNewChild ( node,			 NULL,			 "Liste_exo",			 NULL );  pointeur_liste = etat_courant -> no_exercices;  pointeur_char = NULL;  while ( pointeur_liste )    {      xmlNodePtr node_3;      struct struct_exercice *exo;      node_3 = xmlNewChild ( node_2,			     NULL,			     "Exo",			     NULL );      exo = g_slist_find_custom ( liste_struct_exercices,				  pointeur_liste -> data,				  (GCompareFunc) recherche_exercice_par_no ) -> data;      xmlSetProp ( node_3,		   "Nom",		   exo -> nom_exercice );      pointeur_liste = pointeur_liste -> next;    }  xmlNewTextChild ( node,		    NULL,	       "Plage_date",	       itoa ( etat_courant -> no_plage_date ));  if ( etat_courant->date_perso_debut )    xmlNewTextChild ( node,		    NULL,		 "Date_debut",		 g_strdup_printf ( "%d/%d/%d",				   g_date_day ( etat_courant->date_perso_debut ),				   g_date_month ( etat_courant->date_perso_debut ),				   g_date_year ( etat_courant->date_perso_debut )));  else    xmlNewTextChild ( node,		    NULL,		 "Date_debut",		 NULL );  if ( etat_courant->date_perso_fin )    xmlNewTextChild ( node,		    NULL,		 "Date_fin",		 g_strdup_printf ( "%d/%d/%d",				   g_date_day ( etat_courant->date_perso_fin ),				   g_date_month ( etat_courant->date_perso_fin ),				   g_date_year ( etat_courant->date_perso_fin )));  else    xmlNewTextChild ( node,		    NULL,		 "Date_fin",		 NULL );  xmlNewTextChild ( node,		    NULL,	       "Utilise_plages",	       itoa ( etat_courant -> separation_par_plage ));  xmlNewTextChild ( node,		    NULL,	       "Sep_plages",	       itoa ( etat_courant -> type_separation_plage ));  xmlNewTextChild ( node,		    NULL,	       "Deb_sem_plages",	       itoa ( etat_courant -> jour_debut_semaine ));  xmlNewTextChild ( node,		    NULL,	       "Detail_comptes",	       itoa ( etat_courant -> utilise_detail_comptes ));  node_2 = xmlNewChild ( node,			 NULL,			 "Liste_comptes",			 NULL );  pointeur_liste = etat_courant -> no_comptes;  pointeur_char = NULL;  while ( pointeur_liste )    {      xmlNodePtr node_3;      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + GPOINTER_TO_INT ( pointeur_liste -> data );      node_3 = xmlNewChild ( node_2,			     NULL,			     "Compte",			     NULL );      xmlSetProp ( node_3,		   "Nom",		   NOM_DU_COMPTE );      pointeur_liste = pointeur_liste -> next;    }  xmlNewTextChild ( node,		    NULL,	       "Grp_ope_compte",	       itoa ( etat_courant -> regroupe_ope_par_compte ));  xmlNewTextChild ( node,		    NULL,	       "Total_compte",	       itoa ( etat_courant -> affiche_sous_total_compte ));  xmlNewTextChild ( node,		    NULL,	       "Aff_nom_compte",	       itoa ( etat_courant -> afficher_nom_compte ));  xmlNewTextChild ( node,		    NULL,	       "Type_vir",	       itoa ( etat_courant -> type_virement ));  node_2 = xmlNewChild ( node,			 NULL,			 "Liste_comptes_vir",			 NULL );  pointeur_liste = etat_courant -> no_comptes_virements;  pointeur_char = NULL;  while ( pointeur_liste )    {      xmlNodePtr node_3;      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + GPOINTER_TO_INT ( pointeur_liste -> data );      node_3 = xmlNewChild ( node_2,			     NULL,			     "Compte",			     NULL );      xmlSetProp ( node_3,		   "Nom",		   NOM_DU_COMPTE );      pointeur_liste = pointeur_liste -> next;    }  xmlNewTextChild ( node,		    NULL,	       "Exclure_non_vir",	       itoa ( etat_courant -> exclure_ope_non_virement ));  xmlNewTextChild ( node,		    NULL,	       "Categ",	       itoa ( etat_courant -> utilise_categ ));  xmlNewTextChild ( node,		    NULL,	       "Detail_categ",	       itoa ( etat_courant -> utilise_detail_categ ));  node_2 = xmlNewChild ( node,			 NULL,			 "Liste_categ",			 NULL );  pointeur_liste = etat_courant -> no_categ;  pointeur_char = NULL;  while ( pointeur_liste )    {      xmlNodePtr node_3;      struct struct_categ *categ;      node_3 = xmlNewChild ( node_2,			     NULL,			     "Categ",			     NULL );      categ = g_slist_find_custom ( liste_struct_categories,				    pointeur_liste -> data,				    (GCompareFunc) recherche_categorie_par_no ) -> data;      xmlSetProp ( node_3,		   "Nom",		   categ -> nom_categ );      pointeur_liste = pointeur_liste -> next;    }  xmlNewTextChild ( node,		    NULL,	       "Exclut_categ",	       itoa ( etat_courant -> exclure_ope_sans_categ ));  xmlNewTextChild ( node,		    NULL,	       "Total_categ",	       itoa ( etat_courant -> affiche_sous_total_categ ));  xmlNewTextChild ( node,		    NULL,	       "Aff_ss_categ",	       itoa ( etat_courant -> afficher_sous_categ ));  xmlNewTextChild ( node,		    NULL,	       "Aff_pas_ss_categ",	       itoa ( etat_courant -> afficher_pas_de_sous_categ ));  xmlNewTextChild ( node,		    NULL,	       "Total_ss_categ",	       itoa ( etat_courant -> affiche_sous_total_sous_categ ));  xmlNewTextChild ( node,		    NULL,		    "Devise_categ",		    ((struct struct_devise *)(g_slist_find_custom ( liste_struct_devises,								       GINT_TO_POINTER ( etat_courant -> devise_de_calcul_categ ),								       (GCompareFunc) recherche_devise_par_no ) -> data ))->nom_devise);  xmlNewTextChild ( node,		    NULL,	       "Aff_nom_categ",	       itoa ( etat_courant -> afficher_nom_categ ));  xmlNewTextChild ( node,		    NULL,	       "IB",	       itoa ( etat_courant -> utilise_ib ));  xmlNewTextChild ( node,		    NULL,	       "Detail_ib",	       itoa ( etat_courant -> utilise_detail_ib ));  node_2 = xmlNewChild ( node,			 NULL,			 "Liste_ib",			 NULL );  pointeur_liste = etat_courant -> no_ib;  pointeur_char = NULL;  while ( pointeur_liste )    {      xmlNodePtr node_3;      struct struct_imputation *ib;      node_3 = xmlNewChild ( node_2,			     NULL,			     "Ib",			     NULL );      ib = g_slist_find_custom ( liste_struct_imputation,				    pointeur_liste -> data,				    (GCompareFunc) recherche_imputation_par_no ) -> data;      xmlSetProp ( node_3,		   "Nom",		   ib -> nom_imputation );      pointeur_liste = pointeur_liste -> next;    }  xmlNewTextChild ( node,		    NULL,	       "Exclut_ib",	       itoa ( etat_courant -> exclure_ope_sans_ib ));  xmlNewTextChild ( node,		    NULL,	       "Total_ib",	       itoa ( etat_courant -> affiche_sous_total_ib ));  xmlNewTextChild ( node,		    NULL,	       "Aff_ss_ib",	       itoa ( etat_courant -> afficher_sous_ib ));  xmlNewTextChild ( node,		    NULL,	       "Aff_pas_ss_ib",	       itoa ( etat_courant -> afficher_pas_de_sous_ib ));  xmlNewTextChild ( node,		    NULL,	       "Total_ss_ib",	       itoa ( etat_courant -> affiche_sous_total_sous_ib ));  xmlNewTextChild ( node,		    NULL,		    "Devise_ib",		    ((struct struct_devise *)(g_slist_find_custom ( liste_struct_devises,								       GINT_TO_POINTER ( etat_courant -> devise_de_calcul_ib ),								       (GCompareFunc) recherche_devise_par_no ) -> data ))->nom_devise);  xmlNewTextChild ( node,		    NULL,	       "Aff_nom_ib",	       itoa ( etat_courant -> afficher_nom_ib ));  xmlNewTextChild ( node,		    NULL,	       "Tiers",	       itoa ( etat_courant -> utilise_tiers ));  xmlNewTextChild ( node,		    NULL,	       "Detail_tiers",	       itoa ( etat_courant -> utilise_detail_tiers ));  node_2 = xmlNewChild ( node,			 NULL,			 "Liste_tiers",			 NULL );  pointeur_liste = etat_courant -> no_tiers;  pointeur_char = NULL;  while ( pointeur_liste )    {      xmlNodePtr node_3;      struct struct_tiers *tiers;      node_3 = xmlNewChild ( node_2,			     NULL,			     "Tiers",			     NULL );      tiers = g_slist_find_custom ( liste_struct_tiers,				    pointeur_liste -> data,				    (GCompareFunc) recherche_tiers_par_no ) -> data;      xmlSetProp ( node_3,		   "Nom",		   tiers -> nom_tiers );      pointeur_liste = pointeur_liste -> next;    }  xmlNewTextChild ( node,		    NULL,	       "Total_tiers",	       itoa ( etat_courant -> affiche_sous_total_tiers ));  xmlNewTextChild ( node,		    NULL,		    "Devise_tiers",		    ((struct struct_devise *)(g_slist_find_custom ( liste_struct_devises,								  GINT_TO_POINTER ( etat_courant -> devise_de_calcul_tiers ),								  (GCompareFunc) recherche_devise_par_no ) -> data ))->nom_devise);  xmlNewTextChild ( node,		    NULL,		    "Aff_nom_tiers",		    itoa ( etat_courant -> afficher_nom_tiers ));  xmlNewTextChild ( node,		    NULL,		    "Texte",		    itoa ( etat_courant -> utilise_texte ));  node_2 = xmlNewChild ( node,			 NULL,			 "Texte_comp",			 NULL );  pointeur_liste = etat_courant -> liste_struct_comparaison_textes;  while ( pointeur_liste )    {      struct struct_comparaison_textes_etat *textes_comp;      xmlNodePtr node_3;      textes_comp = pointeur_liste -> data;      node_3 = xmlNewChild ( node_2,			     NULL,			     "Comp",			     NULL );      xmlSetProp ( node_3,		   "Lien_struct",		   itoa ( textes_comp -> lien_struct_precedente ));      xmlSetProp ( node_3,		   "Champ",		   itoa ( textes_comp -> champ ));      xmlSetProp ( node_3,		   "Op",		   itoa ( textes_comp -> operateur ));      xmlSetProp ( node_3,		   "Txt",		   textes_comp -> texte );      xmlSetProp ( node_3,		   "Util_txt",		   itoa ( textes_comp -> utilise_txt ));      xmlSetProp ( node_3,		   "Comp_1",		   itoa ( textes_comp -> comparateur_1 ));      xmlSetProp ( node_3,		   "Lien_1_2",		   itoa ( textes_comp -> lien_1_2 ));      xmlSetProp ( node_3,		   "Comp_2",		   itoa ( textes_comp -> comparateur_2 ));      xmlSetProp ( node_3,		   "Mont_1",		   itoa ( textes_comp -> montant_1 ));      xmlSetProp ( node_3,		   "Mont_2",		   itoa ( textes_comp -> montant_2 ));      pointeur_liste = pointeur_liste -> next;    }  xmlNewTextChild ( node,		    NULL,	       "Montant",	       itoa ( etat_courant -> utilise_montant ));  xmlNewTextChild ( node,		    NULL,		    "Montant_devise",		    ((struct struct_devise *)(g_slist_find_custom ( liste_struct_devises,								       GINT_TO_POINTER ( etat_courant -> choix_devise_montant ),								       (GCompareFunc) recherche_devise_par_no ) -> data ))->nom_devise);  node_2 = xmlNewChild ( node,			 NULL,			 "Montant_comp",			 NULL );  pointeur_liste = etat_courant -> liste_struct_comparaison_montants;  while ( pointeur_liste )    {      struct struct_comparaison_montants_etat *montants_comp;      xmlNodePtr node_3;      montants_comp = pointeur_liste -> data;      node_3 = xmlNewChild ( node_2,			     NULL,			     "Comp",			     NULL );      xmlSetProp ( node_3,		   "Lien_struct",		   itoa ( montants_comp -> lien_struct_precedente ));      xmlSetProp ( node_3,		   "Comp_1",		   itoa ( montants_comp -> comparateur_1 ));      xmlSetProp ( node_3,		   "Lien_1_2",		   itoa ( montants_comp -> lien_1_2 ));      xmlSetProp ( node_3,		   "Comp_2",		   itoa ( montants_comp -> comparateur_2 ));      xmlSetProp ( node_3,		   "Mont_1",		   g_strdup_printf ( "%4.2f",				     montants_comp -> montant_1 ));      xmlSetProp ( node_3,		   "Mont_2",		   g_strdup_printf ( "%4.2f",				     montants_comp -> montant_2 ));      pointeur_liste = pointeur_liste -> next;    }  xmlNewTextChild ( node,		    NULL,	       "Excl_nul",	       itoa ( etat_courant -> exclure_montants_nuls ));  xmlNewTextChild ( node,		    NULL,		    "Detail_mod_paie",		    itoa ( etat_courant -> utilise_mode_paiement ));  node_2 = xmlNewChild ( node,			 NULL,			 "Liste_mod_paie",			 NULL );  pointeur_liste = etat_courant -> noms_modes_paiement;  pointeur_char = NULL;  while ( pointeur_liste )    {      xmlNodePtr node_3;      node_3 = xmlNewChild ( node_2,			     NULL,			     "Mode_paie",			     NULL );      xmlSetProp ( node_3,		   "Nom",		   pointeur_liste -> data );      pointeur_liste = pointeur_liste -> next;    }  /* l'arbre est fait, on sauvegarde */  resultat = xmlSaveFile ( nom_etat,			   doc );  /* on libre la memoire */  xmlFreeDoc ( doc );  if ( resultat == -1 )    {      dialogue ( g_strdup_printf ( _("Error saving the file %s\n\nError:\n%s"),				   nom_etat,				   strerror ( errno ) ) );      return ( FALSE );    }  return ( TRUE );}