--- rpl/src/formateur_fichiers.c 2013/04/18 15:44:39 1.70 +++ rpl/src/formateur_fichiers.c 2015/01/05 13:12:31 1.80 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.14 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.19 + Copyright (C) 1989-2015 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,6 @@ */ -#define DEBUG_ERREURS #include "rpl-conv.h" @@ -86,6 +85,7 @@ formateur_fichier(struct_processus *s_et struct_liste_chainee *l_liste1; struct_liste_chainee *l_liste2; + struct_objet *s_format_tmp; struct_objet *s_sous_objet; struct_objet *s_sous_objet_1; struct_objet *s_sous_objet_2; @@ -234,6 +234,7 @@ formateur_fichier(struct_processus *s_et .instruction_courante[1] == '-')) ? d_vrai : d_faux; + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); if ((*s_etat_processus).erreur_execution != d_ex) @@ -293,7 +294,8 @@ formateur_fichier(struct_processus *s_et if ((strcmp(chaine_fonction, "AND") == 0) || (strcmp(chaine_fonction, "XOR") == 0) || (strcmp(chaine_fonction, "OR") - == 0)) + == 0) || (strcmp(chaine_fonction, + "EQV") == 0)) { autorisation_parenthese = d_vrai; } @@ -320,7 +322,9 @@ formateur_fichier(struct_processus *s_et || (strcmp(chaine_fonction, "AND") == 0) || (strcmp(chaine_fonction, "XOR") == 0) || (strcmp( - chaine_fonction, "OR") == 0)) + chaine_fonction, "OR") == 0) || + (strcmp(chaine_fonction, "EQV") + == 0)) { autorisation_parenthese = d_vrai; } @@ -401,6 +405,7 @@ formateur_fichier(struct_processus *s_et "'%s'", (unsigned char *) (*s_sous_objet_1).objet); + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); if ((*s_etat_processus).erreur_execution != d_ex) @@ -458,7 +463,8 @@ formateur_fichier(struct_processus *s_et if ((strcmp(chaine_fonction, "AND") == 0) || (strcmp(chaine_fonction, "XOR") == 0) || (strcmp(chaine_fonction, "OR") - == 0)) + == 0) || (strcmp(chaine_fonction, + "EQV") == 0)) { autorisation_parenthese = d_vrai; } @@ -475,7 +481,9 @@ formateur_fichier(struct_processus *s_et || (strcmp(chaine_fonction, "AND") == 0) || (strcmp(chaine_fonction, "XOR") == 0) || (strcmp( - chaine_fonction, "OR") == 0)) + chaine_fonction, "OR") == 0) || + (strcmp(chaine_fonction, "EQV") + == 0)) { autorisation_parenthese = d_vrai; } @@ -716,7 +724,9 @@ formateur_fichier(struct_processus *s_et "XOR") == 0) || (strcmp((*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nom_fonction, - "AND") == 0)) + "AND") == 0) || (strcmp((*((struct_fonction *) + (*(*l_element_courant).donnee).objet)) + .nom_fonction, "EQV") == 0)) { if (depilement(s_etat_processus, &((*s_etat_processus) @@ -1674,16 +1684,70 @@ formateur_fichier(struct_processus *s_et chaine_sauvegarde = chaine; + // Si le format_sortie vaut 'N', on remplace le format par + // { "native*(*)" }. L'intérêt est de pouvoir traiter une + // liste par un format "native*(*)". + + if ((format_sortie == 'N') && ((*(*l_element_courant) + .donnee).type == LST)) + { + if ((s_format_tmp = allocation(s_etat_processus, LST)) + == NULL) + { + return(NULL); + } + + if (((*s_format_tmp).objet = allocation_maillon( + s_etat_processus)) == NULL) + { + return(NULL); + } + + (*((struct_liste_chainee *) (*s_format_tmp).objet)) + .suivant = NULL; + + if (((*((struct_liste_chainee *) (*s_format_tmp).objet)) + .donnee = allocation(s_etat_processus, CHN)) + == NULL) + { + return(NULL); + } + + if (((*(*((struct_liste_chainee *) (*s_format_tmp) + .objet)).donnee).objet = malloc(11 * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } + + strcpy((unsigned char *) (*(*((struct_liste_chainee *) + (*s_format_tmp).objet)).donnee).objet, + "native*(*)"); + } + else + { + if ((s_format_tmp = copie_objet(s_etat_processus, + s_format, 'P')) == NULL) + { + return(NULL); + } + } + if ((chaine_formatee = formateur_fichier(s_etat_processus, (*l_element_courant).donnee, s_format, longueur, longueur_champ, format_sortie, type, longueur_effective, recursivite, export_fichier)) == NULL) { + liberation(s_etat_processus, s_format_tmp); free(chaine); return(NULL); } + liberation(s_etat_processus, s_format_tmp); + if ((*(*l_element_courant).donnee).type == CHN) { chaine = (unsigned char *) @@ -3786,17 +3850,71 @@ formateur_fichier(struct_processus *s_et } free(format_chaine); - + + // Si le format_sortie vaut 'N', on remplace le format par + // { "native*(*)" }. L'intérêt est de pouvoir traiter une + // liste par un format "native*(*)". + + if ((format_sortie == 'N') && ((*(*l_element_courant) + .donnee).type == LST)) + { + if ((s_format_tmp = allocation(s_etat_processus, LST)) + == NULL) + { + return(NULL); + } + + if (((*s_format_tmp).objet = allocation_maillon( + s_etat_processus)) == NULL) + { + return(NULL); + } + + (*((struct_liste_chainee *) (*s_format_tmp).objet)) + .suivant = NULL; + + if (((*((struct_liste_chainee *) (*s_format_tmp).objet)) + .donnee = allocation(s_etat_processus, CHN)) + == NULL) + { + return(NULL); + } + + if (((*(*((struct_liste_chainee *) (*s_format_tmp) + .objet)).donnee).objet = malloc(11 * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } + + strcpy((unsigned char *) (*(*((struct_liste_chainee *) + (*s_format_tmp).objet)).donnee).objet, + "native*(*)"); + } + else + { + if ((s_format_tmp = copie_objet(s_etat_processus, + s_format, 'P')) == NULL) + { + return(NULL); + } + } + if ((chaine_formatee = formateur_fichier(s_etat_processus, - (*l_element_courant).donnee, s_format, + (*l_element_courant).donnee, s_format_tmp, longueur, longueur_champ, format_sortie, type, longueur_effective, recursivite, export_fichier)) == NULL) { + liberation(s_etat_processus, s_format_tmp); free(chaine); return(NULL); } + liberation(s_etat_processus, s_format_tmp); + if ((chaine = realloc(chaine, ((size_t) (longueur_totale + (*longueur_effective))) * sizeof(unsigned char))) == NULL) @@ -3812,14 +3930,14 @@ formateur_fichier(struct_processus *s_et free(chaine_formatee); } - nombre_elements++; - l_element_courant = (*l_element_courant).suivant; - if (format_sortie != 'N') { l_element_courant_format = (*l_element_courant_format).suivant; } + + nombre_elements++; + l_element_courant = (*l_element_courant).suivant; } if (format_sortie != 'N')