--- rpl/src/transliteration.c 2012/12/18 13:19:40 1.60 +++ rpl/src/transliteration.c 2015/04/16 19:39:10 1.82 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.12 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.21 + Copyright (C) 1989-2015 Dr. BERTRAND Joël This file is part of RPL/2. @@ -135,8 +135,40 @@ 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); @@ -204,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; @@ -471,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; @@ -490,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) @@ -512,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 = @@ -582,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]); @@ -672,7 +690,7 @@ transliterated_fprintf(struct_processus unsigned long i; # endif - if (valsprintf(&tampon, format, arguments) < 0) + if (valsprintf(s_etat_processus, &tampon, format, arguments) < 0) { va_end(arguments); @@ -688,6 +706,7 @@ transliterated_fprintf(struct_processus if (s_etat_processus != NULL) { +uprintf("%s->%s\n", d_locale, (*s_etat_processus).localisation); if ((tampon2 = transliteration(s_etat_processus, tampon, d_locale, (*s_etat_processus).localisation)) == NULL) { @@ -771,6 +790,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, ...) { @@ -783,7 +818,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); @@ -826,14 +861,35 @@ tex_fprintf(struct_processus *s_etat_pro #undef readline unsigned char * -readline_wrapper(unsigned char *invite) +readline_wrapper(struct_processus *s_etat_processus, unsigned char *invite) { - unsigned char *chaine; + unsigned char *rpl_chaine; + unsigned char *sys_chaine; + + association_etat_processus_readline(s_etat_processus); + sys_chaine = readline(invite); - 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(chaine); + return(rpl_chaine); }