Diff for /rpl/src/evaluation.c between versions 1.75 and 1.97

version 1.75, 2013/03/20 17:11:43 version 1.97, 2015/12/13 22:55:00
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.13    RPL/2 (R) version 4.1.24
   Copyright (C) 1989-2013 Dr. BERTRAND Joël    Copyright (C) 1989-2015 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 91  evaluation(struct_processus *s_etat_proc Line 91  evaluation(struct_processus *s_etat_proc
     unsigned char                   registre_evaluation_forcee;      unsigned char                   registre_evaluation_forcee;
     unsigned char                   registre_instruction_valide;      unsigned char                   registre_instruction_valide;
     unsigned char                   registre_mode_execution_programme;      unsigned char                   registre_mode_execution_programme;
     unsigned char                   registre_retour_definition;  
     unsigned char                   registre_test;      unsigned char                   registre_test;
     unsigned char                   registre_test_2;      unsigned char                   registre_test_2;
     unsigned char                   registre_type_evaluation;      unsigned char                   registre_type_evaluation;
Line 411  evaluation(struct_processus *s_etat_proc Line 410  evaluation(struct_processus *s_etat_proc
                         .niveau_courant = (*s_etat_processus)                          .niveau_courant = (*s_etat_processus)
                         .niveau_courant;                          .niveau_courant;
   
                 // ICI  
                 //empilement_pile_systeme(s_etat_processus);  
   
                 if (presence_variable_partagee == d_faux)                  if (presence_variable_partagee == d_faux)
                 {                  {
                     if (evaluation(s_etat_processus, (*(*s_etat_processus)                      if (evaluation(s_etat_processus, (*(*s_etat_processus)
Line 717  evaluation(struct_processus *s_etat_proc Line 713  evaluation(struct_processus *s_etat_proc
          * Exécution de la séquence d'instructions           * Exécution de la séquence d'instructions
          */           */
   
         registre_retour_definition = (*(*s_etat_processus).l_base_pile_systeme)  
                 .retour_definition;  
         (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'N';  
   
         l_element_courant = (struct_liste_chainee *) (*s_objet).objet;          l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
         autorisation_empilement_programme = (*s_etat_processus)          autorisation_empilement_programme = (*s_etat_processus)
                 .autorisation_empilement_programme;                  .autorisation_empilement_programme;
Line 766  evaluation(struct_processus *s_etat_proc Line 758  evaluation(struct_processus *s_etat_proc
                                 (*s_etat_processus)                                  (*s_etat_processus)
                                 .evaluation_expression_compilee;                                  .evaluation_expression_compilee;
   
                         if (((*(*s_etat_processus).pointeur_variable_courante)                          (*s_etat_processus).evaluation_expression_compilee
                                 .origine == 'E') && ((*(*s_etat_processus)                                  = 'Y';
                                 .pointeur_variable_courante).niveau == 0))  
                         {  
                             (*s_etat_processus).evaluation_expression_compilee  
                                     = 'Y';  
                         }  
                         else  
                         {  
                             (*s_etat_processus).evaluation_expression_compilee  
                                     = 'N';  
                         }  
   
                         analyse(s_etat_processus, (*((struct_fonction *)                          analyse(s_etat_processus, (*((struct_fonction *)
                                 (*(*l_element_courant).donnee).objet))                                  (*(*l_element_courant).donnee).objet))
Line 3100  evaluation(struct_processus *s_etat_proc Line 3082  evaluation(struct_processus *s_etat_proc
                                     instruction_courante;                                      instruction_courante;
                             return(d_erreur);                              return(d_erreur);
                         }                          }
   
                           // Si l'objet élémentaire est un nom et que ce nom n'est
                           // pas un nom symbolique, il convient de l'évaluer.
   
                           if ((*s_objet_elementaire).type == NOM)
                           {
                               if (((*((struct_nom *) (*s_objet_elementaire)
                                       .objet)).symbole == d_faux) ||
                                       (type_evaluation == 'N'))
                               {
                                   if (evaluation(s_etat_processus,
                                           s_objet_elementaire, 'E') == d_erreur)
                                   {
                                       if (presence_variable_partagee == d_vrai)
                                       {
                                           (*(*s_etat_processus)
                                                   .pointeur_variable_courante)
                                                   .objet = NULL;
   
                                           if (pthread_mutex_unlock(
                                               &((*(*s_etat_processus)
                                               .pointeur_variable_partagee_courante
                                               ).mutex)) != 0)
                                           {
                                               (*s_etat_processus).erreur_systeme =
                                                       d_es_processus;
                                           }
                                       }
   
                                       if (presence_egalite == d_vrai)
                                       {
                                           liberation(s_etat_processus,
                                                   s_objet_evalue);
                                       }
   
                                       (*s_etat_processus).erreur_systeme =
                                               d_es_allocation_memoire;
                                       (*s_etat_processus).instruction_courante =
                                               instruction_courante;
                                       return(d_erreur);
                                   }
   
                                   liberation(s_etat_processus,
                                           s_objet_elementaire);
   
   
                                   if (depilement(s_etat_processus,
                                           &((*s_etat_processus).l_base_pile),
                                           &s_objet_elementaire) == d_erreur)
                                   {
                                       if (presence_variable_partagee == d_vrai)
                                       {
                                           (*(*s_etat_processus)
                                                   .pointeur_variable_courante)
                                                   .objet = NULL;
   
                                           if (pthread_mutex_unlock(
                                               &((*(*s_etat_processus)
                                               .pointeur_variable_partagee_courante
                                               ).mutex)) != 0)
                                           {
                                               (*s_etat_processus).erreur_systeme =
                                                       d_es_processus;
                                           }
                                       }
   
                                       if (presence_egalite == d_vrai)
                                       {
                                           liberation(s_etat_processus,
                                                   s_objet_evalue);
                                       }
   
                                       (*s_etat_processus).erreur_systeme =
                                               d_es_allocation_memoire;
                                       (*s_etat_processus).instruction_courante =
                                               instruction_courante;
                                       return(d_erreur);
                                   }
                               }
                           }
                     }                      }
   
                     /*                      /*
Line 3257  evaluation(struct_processus *s_etat_proc Line 3319  evaluation(struct_processus *s_etat_proc
                                     instruction_courante;                                      instruction_courante;
                             return(d_erreur);                              return(d_erreur);
                         }                          }
   
                           // Si l'objet élémentaire est un nom et que ce nom n'est
                           // pas un nom symbolique, il convient de l'évaluer.
   
                           if ((*s_objet_elementaire).type == NOM)
                           {
                               if (((*((struct_nom *) (*s_objet_elementaire)
                                       .objet)).symbole == d_faux) ||
                                       (type_evaluation == 'N'))
                               {
                                   if (evaluation(s_etat_processus,
                                           s_objet_elementaire, 'E') == d_erreur)
                                   {
                                       if (presence_variable_partagee == d_vrai)
                                       {
                                           (*(*s_etat_processus)
                                                   .pointeur_variable_courante)
                                                   .objet = NULL;
   
                                           if (pthread_mutex_unlock(
                                               &((*(*s_etat_processus)
                                               .pointeur_variable_partagee_courante
                                               ).mutex)) != 0)
                                           {
                                               (*s_etat_processus).erreur_systeme =
                                                       d_es_processus;
                                           }
                                       }
   
                                       if (presence_egalite == d_vrai)
                                       {
                                           liberation(s_etat_processus,
                                                   s_objet_evalue);
                                       }
   
                                       (*s_etat_processus).erreur_systeme =
                                               d_es_allocation_memoire;
                                       (*s_etat_processus).instruction_courante =
                                               instruction_courante;
                                       return(d_erreur);
                                   }
   
                                   liberation(s_etat_processus,
                                           s_objet_elementaire);
   
   
                                   if (depilement(s_etat_processus,
                                           &((*s_etat_processus).l_base_pile),
                                           &s_objet_elementaire) == d_erreur)
                                   {
                                       if (presence_variable_partagee == d_vrai)
                                       {
                                           (*(*s_etat_processus)
                                                   .pointeur_variable_courante)
                                                   .objet = NULL;
   
                                           if (pthread_mutex_unlock(
                                               &((*(*s_etat_processus)
                                               .pointeur_variable_partagee_courante
                                               ).mutex)) != 0)
                                           {
                                               (*s_etat_processus).erreur_systeme =
                                                       d_es_processus;
                                           }
                                       }
   
                                       if (presence_egalite == d_vrai)
                                       {
                                           liberation(s_etat_processus,
                                                   s_objet_evalue);
                                       }
   
                                       (*s_etat_processus).erreur_systeme =
                                               d_es_allocation_memoire;
                                       (*s_etat_processus).instruction_courante =
                                               instruction_courante;
                                       return(d_erreur);
                                   }
                               }
                           }
                     }                      }
                     else if (((*((*(*s_etat_processus)                      else if (((*((*(*s_etat_processus)
                             .pointeur_variable_courante).objet)).type == ALG) ||                              .pointeur_variable_courante).objet)).type == ALG) ||
Line 3674  evaluation(struct_processus *s_etat_proc Line 3816  evaluation(struct_processus *s_etat_proc
                                 .evaluation_expression_compilee;                                  .evaluation_expression_compilee;
   
                         (*s_etat_processus).evaluation_expression_compilee                          (*s_etat_processus).evaluation_expression_compilee
                                 = 'N';                                  = 'Y';
   
                         if (evaluation(s_etat_processus, (*l_element_courant)                          if (evaluation(s_etat_processus, (*l_element_courant)
                                 .donnee, type_evaluation) == d_erreur)                                  .donnee, type_evaluation) == d_erreur)
Line 6729  evaluation(struct_processus *s_etat_proc Line 6871  evaluation(struct_processus *s_etat_proc
                                 }                                  }
   
                                 depilement_pile_systeme(s_etat_processus);                                  depilement_pile_systeme(s_etat_processus);
   
                                   if ((((*s_etat_processus).erreur_execution !=
                                           d_ex) || ((*s_etat_processus)
                                           .erreur_systeme != d_es)) &&
                                           ((*s_etat_processus).arret_si_exception
                                           == d_faux))
                                   {
                                       // Reprise sur erreur.
   
   //==============================================================================
   //  Réindentation
   //==============================================================================
   
               drapeau_then = d_faux;
   
               while(drapeau_then == d_faux)
               {
                   l_registre_atome = l_element_courant;
                   l_element_courant = (*l_element_courant).suivant;
   
                   if (l_element_courant == NULL)
                   {
                       /*
                        * La fin de l'expression est atteinte,
                        * le sequenceur reprend la main.
                        */
   
                       if (presence_egalite == d_vrai)
                       {
                           liberation(s_etat_processus, s_objet_evalue);
                       }
   
                       (*s_etat_processus).mode_execution_programme =
                               registre_mode_execution_programme;
                       return(d_absence_erreur);
                   }
   
                   if ((*(*l_element_courant).donnee).type == FCT)
                   {
                       (*s_etat_processus).instruction_courante =
                               (*((struct_fonction *)
                               (*(*l_element_courant).donnee)
                               .objet)).nom_fonction;
   
                       if (recherche_variable(s_etat_processus,
                               (*s_etat_processus).instruction_courante) == d_faux)
                       {
                           (*s_etat_processus).erreur_systeme = d_es;
                           fonction = (*((struct_fonction *)
                                   (*(*l_element_courant).donnee)
                                   .objet)).fonction;
   
                           /*
                            * Traitement de la pile système par les
                            * différentes instructions.
                            */
   
                           if (TEST(instruction_if) ||
                                   TEST(instruction_iferr) ||
                                   TEST(instruction_do) ||
                                   TEST(instruction_while) ||
                                   TEST(instruction_for) ||
                                   TEST(instruction_forall) ||
                                   TEST(instruction_start) ||
                                   TEST(instruction_select) ||
                                   TEST(instruction_case) ||
                                   TEST(instruction_critical) ||
                                   TEST(vers_niveau_superieur))
                           {
                               if (TEST(vers_niveau_superieur))
                               {
                                   registre_exception = (*s_etat_processus)
                                       .exception;
                                   registre_erreur_execution = (*s_etat_processus)
                                       .erreur_execution;
   
                                   analyse(s_etat_processus,
                                           vers_niveau_superieur);
   
                                   if ((*s_etat_processus).erreur_systeme != d_es)
                                   {
                                       if (presence_egalite == d_vrai)
                                       {
                                           liberation(s_etat_processus,
                                                   s_objet_evalue);
                                       }
   
                                       (*s_etat_processus).instruction_courante =
                                               instruction_courante;
                                       return(d_erreur);
                                   }
   
                                   (*s_etat_processus).exception
                                           = registre_exception;
                                   (*s_etat_processus).erreur_execution =
                                       registre_erreur_execution;
                               }
                               else if (TEST(instruction_for) ||
                                       TEST(instruction_forall) ||
                                       TEST(instruction_start))
                               {
                                   empilement_pile_systeme(s_etat_processus);
   
                                   if ((*s_etat_processus).erreur_systeme != d_es)
                                   {
                                       if (presence_egalite == d_vrai)
                                       {
                                           liberation(s_etat_processus,
                                                   s_objet_evalue);
                                       }
   
                                       (*s_etat_processus).instruction_courante =
                                               instruction_courante;
                                       return(d_erreur);
                                   }
   
                                   (*(*s_etat_processus).l_base_pile_systeme)
                                           .type_cloture = 'L';
                               }
                               else
                               {
                                   empilement_pile_systeme(s_etat_processus);
   
                                   if ((*s_etat_processus).erreur_systeme != d_es)
                                   {
                                       if (presence_egalite == d_vrai)
                                       {
                                           liberation(s_etat_processus,
                                                   s_objet_evalue);
                                       }
   
                                       (*s_etat_processus).instruction_courante =
                                               instruction_courante;
                                       return(d_erreur);
                                   }
                               }
                           }
                           else if (TEST(instruction_end) ||
                                   TEST(instruction_next) ||
                                   TEST(instruction_step) ||
                                   TEST(vers_niveau_inferieur))
                           {
                               if (TEST(vers_niveau_inferieur))
                               {
                                   registre_exception = (*s_etat_processus)
                                           .exception;
                                   registre_erreur_execution = (*s_etat_processus)
                                           .erreur_execution;
   
                                   analyse(s_etat_processus,
                                           vers_niveau_inferieur);
   
                                   if ((*s_etat_processus).erreur_systeme != d_es)
                                   {
                                       if (presence_egalite == d_vrai)
                                       {
                                           liberation(s_etat_processus,
                                               s_objet_evalue);
                                       }
   
                                       (*s_etat_processus).instruction_courante =
                                               instruction_courante;
                                       return(d_erreur);
                                   }
   
                                   (*s_etat_processus).exception
                                           = registre_exception;
                                   (*s_etat_processus).erreur_execution =
                                           registre_erreur_execution;
                               }
                               else if ((TEST(instruction_next) ||
                                       TEST(instruction_step)) &&
                                       ((*(*s_etat_processus)
                                       .l_base_pile_systeme)
                                       .type_cloture != 'L'))
                               {
                                   /*
                                    * Libération des compteurs
                                    * de boucle
                                    */
   
                                   presence_compteur = (((*(*s_etat_processus)
                                       .l_base_pile_systeme).type_cloture == 'F')
                                       || ((*(*s_etat_processus)
                                       .l_base_pile_systeme).type_cloture == 'A'))
                                       ? d_vrai : d_faux;
   
                                   if (((*(*s_etat_processus).l_base_pile_systeme)
                                       .type_cloture != 'S') && (presence_compteur
                                       == d_faux))
                                   {
                                       (*s_etat_processus).erreur_execution =
                                               d_ex_erreur_traitement_boucle;
   
                                       if (presence_egalite == d_vrai)
                                       {
                                           liberation(s_etat_processus,
                                               s_objet_evalue);
                                       }
   
                                       (*s_etat_processus).instruction_courante =
                                               instruction_courante;
                                       return(d_erreur);
                                   }
   
                                   if (presence_compteur == d_vrai)
                                   {
                                       if (recherche_variable(s_etat_processus,
                                               (*(*s_etat_processus)
                                               .l_base_pile_systeme).nom_variable)
                                               == d_faux)
                                       {
                                           (*s_etat_processus).erreur_systeme =
                                                   d_es;
                                           (*s_etat_processus).erreur_execution =
                                                   d_ex_erreur_traitement_boucle;
   
                                           if (presence_egalite == d_vrai)
                                           {
                                               liberation(s_etat_processus,
                                                       s_objet_evalue);
                                           }
   
                                           (*s_etat_processus).instruction_courante
                                                   = instruction_courante;
                                           return(d_erreur);
                                       }
   
                                       if ((*(*s_etat_processus)
                                               .pointeur_variable_courante)
                                               .objet == NULL)
                                       {
                                           (*s_etat_processus).erreur_systeme =
                                                   d_es;
                                           (*s_etat_processus).erreur_execution =
                                                   d_ex_variable_partagee;
   
                                           if (presence_egalite == d_vrai)
                                           {
                                               liberation(s_etat_processus,
                                                       s_objet_evalue);
                                           }
   
                                           (*s_etat_processus).instruction_courante
                                                   = instruction_courante;
                                           return(d_erreur);
                                       }
   
                                       (*s_etat_processus)
                                               .niveau_courant--;
   
                                       if (retrait_variables_par_niveau(
                                               s_etat_processus) == d_erreur)
                                       {
                                           if (presence_egalite == d_vrai)
                                           {
                                               liberation(s_etat_processus,
                                                       s_objet_evalue);
                                           }
   
                                           (*s_etat_processus).instruction_courante                                                = instruction_courante;
                                           return(d_erreur);
                                       }
                                   }
   
                                   depilement_pile_systeme(s_etat_processus);
                               }
                               else
                               {
                                   // Traitement spécifique pour
                                   // la fin d'une section
                                   // critique
   
                                   if ((*s_etat_processus).l_base_pile_systeme
                                           == NULL)
                                   {
                                       (*s_etat_processus).erreur_systeme =
                                               d_es_end_incoherent;
   
                                       if (presence_egalite == d_vrai)
                                       {
                                           liberation(s_etat_processus,
                                                   s_objet_evalue);
                                       }
   
                                       (*s_etat_processus).instruction_courante =
                                               instruction_courante;
                                       return(d_erreur);
                                   }
   
                                   if ((*(*s_etat_processus).l_base_pile_systeme)
                                           .type_cloture == 'Q')
                                   {
                                       if (pthread_mutex_unlock(
                                               &mutex_sections_critiques) != 0)
                                       {
                                           (*s_etat_processus).erreur_systeme =
                                                   d_es_processus;
   
                                           liberation(s_etat_processus,
                                                   s_objet_evalue);
   
                                           (*s_etat_processus).instruction_courante                                                = instruction_courante;
                                           return(d_erreur);
                                       }
   
                                       (*s_etat_processus).sections_critiques--;
                                   }
   
                                   depilement_pile_systeme(s_etat_processus);
   
                                   if ((*s_etat_processus)
                                           .erreur_systeme != d_es)
                                   {
                                       if (presence_egalite == d_vrai)
                                       {
                                           liberation(s_etat_processus,
                                                   s_objet_evalue);
                                       }
   
                                       (*s_etat_processus).instruction_courante =
                                               instruction_courante;
                                       return(d_erreur);
                                   }
                               }
                           }
                           else if (TEST(instruction_then))
                           {
                               if ((*(*s_etat_processus).l_base_pile_systeme)
                                       .clause == 'R')
                               {
                                   (*(*s_etat_processus).l_base_pile_systeme)
                                           .clause = 'X';
                                   instruction_then(s_etat_processus);
                                   drapeau_then = d_vrai;
                               }
                           }
                       }
                   }
               }
   
               (*s_etat_processus).expression_courante =
                       l_element_courant;
               (*s_etat_processus).instruction_courante =
                       instruction_courante;
   
               (*s_etat_processus).exception = d_ep;
               (*s_etat_processus).erreur_execution = d_ex;
   
   //==============================================================================
   //  Fin de la réindentation
   //==============================================================================
                                   }
                             }                              }
                             else                              else
                             {                              {
Line 7169  evaluation(struct_processus *s_etat_proc Line 7664  evaluation(struct_processus *s_etat_proc
                 (*s_etat_processus).autorisation_empilement_programme =                  (*s_etat_processus).autorisation_empilement_programme =
                         autorisation_empilement_programme;                          autorisation_empilement_programme;
                 (*s_etat_processus).instruction_courante = instruction_courante;                  (*s_etat_processus).instruction_courante = instruction_courante;
                 (*(*s_etat_processus).l_base_pile_systeme).retour_definition =  
                         registre_retour_definition;  
   
                 return(d_erreur);                  return(d_erreur);
             }              }
   
Line 7184  evaluation(struct_processus *s_etat_proc Line 7676  evaluation(struct_processus *s_etat_proc
                 (*s_etat_processus).autorisation_empilement_programme =                  (*s_etat_processus).autorisation_empilement_programme =
                         autorisation_empilement_programme;                          autorisation_empilement_programme;
                 (*s_etat_processus).instruction_courante = instruction_courante;                  (*s_etat_processus).instruction_courante = instruction_courante;
                 (*(*s_etat_processus).l_base_pile_systeme).retour_definition =  
                         registre_retour_definition;  
   
                 return(d_erreur);                  return(d_erreur);
             }              }
         }          }
Line 7194  evaluation(struct_processus *s_etat_proc Line 7683  evaluation(struct_processus *s_etat_proc
         (*s_etat_processus).autorisation_empilement_programme =          (*s_etat_processus).autorisation_empilement_programme =
                 autorisation_empilement_programme;                  autorisation_empilement_programme;
         (*s_etat_processus).instruction_courante = instruction_courante;          (*s_etat_processus).instruction_courante = instruction_courante;
         (*(*s_etat_processus).l_base_pile_systeme).retour_definition =  
                 registre_retour_definition;  
     }      }
     else if ((*s_objet).type == FCT)      else if ((*s_objet).type == FCT)
     {      {
Line 7204  evaluation(struct_processus *s_etat_proc Line 7691  evaluation(struct_processus *s_etat_proc
   
         registre_type_evaluation = (test_cfsf(s_etat_processus, 35) == d_vrai)          registre_type_evaluation = (test_cfsf(s_etat_processus, 35) == d_vrai)
                 ? 'E' : 'N';                  ? 'E' : 'N';
         cf(s_etat_processus, 35);  
           if (type_evaluation == 'N')
           {
               cf(s_etat_processus, 35);
           }
           else
           {
               sf(s_etat_processus, 35);
           }
   
         analyse(s_etat_processus, (*((struct_fonction *)          analyse(s_etat_processus, (*((struct_fonction *)
                 (*s_objet).objet)).fonction);                  (*s_objet).objet)).fonction);

Removed from v.1.75  
changed lines
  Added in v.1.97


CVSweb interface <joel.bertrand@systella.fr>