Diff for /rpl/src/instructions_r2.c between versions 1.3 and 1.40

version 1.3, 2010/02/10 10:14:24 version 1.40, 2012/09/30 20:46:46
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.11    RPL/2 (R) version 4.1.10
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2012 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 20 Line 20
 */  */
   
   
 #include "rpl.conv.h"  #include "rpl-conv.h"
   
   
 /*  /*
Line 434  instruction_return(struct_processus *s_e Line 434  instruction_return(struct_processus *s_e
                         (strcmp(instruction_majuscule, "DO") == 0) ||                          (strcmp(instruction_majuscule, "DO") == 0) ||
                         (strcmp(instruction_majuscule, "WHILE") == 0) ||                          (strcmp(instruction_majuscule, "WHILE") == 0) ||
                         (strcmp(instruction_majuscule, "FOR") == 0) ||                          (strcmp(instruction_majuscule, "FOR") == 0) ||
                           (strcmp(instruction_majuscule, "FORALL") == 0) ||
                         (strcmp(instruction_majuscule, "START") == 0) ||                          (strcmp(instruction_majuscule, "START") == 0) ||
                         (strcmp(instruction_majuscule, "SELECT") == 0)                          (strcmp(instruction_majuscule, "SELECT") == 0) ||
                           (strcmp(instruction_majuscule, "CRITICAL") == 0)
                         || (strcmp(instruction_majuscule, "CASE") == 0)                          || (strcmp(instruction_majuscule, "CASE") == 0)
                         || (strcmp(instruction_majuscule, "<<") == 0))                          || (strcmp(instruction_majuscule, "<<") == 0))
                 {                  {
Line 444  instruction_return(struct_processus *s_e Line 446  instruction_return(struct_processus *s_e
                         analyse(s_etat_processus, NULL);                          analyse(s_etat_processus, NULL);
                     }                      }
                     else if ((strcmp(instruction_majuscule, "FOR") == 0) ||                      else if ((strcmp(instruction_majuscule, "FOR") == 0) ||
                               (strcmp(instruction_majuscule, "FORALL") == 0) ||
                             (strcmp(instruction_majuscule, "START") == 0))                              (strcmp(instruction_majuscule, "START") == 0))
                     {                      {
                         empilement_pile_systeme(s_etat_processus);                          empilement_pile_systeme(s_etat_processus);
Line 501  instruction_return(struct_processus *s_e Line 504  instruction_return(struct_processus *s_e
                         }                          }
                     }                      }
                     else if (((strcmp(instruction_majuscule, "NEXT") == 0) ||                      else if (((strcmp(instruction_majuscule, "NEXT") == 0) ||
                                 (strcmp(instruction_majuscule, "STEP") == 0)) &&                              (strcmp(instruction_majuscule, "STEP") == 0)) &&
                                 ((*(*s_etat_processus).l_base_pile_systeme)                              ((*(*s_etat_processus).l_base_pile_systeme)
                                 .type_cloture != 'L'))                              .type_cloture != 'L'))
                     {                      {
                         /*                          /*
                          * Libération des compteurs de boucle.                           * Libération des compteurs de boucle.
                          */                           */
   
                         presence_compteur = ((*(*s_etat_processus)                          presence_compteur = (((*(*s_etat_processus)
                                 .l_base_pile_systeme).type_cloture == 'F')                                  .l_base_pile_systeme).type_cloture == 'F') ||
                                 ? d_vrai : d_faux;                                  ((*(*s_etat_processus).l_base_pile_systeme)
                                   .type_cloture == 'A')) ? d_vrai : d_faux;
   
                         if (((*(*s_etat_processus).l_base_pile_systeme)                          if (((*(*s_etat_processus).l_base_pile_systeme)
                                 .type_cloture != 'S') &&                                  .type_cloture != 'S') &&
Line 534  instruction_return(struct_processus *s_e Line 538  instruction_return(struct_processus *s_e
                                 return;                                  return;
                             }                              }
   
                             if (((*s_etat_processus).s_liste_variables                              if ((*(*s_etat_processus)
                                     [(*s_etat_processus)                                      .pointeur_variable_courante).objet == NULL)
                                     .position_variable_courante]).objet == NULL)  
                             {                              {
                                 (*s_etat_processus).erreur_systeme = d_es;                                  (*s_etat_processus).erreur_systeme = d_es;
                                 (*s_etat_processus).erreur_execution =                                  (*s_etat_processus).erreur_execution =
Line 544  instruction_return(struct_processus *s_e Line 547  instruction_return(struct_processus *s_e
                                 return;                                  return;
                             }                              }
   
                             (*(*s_etat_processus).l_base_pile_systeme)                              (*s_etat_processus).niveau_courant--;
                                     .indice_boucle = ((*s_etat_processus)  
                                     .s_liste_variables[(*s_etat_processus)  
                                     .position_variable_courante]).objet;  
   
                             if (presence_compteur == d_vrai)                              if (retrait_variable_par_niveau(
                                       s_etat_processus) == d_erreur)
                             {                              {
                                 (*s_etat_processus).niveau_courant--;                                  return;
   
                                 if (retrait_variable_par_niveau(  
                                         s_etat_processus) == d_erreur)  
                                 {  
                                     return;  
                                 }  
                             }                              }
                         }                          }
   
                         (*(*s_etat_processus).l_base_pile_systeme)  
                                 .indice_boucle = NULL;  
   
                         depilement_pile_systeme(s_etat_processus);                          depilement_pile_systeme(s_etat_processus);
   
                           if ((*s_etat_processus).erreur_systeme != d_es)
                           {
                               return;
                           }
                     }                      }
                     else                      else
                     {                      {
                           if ((*s_etat_processus).l_base_pile_systeme == NULL)
                           {
                               (*s_etat_processus).erreur_systeme =
                                       d_es_processus;
                               return;
                           }
   
                           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;
                                   return;
                               }
   
                               (*s_etat_processus).sections_critiques--;
                           }
   
                         depilement_pile_systeme(s_etat_processus);                          depilement_pile_systeme(s_etat_processus);
   
                         if ((*s_etat_processus).erreur_systeme != d_es)                          if ((*s_etat_processus).erreur_systeme != d_es)
Line 666  instruction_return(struct_processus *s_e Line 684  instruction_return(struct_processus *s_e
                     (fonction == instruction_do) ||                      (fonction == instruction_do) ||
                     (fonction == instruction_while) ||                      (fonction == instruction_while) ||
                     (fonction == instruction_for) ||                      (fonction == instruction_for) ||
                       (fonction == instruction_forall) ||
                     (fonction == instruction_start) ||                      (fonction == instruction_start) ||
                     (fonction == instruction_select) ||                      (fonction == instruction_select) ||
                       (fonction == instruction_critical) ||
                     (fonction == instruction_case) ||                      (fonction == instruction_case) ||
                     (fonction == instruction_vers_niveau_superieur))                      (fonction == instruction_vers_niveau_superieur))
             {              {
Line 677  instruction_return(struct_processus *s_e Line 697  instruction_return(struct_processus *s_e
                             instruction_vers_niveau_superieur);                              instruction_vers_niveau_superieur);
                 }                  }
                 else if ((fonction == instruction_for) ||                  else if ((fonction == instruction_for) ||
                           (fonction == instruction_forall) ||
                         (fonction == instruction_start))                          (fonction == instruction_start))
                 {                  {
                     empilement_pile_systeme(s_etat_processus);                      empilement_pile_systeme(s_etat_processus);
Line 716  instruction_return(struct_processus *s_e Line 737  instruction_return(struct_processus *s_e
                     analyse(s_etat_processus,                      analyse(s_etat_processus,
                             instruction_vers_niveau_inferieur);                              instruction_vers_niveau_inferieur);
   
                     fin_boucle = (((*(*s_etat_processus)                      fin_boucle = ((*(*s_etat_processus)
                             .expression_courante).suivant == NULL) ||                              .expression_courante).suivant == NULL)
                             ((*s_etat_processus).retour_routine_evaluation  
                             == 'Y'))  
                             ? d_vrai : d_faux;                              ? d_vrai : d_faux;
   
                     if (fin_boucle == d_faux)                      if (fin_boucle == d_faux)
Line 740  instruction_return(struct_processus *s_e Line 759  instruction_return(struct_processus *s_e
                      * Libération des compteurs de boucle.                       * Libération des compteurs de boucle.
                      */                       */
   
                     presence_compteur = ((*(*s_etat_processus)                      presence_compteur = (((*(*s_etat_processus)
                             .l_base_pile_systeme).type_cloture == 'F')                              .l_base_pile_systeme).type_cloture == 'F') ||
                             ? d_vrai : d_faux;                              ((*(*s_etat_processus).l_base_pile_systeme)
                               .type_cloture == 'A')) ? d_vrai : d_faux;
   
                     if (((*(*s_etat_processus).l_base_pile_systeme)                      if (((*(*s_etat_processus).l_base_pile_systeme)
                             .type_cloture != 'S') &&                              .type_cloture != 'S') &&
Line 765  instruction_return(struct_processus *s_e Line 785  instruction_return(struct_processus *s_e
                             return;                              return;
                         }                          }
   
                         if ((*s_etat_processus).s_liste_variables                          if ((*(*s_etat_processus).pointeur_variable_courante)
                                 [(*s_etat_processus).position_variable_courante]  
                                 .objet == NULL)                                  .objet == NULL)
                         {                          {
                             (*s_etat_processus).erreur_systeme = d_es;                              (*s_etat_processus).erreur_systeme = d_es;
Line 775  instruction_return(struct_processus *s_e Line 794  instruction_return(struct_processus *s_e
                             return;                              return;
                         }                          }
   
                         (*(*s_etat_processus).l_base_pile_systeme)                          (*s_etat_processus).niveau_courant--;
                                 .indice_boucle = ((*s_etat_processus)  
                                 .s_liste_variables[(*s_etat_processus)  
                                 .position_variable_courante]).objet;  
   
                         if (presence_compteur == d_vrai)                          if (retrait_variable_par_niveau(s_etat_processus)
                                   == d_erreur)
                         {                          {
                             (*s_etat_processus).niveau_courant--;                              return;
   
                             if (retrait_variable_par_niveau(s_etat_processus)  
                                     == d_erreur)  
                             {  
                                 return;  
                             }  
                         }                          }
                     }                      }
   
                     (*(*s_etat_processus).l_base_pile_systeme)  
                             .indice_boucle = NULL;  
   
                     depilement_pile_systeme(s_etat_processus);                      depilement_pile_systeme(s_etat_processus);
                 }                  }
                 else                  else
                 {                  {
                       if ((*s_etat_processus).l_base_pile_systeme == NULL)
                       {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_processus;
                           return;
                       }
   
                       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;
                               return;
                           }
   
                           (*s_etat_processus).sections_critiques--;
                       }
   
                     depilement_pile_systeme(s_etat_processus);                      depilement_pile_systeme(s_etat_processus);
   
                     if ((*s_etat_processus).erreur_systeme != d_es)                      if ((*s_etat_processus).erreur_systeme != d_es)
Line 937  instruction_rdm(struct_processus *s_etat Line 966  instruction_rdm(struct_processus *s_etat
   
         liberation(s_etat_processus, s_objet_initial);          liberation(s_etat_processus, s_objet_initial);
   
         if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)          if ((*(*s_etat_processus).pointeur_variable_courante)
                 .position_variable_courante].variable_verrouillee == d_vrai)                  .variable_verrouillee == d_vrai)
         {          {
             (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;              (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
   
Line 946  instruction_rdm(struct_processus *s_etat Line 975  instruction_rdm(struct_processus *s_etat
             return;              return;
         }          }
   
         s_objet_initial = (*s_etat_processus).s_liste_variables          s_objet_initial = (*(*s_etat_processus).pointeur_variable_courante)
                 [(*s_etat_processus).position_variable_courante].objet;                  .objet;
   
         if (s_objet_initial == NULL)          if (s_objet_initial == NULL)
         {          {
Line 959  instruction_rdm(struct_processus *s_etat Line 988  instruction_rdm(struct_processus *s_etat
             }              }
   
             if (recherche_variable_partagee(s_etat_processus,              if (recherche_variable_partagee(s_etat_processus,
                     (*s_etat_processus).s_liste_variables                      (*(*s_etat_processus).pointeur_variable_courante).nom,
                     [(*s_etat_processus).position_variable_courante].nom,                      (*(*s_etat_processus).pointeur_variable_courante)
                     (*s_etat_processus).s_liste_variables                      .variable_partagee, (*(*s_etat_processus)
                     [(*s_etat_processus).position_variable_courante]                      .pointeur_variable_courante).origine)
                     .variable_partagee, (*s_etat_processus).s_liste_variables  
                     [(*s_etat_processus).position_variable_courante].origine)  
                     == d_faux)                      == d_faux)
             {              {
                 if (pthread_mutex_unlock(&((*(*s_etat_processus)                  if (pthread_mutex_unlock(&((*(*s_etat_processus)
Line 2209  instruction_rdm(struct_processus *s_etat Line 2236  instruction_rdm(struct_processus *s_etat
         }          }
         else          else
         {          {
             (*s_etat_processus).s_liste_variables              (*(*s_etat_processus).pointeur_variable_courante).objet =
                     [(*s_etat_processus).position_variable_courante].objet =  
                     s_objet_redimensionne;                      s_objet_redimensionne;
         }          }
     }      }

Removed from v.1.3  
changed lines
  Added in v.1.40


CVSweb interface <joel.bertrand@systella.fr>