--- rpl/src/formateur_fichiers.c 2011/09/26 15:57:10 1.33 +++ rpl/src/formateur_fichiers.c 2011/11/15 07:01:37 1.34 @@ -1176,8 +1176,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)); @@ -2711,8 +2711,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 +2731,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 +2821,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. * @@ -3884,33 +3931,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 +4042,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) { @@ -5306,33 +5228,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 +5641,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 -------------------------------------------------------------------------------- */ @@ -5981,5 +5861,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); }