--- rpl/src/formateur.c 2010/01/29 16:49:23 1.3 +++ rpl/src/formateur.c 2011/03/12 15:32:02 1.22 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.10 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.0.21 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -67,6 +67,8 @@ formateur(struct_processus *s_etat_proce unsigned char *format_majuscule; unsigned char *ptre; unsigned char *ptrl; + unsigned char *ptr_ecriture; + unsigned char *ptr_lecture; unsigned char *registre; unsigned char tampon[1024 + 1]; @@ -188,7 +190,7 @@ formateur(struct_processus *s_etat_proce # ifdef POSTGRESQL_SUPPORT if (alsprintf(&chaine, "Sql $ %016lX (%s)", (long unsigned int) (*((struct_connecteur_sql *) - (*s_objet).objet)).descripteur.mysql, + (*s_objet).objet)).descripteur.postgresql, (*((struct_connecteur_sql *) (*s_objet).objet)).type) < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -1750,16 +1752,206 @@ formateur(struct_processus *s_etat_proce -------------------------------------------------------------------------------- */ - chaine = (unsigned char *) malloc((strlen((unsigned char *) - ((*s_objet).objet)) + 1) * sizeof(unsigned char)); - - if (chaine == NULL) + if ((chaine = malloc((strlen((unsigned char *) + ((*s_objet).objet)) + 1) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(NULL); } - strcpy(chaine, (unsigned char *) ((*s_objet).objet)); + if ((*s_etat_processus).autorisation_conversion_chaine == 'Y') + { + ptr_lecture = (unsigned char *) (*s_objet).objet; + ptr_ecriture = chaine; + + while((*ptr_lecture) != d_code_fin_chaine) + { + (*ptr_ecriture) = (*ptr_lecture); + + // Début de la séquence d'échappement + + if ((*ptr_lecture) == '\\') + { + if ((*(ptr_lecture + 1)) == '"') + { + ptr_lecture++; + (*ptr_ecriture) = '\"'; + } + else if ((*(ptr_lecture + 1)) == 'b') + { + ptr_lecture++; + (*ptr_ecriture) = '\b'; + } + else if ((*(ptr_lecture + 1)) == 'n') + { + ptr_lecture++; + (*ptr_ecriture) = '\n'; + } + else if ((*(ptr_lecture + 1)) == 't') + { + ptr_lecture++; + (*ptr_ecriture) = '\t'; + } + else if ((*(ptr_lecture + 1)) == 'x') + { + ptr_lecture += 2; + + if ((*ptr_lecture) != d_code_fin_chaine) + { + if ((*(ptr_lecture + 1)) != d_code_fin_chaine) + { + logical1 erreur; + unsigned char ec; + + erreur = d_faux; + + switch(*ptr_lecture) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + ec = (*ptr_lecture) - '0'; + break; + + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + ec = ((*ptr_lecture) - 'A') + 10; + break; + + default: + ec = 0; + erreur = d_vrai; + break; + } + + ec *= 0x10; + ptr_lecture++; + + switch(*ptr_lecture) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + ec += (*ptr_lecture) - '0'; + break; + + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + ec += ((*ptr_lecture) - 'A') + 10; + break; + + default: + erreur = d_vrai; + break; + } + + (*ptr_ecriture) = ec; + + if (erreur == d_vrai) + { + if ((*s_etat_processus).langue == 'F') + { + printf("+++Information : " + "Séquence d'échappement " + "inconnue [%d]\n", + (int) getpid()); + } + else + { + printf("+++Warning : Unknown " + "escape code " + "[%d]\n", (int) getpid()); + } + } + } + else + { + if ((*s_etat_processus).langue == 'F') + { + printf("+++Information : " + "Séquence d'échappement " + "inconnue [%d]\n", (int) getpid()); + } + else + { + printf("+++Warning : Unknown escape code " + "[%d]\n", (int) getpid()); + } + } + } + else + { + if ((*s_etat_processus).langue == 'F') + { + printf("+++Information : " + "Séquence d'échappement " + "inconnue [%d]\n", (int) getpid()); + } + else + { + printf("+++Warning : Unknown escape code " + "[%d]\n", (int) getpid()); + } + } + } + else if ((*(ptr_lecture + 1)) == '\\') + { + ptr_lecture++; + } + else + { + if ((*s_etat_processus).langue == 'F') + { + printf("+++Information : Séquence d'échappement " + "inconnue [%d]\n", (int) getpid()); + } + else + { + printf("+++Warning : Unknown escape code " + "[%d]\n", (int) getpid()); + } + } + } + + ptr_ecriture++; + ptr_lecture++; + } + + (*ptr_ecriture) = d_code_fin_chaine; + + if ((chaine = realloc(chaine, ((ptr_ecriture - chaine) + 1) * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(NULL); + } + } + else + { + strcpy(chaine, (unsigned char *) ((*s_objet).objet)); + } } else if ((*s_objet).type == CPL) { @@ -3435,6 +3627,7 @@ formateur_reel(struct_processus *s_etat_ logical1 i50; long correction; + long dernier_chiffre_significatif; long exposant; long longueur_utile; long longueur_utile_limite; @@ -3567,9 +3760,42 @@ formateur_reel(struct_processus *s_etat_ } } + // Test portant sur le nombre de chiffres significatifs dans + // le cas du format STD pour que 1.2E-15 apparaisse en notation + // SCI car il y a une perte de précision dans l'affichage. + + if ((strcmp(mode, "STD") == 0) && (type == 'R')) + { + if (abs(*((real8 *) valeur_numerique)) < 1) + { + dernier_chiffre_significatif = -exposant; + sprintf(tampon, ".%f", mantisse); + + ptr = &(tampon[strlen(tampon) - 1]); + + while((*ptr) != '.') + { + if ((*ptr) != '0') + { + dernier_chiffre_significatif++; + } + + ptr--; + } + } + else + { + dernier_chiffre_significatif = 0; + } + } + else + { + dernier_chiffre_significatif = 0; + } + if ((strcmp(mode, "SCI") == 0) || ((strcmp(mode, "STD") == 0) && ((exposant > - longueur_utile_limite) || + longueur_utile_limite) || (dernier_chiffre_significatif > 15) || (exposant < -longueur_utile_limite))) || ((strcmp(mode, "FIX") == 0) && ((exposant >= longueur_utile_limite) || @@ -3682,6 +3908,7 @@ formateur_reel(struct_processus *s_etat_ } } } + strcpy(chaine, tampon); }