--- rpl/src/transliteration.c 2012/05/21 17:25:46 1.53 +++ rpl/src/transliteration.c 2015/01/05 15:32:25 1.78 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.9 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.20 + Copyright (C) 1989-2015 Dr. BERTRAND Joël This file is part of RPL/2. @@ -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); } @@ -121,12 +135,58 @@ 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); } @@ -176,19 +236,17 @@ localisation_courante(struct_processus * int pipes_sortie[2]; int status; - long i; - long nombre_arguments; + integer8 i; + integer8 longueur_lecture; + integer8 nombre_arguments; + integer8 nombre_iterations; + integer8 pointeur; - pid_t pid; - struct sigaction action_passee; + pid_t pid; 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; @@ -443,7 +501,7 @@ 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; @@ -462,9 +520,9 @@ localisation_courante(struct_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) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) @@ -484,7 +542,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 = @@ -554,18 +612,6 @@ localisation_courante(struct_processus * strcpy((*s_etat_processus).localisation, d_locale); } - if (sigaction(SIGINT, &action_passee, NULL) != 0) - { - for(i = 0; i < nombre_arguments; i++) - { - free(arguments[i]); - } - - free(arguments); - (*s_etat_processus).erreur_systeme = d_es_signal; - return; - } - for(i = 0; i < nombre_arguments; i++) { free(arguments[i]);