--- rpl/src/interface_cas.cpp 2011/08/06 10:32:12 1.13 +++ rpl/src/interface_cas.cpp 2014/05/17 14:06:48 1.41 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.2 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.18 + Copyright (C) 1989-2014 Dr. BERTRAND Joël This file is part of RPL/2. @@ -19,9 +19,22 @@ ================================================================================ */ - #ifdef RPLCAS + +// Giac inclut et définit sem_t. Or l'émulation +// des IPCS POSIX requiert une redéfinition de sem_t. + +# ifdef IPCS_SYSV +// NetBSD : _SEMAPHORE_H_ +# define _SEMAPHORE_H_ +# endif + +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wstrict-aliasing" +# pragma GCC diagnostic ignored "-Wunused-parameter" +# pragma GCC diagnostic ignored "-Wempty-body" # include "giac.h" +# pragma GCC diagnostic pop # undef PACKAGE # undef PACKAGE_NAME @@ -45,7 +58,29 @@ using namespace std; using namespace giac; #endif +void +initialisation_contexte_cas(struct_processus *s_etat_processus) +{ + s_etat_processus->contexte_cas = NULL; + return; +} +void +liberation_contexte_cas(struct_processus *s_etat_processus) +{ + if (s_etat_processus->contexte_cas != NULL) + { +# ifdef RPLCAS + delete reinterpret_cast( + s_etat_processus->contexte_cas); +# endif + s_etat_processus->contexte_cas = NULL; + } + + return; +} + +#ifdef RPLCAS static unsigned char * conversion_rpl_vers_cas(struct_processus *s_etat_processus, struct_objet **s_objet) @@ -53,7 +88,6 @@ conversion_rpl_vers_cas(struct_processus logical1 drapeau; struct_liste_chainee *l_element_courant; - struct_liste_chainee *l_element_precedent; struct_objet *s_objet_temporaire; @@ -184,7 +218,6 @@ conversion_rpl_vers_cas(struct_processus } } - l_element_precedent = l_element_courant; l_element_courant = l_element_courant->suivant; } } @@ -238,7 +271,6 @@ conversion_cas_vers_rpl(struct_processus logical1 drapeau; struct_liste_chainee *l_element_courant; - struct_liste_chainee *l_element_precedent; struct_objet *s_objet; @@ -311,7 +343,6 @@ conversion_cas_vers_rpl(struct_processus if ((s_objet->type == ALG) || (s_objet->type == RPN)) { - l_element_precedent = NULL; l_element_courant = reinterpret_cast( s_objet->objet); @@ -357,7 +388,6 @@ conversion_cas_vers_rpl(struct_processus } } - l_element_precedent = l_element_courant; l_element_courant = l_element_courant->suivant; } } @@ -370,6 +400,7 @@ conversion_cas_vers_rpl(struct_processus return; } +#endif /* @@ -403,6 +434,35 @@ interface_cas(struct_processus *s_etat_p unsigned int position; + giac::context *contexte; + + if (s_etat_processus->contexte_cas == NULL) + { + try + { + s_etat_processus->contexte_cas = new giac::context; + } + catch(bad_alloc exception) + { + s_etat_processus->erreur_systeme = d_es_allocation_memoire; + return; + } + catch(...) + { + s_etat_processus->erreur_execution = d_ex_erreur_interne_rplcas; + return; + } + } + + contexte = reinterpret_cast( + s_etat_processus->contexte_cas); + + if ((s_etat_processus->erreur_execution != d_ex) || + (s_etat_processus->erreur_systeme != d_es)) + { + return; + } + switch(commande) { case RPLCAS_INTEGRATION: @@ -441,16 +501,15 @@ interface_cas(struct_processus *s_etat_p try { - giac::context contexte; - gen variable( string(reinterpret_cast(argument_1)), - &contexte); + contexte); gen expression( string(reinterpret_cast(argument_2)), - &contexte); + contexte); - gen resultat = integrate_gen(expression, variable, &contexte); + gen resultat = integrate_gen(expression, variable, + contexte); string chaine = "'" + resultat.print() + "'"; conversion_cas_vers_rpl(s_etat_processus, @@ -514,6 +573,8 @@ interface_cas(struct_processus *s_etat_p l_element_courant = reinterpret_cast (s_objet_argument_1->objet); position = 1; + argument_1 = NULL; + argument_3 = NULL; argument_4 = NULL; while(l_element_courant != NULL) @@ -588,8 +649,6 @@ interface_cas(struct_processus *s_etat_p try { - giac::context contexte; - int direction; if (argument_4 == NULL) @@ -604,14 +663,14 @@ interface_cas(struct_processus *s_etat_p gen expression( string(reinterpret_cast(argument_2)), - &contexte); + contexte); identificateur variable( string(reinterpret_cast(argument_1))); gen valeur(string(reinterpret_cast - (argument_3)), &contexte); + (argument_3)), contexte); gen resultat = limit(expression, variable, valeur, direction, - &contexte); + contexte); string chaine = "'" + resultat.print() + "'"; conversion_cas_vers_rpl(s_etat_processus, @@ -641,7 +700,6 @@ interface_cas(struct_processus *s_etat_p } return; - #else if (s_etat_processus->langue == 'F')