--- rpl/src/interface_cas.cpp 2011/08/03 09:26:47 1.12 +++ rpl/src/interface_cas.cpp 2011/08/06 10:32:12 1.13 @@ -233,15 +233,84 @@ conversion_rpl_vers_cas(struct_processus static void conversion_cas_vers_rpl(struct_processus *s_etat_processus, - struct_objet *s_objet) + unsigned char *expression) { + logical1 drapeau; + struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_precedent; + struct_objet *s_objet; + + unsigned char *registre; + + registre = s_etat_processus->instruction_courante; + s_etat_processus->instruction_courante = expression; + recherche_type(s_etat_processus); + s_etat_processus->instruction_courante = registre; + + if ((s_etat_processus->l_base_pile == NULL) || + (s_etat_processus->erreur_execution != d_ex) || + (s_etat_processus->erreur_systeme != d_es)) + { + return; + } + + // Le niveau 1 de la pile opérationnelle contient l'expression + // à convertir. + + if (depilement(s_etat_processus, &(s_etat_processus + ->l_base_pile), &s_objet) == d_erreur) + { + return; + } + if ((s_objet->type == ALG) || (s_objet->type == RPN)) { // On transcrit les fonctions de GIAC vers le RPL/2. + l_element_courant = reinterpret_cast( + s_objet->objet); + drapeau = d_faux; + + // S'il y a une valeur infini, on force l'évaluation de l'expression. + + while(l_element_courant != NULL) + { + if (l_element_courant->donnee->type == NOM) + { + if (strcmp((const char *) reinterpret_cast( + reinterpret_cast( + l_element_courant->donnee->objet)->nom), + "infinity") == 0) + { + drapeau = d_vrai; + break; + } + } + + l_element_courant = l_element_courant->suivant; + } + + if (drapeau == d_vrai) + { + if (evaluation(s_etat_processus, s_objet, 'N') == d_erreur) + { + return; + } + + liberation(s_etat_processus, s_objet); + + if (depilement(s_etat_processus, &(s_etat_processus + ->l_base_pile), &s_objet) == d_erreur) + { + return; + } + } + } + + if ((s_objet->type == ALG) || (s_objet->type == RPN)) + { l_element_precedent = NULL; l_element_courant = reinterpret_cast( s_objet->objet); @@ -293,6 +362,12 @@ conversion_cas_vers_rpl(struct_processus } } + if (empilement(s_etat_processus, &(s_etat_processus->l_base_pile), + s_objet) == d_erreur) + { + return; + } + return; } @@ -325,7 +400,6 @@ interface_cas(struct_processus *s_etat_p unsigned char *argument_2; unsigned char *argument_3; unsigned char *argument_4; - unsigned char *registre; unsigned int position; @@ -379,20 +453,9 @@ interface_cas(struct_processus *s_etat_p gen resultat = integrate_gen(expression, variable, &contexte); string chaine = "'" + resultat.print() + "'"; - registre = s_etat_processus->instruction_courante; - s_etat_processus->instruction_courante = - reinterpret_cast(const_cast - (chaine.c_str())); - - recherche_type(s_etat_processus); - - if (s_etat_processus->l_base_pile != NULL) - { - conversion_cas_vers_rpl(s_etat_processus, - s_etat_processus->l_base_pile->donnee); - } - - s_etat_processus->instruction_courante = registre; + conversion_cas_vers_rpl(s_etat_processus, + reinterpret_cast(const_cast( + chaine.c_str()))); } catch(bad_alloc exception) { @@ -551,20 +614,9 @@ interface_cas(struct_processus *s_etat_p &contexte); string chaine = "'" + resultat.print() + "'"; - registre = s_etat_processus->instruction_courante; - s_etat_processus->instruction_courante = - reinterpret_cast(const_cast - (chaine.c_str())); - - recherche_type(s_etat_processus); - - if (s_etat_processus->l_base_pile != NULL) - { - conversion_cas_vers_rpl(s_etat_processus, - s_etat_processus->l_base_pile->donnee); - } - - s_etat_processus->instruction_courante = registre; + conversion_cas_vers_rpl(s_etat_processus, + reinterpret_cast(const_cast( + chaine.c_str()))); } catch(bad_alloc exception) {