--- rpl/src/transliteration.c 2010/03/04 10:17:55 1.6 +++ rpl/src/transliteration.c 2019/02/03 14:41:31 1.98 @@ -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.31 + Copyright (C) 1989-2019 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,8 +20,8 @@ */ -#include "rpl.conv.h" -#include "tex.conv.h" +#include "rpl-conv.h" +#include "tex-conv.h" #include @@ -90,6 +90,20 @@ reencodage(struct_processus *s_etat_proc if ((transcodage = iconv_open(codage_sortie, codage_entree)) == (iconv_t) -1) { + // On affiche une erreur ici car la fonction d'affichage + // de l'erreur utilise la macro printf() donc une + // opération de translitération qui échouera elle aussi. + // Le positionnement de l'erreur permet de sortir du programme. + + if ((*s_etat_processus).langue == 'F') + { + fprintf(stderr, "+++Erreur : Erreur de transcodage\n"); + } + else + { + fprintf(stderr, "+++Error : Transcodage error\n"); + } + (*s_etat_processus).erreur_execution = d_ex_erreur_transcodage; return(NULL); } @@ -105,7 +119,8 @@ reencodage(struct_processus *s_etat_proc chaine_sortie[0] = d_code_fin_chaine; - if ((buffer_sortie = malloc((d_LONGUEUR + 1) * sizeof(char))) == NULL) + if ((buffer_sortie = malloc((d_LONGUEUR + 1) * sizeof(unsigned char))) + == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(NULL); @@ -120,18 +135,64 @@ reencodage(struct_processus *s_etat_proc &longueur_entree, (char **) &pointeur, &longueur_sortie)) == (size_t) -1) { - // On autorise les erreurs EINVAL et EILSEQ - if (errno == EILSEQ) + // On autorise les erreurs EINVAL si le caractère suivant est non + // nul : la séquence d'entrée est continue sur le bloc suivant. + + if (errno == EINVAL) + { + if ((*(buffer_entree + 1)) == d_code_fin_chaine) + { + free(buffer_sortie); + free(chaine_sortie); + + // On affiche une erreur ici car la fonction d'affichage + // de l'erreur utilise la macro printf() donc une + // opération de translitération qui échouera elle aussi. + // Le positionnement de l'erreur permet de sortir du + // programme. + + if ((*s_etat_processus).langue == 'F') + { + fprintf(stderr, "+++Erreur : Erreur de transcodage\n"); + } + else + { + fprintf(stderr, "+++Error : Transcodage error\n"); + } + + (*s_etat_processus).erreur_execution = + d_ex_erreur_transcodage; + return(NULL); + } + } + + // Si la séquence d'entrée est invalide, on reçoit une erreur + // EILSEQ. + else if (errno == EILSEQ) { free(buffer_sortie); free(chaine_sortie); + // On affiche une erreur ici car la fonction d'affichage + // de l'erreur utilise la macro printf() donc une + // opération de translitération qui échouera elle aussi. + // Le positionnement de l'erreur permet de sortir du programme. + + if ((*s_etat_processus).langue == 'F') + { + fprintf(stderr, "+++Erreur : Erreur de transcodage\n"); + } + else + { + fprintf(stderr, "+++Error : Transcodage error\n"); + } + (*s_etat_processus).erreur_execution = d_ex_erreur_transcodage; return(NULL); } } - tampon = (unsigned char *) chaine_sortie; + tampon = chaine_sortie; (*pointeur) = d_code_fin_chaine; if ((chaine_sortie = malloc((strlen(tampon) + strlen(buffer_sortie) + 1) @@ -175,24 +236,17 @@ localisation_courante(struct_processus * int pipes_sortie[2]; int status; - logical1 drapeau_fin; + integer8 i; + integer8 longueur_lecture; + integer8 nombre_arguments; + integer8 nombre_iterations; + integer8 pointeur; - long i; - long nombre_arguments; pid_t pid; - sigset_t oldset; - sigset_t set; - - struct sigaction action_passee; - unsigned char *tampon; - unsigned long longueur_lecture; - unsigned long nombre_iterations; - unsigned long pointeur; - if ((arguments = malloc(3 * sizeof(char **))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -216,7 +270,6 @@ localisation_courante(struct_processus * arguments[2] = NULL; nombre_arguments = 2; - drapeau_fin = d_faux; if (pipe(pipes_entree) != 0) { @@ -236,15 +289,8 @@ localisation_courante(struct_processus * return; } - 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) { @@ -372,6 +418,8 @@ localisation_courante(struct_processus * } else { + deverrouillage_threads_concurrents(s_etat_processus); + if (close(pipes_entree[0]) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -407,29 +455,44 @@ localisation_courante(struct_processus * * 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; } - if (waitpid(pid, &status, 0) == -1) + while(waitpid(pid, &status, 0) == -1) { - if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + if (errno != EINTR) { - if (errno != EINTR) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) + != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + 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) { @@ -443,24 +506,34 @@ localisation_courante(struct_processus * pointeur = 0; nombre_iterations = 1; - if ((tampon = malloc((longueur_lecture + 1) * + if ((tampon = malloc(((size_t) (longueur_lecture + 1)) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; 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; } - while((ios = read_atomic(s_etat_processus, + while((ios = (int) read_atomic(s_etat_processus, pipes_sortie[0], &(tampon[pointeur]), - longueur_lecture)) > 0) + (size_t) 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) { @@ -474,7 +547,7 @@ localisation_courante(struct_processus * nombre_iterations++; if ((tampon = realloc(tampon, - ((nombre_iterations * longueur_lecture) + 1) * + ((size_t) ((nombre_iterations * longueur_lecture) + 1)) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -482,14 +555,22 @@ localisation_courante(struct_processus * 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) { @@ -518,18 +599,22 @@ localisation_courante(struct_processus * return; } - (*s_etat_processus).localisation = tampon; - - if (sigaction(SIGINT, &action_passee, NULL) != 0) + if (strlen(tampon) > 0) { - for(i = 0; i < nombre_arguments; i++) + (*s_etat_processus).localisation = tampon; + } + else + { + free(tampon); + + if (((*s_etat_processus).localisation = malloc((strlen(d_locale) + + 1) * sizeof(unsigned char))) == NULL) { - free(arguments[i]); + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } - free(arguments); - (*s_etat_processus).erreur_systeme = d_es_signal; - return; + strcpy((*s_etat_processus).localisation, d_locale); } for(i = 0; i < nombre_arguments; i++) @@ -539,7 +624,11 @@ localisation_courante(struct_processus * free(arguments); - 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; @@ -549,20 +638,23 @@ localisation_courante(struct_processus * { // Le processus fils renvoie une erreur. - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + free(tampon); + + if (((*s_etat_processus).localisation = malloc((strlen(d_locale) + + 1) * sizeof(unsigned char))) == NULL) { - 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_execution = d_ex_erreur_processus; - return; + strcpy((*s_etat_processus).localisation, d_locale); } - 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) { @@ -595,7 +687,15 @@ transliterated_fprintf(struct_processus va_start(arguments, format); - if (valsprintf(&tampon, format, arguments) < 0) +# ifdef OS2 + unsigned char *ptr_e;; + unsigned char *ptr_l;; + unsigned char *tampon3; + + unsigned long i; +# endif + + if (valsprintf(s_etat_processus, &tampon, format, arguments) < 0) { va_end(arguments); @@ -625,6 +725,56 @@ transliterated_fprintf(struct_processus tampon2 = tampon; } +# ifdef OS2 + if ((flux == stderr) || (flux == stdout)) + { + i = 0; + ptr_l = tampon2; + + while((*ptr_l) != d_code_fin_chaine) + { + if ((*ptr_l) == '\n') + { + i++; + } + + ptr_l++; + } + + if ((tampon3 = malloc((strlen(tampon2) + i + 1) * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(-1); + } + + ptr_e = tampon3; + ptr_l = tampon2; + + while((*ptr_l) != d_code_fin_chaine) + { + (*ptr_e) = (*ptr_l); + + if ((*ptr_l) == '\n') + { + (*(++ptr_e)) = '\r'; + ptr_e++; + ptr_l++; + } + else + { + ptr_e++; + ptr_l++; + } + } + + (*ptr_e) = d_code_fin_chaine; + + free(tampon2); + tampon2 = tampon3; + } +# endif + # ifdef SunOS while((ios = fprintf(flux, "%s", tampon2)) < 0) { @@ -644,6 +794,22 @@ transliterated_fprintf(struct_processus int +std_fprintf(file *flux, const char *format, ...) +{ + int ios; + + va_list arguments; + + va_start(arguments, format); + ios = vfprintf(flux, format, arguments); + va_end(arguments); + + // Pas de parenthèses pour ne pas appeler la macro. + return ios; +} + + +int tex_fprintf(struct_processus *s_etat_processus, file *flux, const char *format, ...) { @@ -656,7 +822,7 @@ tex_fprintf(struct_processus *s_etat_pro va_start(arguments, format); - if (valsprintf(&tampon, format, arguments) < 0) + if (valsprintf(s_etat_processus, &tampon, format, arguments) < 0) { va_end(arguments); @@ -696,6 +862,41 @@ tex_fprintf(struct_processus *s_etat_pro return(ios); } +#undef readline + +unsigned char * +readline_wrapper(struct_processus *s_etat_processus, unsigned char *invite) +{ + unsigned char *rpl_chaine; + unsigned char *sys_chaine; + + association_etat_processus_readline(s_etat_processus); + sys_chaine = readline(invite); + +# ifdef OS2 + printf("\r"); +# endif + + if (sys_chaine == NULL) + { + return(NULL); + } + + if ((rpl_chaine = rpl_malloc(s_etat_processus, (strlen(sys_chaine) + 1) * + sizeof(unsigned char *))) == NULL) + { + sys_free(sys_chaine); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(NULL); + } + + strcpy(rpl_chaine, sys_chaine); + sys_free(sys_chaine); + + return(rpl_chaine); +} + + #define fprintf NULL #define printf NULL