--- rpl/src/instructions_s1.c 2010/08/06 15:26:49 1.16 +++ rpl/src/instructions_s1.c 2012/12/18 13:19:38 1.60 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.18 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.12 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -2572,15 +2572,6 @@ 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), &s_objet_1) == d_erreur) { @@ -2614,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; @@ -2773,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); @@ -2782,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); @@ -2792,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; } /* @@ -2834,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 { @@ -2919,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; } @@ -3210,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); @@ -3220,28 +3217,24 @@ 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) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - 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) - { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + (*(*s_etat_processus).pointeur_variable_courante).nom, + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee, (*(*s_etat_processus) + .pointeur_variable_courante).origine) == NULL) + { + if (((*s_etat_processus).autorisation_nom_implicite == 'N') && + ((*((struct_nom *) (*s_objet_1).objet)).symbole + == d_faux)) { - (*s_etat_processus).erreur_systeme = d_es_processus; + 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; } @@ -3277,16 +3270,12 @@ instruction_sto(struct_processus *s_etat else { liberation(s_etat_processus, (*(*s_etat_processus) - .s_liste_variables_partagees).table - [(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet); - - (*(*s_etat_processus).s_liste_variables_partagees).table - [(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet = s_objet_2; + .pointeur_variable_partagee_courante).objet); + (*(*s_etat_processus).pointeur_variable_partagee_courante) + .objet = s_objet_2; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -3295,12 +3284,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 @@ -3310,6 +3312,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) @@ -3371,15 +3385,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; @@ -3392,6 +3403,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; @@ -3498,8 +3510,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'; @@ -3507,30 +3517,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 */ @@ -3542,6 +3536,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 = @@ -3559,6 +3555,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 = @@ -3603,6 +3601,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; } } @@ -3615,6 +3623,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 = @@ -3674,16 +3684,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) @@ -3836,13 +3840,20 @@ 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; + } # ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) + != 0) # else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) + if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3850,24 +3861,20 @@ instruction_syseval(struct_processus *s_ } while(write_atomic(s_etat_processus, - pipes_entree[1], (unsigned char *) - (*(*l_element_courant).donnee).objet, + pipes_entree[1], ligne, longueur_ecriture) != longueur_ecriture) { # ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus) - .semaphore_fork)) == -1) + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) # else - while(sem_wait((*s_etat_processus) - .semaphore_fork) == -1) + 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) @@ -3877,11 +3884,11 @@ instruction_syseval(struct_processus *s_ } # ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus) - .semaphore_fork)) != 0) + if (sem_post(&((*s_etat_processus) + .semaphore_fork)) != 0) # else - if (sem_post((*s_etat_processus) - .semaphore_fork) != 0) + if (sem_post((*s_etat_processus) + .semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3889,15 +3896,17 @@ instruction_syseval(struct_processus *s_ } } + free(ligne); + while(write_atomic(s_etat_processus, pipes_entree[1], "\n", 1) != 1) { # ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus) - .semaphore_fork)) == -1) + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) # else - while(sem_wait((*s_etat_processus) - .semaphore_fork) == -1) + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) # endif { if (errno != EINTR) @@ -3915,11 +3924,11 @@ instruction_syseval(struct_processus *s_ } # ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus) - .semaphore_fork)) != 0) + if (sem_post(&((*s_etat_processus) + .semaphore_fork)) != 0) # else - if (sem_post((*s_etat_processus) - .semaphore_fork) != 0) + if (sem_post((*s_etat_processus) + .semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3928,9 +3937,10 @@ instruction_syseval(struct_processus *s_ } # ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) + != 0) # else - while(sem_wait((*s_etat_processus).semaphore_fork) == -1) + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) @@ -3962,9 +3972,9 @@ instruction_syseval(struct_processus *s_ */ # ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) + if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3974,16 +3984,14 @@ instruction_syseval(struct_processus *s_ if (waitpid(pid, &status, 0) == -1) { # ifndef SEMAPHORES_NOMMES - if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + if (sem_post(&((*s_etat_processus).semaphore_fork)) + != 0) # else - if (sem_wait((*s_etat_processus).semaphore_fork) == -1) + 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; @@ -3991,9 +3999,9 @@ instruction_syseval(struct_processus *s_ } # ifndef SEMAPHORES_NOMMES - if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else - if (sem_wait((*s_etat_processus).semaphore_fork) == -1) + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) @@ -4015,35 +4023,30 @@ instruction_syseval(struct_processus *s_ return; } + tampon[0] = d_code_fin_chaine; + # ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif { (*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) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else - while(sem_wait((*s_etat_processus).semaphore_fork) == -1) + 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; @@ -4060,9 +4063,9 @@ instruction_syseval(struct_processus *s_ } # ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) + if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -4071,9 +4074,9 @@ instruction_syseval(struct_processus *s_ } # ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else - while(sem_wait((*s_etat_processus).semaphore_fork) == -1) + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) @@ -4083,14 +4086,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; @@ -4155,16 +4150,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++; @@ -4223,9 +4216,9 @@ instruction_syseval(struct_processus *s_ } # ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) + if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -4244,9 +4237,9 @@ instruction_syseval(struct_processus *s_ == d_erreur) { # ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else - while(sem_wait((*s_etat_processus).semaphore_fork) == -1) + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) @@ -4267,9 +4260,9 @@ instruction_syseval(struct_processus *s_ } # ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else - while(sem_wait((*s_etat_processus).semaphore_fork) == -1) + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR)