--- rpl/src/formateur_fichiers.c 2013/03/22 13:09:13 1.65 +++ rpl/src/formateur_fichiers.c 2013/04/19 11:05:08 1.72 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.13 + RPL/2 (R) version 4.1.14 Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -19,7 +19,7 @@ ================================================================================ */ -#define DEBUG_ERREURS + #include "rpl-conv.h" @@ -85,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; @@ -1000,7 +1001,7 @@ formateur_fichier(struct_processus *s_et if (format_sortie == 'N') { - sprintf(tampon, "%llX", (*((logical8 *) + sprintf(tampon, "%llX", (unsigned long long) (*((logical8 *) ((*s_objet).objet)))); strcpy(base, "h"); } @@ -1010,8 +1011,8 @@ formateur_fichier(struct_processus *s_et { case 2: { - sprintf(tampon, "%llX", (*((logical8 *) - ((*s_objet).objet)))); + sprintf(tampon, "%llX", (unsigned long long) + (*((logical8 *) ((*s_objet).objet)))); chaine = (unsigned char *) malloc((strlen(tampon) + 1) * sizeof(unsigned char)); @@ -1120,7 +1121,7 @@ formateur_fichier(struct_processus *s_et case 8: { - sprintf(tampon, "%llo", (*((logical8 *) + sprintf(tampon, "%llo", (*((unsigned long long *) ((*s_objet).objet)))); strcpy(base, "o"); break; @@ -1128,7 +1129,7 @@ formateur_fichier(struct_processus *s_et case 10: { - sprintf(tampon, "%llu", (*((logical8 *) + sprintf(tampon, "%llu", (*((unsigned long long *) ((*s_objet).objet)))); strcpy(base, "d"); break; @@ -1136,8 +1137,8 @@ formateur_fichier(struct_processus *s_et case 16: { - sprintf(tampon, "%llX", (*((logical8 *) - ((*s_objet).objet)))); + sprintf(tampon, "%llX", (unsigned long long) + (*((logical8 *) ((*s_objet).objet)))); strcpy(base, "h"); break; } @@ -1673,16 +1674,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 *) @@ -3785,17 +3840,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) @@ -3811,14 +3920,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') @@ -4078,11 +4187,15 @@ formateur_fichier(struct_processus *s_et memcpy(&(chaine[longueur_totale]), tampon, 1); longueur_totale += 1; } - else if (longueur_totale < (((integer8) 1) << 16)) + else { longueur_totale++; - for(i = 0; i < 7; i++) + // i = { 0 (16 bits) 2 (32 bits) 6 (64 bits) } + + i = 0; + + for(;;) { if ((longueur_totale < (((integer8) 1) << (8 * (i + 2)))) || (i == 6)) @@ -4106,9 +4219,29 @@ formateur_fichier(struct_processus *s_et | ((i + 1) << 1)); break; } + + switch(i) + { + case 0 : + { + i = 2; + break; + } + + case 2 : + { + i = 6; + break; + } + } } - if ((chaine = realloc(chaine, (((size_t) longueur_totale) + 3) + // i = 0 => +3 (16 bits) + // i = 2 => +5 (32 bits) + // i = 6 => +9 (64 bits) + + if ((chaine = realloc(chaine, (((size_t) longueur_totale) + + ((i == 0) ? 3 : ((i == 2) ? 5 : 9))) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -4119,9 +4252,6 @@ formateur_fichier(struct_processus *s_et memcpy(&(chaine[longueur_totale]), tampon, 3); longueur_totale += 3; } - else if (longueur_totale < (((integer8) 1) << 32)) - { - } __zone(); (*longueur_effective) = longueur_totale; @@ -5275,7 +5405,7 @@ lecture_fichier_non_formate(struct_proce switch(deplacement) { case 1: - i1 = octets[0]; + i1 = (integer1) octets[0]; break; case 2: