--- rpl/src/formateur.c 2010/01/29 16:49:23 1.3 +++ rpl/src/formateur.c 2013/02/27 17:11:40 1.55 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.10 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.13 + Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -47,6 +47,8 @@ formateur(struct_processus *s_etat_proce logical4 autorisation_parenthese; logical4 presence_signe; + long longueur_chaine; + struct_liste_chainee *l_atome; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_liste1; @@ -73,7 +75,6 @@ formateur(struct_processus *s_etat_proce unsigned long i; unsigned long j; unsigned long k; - unsigned long longueur_binaire; unsigned long longueur_courante; unsigned long longueur_decimale_courante; unsigned long *longueurs_maximales; @@ -92,7 +93,6 @@ formateur(struct_processus *s_etat_proce strcpy(base, " "); - longueur_binaire = 0; masque_binaire = 0; if ((*s_objet).type == ADR) @@ -188,7 +188,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; @@ -390,7 +390,7 @@ formateur(struct_processus *s_etat_proce -------------------------------------------------------------------------------- */ - if (alsprintf(&chaine, "Socket %016lX", + if (alsprintf(&chaine, "Socket $ %016lX", (unsigned long) (*((struct_socket *) ((*s_objet).objet))).socket) < 0) { @@ -1578,7 +1578,6 @@ formateur(struct_processus *s_etat_proce -------------------------------------------------------------------------------- */ - 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) && @@ -1750,16 +1749,27 @@ formateur(struct_processus *s_etat_proce -------------------------------------------------------------------------------- */ - chaine = (unsigned char *) malloc((strlen((unsigned char *) - ((*s_objet).objet)) + 1) * sizeof(unsigned char)); - - if (chaine == NULL) + if (((*s_etat_processus).autorisation_conversion_chaine == 'Y') && + (test_cfsf(s_etat_processus, 34) == d_vrai)) { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); + if ((chaine = formateur_flux(s_etat_processus, + (unsigned char *) (*s_objet).objet, &longueur_chaine)) + == NULL) + { + return(NULL); + } } + else + { + 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)); + strcpy(chaine, (unsigned char *) ((*s_objet).objet)); + } } else if ((*s_objet).type == CPL) { @@ -2983,8 +2993,9 @@ formateur(struct_processus *s_etat_proce } else if ((*s_objet).type == MTX) { - if (alsprintf(&chaine, "Mutex $ %016lX", (unsigned long) - &((*((struct_mutex *) (*s_objet).objet)).mutex)) < 0) + if (alsprintf(&chaine, "Mutex $ %016lX owned by $ %016lX", + (unsigned long) &((*((struct_mutex *) (*s_objet).objet)).mutex), + (unsigned long) (*((struct_mutex *) (*s_objet).objet)).tid) < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(NULL); @@ -3435,6 +3446,7 @@ formateur_reel(struct_processus *s_etat_ logical1 i50; long correction; + long dernier_chiffre_significatif; long exposant; long longueur_utile; long longueur_utile_limite; @@ -3459,6 +3471,30 @@ formateur_reel(struct_processus *s_etat_ if (type == 'R') { +# ifdef FP_INFINITE + int signe; + + if ((signe = isinf((*((real8 *) valeur_numerique)))) != 0) + { + if (signe > 0) + { + strcpy(chaine, "infinity"); + } + else + { + strcpy(chaine, "-infinity"); + } + + return(chaine); + } +# endif + + if (isnan((*((real8 *) valeur_numerique)))) + { + strcpy(chaine, "undef"); + return(chaine); + } + tampon_reel = *((real8 *) valeur_numerique); if (tampon_reel > ((real8) 0)) @@ -3567,9 +3603,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) || @@ -3656,8 +3725,15 @@ formateur_reel(struct_processus *s_etat_ if (exposant >= 0) { - sprintf(format, "%%.%luf", (longueur_utile_limite - exposant - - 1)); + if ((exposant + 1) < longueur_utile_limite) + { + sprintf(format, "%%.%luf", (longueur_utile_limite - exposant + - 1)); + } + else + { + strcpy(format, "%.0f."); + } } else { @@ -3682,6 +3758,7 @@ formateur_reel(struct_processus *s_etat_ } } } + strcpy(chaine, tampon); }