--- rpl/src/instructions_s1.c 2010/03/04 10:17:53 1.5 +++ rpl/src/instructions_s1.c 2011/06/27 09:04:59 1.33 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.12 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.0 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -1275,6 +1275,10 @@ instruction_same(struct_processus *s_eta printf(" 1: %s\n", d_RPN); printf("-> 1: %s\n", d_RPN); + printf(" 2: %s\n", d_PRC); + printf(" 1: %s\n", d_PRC); + printf("-> 1: %s\n", d_INT); + return; } else if ((*s_etat_processus).test_instruction == 'Y') @@ -2569,6 +2573,12 @@ instruction_start(struct_processus *s_et } empilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return; + } + (*(*s_etat_processus).l_base_pile_systeme).type_cloture = 'S'; if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), @@ -2578,8 +2588,7 @@ instruction_start(struct_processus *s_et return; } - if (((*s_objet_1).type != INT) && - ((*s_objet_1).type != REL)) + if (((*s_objet_1).type != INT) && ((*s_objet_1).type != REL)) { liberation(s_etat_processus, s_objet_1); @@ -2596,8 +2605,7 @@ instruction_start(struct_processus *s_et return; } - if (((*s_objet_2).type != INT) && - ((*s_objet_2).type != REL)) + if (((*s_objet_2).type != INT) && ((*s_objet_2).type != REL)) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); @@ -2765,8 +2773,8 @@ instruction_step(struct_processus *s_eta return; } - if (((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante]).variable_verrouillee == d_vrai) + if ((*(*s_etat_processus).pointeur_variable_courante) + .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet); @@ -2774,8 +2782,7 @@ instruction_step(struct_processus *s_eta return; } - if (((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet == NULL) + if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { liberation(s_etat_processus, s_objet); @@ -2784,8 +2791,7 @@ instruction_step(struct_processus *s_eta } (*(*s_etat_processus).l_base_pile_systeme).indice_boucle = - ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet; + (*(*s_etat_processus).pointeur_variable_courante).objet; } /* @@ -2826,8 +2832,7 @@ instruction_step(struct_processus *s_eta */ (*(*s_etat_processus).l_base_pile_systeme).indice_boucle = NULL; - ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet = s_objet; + (*(*s_etat_processus).pointeur_variable_courante).objet = s_objet; } else { @@ -3202,8 +3207,8 @@ instruction_sto(struct_processus *s_etat * La variable est accessible. */ - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_verrouillee == d_vrai) + if ((*(*s_etat_processus).pointeur_variable_courante) + .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); @@ -3212,8 +3217,7 @@ instruction_sto(struct_processus *s_etat return; } - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet == NULL) + if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) @@ -3223,12 +3227,10 @@ instruction_sto(struct_processus *s_etat } if (recherche_variable_partagee(s_etat_processus, - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].nom, - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_partagee, - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].origine) == d_faux) + (*(*s_etat_processus).pointeur_variable_courante).nom, + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee, (*(*s_etat_processus) + .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) @@ -3237,6 +3239,17 @@ instruction_sto(struct_processus *s_etat return; } + if ((*s_etat_processus).autorisation_nom_implicite == 'N') + { + liberation(s_etat_processus, s_objet_1); + liberation(s_etat_processus, s_objet_2); + + (*s_etat_processus).erreur_systeme = d_es; + (*s_etat_processus).erreur_execution = + d_ex_creation_variable_globale; + return; + } + if ((s_variable.nom = malloc((strlen((*((struct_nom *) (*s_objet_1).objet)).nom) + 1) * sizeof(unsigned char))) == NULL) @@ -3287,12 +3300,24 @@ instruction_sto(struct_processus *s_etat } else { - liberation(s_etat_processus, - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet); + if ((*s_etat_processus).autorisation_nom_implicite == 'N') + { + if ((*(*s_etat_processus).pointeur_variable_courante) + .niveau == 1) + { + liberation(s_etat_processus, s_objet_1); + liberation(s_etat_processus, s_objet_2); - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet = s_objet_2; + (*s_etat_processus).erreur_execution = + d_ex_creation_variable_globale; + return; + } + } + + liberation(s_etat_processus, + (*(*s_etat_processus).pointeur_variable_courante).objet); + (*(*s_etat_processus).pointeur_variable_courante).objet = + s_objet_2; } } else @@ -3302,6 +3327,17 @@ instruction_sto(struct_processus *s_etat * une variable globale. */ + if ((*s_etat_processus).autorisation_nom_implicite == 'N') + { + liberation(s_etat_processus, s_objet_1); + liberation(s_etat_processus, s_objet_2); + + (*s_etat_processus).erreur_systeme = d_es; + (*s_etat_processus).erreur_execution = + d_ex_creation_variable_globale; + return; + } + if ((s_variable.nom = malloc((strlen((*((struct_nom *) (*s_objet_1).objet)).nom) + 1) * sizeof(unsigned char))) == NULL) @@ -3831,7 +3867,11 @@ instruction_syseval(struct_processus *s_ longueur_ecriture = strlen((unsigned char *) (*(*l_element_courant).donnee).objet); +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -3842,8 +3882,13 @@ instruction_syseval(struct_processus *s_ (*(*l_element_courant).donnee).objet, longueur_ecriture) != longueur_ecriture) { +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus) .semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -3859,8 +3904,13 @@ instruction_syseval(struct_processus *s_ return; } +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus) .semaphore_fork)) != 0) +# else + if (sem_post((*s_etat_processus) + .semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -3870,8 +3920,13 @@ instruction_syseval(struct_processus *s_ while(write_atomic(s_etat_processus, pipes_entree[1], "\n", 1) != 1) { +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus) .semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -3887,16 +3942,24 @@ instruction_syseval(struct_processus *s_ return; } +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus) .semaphore_fork)) != 0) +# else + if (sem_post((*s_etat_processus) + .semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } - while(sem_wait(&((*s_etat_processus).semaphore_fork)) - == -1) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -3926,8 +3989,11 @@ instruction_syseval(struct_processus *s_ * Récupération de la valeur de retour du processus détaché */ - if (sem_post(&((*s_etat_processus).semaphore_fork)) - != 0) +# ifndef SEMAPHORES_NOMMES + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -3935,7 +4001,11 @@ instruction_syseval(struct_processus *s_ if (waitpid(pid, &status, 0) == -1) { +# ifndef SEMAPHORES_NOMMES if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + if (sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -3948,7 +4018,11 @@ instruction_syseval(struct_processus *s_ return; } +# ifndef SEMAPHORES_NOMMES if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + if (sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -3969,17 +4043,29 @@ instruction_syseval(struct_processus *s_ return; } +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif while((ios = read_atomic(s_etat_processus, pipes_sortie[0], &(tampon[pointeur]), longueur_lecture)) > 0) { +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -4001,14 +4087,22 @@ instruction_syseval(struct_processus *s_ return; } +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -4156,7 +4250,11 @@ instruction_syseval(struct_processus *s_ return; } +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -4173,7 +4271,11 @@ instruction_syseval(struct_processus *s_ &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) { +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -4192,7 +4294,11 @@ instruction_syseval(struct_processus *s_ return; } +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) {