--- rpl/src/instructions_s1.c 2010/02/11 17:06:02 1.4 +++ rpl/src/instructions_s1.c 2012/10/07 08:18:36 1.57 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.11 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.11 + Copyright (C) 1989-2012 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') @@ -2568,9 +2572,6 @@ instruction_start(struct_processus *s_et } } - empilement_pile_systeme(s_etat_processus); - (*(*s_etat_processus).l_base_pile_systeme).type_cloture = 'S'; - if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { @@ -2578,8 +2579,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 +2596,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); @@ -2606,6 +2605,15 @@ instruction_start(struct_processus *s_et return; } + 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'; + (*(*s_etat_processus).l_base_pile_systeme).indice_boucle = s_objet_2; (*(*s_etat_processus).l_base_pile_systeme).limite_indice_boucle = s_objet_1; @@ -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 { @@ -2911,7 +2916,7 @@ instruction_step(struct_processus *s_eta { (*s_etat_processus).niveau_courant--; - if (retrait_variable_par_niveau(s_etat_processus) == d_erreur) + if (retrait_variables_par_niveau(s_etat_processus) == d_erreur) { return; } @@ -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,19 @@ instruction_sto(struct_processus *s_etat return; } + if (((*s_etat_processus).autorisation_nom_implicite == 'N') && + ((*((struct_nom *) (*s_objet_1).objet)).symbole + == d_faux)) + { + 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 +3302,25 @@ 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') && + ((*((struct_nom *) (*s_objet_1).objet)).symbole == d_faux)) + { + 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 +3330,18 @@ instruction_sto(struct_processus *s_etat * une variable globale. */ + if (((*s_etat_processus).autorisation_nom_implicite == 'N') && + ((*((struct_nom *) (*s_objet_1).objet)).symbole == d_faux)) + { + 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) @@ -3363,15 +3403,12 @@ instruction_syseval(struct_processus *s_ logical1 presence_stdin; long i; + long longueur_ecriture; + long longueur_traitee; long nombre_arguments; pid_t pid; - sigset_t oldset; - sigset_t set; - - ssize_t longueur_ecriture; - struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_precedent; struct_liste_chainee *l_element_stdin; @@ -3384,6 +3421,7 @@ instruction_syseval(struct_processus *s_ struct sigaction action_courante; struct sigaction action_passee; + unsigned char *ligne; unsigned char *ptr; unsigned char *ptr2; unsigned char registre_autorisation_empilement_programme; @@ -3490,8 +3528,6 @@ instruction_syseval(struct_processus *s_ registre_programme = (*s_etat_processus).definitions_chainees; registre_position_courante = (*s_etat_processus).position_courante; - (*s_etat_processus).definitions_chainees = - (unsigned char *) (*s_objet).objet; (*s_etat_processus).position_courante = 0; (*s_etat_processus).autorisation_empilement_programme = 'N'; @@ -3499,30 +3535,14 @@ instruction_syseval(struct_processus *s_ * Échappement des guillemets */ - ptr = (*s_etat_processus).definitions_chainees; - ptr2 = ptr; - i = 0; - - while((*ptr) != d_code_fin_chaine) + if (((*s_etat_processus).definitions_chainees = + formateur_flux(s_etat_processus, (unsigned char *) + (*s_objet).objet, &longueur_traitee)) == NULL) { - if ((*ptr) == '\\') - { - switch (*(ptr + 1)) - { - case '"': - case '\\': - { - ptr++; - break; - } - } - } - - *ptr2++ = *ptr++; + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; } - *ptr2 = d_code_fin_chaine; - /* * Scission de la chaîne en différents arguments */ @@ -3534,6 +3554,8 @@ instruction_syseval(struct_processus *s_ { if (recherche_instruction_suivante(s_etat_processus) == d_erreur) { + free((*s_etat_processus).definitions_chainees); + (*s_etat_processus).autorisation_empilement_programme = registre_autorisation_empilement_programme; (*s_etat_processus).instruction_courante = @@ -3551,6 +3573,8 @@ instruction_syseval(struct_processus *s_ if ((s_objet_temporaire = allocation(s_etat_processus, CHN)) == NULL) { + free((*s_etat_processus).definitions_chainees); + (*s_etat_processus).autorisation_empilement_programme = registre_autorisation_empilement_programme; (*s_etat_processus).instruction_courante = @@ -3595,6 +3619,16 @@ instruction_syseval(struct_processus *s_ &((*s_etat_processus).l_base_pile), s_objet_temporaire) == d_erreur) { + free((*s_etat_processus).definitions_chainees); + + (*s_etat_processus).autorisation_empilement_programme = + registre_autorisation_empilement_programme; + (*s_etat_processus).instruction_courante = + registre_instruction_courante; + (*s_etat_processus).definitions_chainees = + registre_programme; + (*s_etat_processus).position_courante = + registre_position_courante; return; } } @@ -3607,6 +3641,8 @@ instruction_syseval(struct_processus *s_ nombre_arguments++; } while(drapeau_fin == d_faux); + free((*s_etat_processus).definitions_chainees); + (*s_etat_processus).autorisation_empilement_programme = registre_autorisation_empilement_programme; (*s_etat_processus).instruction_courante = @@ -3666,16 +3702,10 @@ instruction_syseval(struct_processus *s_ fflush(NULL); - sigfillset(&set); - pthread_sigmask(SIG_BLOCK, &set, &oldset); - verrouillage_threads_concurrents(s_etat_processus); pid = fork(); deverrouillage_threads_concurrents(s_etat_processus); - pthread_sigmask(SIG_SETMASK, &oldset, NULL); - sigpending(&set); - if (pid < 0) { if (close(pipes_entree[0]) != 0) @@ -3828,29 +3858,41 @@ instruction_syseval(struct_processus *s_ while(l_element_courant != NULL) { - longueur_ecriture = strlen((unsigned char *) - (*(*l_element_courant).donnee).objet); + if ((ligne = formateur_flux(s_etat_processus, + (unsigned char *) (*(*l_element_courant).donnee) + .objet, &longueur_ecriture)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } - 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; } while(write_atomic(s_etat_processus, - pipes_entree[1], (unsigned char *) - (*(*l_element_courant).donnee).objet, + pipes_entree[1], ligne, longueur_ecriture) != longueur_ecriture) { - while(sem_wait(&((*s_etat_processus) - .semaphore_fork)) == -1) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif { - 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,19 +3901,31 @@ instruction_syseval(struct_processus *s_ return; } - 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; } } + free(ligne); + while(write_atomic(s_etat_processus, pipes_entree[1], "\n", 1) != 1) { - while(sem_wait(&((*s_etat_processus) - .semaphore_fork)) == -1) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif { if (errno != EINTR) { @@ -3887,16 +3941,25 @@ instruction_syseval(struct_processus *s_ return; } - 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; } } - while(sem_wait(&((*s_etat_processus).semaphore_fork)) - == -1) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) + != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# 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,20 +4001,26 @@ instruction_syseval(struct_processus *s_ if (waitpid(pid, &status, 0) == -1) { - if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# ifndef SEMAPHORES_NOMMES + if (sem_post(&((*s_etat_processus).semaphore_fork)) + != 0) +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif { - 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) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif { if (errno != EINTR) { @@ -3969,7 +4041,13 @@ instruction_syseval(struct_processus *s_ return; } - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + tampon[0] = d_code_fin_chaine; + +# 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; @@ -3979,13 +4057,14 @@ instruction_syseval(struct_processus *s_ pipes_sortie[0], &(tampon[pointeur]), longueur_lecture)) > 0) { - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif { - 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,14 +4080,22 @@ instruction_syseval(struct_processus *s_ return; } - 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; } } - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif { if (errno != EINTR) { @@ -4017,14 +4104,6 @@ instruction_syseval(struct_processus *s_ } } - if ((tampon = realloc(tampon, (strlen(tampon) + 1) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return; - } - if (ios == -1) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -4089,16 +4168,14 @@ instruction_syseval(struct_processus *s_ } if (((*(*l_element_courant).donnee).objet = - malloc((strlen(ptr) + 1) * sizeof(unsigned char))) - == NULL) + analyse_flux(s_etat_processus, ptr, + strlen(ptr))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } - strcpy((*(*l_element_courant).donnee).objet, ptr); - while((*ptr) != d_code_fin_chaine) { ptr++; @@ -4156,7 +4233,11 @@ instruction_syseval(struct_processus *s_ return; } - 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; @@ -4173,7 +4254,11 @@ 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) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif { if (errno != EINTR) { @@ -4192,7 +4277,11 @@ instruction_syseval(struct_processus *s_ return; } - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif { if (errno != EINTR) {