--- rpl/src/formateur_fichiers.c 2011/04/11 13:02:15 1.20.2.1 +++ rpl/src/formateur_fichiers.c 2012/07/05 08:05:50 1.44 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.22 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.9 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -75,8 +75,6 @@ formateur_fichier(struct_processus *s_et logical1 autorisation_parenthese; logical1 format_degenere; - logical1 longueur_3bits; - logical1 longueur_6bits; logical1 presence_signe; struct_liste_chainee *l_atome; @@ -97,16 +95,12 @@ formateur_fichier(struct_processus *s_et unsigned char *chaine_tampon; unsigned char *chaine_sauvegarde; unsigned char *format_chaine; - unsigned char longueur_optimale; - unsigned char parametre_longueur; unsigned char *ptre; unsigned char *ptrl; unsigned char tampon[64 + 1]; unsigned long i; unsigned long j; - unsigned long longueur_binaire; - unsigned long longueur_champ_final; unsigned long nombre_arguments; unsigned long nombre_arguments_fonction; unsigned long nombre_colonnes; @@ -114,16 +108,12 @@ formateur_fichier(struct_processus *s_et unsigned long nombre_lignes; integer8 longueur_liste; - integer8 longueur_entete; - integer8 longueur_objet; integer8 longueur_totale; integer8 masque_binaire; integer8 position_1; integer8 position_2; integer8 position_3; - long offset; - (*recursivite)++; if (type == 'F') @@ -138,7 +128,6 @@ formateur_fichier(struct_processus *s_et strcpy(base, " "); - longueur_binaire = 0; masque_binaire = 0; if ((*s_objet).type == ALG) @@ -998,7 +987,6 @@ formateur_fichier(struct_processus *s_et return(NULL); } - longueur_binaire = longueur_entiers_binaires(s_etat_processus); masque_binaire = masque_entiers_binaires(s_etat_processus); if ((test_cfsf(s_etat_processus, 43) == d_faux) && @@ -1176,8 +1164,8 @@ formateur_fichier(struct_processus *s_et return(NULL); } - if ((longueur_champ == -1) || (strlen((unsigned char *) - (*s_objet).objet) < longueur_champ)) + if ((longueur_champ == -1) || (((long) strlen((unsigned char *) + (*s_objet).objet)) < longueur_champ)) { chaine = (unsigned char *) malloc((strlen((unsigned char *) ((*s_objet).objet)) + 1) * sizeof(unsigned char)); @@ -1508,8 +1496,19 @@ formateur_fichier(struct_processus *s_et return(NULL); } - position_3 = strlen(format_chaine); - format_chaine[--position_3] = d_code_fin_chaine; + position_3 = strlen(format_chaine) - 1; + + if (format_chaine[position_3] != ')') + { + free(chaine); + free(format_chaine); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_format_fichier; + return(NULL); + } + + format_chaine[position_3] = d_code_fin_chaine; position_2 = position_1; @@ -1728,7 +1727,7 @@ formateur_fichier(struct_processus *s_et (((*(*((struct_tableau *) (*s_format).objet)) .elements[i]).type == TBL) && ((*(*((struct_tableau *) (*s_objet).objet)).elements[i]) - .type == TAB))) + .type == TBL))) { chaine_sauvegarde = chaine; @@ -2711,8 +2710,9 @@ formateur_fichier(struct_processus *s_et */ #define __zone() \ - do { int _i; for(_i = 0; _i < longueur_totale; _i++) \ - printf("%02X ", chaine[_i]); printf("\b\n"); } while(0) + do { int _i; \ + for(_i = 0; _i < longueur_totale; _i++) \ + printf("%02X ", chaine[_i]); printf("\b\n"); } while(0) /* * Chaque enregistrement est composé d'une donnée (une liste) @@ -2730,9 +2730,16 @@ formateur_fichier(struct_processus *s_et * Longueur : (pour l'instruction backspace) * * 00 XXXXXX longueur sur 6 bits - * 01 ------ longueur sur 16 bits - * 10 ------ longueur sur 32 bits - * 11 ------ longueur sur 64 bits + * 01 XXXXXX longueur sur 16 bits + * 10 XXXXXX longueur sur 32 bits + * 11 XXXXXX 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] * * Structures des enregistrements : * chaque type de donnée est associé à une en-tête binaire comprenant @@ -2813,7 +2820,46 @@ formateur_fichier(struct_processus *s_et * 1001 10 10 table de longueur integer*4 * 1001 10 11 table de longueur integer*8 * + * 1010 00 10 vecteur real*4 (dimensions integer*1) + * 1010 01 10 vecteur real*4 (dimensions integer*2) + * 1010 10 10 vecteur real*4 (dimensions integer*4) + * 1010 11 10 vecteur real*4 (dimensions integer*8) + * 1010 00 11 vecteur real*8 (dimensions integer*1) + * 1010 01 11 vecteur real*8 (dimensions integer*2) + * 1010 10 11 vecteur real*8 (dimensions integer*4) + * 1010 11 11 vecteur real*8 (dimensions integer*8) + * 1011 00 10 vecteur complex*8 (dimensions integer*1) + * 1011 01 10 vecteur complex*8 (dimensions integer*2) + * 1011 10 10 vecteur complex*8 (dimensions integer*4) + * 1011 11 10 vecteur complex*8 (dimensions integer*8) + * 1011 00 11 vecteur complex*16 (dimensions integer*1) + * 1011 01 11 vecteur complex*16 (dimensions integer*2) + * 1011 10 11 vecteur complex*16 (dimensions integer*4) + * 1011 11 11 vecteur complex*16 (dimensions integer*8) + * + * 1100 00 10 matrice real*4 (dimensions integer*1) + * 1100 01 10 matrice real*4 (dimensions integer*2) + * 1100 10 10 matrice real*4 (dimensions integer*4) + * 1100 11 10 matrice real*4 (dimensions integer*8) + * 1100 00 11 matrice real*8 (dimensions integer*1) + * 1100 01 11 matrice real*8 (dimensions integer*2) + * 1100 10 11 matrice real*8 (dimensions integer*4) + * 1100 11 11 matrice real*8 (dimensions integer*8) + * 1101 00 10 matrice complex*8 (dimensions integer*1) + * 1101 01 10 matrice complex*8 (dimensions integer*2) + * 1101 10 10 matrice complex*8 (dimensions integer*4) + * 1101 11 10 matrice complex*8 (dimensions integer*8) + * 1101 00 11 matrice complex*16 (dimensions integer*1) + * 1101 01 11 matrice complex*16 (dimensions integer*2) + * 1101 10 11 matrice complex*16 (dimensions integer*4) + * 1101 11 11 matrice complex*16 (dimensions integer*8) + * * Les longueurs indiquées par le champ LL suivent l'en-tête : + * 00 : integer*1 + * 01 : integer*2 + * 10 : integer*4 + * 11 : integer*8 + * * [En-tête][longueur_1][longueur_2][données] * le nombre de champs longueur dépendant des types d'enregistrement. * @@ -2826,7 +2872,6 @@ formateur_fichier(struct_processus *s_et strcpy(base, " "); - longueur_binaire = 0; masque_binaire = 0; if ((*s_objet).type == ALG) @@ -3686,7 +3731,6 @@ formateur_fichier(struct_processus *s_et return(NULL); } - longueur_binaire = longueur_entiers_binaires(s_etat_processus); masque_binaire = masque_entiers_binaires(s_etat_processus); if ((test_cfsf(s_etat_processus, 43) == d_faux) && @@ -3884,33 +3928,19 @@ formateur_fichier(struct_processus *s_et -------------------------------------------------------------------------------- */ - if ((format_sortie != 'S') && (format_sortie != 'F') && - (format_sortie != 'I') && (format_sortie != 'E')) + if (format_sortie != 'C') { (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier; return(NULL); } - if ((chaine_formatee = formateur_fichier_nombre(s_etat_processus, - (void *) ((struct_complexe16 *) ((*s_objet).objet)), 'C', - longueur, longueur_champ, format_sortie)) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); - } - - chaine = (unsigned char *) malloc((strlen(chaine_formatee) - + 1) * sizeof(unsigned char)); - - if (chaine == NULL) + if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus, + (*s_objet).objet, 'C', longueur, longueur_effective)) + == NULL) { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(NULL); } - - strcpy(chaine, chaine_formatee); - free(chaine_formatee); } else if ((*s_objet).type == RPN) { @@ -4009,123 +4039,12 @@ formateur_fichier(struct_processus *s_et return(NULL); } - switch(longueur) + if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus, + (*s_objet).objet, 'I', longueur, longueur_effective)) + == NULL) { - case 1: - { - if ((*((integer8 *) (*s_objet).objet)) != - ((integer1) (*((integer8 *) (*s_objet).objet)))) - { - (*s_etat_processus).erreur_execution = - d_ex_representation; - return(NULL); - } - - if ((chaine = malloc(2 * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - longueur_totale = 2; - chaine[0] = 0x10; - chaine[1] = (*((integer8 *) (*s_objet).objet)) & 0xFF; - break; - } - - case 2: - { - if ((*((integer8 *) (*s_objet).objet)) != - ((integer2) (*((integer8 *) (*s_objet).objet)))) - { - (*s_etat_processus).erreur_execution = - d_ex_representation; - return(NULL); - } - - if ((chaine = malloc(3 * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - longueur_totale = 3; - chaine[0] = 0x11; - chaine[1] = ((*((integer8 *) (*s_objet).objet)) >> 8) - & 0xFF; - chaine[2] = (*((integer8 *) (*s_objet).objet)) & 0xFF; - break; - } - - case 4: - { - if ((*((integer4 *) (*s_objet).objet)) != - ((integer2) (*((integer8 *) (*s_objet).objet)))) - { - (*s_etat_processus).erreur_execution = - d_ex_representation; - return(NULL); - } - - if ((chaine = malloc(5 * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - longueur_totale = 5; - chaine[0] = 0x12; - chaine[1] = ((*((integer8 *) (*s_objet).objet)) >> 24) - & 0xFF; - chaine[2] = ((*((integer8 *) (*s_objet).objet)) >> 16) - & 0xFF; - chaine[3] = ((*((integer8 *) (*s_objet).objet)) >> 8) - & 0xFF; - chaine[4] = (*((integer8 *) (*s_objet).objet)) & 0xFF; - break; - } - - case 8: - { - if ((chaine = malloc(9 * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(NULL); - } - - longueur_totale = 9; - chaine[0] = 0x13; - chaine[1] = ((*((integer8 *) (*s_objet).objet)) >> 56) - & 0xFF; - chaine[2] = ((*((integer8 *) (*s_objet).objet)) >> 48) - & 0xFF; - chaine[3] = ((*((integer8 *) (*s_objet).objet)) >> 40) - & 0xFF; - chaine[4] = ((*((integer8 *) (*s_objet).objet)) >> 32) - & 0xFF; - chaine[5] = ((*((integer8 *) (*s_objet).objet)) >> 24) - & 0xFF; - chaine[6] = ((*((integer8 *) (*s_objet).objet)) >> 16) - & 0xFF; - chaine[7] = ((*((integer8 *) (*s_objet).objet)) >> 8) - & 0xFF; - chaine[8] = (*((integer8 *) (*s_objet).objet)) & 0xFF; - break; - } - - default : - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return(NULL); - } + return(NULL); } - - (*longueur_effective) = longueur_totale; } else if ((*s_objet).type == FCT) { @@ -4596,7 +4515,7 @@ formateur_fichier(struct_processus *s_et (((*(*((struct_tableau *) (*s_format).objet)) .elements[i]).type == TBL) && ((*(*((struct_tableau *) (*s_objet).objet)).elements[i]) - .type == TAB))) + .type == TBL))) { chaine_sauvegarde = chaine; @@ -5306,33 +5225,19 @@ formateur_fichier(struct_processus *s_et -------------------------------------------------------------------------------- */ - if ((format_sortie != 'S') && (format_sortie != 'F') && - (format_sortie != 'I') && (format_sortie != 'E')) + if (format_sortie != 'R') { (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier; return(NULL); } - if ((chaine_formatee = formateur_fichier_nombre(s_etat_processus, - (void *) ((real8 *) ((*s_objet).objet)), 'R', - longueur, longueur_champ, format_sortie)) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); - } - - chaine = (unsigned char *) malloc((strlen(chaine_formatee) + 1) - * sizeof(unsigned char)); - - if (chaine == NULL) + if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus, + (*s_objet).objet, 'R', longueur, longueur_effective)) + == NULL) { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(NULL); } - - strcpy(chaine, chaine_formatee); - free(chaine_formatee); } else if ((*s_objet).type == VCX) { @@ -5733,34 +5638,6 @@ formateur_fichier_nombre(struct_processu /* -------------------------------------------------------------------------------- - Recherche de la longueur de l'entier minimale pour représenter la donnée --------------------------------------------------------------------------------- -*/ - -unsigned char -recherche_longueur_optimale(integer8 parametre) -{ - if (parametre == (integer8) ((integer1) parametre)) - { - return(0x0); - } - else if (parametre == (integer8) ((integer2) parametre)) - { - return(0x1); - } - else if (parametre == (integer8) ((integer4) parametre)) - { - return(0x2); - } - else - { - return(0x3); - } -} - - -/* --------------------------------------------------------------------------------- Formateur des réels et entiers -------------------------------------------------------------------------------- */ @@ -5983,3 +5860,349 @@ formateur_fichier_reel(struct_processus return(chaine); } + + +/* +-------------------------------------------------------------------------------- + Mêmes fonctions mais pour les fichiers binaires +-------------------------------------------------------------------------------- +*/ + +unsigned char * +formateur_fichier_binaire_nombre(struct_processus *s_etat_processus, + void *valeur_numerique, unsigned char type, long longueur, + long *longueur_conversion) +{ + unsigned char *chaine; + + switch(type) + { + default : + case 'I' : + { + switch(longueur) + { + case 1: + { + if ((*((integer8 *) valeur_numerique)) != + ((integer1) (*((integer8 *) valeur_numerique)))) + { + (*s_etat_processus).erreur_execution = + d_ex_representation; + return(NULL); + } + + if ((chaine = malloc(2 * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } + + (*longueur_conversion) = 2; + chaine[0] = 0x10; + chaine[1] = (*((integer8 *) valeur_numerique)) & 0xFF; + break; + } + + case 2: + { + if ((*((integer8 *) valeur_numerique)) != + ((integer2) (*((integer8 *) valeur_numerique)))) + { + (*s_etat_processus).erreur_execution = + d_ex_representation; + return(NULL); + } + + if ((chaine = malloc(3 * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } + + (*longueur_conversion) = 3; + chaine[0] = 0x11; + chaine[1] = ((*((integer8 *) valeur_numerique)) >> 8) + & 0xFF; + chaine[2] = (*((integer8 *) valeur_numerique)) & 0xFF; + break; + } + + case 4: + { + if ((*((integer8 *) valeur_numerique)) != + ((integer2) (*((integer8 *) valeur_numerique)))) + { + (*s_etat_processus).erreur_execution = + d_ex_representation; + return(NULL); + } + + if ((chaine = malloc(5 * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } + + (*longueur_conversion) = 5; + chaine[0] = 0x12; + chaine[1] = ((*((integer8 *) valeur_numerique)) >> 24) + & 0xFF; + chaine[2] = ((*((integer8 *) valeur_numerique)) >> 16) + & 0xFF; + chaine[3] = ((*((integer8 *) valeur_numerique)) >> 8) + & 0xFF; + chaine[4] = (*((integer8 *) valeur_numerique)) & 0xFF; + break; + } + + case 8: + { + if ((chaine = malloc(9 * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } + + (*longueur_conversion) = 9; + chaine[0] = 0x13; + chaine[1] = ((*((integer8 *) valeur_numerique)) >> 56) + & 0xFF; + chaine[2] = ((*((integer8 *) valeur_numerique)) >> 48) + & 0xFF; + chaine[3] = ((*((integer8 *) valeur_numerique)) >> 40) + & 0xFF; + chaine[4] = ((*((integer8 *) valeur_numerique)) >> 32) + & 0xFF; + chaine[5] = ((*((integer8 *) valeur_numerique)) >> 24) + & 0xFF; + chaine[6] = ((*((integer8 *) valeur_numerique)) >> 16) + & 0xFF; + chaine[7] = ((*((integer8 *) valeur_numerique)) >> 8) + & 0xFF; + chaine[8] = (*((integer8 *) valeur_numerique)) & 0xFF; + break; + } + + default : + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_format_fichier; + return(NULL); + } + } + + break; + } + + case 'R' : + { + switch(longueur) + { + case 4: + { + double vinf; + double vsup; + + union + { + real4 r4; + integer4 i4; + } eq4; + + if ((*((real8 *) valeur_numerique)) > 0) + { + vinf = nextafter((*((real8 *) valeur_numerique)), 0); + vsup = nextafter((*((real8 *) valeur_numerique)), + (*((real8 *) valeur_numerique)) * 2); + } + else + { + vinf = nextafter((*((real8 *) valeur_numerique)), + (*((real8 *) valeur_numerique)) * 2); + vsup = nextafter((*((real8 *) valeur_numerique)), 0); + } + + if (!((vinf <= ((real4) (*((real8 *) valeur_numerique)))) && + ((real4) ((*((real8 *) valeur_numerique))) + <= vsup))) + { + (*s_etat_processus).erreur_execution = + d_ex_representation; + return(NULL); + } + + if ((chaine = malloc(5 * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } + + eq4.r4 = (real4) (*((real8 *) valeur_numerique)); + (*longueur_conversion) = 5; + chaine[0] = 0x12; + chaine[1] = (eq4.i4 >> 24) & 0xFF; + chaine[2] = (eq4.i4 >> 16) & 0xFF; + chaine[3] = (eq4.i4 >> 8) & 0xFF; + chaine[4] = eq4.i4 & 0xFF; + break; + } + + case 8: + { + union + { + real8 r8; + integer8 i8; + } eq8; + + if ((chaine = malloc(9 * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } + + eq8.r8 = (*((real8 *) valeur_numerique)); + + (*longueur_conversion) = 9; + chaine[0] = 0x13; + chaine[1] = (eq8.i8 >> 56) & 0xFF; + chaine[2] = (eq8.i8 >> 48) & 0xFF; + chaine[3] = (eq8.i8 >> 40) & 0xFF; + chaine[4] = (eq8.i8 >> 32) & 0xFF; + chaine[5] = (eq8.i8 >> 24) & 0xFF; + chaine[6] = (eq8.i8 >> 16) & 0xFF; + chaine[7] = (eq8.i8 >> 8) & 0xFF; + chaine[8] = eq8.i8 & 0xFF; + break; + } + + default : + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_format_fichier; + return(NULL); + } + } + + break; + } + + case 'C' : + { + switch(longueur) + { + case 8: + { + unsigned char *partie_reelle; + unsigned char *partie_imaginaire; + + long limag; + long lreel; + + if ((partie_reelle = formateur_fichier_binaire_nombre( + s_etat_processus, &((*((complex16 *) + valeur_numerique)).partie_reelle), 'R', 4, &lreel)) + == NULL) + { + return(NULL); + } + + if ((partie_imaginaire = formateur_fichier_binaire_nombre( + s_etat_processus, &((*((complex16 *) + valeur_numerique)).partie_imaginaire), 'R', 4, + &limag)) == NULL) + { + free(partie_reelle); + return(NULL); + } + + if ((chaine = malloc((lreel + limag - 1) * + sizeof(unsigned char))) == NULL) + { + free(partie_reelle); + free(partie_imaginaire); + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } + + chaine[0] = 0x18; + memcpy(chaine + 1, partie_reelle + 1, lreel - 1); + memcpy(chaine + lreel, partie_imaginaire + 1, limag - 1); + (*longueur_conversion) = lreel + limag - 1; + + free(partie_reelle); + free(partie_imaginaire); + break; + } + + case 16: + { + unsigned char *partie_reelle; + unsigned char *partie_imaginaire; + + long limag; + long lreel; + + if ((partie_reelle = formateur_fichier_binaire_nombre( + s_etat_processus, &((*((complex16 *) + valeur_numerique)).partie_reelle), 'R', 8, &lreel)) + == NULL) + { + return(NULL); + } + + if ((partie_imaginaire = formateur_fichier_binaire_nombre( + s_etat_processus, &((*((complex16 *) + valeur_numerique)).partie_imaginaire), 'R', 8, + &limag)) == NULL) + { + free(partie_reelle); + return(NULL); + } + + if ((chaine = malloc((lreel + limag - 1) * + sizeof(unsigned char))) == NULL) + { + free(partie_reelle); + free(partie_imaginaire); + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(NULL); + } + + chaine[0] = 0x19; + memcpy(chaine + 1, partie_reelle + 1, lreel - 1); + memcpy(chaine + lreel, partie_imaginaire + 1, limag - 1); + (*longueur_conversion) = lreel + limag - 1; + + free(partie_reelle); + free(partie_imaginaire); + break; + } + + default : + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_format_fichier; + return(NULL); + } + } + + break; + } + } + + return(chaine); +} + +// vim: ts=4