--- rpl/src/instructions_s1.c 2011/06/20 17:54:19 1.28 +++ rpl/src/instructions_s1.c 2012/06/13 08:29:38 1.50 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.1 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.9 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -3399,13 +3399,11 @@ instruction_syseval(struct_processus *s_ logical1 presence_stdin; long i; + 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; @@ -3420,6 +3418,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; @@ -3526,8 +3525,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'; @@ -3535,30 +3532,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 */ @@ -3570,6 +3551,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 = @@ -3587,6 +3570,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 = @@ -3631,6 +3616,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; } } @@ -3643,6 +3638,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 = @@ -3702,16 +3699,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) @@ -3864,13 +3855,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; @@ -3878,24 +3876,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) @@ -3905,11 +3899,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; @@ -3917,15 +3911,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) @@ -3943,11 +3939,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; @@ -3956,9 +3952,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) @@ -3990,9 +3987,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; @@ -4002,16 +3999,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; @@ -4019,9 +4014,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) @@ -4043,35 +4038,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; @@ -4088,9 +4078,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; @@ -4099,9 +4089,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) @@ -4111,14 +4101,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; @@ -4183,16 +4165,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, + &longueur_tampon)) == 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++; @@ -4251,9 +4231,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; @@ -4272,9 +4252,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) @@ -4295,9 +4275,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)