--- rpl/src/interface_cas.cpp 2011/06/24 20:31:41 1.5 +++ rpl/src/interface_cas.cpp 2011/06/25 10:40:48 1.7 @@ -95,7 +95,8 @@ conversion_rpl_vers_cas(struct_processus { unsigned char *ptr; - ptr = reinterpret_cast(((struct_fonction *) + ptr = reinterpret_cast( + reinterpret_cast( l_element_courant->donnee->objet)->nom_fonction); while((*ptr) != d_code_fin_chaine) @@ -152,9 +153,9 @@ conversion_cas_vers_rpl(struct_processus // qui n'est pas reconnu comme un mot-clef du RPL/2. S'il // s'agit d'un mot-clef de GIAC, on le convertit. - if (strcmp(const_cast(reinterpret_cast( - ((struct_fonction *) l_element_courant->donnee - ->objet)->nom_fonction)), "quote") == 0) + if (strcmp((const char *) + reinterpret_cast(l_element_courant + ->donnee->objet)->nom_fonction, "quote") == 0) { liberation(s_etat_processus, l_element_courant->donnee); @@ -176,7 +177,8 @@ conversion_cas_vers_rpl(struct_processus return; } - strcpy(reinterpret_cast(((struct_fonction *) + strcpy(reinterpret_cast( + reinterpret_cast( l_element_courant->donnee->objet)->nom_fonction), "RELAX"); } @@ -251,31 +253,46 @@ interface_cas(struct_processus *s_etat_p liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); - gen variable(string(reinterpret_cast(argument_1)), - giac::context0); - gen expression(string(reinterpret_cast(argument_2)), - giac::context0); + try + { + giac::context contexte; - free(argument_1); - free(argument_2); + gen variable( + string(reinterpret_cast(argument_1)), + &contexte); + gen expression( + string(reinterpret_cast(argument_2)), + &contexte); - gen resultat = integrate(expression, variable, giac::context0); - string chaine = "'" + resultat.print() + "'"; + gen resultat = integrate(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())); + registre = s_etat_processus->instruction_courante; + s_etat_processus->instruction_courante = + reinterpret_cast(const_cast + (chaine.c_str())); - recherche_type(s_etat_processus); + 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); + } - if (s_etat_processus->l_base_pile != NULL) + s_etat_processus->instruction_courante = registre; + } + catch(bad_alloc exception) + { + s_etat_processus->erreur_systeme = d_es_allocation_memoire; + } + catch(...) { - conversion_cas_vers_rpl(s_etat_processus, - s_etat_processus->l_base_pile->donnee); + s_etat_processus->erreur_execution = d_ex_erreur_interne_rplcas; } - s_etat_processus->instruction_courante = registre; + free(argument_1); + free(argument_2); break; }