Diff for /rpl/src/rpl.c between versions 1.42 and 1.80

version 1.42, 2010/08/22 16:38:36 version 1.80, 2011/09/03 10:31:50
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.18    RPL/2 (R) version 4.1.3
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2011 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 23 Line 23
 #define  MAIN_RPL  #define  MAIN_RPL
 #include "rpl-conv.h"  #include "rpl-conv.h"
   
 #ifdef SEMAPHORES_SYSV  #ifdef IPCS_SYSV
 #ifndef OS2  #ifndef OS2
     unsigned char       *chemin_semaphores_SysV;      unsigned char       *chemin_semaphores_SysV;
 #endif  #endif
Line 46  rplinit(int argc, char *argv[], unsigned Line 46  rplinit(int argc, char *argv[], unsigned
   
     int                                 erreur_historique;      int                                 erreur_historique;
     int                                 option_P;      int                                 option_P;
     int                                 status;  
   
     logical1                            core;      logical1                            core;
     logical1                            debug;      logical1                            debug;
Line 183  rplinit(int argc, char *argv[], unsigned Line 182  rplinit(int argc, char *argv[], unsigned
         (*s_etat_processus).langue = 'E';          (*s_etat_processus).langue = 'E';
     }      }
   
       initialisation_contexte_cas(s_etat_processus);
   
     (*s_etat_processus).exception = d_ep;      (*s_etat_processus).exception = d_ep;
     (*s_etat_processus).erreur_systeme = d_es;      (*s_etat_processus).erreur_systeme = d_es;
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
       (*s_etat_processus).compteur_violation_d_acces = 0;
   
     (*s_etat_processus).rpl_home = rpl_home;      (*s_etat_processus).rpl_home = rpl_home;
   
Line 240  rplinit(int argc, char *argv[], unsigned Line 242  rplinit(int argc, char *argv[], unsigned
     (*s_etat_processus).chemin_fichiers_temporaires =      (*s_etat_processus).chemin_fichiers_temporaires =
             recherche_chemin_fichiers_temporaires(s_etat_processus);              recherche_chemin_fichiers_temporaires(s_etat_processus);
   
 #   ifdef SEMAPHORES_SYSV  #   ifdef IPCS_SYSV
 #   ifndef OS2  #   ifndef OS2
     chemin_semaphores_SysV = (*s_etat_processus).chemin_fichiers_temporaires;      chemin_semaphores_SysV = (*s_etat_processus).chemin_fichiers_temporaires;
 #   endif  #   endif
Line 248  rplinit(int argc, char *argv[], unsigned Line 250  rplinit(int argc, char *argv[], unsigned
   
 #   ifdef _BROKEN_SIGINFO  #   ifdef _BROKEN_SIGINFO
     creation_fifos_signaux(s_etat_processus);      creation_fifos_signaux(s_etat_processus);
   #   ifdef return
   #       undef return
   #   endif
   #   define return destruction_fifos_signaux(s_etat_processus); return
   #   endif
   
       insertion_thread(s_etat_processus, d_vrai);
   
   #   ifndef OS2
       localisation_courante(s_etat_processus);
   #   else
     if ((*s_etat_processus).erreur_systeme != d_es)      if ((*s_etat_processus).erreur_systeme != d_es)
     {      {
         if (((*s_etat_processus).localisation = malloc((strlen(d_locale) + 1) *          if (((*s_etat_processus).localisation = malloc((strlen(d_locale) + 1) *
Line 268  rplinit(int argc, char *argv[], unsigned Line 280  rplinit(int argc, char *argv[], unsigned
   
         strcpy((*s_etat_processus).localisation, d_locale);          strcpy((*s_etat_processus).localisation, d_locale);
     }      }
 #   ifdef return  
 #       undef return  
 #   endif  
 #   define return destruction_fifos_signaux(s_etat_processus); return  
 #   endif  #   endif
   
     insertion_thread(s_etat_processus, d_vrai);  
   
     localisation_courante(s_etat_processus);  
     (*s_etat_processus).erreur_systeme = d_es;      (*s_etat_processus).erreur_systeme = d_es;
   
     if ((*s_etat_processus).localisation == NULL)      if ((*s_etat_processus).localisation == NULL)
Line 304  rplinit(int argc, char *argv[], unsigned Line 309  rplinit(int argc, char *argv[], unsigned
   
     if ((*s_etat_processus).langue == 'F')      if ((*s_etat_processus).langue == 'F')
     {      {
         printf("+++Copyright (C) 1989 à 2009, 2010 BERTRAND Joël\n");          printf("+++Copyright (C) 1989 à 2010, 2011 BERTRAND Joël\n");
     }      }
     else      else
     {      {
         printf("+++Copyright (C) 1989 to 2009, 2010 BERTRAND Joel\n");          printf("+++Copyright (C) 1989 to 2010, 2011 BERTRAND Joel\n");
     }      }
   
     if (getenv("HOME") != NULL)      if (getenv("HOME") != NULL)
Line 435  rplinit(int argc, char *argv[], unsigned Line 440  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
       if (sigaction(SIGTERM, &action, NULL) != 0)
       {
           erreur = d_es_signal;
   
           if ((*s_etat_processus).langue == 'F')
           {
               printf("+++Système : Initialisation des signaux POSIX "
                       "impossible\n");
           }
           else
           {
               printf("+++System : Initialization of POSIX signals failed\n");
           }
   
           return(EXIT_FAILURE);
       }
   
 #   ifndef _BROKEN_SIGINFO  #   ifndef _BROKEN_SIGINFO
     action.sa_sigaction = interruption2;      action.sa_sigaction = interruption2;
 #   else  #   else
Line 1813  rplinit(int argc, char *argv[], unsigned Line 1835  rplinit(int argc, char *argv[], unsigned
             (*s_etat_processus).affichage_arguments = 'N';              (*s_etat_processus).affichage_arguments = 'N';
             (*s_etat_processus).autorisation_conversion_chaine = 'Y';              (*s_etat_processus).autorisation_conversion_chaine = 'Y';
             (*s_etat_processus).autorisation_evaluation_nom = 'Y';              (*s_etat_processus).autorisation_evaluation_nom = 'Y';
             (*s_etat_processus).autorisation_nom_implicite = 'Y';  
               if (mode_interactif == d_vrai)
               {
                   (*s_etat_processus).autorisation_nom_implicite = 'Y';
               }
               else
               {
                   (*s_etat_processus).autorisation_nom_implicite = 'N';
               }
   
             (*s_etat_processus).autorisation_empilement_programme = 'N';              (*s_etat_processus).autorisation_empilement_programme = 'N';
             (*s_etat_processus).requete_arret = 'N';              (*s_etat_processus).requete_arret = 'N';
             (*s_etat_processus).evaluation_forcee = 'N';              (*s_etat_processus).evaluation_forcee = 'N';
               (*s_etat_processus).recherche_type = 'N';
   
             (*s_etat_processus).constante_symbolique = 'N';              (*s_etat_processus).constante_symbolique = 'N';
             (*s_etat_processus).traitement_symbolique = 'N';              (*s_etat_processus).traitement_symbolique = 'N';
Line 1828  rplinit(int argc, char *argv[], unsigned Line 1860  rplinit(int argc, char *argv[], unsigned
             (*s_etat_processus).l_base_pile = NULL;              (*s_etat_processus).l_base_pile = NULL;
             (*s_etat_processus).l_base_pile_last = NULL;              (*s_etat_processus).l_base_pile_last = NULL;
   
             (*s_etat_processus).s_liste_variables = NULL;              (*s_etat_processus).s_arbre_variables = NULL;
               (*s_etat_processus).l_liste_variables_par_niveau = NULL;
             (*s_etat_processus).gel_liste_variables = d_faux;              (*s_etat_processus).gel_liste_variables = d_faux;
             (*s_etat_processus).nombre_variables = 0;              (*s_etat_processus).pointeur_variable_courante = NULL;
             (*s_etat_processus).nombre_variables_allouees = 0;  
             (*s_etat_processus).s_liste_variables_statiques = NULL;              (*s_etat_processus).s_liste_variables_statiques = NULL;
             (*s_etat_processus).nombre_variables_statiques = 0;              (*s_etat_processus).nombre_variables_statiques = 0;
             (*s_etat_processus).nombre_variables_statiques_allouees = 0;              (*s_etat_processus).nombre_variables_statiques_allouees = 0;
Line 1839  rplinit(int argc, char *argv[], unsigned Line 1871  rplinit(int argc, char *argv[], unsigned
             (*s_etat_processus).niveau_initial = 0;              (*s_etat_processus).niveau_initial = 0;
             (*s_etat_processus).creation_variables_statiques = d_faux;              (*s_etat_processus).creation_variables_statiques = d_faux;
             (*s_etat_processus).creation_variables_partagees = d_faux;              (*s_etat_processus).creation_variables_partagees = d_faux;
             (*s_etat_processus).position_variable_courante = 0;  
             (*s_etat_processus).position_variable_statique_courante = 0;              (*s_etat_processus).position_variable_statique_courante = 0;
   
             (*s_etat_processus).s_bibliotheques = NULL;              (*s_etat_processus).s_bibliotheques = NULL;
Line 1972  rplinit(int argc, char *argv[], unsigned Line 2003  rplinit(int argc, char *argv[], unsigned
             (*s_etat_processus).pid_processus_pere = getpid();              (*s_etat_processus).pid_processus_pere = getpid();
             (*s_etat_processus).processus_detache = d_vrai;              (*s_etat_processus).processus_detache = d_vrai;
             (*s_etat_processus).var_volatile_processus_pere = -1;              (*s_etat_processus).var_volatile_processus_pere = -1;
               (*s_etat_processus).var_volatile_processus_racine = -1;
             (*s_etat_processus).var_volatile_traitement_retarde_stop = 0;              (*s_etat_processus).var_volatile_traitement_retarde_stop = 0;
             (*s_etat_processus).var_volatile_alarme = 0;              (*s_etat_processus).var_volatile_alarme = 0;
             (*s_etat_processus).var_volatile_requete_arret = 0;              (*s_etat_processus).var_volatile_requete_arret = 0;
Line 1984  rplinit(int argc, char *argv[], unsigned Line 2016  rplinit(int argc, char *argv[], unsigned
   
             initialisation_allocateur(s_etat_processus);              initialisation_allocateur(s_etat_processus);
             initialisation_drapeaux(s_etat_processus);              initialisation_drapeaux(s_etat_processus);
               initialisation_variables(s_etat_processus);
               initialisation_instructions(s_etat_processus);
   
             if ((*s_etat_processus).erreur_systeme != d_es)              if ((*s_etat_processus).erreur_systeme != d_es)
             {              {
Line 2369  rplinit(int argc, char *argv[], unsigned Line 2403  rplinit(int argc, char *argv[], unsigned
                     (*s_etat_processus).position_courante = 0;                      (*s_etat_processus).position_courante = 0;
                     (*s_etat_processus).traitement_cycle_exit = 'N';                      (*s_etat_processus).traitement_cycle_exit = 'N';
   
                     if ((*s_etat_processus).nombre_variables == 0)                      if ((*s_etat_processus).s_arbre_variables == NULL)
                     {                      {
                         if ((*s_etat_processus).langue == 'F')                          if ((*s_etat_processus).langue == 'F')
                         {                          {
Line 2429  rplinit(int argc, char *argv[], unsigned Line 2463  rplinit(int argc, char *argv[], unsigned
                         return(EXIT_FAILURE);                          return(EXIT_FAILURE);
                     }                      }
   
                     if ((*s_etat_processus).s_liste_variables                      if ((*(*s_etat_processus).pointeur_variable_courante)
                             [(*s_etat_processus)                              .niveau != 0)
                             .position_variable_courante].niveau != 0)  
                     {                      {
                         if ((*s_etat_processus).langue == 'F')                          if ((*s_etat_processus).langue == 'F')
                         {                          {
Line 2517  rplinit(int argc, char *argv[], unsigned Line 2550  rplinit(int argc, char *argv[], unsigned
   
                     fflush(stdout);                      fflush(stdout);
   
                     initialisation_instructions(s_etat_processus);  
   
                     if (arguments != NULL)                      if (arguments != NULL)
                     {                      {
                         tampon = (*s_etat_processus).definitions_chainees;                          tampon = (*s_etat_processus).definitions_chainees;
Line 2735  rplinit(int argc, char *argv[], unsigned Line 2766  rplinit(int argc, char *argv[], unsigned
                             if (setjmp(contexte_initial) == 0)                              if (setjmp(contexte_initial) == 0)
                             {                              {
                                 erreur = sequenceur(s_etat_processus);                                  erreur = sequenceur(s_etat_processus);
   
                                   if (erreur == d_absence_erreur)
                                   {
                                       if (((*s_etat_processus).var_volatile_alarme
                                               == 0) && ((*s_etat_processus)
                                               .arret_depuis_abort == 0) &&
                                               ((*s_etat_processus).at_exit
                                               != NULL))
                                       {
                                           erreur = evaluation(s_etat_processus,
                                                   (*s_etat_processus).at_exit,
                                                   'E');
                                       }
                                   }
                             }                              }
                         }                          }
                         else                          else
Line 2742  rplinit(int argc, char *argv[], unsigned Line 2787  rplinit(int argc, char *argv[], unsigned
                             if (setjmp(contexte_initial) == 0)                              if (setjmp(contexte_initial) == 0)
                             {                              {
                                 erreur = sequenceur_optimise(s_etat_processus);                                  erreur = sequenceur_optimise(s_etat_processus);
                             }  
                         }  
   
                         if (erreur == d_absence_erreur)                                  if (erreur == d_absence_erreur)
                         {                                  {
                             if (((*s_etat_processus).var_volatile_alarme == 0)                                      if (((*s_etat_processus).var_volatile_alarme
                                     && ((*s_etat_processus).arret_depuis_abort                                              == 0) && ((*s_etat_processus)
                                     == 0) && ((*s_etat_processus).at_exit                                              .arret_depuis_abort == 0) &&
                                     != NULL))                                              ((*s_etat_processus).at_exit
                             {                                              != NULL))
                                 erreur = evaluation(s_etat_processus,                                      {
                                         (*s_etat_processus).at_exit, 'E');                                          erreur = evaluation(s_etat_processus,
                                                   (*s_etat_processus).at_exit,
                                                   'E');
                                       }
                                   }
                             }                              }
                         }                          }
                     }                      }
Line 2962  rplinit(int argc, char *argv[], unsigned Line 3009  rplinit(int argc, char *argv[], unsigned
   
                     while((*s_etat_processus).l_base_pile_processus != NULL)                      while((*s_etat_processus).l_base_pile_processus != NULL)
                     {                      {
                         status = 0;  
   
                         l_element_courant = (void *)                          l_element_courant = (void *)
                                 (*s_etat_processus).l_base_pile_processus;                                  (*s_etat_processus).l_base_pile_processus;
   
Line 3187  rplinit(int argc, char *argv[], unsigned Line 3232  rplinit(int argc, char *argv[], unsigned
                      * le libérer...                       * le libérer...
                      */                       */
   
                     for(i = 0; i < (*s_etat_processus).nombre_variables; i++)                      liberation_arbre_variables(s_etat_processus,
                     {                              (*s_etat_processus).s_arbre_variables, d_vrai);
                         liberation(s_etat_processus,                      free((*s_etat_processus).pointeurs_caracteres_variables);
                                 (*s_etat_processus).s_liste_variables[i].objet);  
                         free((*s_etat_processus).s_liste_variables[i].nom);  
                     }  
   
                     free((*s_etat_processus).s_liste_variables);  
   
                     for(i = 0; i < (*s_etat_processus)                      for(i = 0; i < (*s_etat_processus)
                             .nombre_variables_statiques; i++)                              .nombre_variables_statiques; i++)
Line 3553  rplinit(int argc, char *argv[], unsigned Line 3593  rplinit(int argc, char *argv[], unsigned
         }          }
     }      }
   
 #   if !defined(Cygwin) && !defined(OpenBSD)  
     (*s_etat_processus).pile_signal.ss_flags = SS_DISABLE;  
     sigaltstack(&((*s_etat_processus).pile_signal), NULL);  
     free((*s_etat_processus).pile_signal.ss_sp);  
 #   endif  
   
     closelog();      closelog();
   
     pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));      pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));
Line 3601  rplinit(int argc, char *argv[], unsigned Line 3635  rplinit(int argc, char *argv[], unsigned
 #   undef return  #   undef return
 #   endif  #   endif
   
       liberation_contexte_cas(s_etat_processus);
   
     free((*s_etat_processus).chemin_fichiers_temporaires);      free((*s_etat_processus).chemin_fichiers_temporaires);
     free(s_etat_processus);      free(s_etat_processus);
   

Removed from v.1.42  
changed lines
  Added in v.1.80


CVSweb interface <joel.bertrand@systella.fr>