--- rpl/src/instructions_s1.c 2010/03/09 10:18:48 1.6 +++ rpl/src/instructions_s1.c 2011/09/14 17:55:59 1.37 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.13 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.3 + 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).erreur_execution = + d_ex_creation_variable_globale; + return; + } + } - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet = s_objet_2; + 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,8 @@ instruction_syseval(struct_processus *s_ longueur_ecriture = strlen((unsigned char *) (*(*l_element_courant).donnee).objet); - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -3842,15 +3879,12 @@ instruction_syseval(struct_processus *s_ (*(*l_element_courant).donnee).objet, longueur_ecriture) != longueur_ecriture) { - while(sem_wait(&((*s_etat_processus) - .semaphore_fork)) == -1) + while(pthread_mutex_lock(&((*s_etat_processus) + .mutex_fork)) != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; } if (longueur_ecriture == -1) @@ -3859,8 +3893,8 @@ instruction_syseval(struct_processus *s_ return; } - if (sem_post(&((*s_etat_processus) - .semaphore_fork)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -3870,15 +3904,12 @@ instruction_syseval(struct_processus *s_ while(write_atomic(s_etat_processus, pipes_entree[1], "\n", 1) != 1) { - while(sem_wait(&((*s_etat_processus) - .semaphore_fork)) == -1) + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_fork)) != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; } if (longueur_ecriture == -1) @@ -3887,22 +3918,19 @@ instruction_syseval(struct_processus *s_ return; } - if (sem_post(&((*s_etat_processus) - .semaphore_fork)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } - while(sem_wait(&((*s_etat_processus).semaphore_fork)) - == -1) + if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) + != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } l_element_courant = (*l_element_courant).suivant; @@ -3926,7 +3954,7 @@ 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)) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3935,26 +3963,21 @@ instruction_syseval(struct_processus *s_ if (waitpid(pid, &status, 0) == -1) { - if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) + != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } (*s_etat_processus).erreur_systeme = d_es_processus; return; } - if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } } while((!WIFEXITED(status)) && (!WIFSIGNALED(status))); @@ -3969,7 +3992,7 @@ instruction_syseval(struct_processus *s_ return; } - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -3979,13 +4002,11 @@ instruction_syseval(struct_processus *s_ pipes_sortie[0], &(tampon[pointeur]), longueur_lecture)) > 0) { - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + while(pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) + != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } tampon[pointeur + ios] = d_code_fin_chaine; @@ -4001,20 +4022,18 @@ instruction_syseval(struct_processus *s_ return; } - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } if ((tampon = realloc(tampon, (strlen(tampon) + 1) * @@ -4156,7 +4175,7 @@ instruction_syseval(struct_processus *s_ return; } - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -4173,13 +4192,10 @@ instruction_syseval(struct_processus *s_ &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) { - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } if (close(pipes_erreur[0]) != 0) @@ -4192,13 +4208,10 @@ instruction_syseval(struct_processus *s_ return; } - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } if (close(pipes_erreur[0]) != 0)