--- rpl/src/interface_cas.cpp 2011/06/24 15:59:07 1.4 +++ rpl/src/interface_cas.cpp 2011/07/25 07:44:59 1.11 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.3 + RPL/2 (R) version 4.1.2 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,14 +20,16 @@ */ -#include "giac.h" +#ifdef RPLCAS +# include "giac.h" -#undef PACKAGE -#undef PACKAGE_NAME -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -#undef PACKAGE_VERSION -#undef VERSION +# undef PACKAGE +# undef PACKAGE_NAME +# undef PACKAGE_STRING +# undef PACKAGE_TARNAME +# undef PACKAGE_VERSION +# undef VERSION +#endif extern "C" { @@ -38,7 +40,10 @@ extern "C" #include using namespace std; -using namespace giac; + +#ifdef RPLCAS + using namespace giac; +#endif static unsigned char * @@ -95,7 +100,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 +158,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 +182,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"); } @@ -208,6 +215,7 @@ void interface_cas(struct_processus *s_etat_processus, enum t_rplcas_commandes commande) { +# ifdef RPLCAS struct_objet *s_objet_argument_1; struct_objet *s_objet_argument_2; @@ -251,31 +259,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); - - free(argument_1); - free(argument_2); + try + { + giac::context contexte; - gen resultat = integrate(expression, variable, giac::context0); - string chaine = "'" + resultat.print() + "'"; + gen variable( + string(reinterpret_cast(argument_1)), + &contexte); + gen expression( + string(reinterpret_cast(argument_2)), + &contexte); + + 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())); - 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; } @@ -287,6 +310,23 @@ interface_cas(struct_processus *s_etat_p } return; + +#else + + if (s_etat_processus->langue == 'F') + { + printf("+++Attention : RPL/CAS non compilé !\n"); + } + else + { + printf("+++Warning : RPL/CAS not available !\n"); + } + + fflush(stdout); + + return; + +#endif } // vim: ts=4