--- rpl/src/formateur_fichiers.c 2013/03/08 14:55:38 1.51 +++ rpl/src/formateur_fichiers.c 2013/03/10 17:01:05 1.52 @@ -19,7 +19,7 @@ ================================================================================ */ - +#define DEBUG_ERREURS #include "rpl-conv.h" @@ -42,7 +42,7 @@ unsigned char * formateur_fichier(struct_processus *s_etat_processus, struct_objet *s_objet, struct_objet *s_format, long longueur, long longueur_champ, unsigned char format_sortie, unsigned char type, - long *longueur_effective, long *recursivite) + long *longueur_effective, long *recursivite, logical1 export_fichier) { /* * Traitement du format des fichiers formatés : @@ -70,13 +70,15 @@ formateur_fichier(struct_processus *s_et * "real*4", "real*8", ["real*16",] * "complex*8", "complex*16", ["complex*32",] * "logical*1", "logical*2", "logical*4", logical*8", - * "character" } + * "character*n" "character*(*)" } */ logical1 autorisation_parenthese; logical1 format_degenere; logical1 presence_signe; + long longueur_chaine_traitee; + struct_liste_chainee *l_atome; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_courant_format; @@ -108,6 +110,7 @@ formateur_fichier(struct_processus *s_et unsigned long nombre_lignes; integer8 longueur_liste; + integer8 longueur_reelle_chaine; integer8 longueur_totale; integer8 masque_binaire; integer8 position_1; @@ -861,7 +864,7 @@ formateur_fichier(struct_processus *s_et free(chaine_sauvegarde); if ((s_sous_objet = allocation(s_etat_processus, - CHN)) == NULL) + CHN)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -892,7 +895,8 @@ formateur_fichier(struct_processus *s_et if (((*s_sous_objet).objet = (void *) formateur_fichier( s_etat_processus, (*l_element_courant).donnee, s_format, longueur, longueur_champ, format_sortie, - type, longueur_effective, recursivite)) == NULL) + type, longueur_effective, recursivite, + export_fichier)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -1164,8 +1168,11 @@ formateur_fichier(struct_processus *s_et return(NULL); } - if ((longueur_champ == -1) || (((long) strlen((unsigned char *) - (*s_objet).objet)) < longueur_champ)) + longueur_reelle_chaine = longueur_chaine(s_etat_processus, + (unsigned char *) (*s_objet).objet); + + if ((longueur_champ == -1) || (longueur_reelle_chaine < + longueur_champ)) { chaine = (unsigned char *) malloc((strlen((unsigned char *) ((*s_objet).objet)) + 1) * sizeof(unsigned char)); @@ -1181,10 +1188,13 @@ formateur_fichier(struct_processus *s_et } else { - chaine = (unsigned char *) malloc((longueur_champ + 1) - * sizeof(unsigned char)); + longueur_reelle_chaine = pointeur_ieme_caractere( + s_etat_processus, (unsigned char *) + (*s_objet).objet, longueur_champ) + - ((unsigned char *) (*s_objet).objet); - if (chaine == NULL) + if ((chaine = malloc((longueur_reelle_chaine + 1) * + sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -1192,8 +1202,8 @@ formateur_fichier(struct_processus *s_et } strncpy(chaine, (unsigned char *) ((*s_objet).objet), - longueur_champ); - chaine[longueur_champ] = d_code_fin_chaine; + longueur_reelle_chaine); + chaine[longueur_reelle_chaine] = d_code_fin_chaine; } } else if ((*s_objet).type == CPL) @@ -1250,7 +1260,8 @@ formateur_fichier(struct_processus *s_et if ((chaine_formatee = formateur_fichier(s_etat_processus, (*l_element_courant).donnee, s_format, longueur, longueur_champ, format_sortie, type, - longueur_effective, recursivite)) == NULL) + longueur_effective, recursivite, export_fichier)) + == NULL) { return(NULL); } @@ -1410,8 +1421,8 @@ formateur_fichier(struct_processus *s_et if ((chaine_formatee = formateur_fichier(s_etat_processus, (*l_element_courant).donnee, (*l_element_courant_format).donnee, - 0, 0, ' ', 'F', longueur_effective, recursivite)) - == NULL) + 0, 0, ' ', 'F', longueur_effective, recursivite, + export_fichier)) == NULL) { return(NULL); } @@ -1583,7 +1594,8 @@ formateur_fichier(struct_processus *s_et if ((chaine_formatee = formateur_fichier(s_etat_processus, (*l_element_courant).donnee, s_format, longueur, longueur_champ, format_sortie, type, - longueur_effective, recursivite)) == NULL) + longueur_effective, recursivite, export_fichier)) + == NULL) { free(chaine); return(NULL); @@ -1734,8 +1746,8 @@ formateur_fichier(struct_processus *s_et if ((chaine_formatee = formateur_fichier(s_etat_processus, (*l_element_courant).donnee, (*l_element_courant_format).donnee, - 0, 0, ' ', 'F', longueur_effective, recursivite)) - == NULL) + 0, 0, ' ', 'F', longueur_effective, recursivite, + export_fichier)) == NULL) { return(NULL); } @@ -1898,7 +1910,8 @@ formateur_fichier(struct_processus *s_et (*((struct_tableau *) (*s_objet).objet)) .elements[i], s_format, longueur, longueur_champ, format_sortie, type, - longueur_effective, recursivite)) == NULL) + longueur_effective, recursivite, export_fichier)) + == NULL) { return(NULL); } @@ -2729,17 +2742,22 @@ formateur_fichier(struct_processus *s_et * * Longueur : (pour l'instruction backspace) * - * 00 XXXXXX longueur sur 6 bits - * 01 000000 longueur sur 16 bits - * 10 000000 longueur sur 32 bits - * 11 000000 longueur sur 64 bits - * - * Exemples : - * [00 XXXXXX] - * [01 ----XX][XXXXXXXX][01 XXXXXX] - * [10 ----XX][XXXXXXXX][XXXXXXXX][XXXXXXXX][10 XXXXXX] - * [11 ----XX][XXXXXXXX][XXXXXXXX][XXXXXXXX][XXXXXXXX][XXXXXXXX] - * [XXXXXXXX][XXXXXXXX][11 XXXXXX] + * XXXXXXX0 longueur sur 7 bits + * XXXX0011 XXXXXXXX XXXX0011 longueur sur 16 bits + * MSB(1/2) LSB MSB(2/2) + * XXXX0101 XXXXXXXX XXXXXXXX XXXX0101 longueur sur 24 bits + * XXXX0111 XXXXXXXX XXXXXXXX XXXXXXXX + * XXXX0111 longueur sur 32 bits + * XXXX1001 XXXXXXXX XXXXXXXX XXXXXXXX + * XXXXXXXX XXXX1001 longueur sur 40 bits + * XXXX1011 XXXXXXXX XXXXXXXX XXXXXXXX + * XXXXXXXX XXXXXXXX XXXX1011 longueur sur 48 bits + * XXXX1101 XXXXXXXX XXXXXXXX XXXXXXXX + * XXXXXXXX XXXXXXXX XXXXXXXX + * XXXX1101 longueur sur 56 bits + * XXXX1111 XXXXXXXX XXXXXXXX XXXXXXXX + * XXXXXXXX XXXXXXXX XXXXXXXX + * XXXXXXXX XXXX1111 longueur sur 64 bits * * Structures des enregistrements : * chaque type de donnée est associé à une en-tête binaire comprenant @@ -2870,10 +2888,6 @@ formateur_fichier(struct_processus *s_et chaine_formatee = NULL; chaine_sauvegarde = NULL; - strcpy(base, " "); - - masque_binaire = 0; - if ((*s_objet).type == ALG) { @@ -2883,837 +2897,6 @@ formateur_fichier(struct_processus *s_et -------------------------------------------------------------------------------- */ - l_element_courant = (struct_liste_chainee *) (*s_objet).objet; - - while(l_element_courant != NULL) - { - if ((*(*l_element_courant).donnee).type == FCT) - { - if ((strcmp((*((struct_fonction *) (*(*l_element_courant) - .donnee).objet)).nom_fonction, "<<") != 0) && - (strcmp((*((struct_fonction *) - (*(*l_element_courant) - .donnee).objet)).nom_fonction, ">>") != 0)) - { - if ((strcmp((*((struct_fonction *) - (*(*l_element_courant) - .donnee).objet)).nom_fonction, "+") == 0) || - (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "-") == 0) || (strcmp( - (*((struct_fonction *) (*(*l_element_courant) - .donnee).objet)).nom_fonction, "*") == 0) || - (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "/") == 0) || (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "^") == 0) || (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "<") == 0) || (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - ">") == 0) || (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "==") == 0) || (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "<>") == 0) || (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "<=") == 0) || (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "=<") == 0) || (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - ">=") == 0) || (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "=>") == 0)) - { - if (depilement(s_etat_processus, - &((*s_etat_processus) - .l_base_pile), &s_sous_objet_2) == d_erreur) - { - return(NULL); - } - - chaine_sauvegarde = (*s_etat_processus) - .instruction_courante; - - if (((*s_etat_processus).instruction_courante = - (unsigned char *) malloc((strlen( - (unsigned char *) (*s_sous_objet_2).objet) - + 2 + 1) * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).instruction_courante = - chaine_sauvegarde; - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf((*s_etat_processus).instruction_courante, - "'%s'", (unsigned char *) - (*s_sous_objet_2).objet); - - presence_signe = (((*s_etat_processus) - .instruction_courante[1] == '+') - || ((*s_etat_processus) - .instruction_courante[1] - == '-')) ? d_vrai : d_faux; - - recherche_type(s_etat_processus); - - if ((*s_etat_processus).erreur_execution != d_ex) - { - // Aucune erreur ne peut être renvoyée. - - return(NULL); - } - - if (depilement(s_etat_processus, - &((*s_etat_processus) - .l_base_pile), &s_sous_objet_3) == d_erreur) - { - return(NULL); - } - - free((*s_etat_processus).instruction_courante); - - (*s_etat_processus).instruction_courante = - chaine_sauvegarde; - - autorisation_parenthese = d_faux; - - if ((*s_sous_objet_3).type == ALG) - { - l_atome = (struct_liste_chainee *) - (*s_sous_objet_3).objet; - chaine_fonction = ""; - nombre_arguments_fonction = 0; - - while(l_atome != NULL) - { - if ((*(*l_atome).donnee).type == FCT) - { - if (strcmp((*((struct_fonction *) - (*(*l_atome).donnee).objet)) - .nom_fonction, ">>") != 0) - { - chaine_fonction = - (*((struct_fonction *) - (*(*l_atome).donnee).objet)) - .nom_fonction; - nombre_arguments_fonction = - (*((struct_fonction *) - (*(*l_atome).donnee).objet)) - .nombre_arguments; - } - } - - l_atome = (*l_atome).suivant; - } - - if (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "+") == 0) - { - if ((strcmp(chaine_fonction, "AND") == 0) || - (strcmp(chaine_fonction, "XOR") == - 0) || (strcmp(chaine_fonction, "OR") - == 0)) - { - autorisation_parenthese = d_vrai; - } - } - else if (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "-") == 0) - { - if (nombre_arguments_fonction != 0) - { - autorisation_parenthese = d_faux; - } - else - { - autorisation_parenthese = d_vrai; - } - } - else if (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "*") == 0) - { - if ((strcmp(chaine_fonction, "+") == 0) || - (strcmp(chaine_fonction, "-") == 0) - || (strcmp(chaine_fonction, "AND") - == 0) || (strcmp(chaine_fonction, - "XOR") == 0) || (strcmp( - chaine_fonction, "OR") == 0)) - { - autorisation_parenthese = d_vrai; - } - } - else if (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "/") == 0) - { - if (nombre_arguments_fonction != 0) - { - autorisation_parenthese = d_faux; - } - else - { - autorisation_parenthese = d_vrai; - } - } - else if ((strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "^") == 0)) - { - if (nombre_arguments_fonction != 0) - { - autorisation_parenthese = d_faux; - } - else - { - autorisation_parenthese = d_vrai; - } - } - } - - if ((autorisation_parenthese == d_vrai) || - (presence_signe == d_vrai)) - { - chaine_sauvegarde = (unsigned char *) - (*s_sous_objet_2).objet; - - if (((*s_sous_objet_2).objet = (void *) - malloc((strlen(chaine_sauvegarde) + 2 - + 1) * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf((unsigned char *) (*s_sous_objet_2) - .objet, "(%s)", chaine_sauvegarde); - free(chaine_sauvegarde); - } - - liberation(s_etat_processus, s_sous_objet_3); - - if (depilement(s_etat_processus, - &((*s_etat_processus) - .l_base_pile), &s_sous_objet_1) == d_erreur) - { - return(NULL); - } - - chaine_sauvegarde = (*s_etat_processus) - .instruction_courante; - - if (((*s_etat_processus).instruction_courante = - (unsigned char *) malloc((strlen( - (unsigned char *) (*s_sous_objet_1).objet) - + 2 + 1) * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).instruction_courante = - chaine_sauvegarde; - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf((*s_etat_processus).instruction_courante, - "'%s'", (unsigned char *) - (*s_sous_objet_1).objet); - - recherche_type(s_etat_processus); - - if ((*s_etat_processus).erreur_execution != d_ex) - { - // Aucune erreur ne peut être renvoyée. - - return(NULL); - } - - if (depilement(s_etat_processus, - &((*s_etat_processus) - .l_base_pile), &s_sous_objet_3) == d_erreur) - { - return(NULL); - } - - free((*s_etat_processus).instruction_courante); - - (*s_etat_processus).instruction_courante = - chaine_sauvegarde; - - autorisation_parenthese = d_faux; - - if ((*s_sous_objet_3).type == ALG) - { - l_atome = (struct_liste_chainee *) - (*s_sous_objet_3).objet; - chaine_fonction = ""; - - while(l_atome != NULL) - { - if ((*(*l_atome).donnee).type == FCT) - { - if (strcmp((*((struct_fonction *) - (*(*l_atome).donnee).objet)) - .nom_fonction, ">>") != 0) - { - chaine_fonction = - (*((struct_fonction *) - (*(*l_atome).donnee).objet)) - .nom_fonction; - } - } - - l_atome = (*l_atome).suivant; - } - - if ((strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "+") == 0) || - (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "-") == 0)) - { - if ((strcmp(chaine_fonction, "AND") == 0) || - (strcmp(chaine_fonction, "XOR") == - 0) || (strcmp(chaine_fonction, "OR") - == 0)) - { - autorisation_parenthese = d_vrai; - } - } - else if ((strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "*") == 0) || - (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "/") == 0)) - { - if ((strcmp(chaine_fonction, "+") == 0) || - (strcmp(chaine_fonction, "-") == 0) - || (strcmp(chaine_fonction, "AND") - == 0) || (strcmp(chaine_fonction, - "XOR") == 0) || (strcmp( - chaine_fonction, "OR") == 0)) - { - autorisation_parenthese = d_vrai; - } - } - else if ((strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "^") == 0)) - { - autorisation_parenthese = d_vrai; - } - } - - if (autorisation_parenthese == d_vrai) - { - chaine_sauvegarde = (unsigned char *) - (*s_sous_objet_1).objet; - - if (((*s_sous_objet_1).objet = (void *) - malloc((strlen(chaine_sauvegarde) + 2 - + 1) * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf((unsigned char *) (*s_sous_objet_1) - .objet, "(%s)", chaine_sauvegarde); - free(chaine_sauvegarde); - } - - liberation(s_etat_processus, s_sous_objet_3); - - if ((s_sous_objet = allocation(s_etat_processus, - CHN)) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - if (((*s_sous_objet).objet = (void *) - malloc((strlen( - (unsigned char *) (*s_sous_objet_1).objet) + - strlen((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction) + strlen((unsigned char *) - (*s_sous_objet_2).objet) + 1) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf((unsigned char *) (*s_sous_objet).objet, - "%s%s%s", (unsigned char *) - (*s_sous_objet_1) - .objet, (*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, (unsigned char *) - (*s_sous_objet_2).objet); - - liberation(s_etat_processus, s_sous_objet_1); - liberation(s_etat_processus, s_sous_objet_2); - - if (empilement(s_etat_processus, - &((*s_etat_processus) - .l_base_pile), s_sous_objet) == d_erreur) - { - return(NULL); - } - } - else if (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, "=") == 0) - { - if (depilement(s_etat_processus, - &((*s_etat_processus).l_base_pile), - &s_sous_objet_2) == d_erreur) - { - return(NULL); - } - - if (depilement(s_etat_processus, - &((*s_etat_processus).l_base_pile), - &s_sous_objet_1) == d_erreur) - { - return(NULL); - } - - if ((s_sous_objet = allocation(s_etat_processus, - CHN)) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - autorisation_parenthese = d_vrai; - l_atome = l_element_courant; - - if (l_atome != NULL) - { - if ((*l_atome).suivant != NULL) - { - l_atome = (*l_atome).suivant; - - if ((*(*l_atome).donnee).type == FCT) - { - if (strcmp((*((struct_fonction *) - (*(*l_atome).donnee).objet)) - .nom_fonction, ">>") == 0) - { - if ((*l_atome).suivant == NULL) - { - autorisation_parenthese = - d_faux; - } - } - } - } - } - - if (autorisation_parenthese == d_vrai) - { - if (((*s_sous_objet).objet = - (void *) malloc((strlen( - (unsigned char *) (*s_sous_objet_1) - .objet) + strlen((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction) + - strlen((unsigned char *) - (*s_sous_objet_2).objet) + 2 + 1) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf((unsigned char *) (*s_sous_objet).objet, - "(%s%s%s)", (unsigned char *) - (*s_sous_objet_1) - .objet, (*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, (unsigned char *) - (*s_sous_objet_2).objet); - } - else - { - if (((*s_sous_objet).objet = - (void *) malloc((strlen( - (unsigned char *) (*s_sous_objet_1) - .objet) + strlen((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction) + strlen( - (unsigned char *) (*s_sous_objet_2) - .objet) + 1) * sizeof(unsigned char))) - == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf((unsigned char *) (*s_sous_objet).objet, - "%s%s%s", (unsigned char *) - (*s_sous_objet_1) - .objet, (*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, (unsigned char *) - (*s_sous_objet_2).objet); - } - - liberation(s_etat_processus, s_sous_objet_1); - liberation(s_etat_processus, s_sous_objet_2); - - if (empilement(s_etat_processus, - &((*s_etat_processus).l_base_pile), - s_sous_objet) == d_erreur) - { - return(NULL); - } - } - else if (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "NOT") == 0) - { - if (depilement(s_etat_processus, - &((*s_etat_processus) - .l_base_pile), &s_sous_objet_1) == d_erreur) - { - return(NULL); - } - - if ((s_sous_objet = allocation(s_etat_processus, - CHN)) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - if (((*s_sous_objet).objet = (unsigned char *) - malloc( - (strlen((unsigned char *) (*s_sous_objet_1) - .objet) + 4 + 1) * sizeof(unsigned char))) - == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf((unsigned char *) (*s_sous_objet).objet, - "%s %s", (*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, (unsigned char *) - (*s_sous_objet_1).objet ); - - liberation(s_etat_processus, s_sous_objet_1); - - if (empilement(s_etat_processus, - &((*s_etat_processus) - .l_base_pile), s_sous_objet) == d_erreur) - { - return(NULL); - } - } - else if ((strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "OR") == 0) || (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "XOR") == 0) || (strcmp((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, - "AND") == 0)) - { - if (depilement(s_etat_processus, - &((*s_etat_processus) - .l_base_pile), &s_sous_objet_2) == d_erreur) - { - return(NULL); - } - - if (depilement(s_etat_processus, - &((*s_etat_processus) - .l_base_pile), &s_sous_objet_1) == d_erreur) - { - return(NULL); - } - - if ((s_sous_objet = allocation(s_etat_processus, - CHN)) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - if (((*s_sous_objet).objet = (void *) - malloc((strlen( - (unsigned char *) (*s_sous_objet_1).objet) + - strlen((*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction) + strlen((unsigned char *) - (*s_sous_objet_2).objet) + 2 + 1) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf((unsigned char *) (*s_sous_objet).objet, - "%s %s %s", (unsigned char *) - (*s_sous_objet_1) - .objet, (*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, (unsigned char *) - (*s_sous_objet_2).objet); - - liberation(s_etat_processus, s_sous_objet_1); - liberation(s_etat_processus, s_sous_objet_2); - - if (empilement(s_etat_processus, - &((*s_etat_processus) - .l_base_pile), s_sous_objet) == d_erreur) - { - return(NULL); - } - } - else - { - nombre_arguments = (*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nombre_arguments; - - if ((chaine = (unsigned char *) - malloc(sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - chaine[0] = d_code_fin_chaine; - - for(i = 0; i < nombre_arguments; i++) - { - if ((nombre_arguments - i) > 1) - { - l_liste1 = (*s_etat_processus).l_base_pile; - - for(j = 2; j < (nombre_arguments - i); j++) - { - l_liste1 = (*l_liste1).suivant; - } - - l_liste2 = (*l_liste1).suivant; - (*l_liste1).suivant = (*l_liste2).suivant; - (*l_liste2).suivant = (*s_etat_processus) - .l_base_pile; - (*s_etat_processus).l_base_pile = l_liste2; - } - - if (depilement(s_etat_processus, - &((*s_etat_processus).l_base_pile), - &s_sous_objet) == d_erreur) - { - return(NULL); - } - - chaine_sauvegarde = chaine; - - if (strlen(chaine_sauvegarde) == 0) - { - if ((chaine = (unsigned char *) - malloc((strlen((unsigned char *) - (*s_sous_objet).objet) + 1) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf(chaine, "%s", (unsigned char *) - (*s_sous_objet).objet); - } - else - { - if ((chaine = (unsigned char *) - malloc((strlen(chaine_sauvegarde) - + 1 + strlen((unsigned char *) - (*s_sous_objet).objet) + 1) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf(chaine, "%s,%s", chaine_sauvegarde, - (unsigned char *) (*s_sous_objet) - .objet); - } - - free(chaine_sauvegarde); - liberation(s_etat_processus, s_sous_objet); - } - - chaine_sauvegarde = chaine; - - if ((chaine = (unsigned char *) malloc((strlen( - (*((struct_fonction *) - (*(*l_element_courant) - .donnee).objet)).nom_fonction) + 2 + - strlen(chaine_sauvegarde) + 1) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf(chaine, "%s(%s)", (*((struct_fonction *) - (*(*l_element_courant).donnee).objet)) - .nom_fonction, chaine_sauvegarde); - free(chaine_sauvegarde); - - if ((s_sous_objet = allocation(s_etat_processus, - CHN)) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - (*s_sous_objet).objet = (void *) chaine; - - if (empilement(s_etat_processus, - &((*s_etat_processus) - .l_base_pile), s_sous_objet) == d_erreur) - { - return(NULL); - } - } - } - } - else - { - if ((s_sous_objet = allocation(s_etat_processus, CHN)) - == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - if (((*s_sous_objet).objet = (void *) formateur_fichier( - s_etat_processus, (*l_element_courant).donnee, - s_format, longueur, longueur_champ, format_sortie, - type, longueur_effective, recursivite)) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - if (((*(*l_element_courant).donnee).type == ALG) - || ((*(*l_element_courant).donnee).type == NOM)) - { - chaine_sauvegarde = (unsigned char *) - (*s_sous_objet).objet; - - if (((*s_sous_objet).objet = malloc((strlen( - chaine_sauvegarde) - 1) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - ptrl = chaine_sauvegarde; - ptre = (unsigned char *) (*s_sous_objet).objet; - - for(ptrl++, i = strlen(chaine_sauvegarde) - 2; i > 0; - i--, *ptre++ = *ptrl++); - - (*ptre) = d_code_fin_chaine; - - free(chaine_sauvegarde); - } - else if ((*(*l_element_courant).donnee).type == CHN) - { - chaine_sauvegarde = (unsigned char *) - (*s_sous_objet).objet; - - if (((*s_sous_objet).objet = malloc((strlen( - chaine_sauvegarde) + 3) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf((unsigned char *) (*s_sous_objet).objet, - "\"%s\"", chaine_sauvegarde); - - free(chaine_sauvegarde); - } - - if (empilement(s_etat_processus, &((*s_etat_processus) - .l_base_pile), s_sous_objet) == d_erreur) - { - return(NULL); - } - } - - l_element_courant = (*l_element_courant).suivant; - } - - if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), - &s_sous_objet) == d_erreur) - { - return(NULL); - } - - if ((chaine = (unsigned char *) malloc((strlen((unsigned char *) - (*s_sous_objet).objet) + 2 + 1) * sizeof(unsigned char))) - == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); - } - - sprintf(chaine, "'%s'", (unsigned char *) (*s_sous_objet).objet); - liberation(s_etat_processus, s_sous_objet); } else if ((*s_objet).type == BIN) { @@ -3724,200 +2907,162 @@ formateur_fichier(struct_processus *s_et -------------------------------------------------------------------------------- */ - if (format_sortie != 'B') - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - - masque_binaire = masque_entiers_binaires(s_etat_processus); - - if ((test_cfsf(s_etat_processus, 43) == d_faux) && - (test_cfsf(s_etat_processus, 44) == d_faux)) - { + } + else if ((*s_objet).type == CHN) + { /* --- Base décimale --------------------------------------------------------------- +-------------------------------------------------------------------------------- + Chaîne de caractères + Poids fort 1000 0XXX (longueur inférieure à 2**3-1 + 1000 10LL (autres longueurs) +-------------------------------------------------------------------------------- */ - sprintf(tampon, "%llu", (*((logical8 *) - ((*s_objet).objet))) & masque_binaire); - strcpy(base, "d"); - } - else if ((test_cfsf(s_etat_processus, 43) == d_vrai) && - (test_cfsf(s_etat_processus, 44) == d_faux)) - { + longueur_reelle_chaine = longueur_chaine(s_etat_processus, + (unsigned char *) (*s_objet).objet); -/* --- Base octale ----------------------------------------------------------------- -*/ + if ((longueur_champ == -1) || (longueur_reelle_chaine < + longueur_champ)) + { + // Le format est CHARACTER*(*). On copie dans la sortie + // la chaine en évaluant les caractères échappés. - sprintf(tampon, "%llo", (*((logical8 *) - ((*s_objet).objet))) & masque_binaire); - strcpy(base, "o"); + if ((chaine = formateur_flux(s_etat_processus, (unsigned char *) + (*s_objet).objet, &longueur_chaine_traitee)) == NULL) + { + return(NULL); + } } - else if (test_cfsf(s_etat_processus, 44) == d_vrai) + else { + // Format de type CHARACTER*(n) -/* --- Bases hexadécimale et binaire ----------------------------------------------- -*/ - - sprintf(tampon, "%llX", (*((logical8 *) - ((*s_objet).objet))) & masque_binaire); - - if (test_cfsf(s_etat_processus, 43) == d_vrai) + if ((chaine_sauvegarde = formateur_flux(s_etat_processus, + (unsigned char *) (*s_objet).objet, + &longueur_chaine_traitee)) == NULL) { - strcpy(base, "h"); + return(NULL); } - else - { - chaine = (unsigned char *) malloc((strlen(tampon) + 1) - * sizeof(unsigned char)); - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } + if ((chaine = malloc(longueur_champ * sizeof(unsigned char))) + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } - strcpy(chaine, tampon); - tampon[0] = 0; + memcpy(chaine, chaine_sauvegarde, longueur_champ); + longueur_chaine_traitee = longueur_champ; + free(chaine_sauvegarde); + } - for(i = 0; i < strlen(chaine); i++) - { - switch(chaine[i]) - { - case '0' : - { - strcat(tampon, (i != 0) ? "0000" : "0"); - break; - } - case '1' : - { - strcat(tampon, (i != 0) ? "0001" : "1"); - break; - } - case '2' : - { - strcat(tampon, (i != 0) ? "0010" : "10"); - break; - } - case '3' : - { - strcat(tampon, (i != 0) ? "0011" : "11"); - break; - } - case '4' : - { - strcat(tampon, (i != 0) ? "0100" : "100"); - break; - } - case '5' : - { - strcat(tampon, (i != 0) ? "0101" : "101"); - break; - } - case '6' : - { - strcat(tampon, (i != 0) ? "0110" : "110"); - break; - } - case '7' : - { - strcat(tampon, (i != 0) ? "0111" : "111"); - break; - } - case '8' : - { - strcat(tampon, "1000"); - break; - } - case '9' : - { - strcat(tampon, "1001"); - break; - } - case 'A' : - { - strcat(tampon, "1010"); - break; - } - case 'B' : - { - strcat(tampon, "1011"); - break; - } - case 'C' : - { - strcat(tampon, "1100"); - break; - } - case 'D' : - { - strcat(tampon, "1101"); - break; - } - case 'E' : - { - strcat(tampon, "1110"); - break; - } - case 'F' : - { - strcat(tampon, "1111"); - break; - } - } - } + chaine_sauvegarde = chaine; - free(chaine); - strcpy(base, "b"); + if (longueur_chaine_traitee < (1LL << 3)) + { + if ((chaine = malloc((longueur_chaine_traitee + 1) + * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); } - } - chaine = (unsigned char *) malloc((strlen(tampon) + 4) - * sizeof(unsigned char)); + chaine[0] = 0x80 | (longueur_chaine_traitee & 0x7); - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); + memcpy(chaine + 1, chaine_sauvegarde, longueur_chaine_traitee); + longueur_totale = longueur_chaine_traitee + 1; } + else if (longueur_chaine_traitee < (1LL << 8)) + { + if ((chaine = malloc((longueur_chaine_traitee + 2) + * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } - strcpy(chaine, "# "); + chaine[0] = 0x88; + chaine[1] = (unsigned char) (longueur_chaine_traitee & 0xFF); - strcat(chaine, tampon); - strcat(chaine, base); - } - else if ((*s_objet).type == CHN) - { + memcpy(chaine + 2, chaine_sauvegarde, longueur_chaine_traitee); + longueur_totale = longueur_chaine_traitee + 2; + } + else if (longueur_chaine_traitee < (1LL << 16)) + { + if ((chaine = malloc((longueur_chaine_traitee + 3) + * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } -/* --------------------------------------------------------------------------------- - Chaîne de caractères --------------------------------------------------------------------------------- -*/ + chaine[0] = 0x89; + chaine[1] = (unsigned char) ((longueur_chaine_traitee >> 8) + & 0xFF); + chaine[2] = (unsigned char) (longueur_chaine_traitee & 0xFF); - if (format_sortie != 'C') - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); + memcpy(chaine + 3, chaine_sauvegarde, longueur_chaine_traitee); + longueur_totale = longueur_chaine_traitee + 3; } + else if (longueur_chaine_traitee < (1LL << 32)) + { + if ((chaine = malloc((longueur_chaine_traitee + 5) + * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } - chaine = (unsigned char *) malloc((strlen((unsigned char *) - ((*s_objet).objet)) + 1) * sizeof(unsigned char)); + chaine[0] = 0x8A; + chaine[1] = (unsigned char) ((longueur_chaine_traitee >> 24) + & 0xFF); + chaine[2] = (unsigned char) ((longueur_chaine_traitee >> 16) + & 0xFF); + chaine[3] = (unsigned char) ((longueur_chaine_traitee >> 8) + & 0xFF); + chaine[4] = (unsigned char) (longueur_chaine_traitee & 0xFF); - if (chaine == NULL) + memcpy(chaine + 5, chaine_sauvegarde, longueur_chaine_traitee); + longueur_totale = longueur_chaine_traitee + 5; + } + else { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); + if ((chaine = malloc((longueur_chaine_traitee + 9) + * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } + + chaine[0] = 0x8B; + chaine[1] = (unsigned char) ((longueur_chaine_traitee >> 56) + & 0xFF); + chaine[2] = (unsigned char) ((longueur_chaine_traitee >> 48) + & 0xFF); + chaine[3] = (unsigned char) ((longueur_chaine_traitee >> 40) + & 0xFF); + chaine[4] = (unsigned char) ((longueur_chaine_traitee >> 32) + & 0xFF); + chaine[5] = (unsigned char) ((longueur_chaine_traitee >> 24) + & 0xFF); + chaine[6] = (unsigned char) ((longueur_chaine_traitee >> 16) + & 0xFF); + chaine[7] = (unsigned char) ((longueur_chaine_traitee >> 8) + & 0xFF); + chaine[8] = (unsigned char) (longueur_chaine_traitee & 0xFF); + + memcpy(chaine + 9, chaine_sauvegarde, longueur_chaine_traitee); + longueur_totale = longueur_chaine_traitee + 9; } - strcpy(chaine, (unsigned char *) ((*s_objet).objet)); + (*longueur_effective) = longueur_totale; } else if ((*s_objet).type == CPL) { @@ -3937,7 +3082,7 @@ formateur_fichier(struct_processus *s_et } if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus, - (*s_objet).objet, 'C', longueur, longueur_effective)) + (*s_objet).objet, 'C', 'C', longueur, longueur_effective)) == NULL) { return(NULL); @@ -3951,78 +3096,6 @@ formateur_fichier(struct_processus *s_et Définition -------------------------------------------------------------------------------- */ - - l_element_courant = (struct_liste_chainee *) ((*s_objet).objet); - chaine_sauvegarde = chaine; - - while(l_element_courant != NULL) - { - if ((chaine_formatee = formateur_fichier(s_etat_processus, - (*l_element_courant).donnee, s_format, - longueur, longueur_champ, format_sortie, type, - longueur_effective, recursivite)) == NULL) - { - return(NULL); - } - - if ((*(*l_element_courant).donnee).type == CHN) - { - chaine_tampon = chaine_formatee; - - if ((chaine_formatee = (unsigned char *) malloc((strlen( - chaine_tampon) + 3) * sizeof(unsigned char))) - == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf(chaine_formatee, "\"%s\"", chaine_tampon); - free(chaine_tampon); - } - - l_element_courant = (*l_element_courant).suivant; - - if (chaine != NULL) - { - chaine_sauvegarde = chaine; - - if ((chaine = (unsigned char *) malloc((strlen( - chaine_sauvegarde) + strlen(chaine_formatee) + 2) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " "); - strcat(chaine, chaine_formatee); - free(chaine_formatee); - } - else - { - chaine = chaine_formatee; - } - } - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 1) * - sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - free(chaine_sauvegarde); - return(NULL); - } - - chaine_sauvegarde[strlen(chaine_sauvegarde)] = d_code_fin_chaine; - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); } else if ((*s_objet).type == INT) { @@ -4034,7 +3107,8 @@ formateur_fichier(struct_processus *s_et -------------------------------------------------------------------------------- */ - if (format_sortie != 'I') + if ((format_sortie != 'I') && (format_sortie != 'R') + && (format_sortie != 'C')) { (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier; @@ -4042,8 +3116,8 @@ formateur_fichier(struct_processus *s_et } if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus, - (*s_objet).objet, 'I', longueur, longueur_effective)) - == NULL) + (*s_objet).objet, 'I', format_sortie, longueur, + longueur_effective)) == NULL) { return(NULL); } @@ -4057,18 +3131,6 @@ formateur_fichier(struct_processus *s_et -------------------------------------------------------------------------------- */ - chaine = (unsigned char *) malloc((strlen((*((struct_fonction *) - ((*s_objet).objet))).nom_fonction) + 1) * - sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, (unsigned char *) (*((struct_fonction *) - ((*s_objet).objet))).nom_fonction); } else if ((*s_objet).type == LST) { @@ -4238,8 +3300,8 @@ formateur_fichier(struct_processus *s_et { if ((chaine_formatee = formateur_fichier(s_etat_processus, (*l_element_courant).donnee, - (*l_element_courant_format).donnee, - 0, 0, ' ', 'U', longueur_effective, recursivite)) + (*l_element_courant_format).donnee, 0, 0, ' ', 'U', + longueur_effective, recursivite, export_fichier)) == NULL) { return(NULL); @@ -4278,8 +3340,6 @@ formateur_fichier(struct_processus *s_et return(NULL); } - format_degenere = d_faux; - if (strncmp("INTEGER*", format_chaine, 8) == 0) { format_sortie = 'I'; @@ -4300,7 +3360,7 @@ formateur_fichier(struct_processus *s_et format_sortie = 'C'; position_1 = 8; } - else if (strcmp("CHARACTER", format_chaine) == 0) + else if (strncmp("CHARACTER*", format_chaine, 10) == 0) { format_sortie = 'S'; position_1 = 10; @@ -4316,18 +3376,18 @@ formateur_fichier(struct_processus *s_et return(NULL); } - if (format_degenere == d_faux) + if (format_chaine[position_1] == d_code_fin_chaine) { - if (format_chaine[position_1] == d_code_fin_chaine) - { - free(chaine); - free(format_chaine); + free(chaine); + free(format_chaine); - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } + (*s_etat_processus).erreur_execution = + d_ex_erreur_format_fichier; + return(NULL); + } + if (strcmp(&(format_chaine[position_1]), "(*)") != 0) + { if (sscanf(&(format_chaine[position_1]), "%ld", &longueur) != 1) { @@ -4338,9 +3398,12 @@ formateur_fichier(struct_processus *s_et d_ex_erreur_format_fichier; return(NULL); } + + longueur_champ = longueur; } else { + longueur_champ = -1; longueur = -1; } @@ -4349,7 +3412,8 @@ formateur_fichier(struct_processus *s_et if ((chaine_formatee = formateur_fichier(s_etat_processus, (*l_element_courant).donnee, s_format, longueur, longueur_champ, format_sortie, type, - longueur_effective, recursivite)) == NULL) + longueur_effective, recursivite, export_fichier)) + == NULL) { free(chaine); return(NULL); @@ -4385,88 +3449,6 @@ formateur_fichier(struct_processus *s_et return(NULL); } - if ((*recursivite) == 1) - { - // Ajout de la longueur totale en fin d'enregistrement. - - if (longueur_totale < (((integer8) 1) << 6)) - { - tampon[0] = longueur_totale + 1; - - if ((chaine = realloc(chaine, (longueur_totale + 1) - * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - memcpy(&(chaine[longueur_totale]), tampon, 1); - longueur_totale += 1; - } - else if (longueur_totale < (((integer8) 1) << 16)) - { - tampon[2] = 0x40; - tampon[1] = (longueur_totale + 1) & 0xFF; - tampon[0] = ((longueur_totale + 1) >> 8) & 0xFF; - - if ((chaine = realloc(chaine, (longueur_totale + 3) - * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - memcpy(&(chaine[longueur_totale]), tampon, 3); - longueur_totale += 3; - } - else if (longueur_totale < (((integer8) 1) << 32)) - { - tampon[4] = 0x80; - tampon[3] = (longueur_totale + 1) & 0xFF; - tampon[2] = ((longueur_totale + 1) >> 8) & 0xFF; - tampon[1] = ((longueur_totale + 1) >> 16) & 0xFF; - tampon[0] = ((longueur_totale + 1) >> 24) & 0xFF; - - if ((chaine = realloc(chaine, (longueur_totale + 5) - * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - memcpy(&(chaine[longueur_totale]), tampon, 5); - longueur_totale += 5; - } - else - { - tampon[8] = 0xC0; - tampon[7] = (longueur_totale + 1) & 0xFF; - tampon[6] = ((longueur_totale + 1) >> 8) & 0xFF; - tampon[5] = ((longueur_totale + 1) >> 16) & 0xFF; - tampon[4] = ((longueur_totale + 1) >> 24) & 0xFF; - tampon[3] = ((longueur_totale + 1) >> 32) & 0xFF; - tampon[2] = ((longueur_totale + 1) >> 40) & 0xFF; - tampon[1] = ((longueur_totale + 1) >> 48) & 0xFF; - tampon[0] = ((longueur_totale + 1) >> 56) & 0xFF; - - if ((chaine = realloc(chaine, (longueur_totale + 9) - * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - memcpy(&(chaine[longueur_totale]), tampon, 9); - longueur_totale += 9; - } - - __zone(); - } - (*longueur_effective) = longueur_totale; } else if ((*s_objet).type == TBL) @@ -4477,299 +3459,6 @@ formateur_fichier(struct_processus *s_et Table -------------------------------------------------------------------------------- */ - - if ((*s_format).type != TBL) - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - - l_element_courant = (struct_liste_chainee *) (*s_objet).objet; - l_element_courant_format = (struct_liste_chainee *) - (*s_format).objet; - - if ((*((struct_tableau *) (*s_objet).objet)).nombre_elements != - (*((struct_tableau *) (*s_format).objet)).nombre_elements) - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - - chaine = (unsigned char *) malloc(3 * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, "<["); - - for(i = 0; i < (*((struct_tableau *) (*s_objet).objet)) - .nombre_elements; i++) - { - if ((((*(*((struct_tableau *) (*s_format).objet)) - .elements[i]).type == LST) && - ((*(*((struct_tableau *) (*s_objet).objet)).elements[i]) - .type == LST)) || - (((*(*((struct_tableau *) (*s_format).objet)) - .elements[i]).type == TBL) && - ((*(*((struct_tableau *) (*s_objet).objet)).elements[i]) - .type == TBL))) - { - chaine_sauvegarde = chaine; - - if ((chaine_formatee = formateur_fichier(s_etat_processus, - (*l_element_courant).donnee, - (*l_element_courant_format).donnee, - 0, 0, ' ', 'F', longueur_effective, recursivite)) - == NULL) - { - return(NULL); - } - - chaine = (unsigned char *) malloc((strlen(chaine_formatee) - + strlen(chaine_sauvegarde) + 2) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " "); - strcat(chaine, chaine_formatee); - free(chaine_formatee); - } - else if ((*(*((struct_tableau *) (*s_format).objet)) - .elements[i]).type != CHN) - { - free(chaine); - - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - else - { - if ((format_chaine = conversion_majuscule((unsigned char *) - (*(*((struct_tableau *) (*s_format).objet)) - .elements[i]).objet)) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - format_degenere = d_faux; - - if (strncmp("STANDARD*", format_chaine, 9) == 0) - { - format_sortie = 'S'; - position_1 = 9; - format_degenere = d_vrai; - } - else if (strncmp("BINARY*", format_chaine, 7) == 0) - { - format_sortie = 'B'; - position_1 = 7; - } - else if (strncmp("FIXED*", format_chaine, 6) == 0) - { - format_sortie = 'F'; - position_1 = 6; - } - else if (strncmp("SCIENTIFIC*", format_chaine, 11) == 0) - { - format_sortie = 'I'; - position_1 = 11; - } - else if (strncmp("ENGINEER*", format_chaine, 9) == 0) - { - format_sortie = 'E'; - position_1 = 9; - } - else if (strncmp("CHARACTER*", format_chaine, 10) == 0) - { - format_sortie = 'C'; - position_1 = 10; - format_degenere = d_vrai; - } - else - { - free(chaine); - free(format_chaine); - - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - - position_3 = strlen(format_chaine); - format_chaine[--position_3] = d_code_fin_chaine; - - position_2 = position_1; - - while(format_chaine[position_2] != '(') - { - if (format_chaine[position_2] == d_code_fin_chaine) - { - free(chaine); - free(format_chaine); - - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - - position_2++; - } - - format_chaine[position_2++] = d_code_fin_chaine; - - if (format_degenere == d_faux) - { - if (sscanf(&(format_chaine[position_1]), "%ld", - &longueur) != 1) - { - free(chaine); - free(format_chaine); - - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - } - else - { - longueur = -1; - } - - if (strcmp(&(format_chaine[position_2]), "*") != 0) - { - if (sscanf(&(format_chaine[position_2]), "%ld", - &longueur_champ) != 1) - { - free(chaine); - free(format_chaine); - - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - } - else - { - longueur_champ = -1; - } - - if ((longueur >= 0) && (longueur_champ >= 0) && (longueur > - longueur_champ)) - { - free(chaine); - free(format_chaine); - - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - - free(format_chaine); - - chaine_sauvegarde = chaine; - - if ((chaine_formatee = formateur_fichier(s_etat_processus, - (*((struct_tableau *) (*s_objet).objet)) - .elements[i], s_format, - longueur, longueur_champ, format_sortie, type, - longueur_effective, recursivite)) == NULL) - { - return(NULL); - } - - if ((*(*((struct_tableau *) (*s_objet).objet)) - .elements[i]).type == CHN) - { - chaine = (unsigned char *) - malloc((strlen(chaine_formatee) - + strlen(chaine_sauvegarde) + 4) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " \""); - strcat(chaine, chaine_formatee); - free(chaine_formatee); - strcat(chaine, "\""); - } - else if ((*(*((struct_tableau *) (*s_objet).objet)) - .elements[i]).type == NOM) - { - chaine = (unsigned char *) - malloc((strlen(chaine_formatee) - + strlen(chaine_sauvegarde) + 2) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - sprintf(chaine, "%s %s", chaine_sauvegarde, - chaine_formatee); - free(chaine_formatee); - } - else - { - chaine = (unsigned char *) - malloc((strlen(chaine_formatee) - + strlen(chaine_sauvegarde) + 2) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " "); - strcat(chaine, chaine_formatee); - free(chaine_formatee); - } - } - } - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 4) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " ]>"); } else if ((*s_objet).type == MCX) { @@ -4779,140 +3468,6 @@ formateur_fichier(struct_processus *s_et Matrice complexe -------------------------------------------------------------------------------- */ - - if ((format_sortie != 'S') && (format_sortie != 'F') && - (format_sortie != 'I') && (format_sortie != 'E')) - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - - nombre_lignes = (*((struct_matrice *) ((*s_objet).objet))) - .nombre_lignes; - nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet))) - .nombre_colonnes; - - chaine = (unsigned char *) malloc(3 * sizeof(unsigned char)); - - if (chaine != NULL) - { - strcpy(chaine, "[["); - - for(i = 0; i < nombre_lignes; i++) - { - for(j = 0; j < nombre_colonnes; j++) - { - if ((chaine_formatee = - formateur_fichier_nombre(s_etat_processus, - (void *) &(((struct_complexe16 **) - ((*((struct_matrice *) - ((*s_objet).objet))).tableau))[i][j]), 'C', - longueur, longueur_champ, format_sortie)) - == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + - strlen(chaine_formatee) + 2) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " "); - strcat(chaine, chaine_formatee); - free(chaine_formatee); - } - - chaine_sauvegarde = chaine; - if (test_cfsf(s_etat_processus, 45) == d_vrai) - { - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + 6) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " ]\n ["); - } - else - { - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + 4) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " ]["); - } - } - - if (test_cfsf(s_etat_processus, 45) == d_vrai) - { - chaine[strlen(chaine) - 3] = ']'; - chaine[strlen(chaine) - 2] = 0; - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) - + 1) * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - } - else - { - chaine[strlen(chaine) - 2] = ']'; - chaine[strlen(chaine) - 1] = 0; - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) - + 2) * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, "]"); - } - } } else if ((*s_objet).type == MIN) { @@ -4922,139 +3477,6 @@ formateur_fichier(struct_processus *s_et Matrice entière -------------------------------------------------------------------------------- */ - - if ((format_sortie != 'S') && (format_sortie != 'F') && - (format_sortie != 'I') && (format_sortie != 'E')) - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - - nombre_lignes = (*((struct_matrice *) ((*s_objet).objet))) - .nombre_lignes; - nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet))) - .nombre_colonnes; - - chaine = (unsigned char *) malloc(3 * sizeof(unsigned char)); - - if (chaine != NULL) - { - strcpy(chaine, "[["); - - for(i = 0; i < nombre_lignes; i++) - { - for(j = 0; j < nombre_colonnes; j++) - { - if ((chaine_formatee = - formateur_fichier_nombre(s_etat_processus, - (void *) &(((integer8 **) ((*((struct_matrice *) - ((*s_objet).objet))).tableau))[i][j]), 'I', - longueur, longueur_champ, format_sortie)) - == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + - strlen(chaine_formatee) + 2) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " "); - strcat(chaine, chaine_formatee); - free(chaine_formatee); - } - - chaine_sauvegarde = chaine; - if (test_cfsf(s_etat_processus, 45) == d_vrai) - { - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + 6) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " ]\n ["); - } - else - { - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + 4) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " ]["); - } - } - - if (test_cfsf(s_etat_processus, 45) == d_vrai) - { - chaine[strlen(chaine) - 3] = ']'; - chaine[strlen(chaine) - 2] = 0; - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) - + 1) * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - } - else - { - chaine[strlen(chaine) - 2] = ']'; - chaine[strlen(chaine) - 1] = 0; - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) - + 2) * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, "]"); - } - } } else if ((*s_objet).type == MRL) { @@ -5064,139 +3486,6 @@ formateur_fichier(struct_processus *s_et Matrice réelle -------------------------------------------------------------------------------- */ - - if ((format_sortie != 'S') && (format_sortie != 'F') && - (format_sortie != 'I') && (format_sortie != 'E')) - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - - nombre_lignes = (*((struct_matrice *) ((*s_objet).objet))) - .nombre_lignes; - nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet))) - .nombre_colonnes; - - chaine = (unsigned char *) malloc(3 * sizeof(unsigned char)); - - if (chaine != NULL) - { - strcpy(chaine, "[["); - - for(i = 0; i < nombre_lignes; i++) - { - for(j = 0; j < nombre_colonnes; j++) - { - if ((chaine_formatee = - formateur_fichier_nombre(s_etat_processus, - (void *) &(((real8 **) ((*((struct_matrice *) - ((*s_objet).objet))).tableau))[i][j]), 'R', - longueur, longueur_champ, format_sortie)) - == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + - strlen(chaine_formatee) + 2) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " "); - strcat(chaine, chaine_formatee); - free(chaine_formatee); - } - - chaine_sauvegarde = chaine; - if (test_cfsf(s_etat_processus, 45) == d_vrai) - { - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + 6) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " ]\n ["); - } - else - { - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + 4) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " ]["); - } - } - - if (test_cfsf(s_etat_processus, 45) == d_vrai) - { - chaine[strlen(chaine) - 3] = ']'; - chaine[strlen(chaine) - 2] = 0; - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) - + 1) * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - } - else - { - chaine[strlen(chaine) - 2] = ']'; - chaine[strlen(chaine) - 1] = 0; - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) - + 2) * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, "]"); - } - } } else if ((*s_objet).type == NOM) { @@ -5206,17 +3495,6 @@ formateur_fichier(struct_processus *s_et Nom -------------------------------------------------------------------------------- */ - - chaine = (unsigned char *) malloc((strlen((*((struct_nom *) - (*s_objet).objet)).nom) + 3) * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); - } - - sprintf(chaine, "'%s'", (*((struct_nom *) (*s_objet).objet)).nom); } else if ((*s_objet).type == REL) { @@ -5228,7 +3506,7 @@ formateur_fichier(struct_processus *s_et -------------------------------------------------------------------------------- */ - if (format_sortie != 'R') + if ((format_sortie != 'R') && (format_sortie != 'C')) { (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier; @@ -5236,8 +3514,8 @@ formateur_fichier(struct_processus *s_et } if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus, - (*s_objet).objet, 'R', longueur, longueur_effective)) - == NULL) + (*s_objet).objet, 'R', format_sortie, + longueur, longueur_effective)) == NULL) { return(NULL); } @@ -5250,73 +3528,6 @@ formateur_fichier(struct_processus *s_et Vecteur complexe -------------------------------------------------------------------------------- */ - - if ((format_sortie != 'S') && (format_sortie != 'F') && - (format_sortie != 'I') && (format_sortie != 'E')) - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - - nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet))) - .taille; - - chaine = (unsigned char *) malloc(2 * sizeof(unsigned char)); - - if (chaine != NULL) - { - strcpy(chaine, "["); - - for(i = 0; i < nombre_colonnes; i++) - { - if ((chaine_formatee = - formateur_fichier_nombre(s_etat_processus, - (void *) &(((struct_complexe16 *) - ((*((struct_vecteur *) - ((*s_objet).objet))).tableau))[i]), 'C', - longueur, longueur_champ, format_sortie)) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + strlen(chaine_formatee) - + 2) * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " "); - strcat(chaine, chaine_formatee); - free(chaine_formatee); - } - - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + 3) - * sizeof(unsigned char)); - - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " ]"); - } } else if ((*s_objet).type == VIN) { @@ -5326,156 +3537,96 @@ formateur_fichier(struct_processus *s_et Vecteur entier -------------------------------------------------------------------------------- */ + } + else if ((*s_objet).type == VRL) + { - if ((format_sortie != 'S') && (format_sortie != 'F') && - (format_sortie != 'I') && (format_sortie != 'E')) - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } - - nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet))) - .taille; - - chaine = (unsigned char *) malloc(2 * sizeof(unsigned char)); +/* +-------------------------------------------------------------------------------- + Vecteur réel +-------------------------------------------------------------------------------- +*/ + } + else + { + // Type non exportable - if (chaine != NULL) - { - strcpy(chaine, "["); + (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier; + free(chaine); - for(i = 0; i < nombre_colonnes; i++) - { - if ((chaine_formatee = - formateur_fichier_nombre(s_etat_processus, - (void *) &(((integer8 *) ((*((struct_vecteur *) - ((*s_objet).objet))).tableau))[i]), 'I', - longueur, longueur_champ, format_sortie)) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } + return(NULL); + } - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + strlen(chaine_formatee) - + 2) * sizeof(unsigned char)); + // On n'ajoute la longueur de l'enregistrement que dans le cas + // où le format est utilisé dans un fichier. - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } + if (((*recursivite) == 1) && (export_fichier == d_vrai)) + { + // Ajout de la longueur totale en fin d'enregistrement. - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " "); - strcat(chaine, chaine_formatee); - free(chaine_formatee); - } + longueur_totale = (*longueur_effective); - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + 3) - * sizeof(unsigned char)); + if (longueur_totale < (((integer8) 1) << 7)) + { + tampon[0] = ((longueur_totale + 1) << 1) & 0xFF; - if (chaine == NULL) + if ((chaine = realloc(chaine, (longueur_totale + 1) + * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(NULL); } - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " ]"); - } - } - else if ((*s_objet).type == VRL) - { - -/* --------------------------------------------------------------------------------- - Vecteur réel --------------------------------------------------------------------------------- -*/ - - if ((format_sortie != 'S') && (format_sortie != 'F') && - (format_sortie != 'I') && (format_sortie != 'E')) - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); + // XXXX XXX0 + memcpy(&(chaine[longueur_totale]), tampon, 1); + longueur_totale += 1; } - - nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet))) - .taille; - - chaine = (unsigned char *) malloc(2 * sizeof(unsigned char)); - - if (chaine != NULL) + else if (longueur_totale < (((integer8) 1) << 16)) { - strcpy(chaine, "["); + longueur_totale++; - for(i = 0; i < nombre_colonnes; i++) + for(i = 0; i < 7; i++) { - if ((chaine_formatee = - formateur_fichier_nombre(s_etat_processus, - (void *) &(((real8 *) ((*((struct_vecteur *) - ((*s_objet).objet))).tableau))[i]), 'R', - longueur, longueur_champ, format_sortie)) == NULL) + if ((longueur_totale < (((integer8) 1) << (8 * (i + 2)))) + || (i == 6)) { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } + // MSB (4 bits de poids fort) + tampon[0] = ((longueur_totale >> 8) & 0xF0) + | 0x1 /* longueur supérieure à 7 bits */ + | ((i + 1) << 1); - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + strlen(chaine_formatee) - + 2) * sizeof(unsigned char)); + for(j = 0; j <= i; j++) + { + tampon[(i - j) + 1] = (longueur_totale >> (j + 1)) + & 0xFF; + } - if (chaine == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); + // MSB (4 bits de poids faible) + tampon[i + 2] = (((longueur_totale >> 8) & 0x0F) << 4) + | 0x1 /* longueur supérieure à 7 bits */ + | ((i + 1) << 1); + break; } - - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " "); - strcat(chaine, chaine_formatee); - free(chaine_formatee); } - chaine_sauvegarde = chaine; - chaine = (unsigned char *) malloc( - (strlen(chaine_sauvegarde) + 3) - * sizeof(unsigned char)); - - if (chaine == NULL) + if ((chaine = realloc(chaine, (longueur_totale + 3) + * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(NULL); } - strcpy(chaine, chaine_sauvegarde); - free(chaine_sauvegarde); - strcat(chaine, " ]"); + memcpy(&(chaine[longueur_totale]), tampon, 3); + longueur_totale += 3; + } + else if (longueur_totale < (((integer8) 1) << 32)) + { } - } - else - { - // Type non exportable - - (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier; - free(chaine); - return(NULL); + __zone(); + (*longueur_effective) = longueur_totale; } } @@ -5874,16 +4025,21 @@ formateur_fichier_reel(struct_processus unsigned char * formateur_fichier_binaire_nombre(struct_processus *s_etat_processus, - void *valeur_numerique, unsigned char type, long longueur, - long *longueur_conversion) + void *valeur_numerique, unsigned char type_entree, + unsigned char type, long longueur, long *longueur_conversion) { unsigned char *chaine; switch(type) { - default : case 'I' : { + if (type_entree != type) + { + (*s_etat_processus).erreur_execution = d_ex_representation; + return(NULL); + } + switch(longueur) { case 1: @@ -6009,8 +4165,9 @@ formateur_fichier_binaire_nombre(struct_ { case 4: { - double vinf; - double vsup; + real8 valeur; + real8 vinf; + real8 vsup; union { @@ -6018,22 +4175,34 @@ formateur_fichier_binaire_nombre(struct_ integer4 i4; } eq4; - if ((*((real8 *) valeur_numerique)) > 0) + if (type_entree == 'R') { - vinf = nextafter((*((real8 *) valeur_numerique)), 0); - vsup = nextafter((*((real8 *) valeur_numerique)), - (*((real8 *) valeur_numerique)) * 2); + valeur = (*((real8 *) valeur_numerique)); + } + else if (type_entree == 'I') + { + valeur = (*((integer8 *) valeur_numerique)); } else { - vinf = nextafter((*((real8 *) valeur_numerique)), - (*((real8 *) valeur_numerique)) * 2); - vsup = nextafter((*((real8 *) valeur_numerique)), 0); + (*s_etat_processus).erreur_execution = + d_ex_representation; + return(NULL); } - if (!((vinf <= ((real4) (*((real8 *) valeur_numerique)))) && - ((real4) ((*((real8 *) valeur_numerique))) - <= vsup))) + if (valeur > 0) + { + vinf = nextafter(valeur, 0); + vsup = nextafter(valeur, valeur * 2); + } + else + { + vinf = nextafter(valeur, valeur * 2); + vsup = nextafter(valeur, 0); + } + + if (!((vinf <= ((real4) valeur)) && + (((real4) valeur) <= vsup))) { (*s_etat_processus).erreur_execution = d_ex_representation; @@ -6047,9 +4216,9 @@ formateur_fichier_binaire_nombre(struct_ return(NULL); } - eq4.r4 = (real4) (*((real8 *) valeur_numerique)); + eq4.r4 = (real4) valeur; (*longueur_conversion) = 5; - chaine[0] = 0x12; + chaine[0] = 0x14; chaine[1] = (eq4.i4 >> 24) & 0xFF; chaine[2] = (eq4.i4 >> 16) & 0xFF; chaine[3] = (eq4.i4 >> 8) & 0xFF; @@ -6072,10 +4241,23 @@ formateur_fichier_binaire_nombre(struct_ return(NULL); } - eq8.r8 = (*((real8 *) valeur_numerique)); + if (type_entree == 'I') + { + eq8.r8 = (*((integer8 *) valeur_numerique)); + } + else if (type_entree == 'R') + { + eq8.r8 = (*((real8 *) valeur_numerique)); + } + else + { + (*s_etat_processus).erreur_execution = + d_ex_representation; + return(NULL); + } (*longueur_conversion) = 9; - chaine[0] = 0x13; + chaine[0] = 0x15; chaine[1] = (eq8.i8 >> 56) & 0xFF; chaine[2] = (eq8.i8 >> 48) & 0xFF; chaine[3] = (eq8.i8 >> 40) & 0xFF; @@ -6110,20 +4292,74 @@ formateur_fichier_binaire_nombre(struct_ long limag; long lreel; - if ((partie_reelle = formateur_fichier_binaire_nombre( - s_etat_processus, &((*((complex16 *) - valeur_numerique)).partie_reelle), 'R', 4, &lreel)) - == NULL) + real8 zero; + + if (type_entree == 'I') { - return(NULL); + if ((partie_reelle = formateur_fichier_binaire_nombre( + s_etat_processus, &(*((integer8 *) + valeur_numerique)), 'I', 'R', 4, + &lreel)) == NULL) + { + return(NULL); + } + + zero = 0; + + if ((partie_imaginaire = + formateur_fichier_binaire_nombre( + s_etat_processus, &zero, 'R', 'R', 4, + &limag)) == NULL) + { + free(partie_reelle); + return(NULL); + } } + else if (type_entree == 'R') + { + if ((partie_reelle = formateur_fichier_binaire_nombre( + s_etat_processus, &(*((real8 *) + valeur_numerique)), 'R', 'R', 4, + &lreel)) == NULL) + { + return(NULL); + } + + zero = 0; - if ((partie_imaginaire = formateur_fichier_binaire_nombre( - s_etat_processus, &((*((complex16 *) - valeur_numerique)).partie_imaginaire), 'R', 4, - &limag)) == NULL) + if ((partie_imaginaire = + formateur_fichier_binaire_nombre( + s_etat_processus, &zero, 'R', 'R', 4, + &limag)) == NULL) + { + free(partie_reelle); + return(NULL); + } + } + else if (type_entree == 'C') { - free(partie_reelle); + if ((partie_reelle = formateur_fichier_binaire_nombre( + s_etat_processus, &((*((complex16 *) + valeur_numerique)).partie_reelle), 'R', 'R', 4, + &lreel)) == NULL) + { + return(NULL); + } + + if ((partie_imaginaire = + formateur_fichier_binaire_nombre( + s_etat_processus, &((*((complex16 *) + valeur_numerique)).partie_imaginaire), + 'R', 'R', 4, &limag)) == NULL) + { + free(partie_reelle); + return(NULL); + } + } + else + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_format_fichier; return(NULL); } @@ -6155,21 +4391,74 @@ formateur_fichier_binaire_nombre(struct_ long limag; long lreel; + real8 zero; - if ((partie_reelle = formateur_fichier_binaire_nombre( - s_etat_processus, &((*((complex16 *) - valeur_numerique)).partie_reelle), 'R', 8, &lreel)) - == NULL) + if (type_entree == 'I') { - return(NULL); + if ((partie_reelle = formateur_fichier_binaire_nombre( + s_etat_processus, &(*((integer8 *) + valeur_numerique)), 'I', 'R', 8, + &lreel)) == NULL) + { + return(NULL); + } + + zero = 0; + + if ((partie_imaginaire = + formateur_fichier_binaire_nombre( + s_etat_processus, &zero, 'R', 'R', 8, + &limag)) == NULL) + { + free(partie_reelle); + return(NULL); + } } + else if (type_entree == 'R') + { + if ((partie_reelle = formateur_fichier_binaire_nombre( + s_etat_processus, &(*((real8 *) + valeur_numerique)), 'R', 'R', 8, + &lreel)) == NULL) + { + return(NULL); + } + + zero = 0; - if ((partie_imaginaire = formateur_fichier_binaire_nombre( - s_etat_processus, &((*((complex16 *) - valeur_numerique)).partie_imaginaire), 'R', 8, - &limag)) == NULL) + if ((partie_imaginaire = + formateur_fichier_binaire_nombre( + s_etat_processus, &zero, 'R', 'R', 8, + &limag)) == NULL) + { + free(partie_reelle); + return(NULL); + } + } + else if (type_entree == 'C') { - free(partie_reelle); + if ((partie_reelle = formateur_fichier_binaire_nombre( + s_etat_processus, &((*((complex16 *) + valeur_numerique)).partie_reelle), 'R', 'R', 8, + &lreel)) == NULL) + { + return(NULL); + } + + if ((partie_imaginaire = + formateur_fichier_binaire_nombre( + s_etat_processus, &((*((complex16 *) + valeur_numerique)).partie_imaginaire), + 'R', 'R', 8, &limag)) == NULL) + { + free(partie_reelle); + return(NULL); + } + } + else + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_format_fichier; return(NULL); } @@ -6204,9 +4493,486 @@ formateur_fichier_binaire_nombre(struct_ break; } + + default : + { + (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier; + return(NULL); + } } return(chaine); } + +/* +================================================================================ + Routines de conversion d'un objet binaire en struct_objet * +================================================================================ + Entrées : pointeur sur un void *. Si longueur_buffer est strictement inférieur + à zéro, il s'agit d'un file * sinon d'un buffer de type unsigned + char *. +-------------------------------------------------------------------------------- + Sorties : pointeur sur un struct_objet nouvellement alloué +-------------------------------------------------------------------------------- + Effets de bord : néant +================================================================================ +*/ + +struct_objet * +lecture_fichier_non_formate(struct_processus *s_etat_processus, + void *argument, integer8 longueur_buffer, logical1 recursivite) +{ + file *fichier; + + integer8 i; + integer8 longueur; + + struct_liste_chainee *l_element_courant; + + struct_objet *s_objet; + struct_objet *s_objet_elementaire; + + unsigned char octets[8]; + unsigned char *buffer; + unsigned char *ptr; + + size_t deplacement; + + if (longueur_buffer < 0) + { + fichier = argument; + buffer = NULL; + ptr = NULL; + } + else + { + buffer = argument; + ptr = buffer; + fichier = NULL; + } + + + if (longueur_buffer < 0) + { + if (fread(octets, (size_t) sizeof(unsigned char), + 1, fichier) != 1) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(NULL); + } + } + else + { + octets[0] = *ptr++; + } + + switch(octets[0] & 0xF0) + { + case 0x10: // Scalaire + { + switch(octets[0] & 0x0C) + { + case 0x00: // Entier + { + if ((s_objet = allocation(s_etat_processus, INT)) == NULL) + { + return(NULL); + } + + switch(octets[0] & 0x03) + { + case 0x00: // integer*1 + { + deplacement = 1; + break; + } + + case 0x01: // integer*2 + { + deplacement = 2; + break; + } + + case 0x02: // integer*4 + { + deplacement = 4; + break; + } + + case 0x03: // integer*8 + { + deplacement = 8; + break; + } + } + + if (longueur_buffer < 0) + { + if (fread(octets, (size_t) sizeof(unsigned char), + deplacement, fichier) != deplacement) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return(NULL); + } + } + else + { + for(i = 0; i < (signed) deplacement; i++) + { + octets[i] = *ptr++; + } + } + + (*((integer8 *) (*s_objet).objet)) = 0; + + for(i = 0; i < (signed) deplacement; i++) + { + (*((integer8 *) (*s_objet).objet)) |= + octets[i] << (8 * ((deplacement - 1) - i)); + } + + break; + } + + case 0x04: // Réel + { + if ((s_objet = allocation(s_etat_processus, REL)) == NULL) + { + return(NULL); + } + + switch(octets[0] & 0x03) + { + case 0x00: // real*4 + { + deplacement = 4; + break; + } + + case 0x01: // real*8 + { + deplacement = 8; + break; + } + + default: + { + (*s_etat_processus).erreur_execution = + d_ex_syntaxe; + return(NULL); + } + } + + if (longueur_buffer < 0) + { + if (fread(octets, (size_t) sizeof(unsigned char), + deplacement, fichier) != deplacement) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return(NULL); + } + } + else + { + for(i = 0; i < (signed) deplacement; i++) + { + octets[i] = *ptr++; + } + } + + if (deplacement == 4) + { + union + { + real4 r4; + integer4 i4; + } eq4; + + eq4.i4 = 0; + + for(i = 0; i < (signed) deplacement; i++) + { + eq4.i4 |= ((integer4) octets[i]) << + (8 * ((deplacement - 1) - i)); + } + + (*((real8 *) (*s_objet).objet)) = (real8) eq4.r4; + } + else + { + union + { + real8 r8; + integer8 i8; + } eq8; + + eq8.i8 = 0; + + for(i = 0; i < (signed) deplacement; i++) + { + eq8.i8 |= ((integer8) octets[i]) << + (8 * ((deplacement - 1) - i)); + } + + (*((real8 *) (*s_objet).objet)) = (real8) eq8.r8; + } + + break; + } + + case 0x08: // Complexe + { + if ((s_objet = allocation(s_etat_processus, CPL)) == NULL) + { + return(NULL); + } + + break; + } + + default: + { + (*s_etat_processus).erreur_execution = d_ex_syntaxe; + return(NULL); + } + } + + break; + } + + case 0x40: // Liste + { + if ((octets[0] & 0x08) == 0) // Longueur sur 6 bits + { + longueur = (octets[0] & 0x07); + } + else + { + switch(octets[0] & 0x07) + { + case 0x00: // Longueur sur 8 bits + { + if (longueur_buffer < 0) + { + if (fread(octets, (size_t) sizeof(unsigned char), + 1, fichier) != 1) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return(NULL); + } + } + else + { + octets[0] = *ptr++; + } + + longueur = octets[0]; + break; + } + + case 0x01: // Longueur sur 16 bits + { + if (longueur_buffer < 0) + { + if (fread(octets, (size_t) sizeof(unsigned char), + 2, fichier) != 2) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return(NULL); + } + } + else + { + octets[0] = *ptr++; + octets[1] = *ptr++; + } + + longueur = (((integer8) (octets[0])) << 8) + | ((integer8) (octets[1])); + break; + } + + case 0x02: // Longueur sur 32 bits + { + if (longueur_buffer < 0) + { + if (fread(octets, (size_t) sizeof(unsigned char), + 4, fichier) != 4) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return(NULL); + } + } + else + { + octets[0] = *ptr++; + octets[1] = *ptr++; + octets[2] = *ptr++; + octets[3] = *ptr++; + } + + longueur = (((integer8) (octets[0])) << 24) + | (((integer8) (octets[1])) << 16) + | (((integer8) (octets[2])) << 8) + | ((integer8) (octets[3])); + break; + } + + case 0x03: // Longueur sur 64 bits + { + if (longueur_buffer < 0) + { + if (fread(octets, (size_t) sizeof(unsigned char), + 8, fichier) != 8) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return(NULL); + } + } + else + { + octets[0] = *ptr++; + octets[1] = *ptr++; + octets[2] = *ptr++; + octets[3] = *ptr++; + octets[4] = *ptr++; + octets[5] = *ptr++; + octets[6] = *ptr++; + octets[7] = *ptr++; + } + + longueur = (((integer8) (octets[0])) << 56) + | (((integer8) (octets[1])) << 48) + | (((integer8) (octets[2])) << 40) + | (((integer8) (octets[3])) << 32) + | (((integer8) (octets[4])) << 24) + | (((integer8) (octets[5])) << 16) + | (((integer8) (octets[6])) << 8) + | ((integer8) (octets[7])); + break; + } + + default: + { + (*s_etat_processus).erreur_execution = d_ex_syntaxe; + return(NULL); + } + } + } + + if ((s_objet = allocation(s_etat_processus, LST)) == NULL) + { + return(NULL); + } + + l_element_courant = NULL; + + for(i = 0; i < longueur; i++) + { + // Lecture des éléments de la liste. + + if (longueur_buffer < 0) + { + if ((s_objet_elementaire = lecture_fichier_non_formate( + s_etat_processus, fichier, longueur_buffer, d_vrai)) + == NULL) + { + liberation(s_etat_processus, s_objet); + return(NULL); + } + } + else + { + if ((s_objet_elementaire = lecture_fichier_non_formate( + s_etat_processus, &ptr, + longueur_buffer - (ptr - buffer), d_vrai)) == NULL) + { + liberation(s_etat_processus, s_objet); + return(NULL); + } + } + + if (l_element_courant == NULL) + { + if (((*s_objet).objet = allocation_maillon( + s_etat_processus)) == NULL) + { + liberation(s_etat_processus, s_objet_elementaire); + liberation(s_etat_processus, s_objet); + return(NULL); + } + + l_element_courant = (*s_objet).objet; + } + else + { + if (((*l_element_courant).suivant = allocation_maillon( + s_etat_processus)) == NULL) + { + liberation(s_etat_processus, s_objet_elementaire); + liberation(s_etat_processus, s_objet); + return(NULL); + } + + l_element_courant = (*l_element_courant).suivant; + } + + (*l_element_courant).donnee = s_objet_elementaire; + (*l_element_courant).suivant = NULL; + } + + break; + } + + case 0x80: // Chaîne de caractères + { + s_objet = NULL; + break; + } + + default: + { + (*s_etat_processus).erreur_execution = d_ex_syntaxe; + return(NULL); + } + } + + if ((longueur_buffer < 0) && (recursivite == d_faux)) + { + // Lecture depuis un fichier, on saute le champ de queue qui contient + // la longueur de l'enregistrement. + + if (fread(octets, (size_t) sizeof(unsigned char), 1, fichier) != 1) + { + liberation(s_etat_processus, s_objet); + + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(NULL); + } + + if ((octets[0] & 0x01) != 0) + { + deplacement = ((octets[0] & 0x0F) >> 1) + 1; + + if (fread(octets, (size_t) sizeof(unsigned char), deplacement, + fichier) != deplacement) + { + liberation(s_etat_processus, s_objet); + + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(NULL); + } + } + } + + return(s_objet); +} + // vim: ts=4