--- rpl/src/transliteration.c 2010/02/10 08:09:30 1.3 +++ rpl/src/transliteration.c 2010/08/22 16:38:36 1.18 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.10 + RPL/2 (R) version 4.0.18 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,8 +20,11 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" +#include "tex-conv.h" + #include + #undef fprintf #undef printf @@ -155,8 +158,8 @@ reencodage(struct_processus *s_etat_proc ================================================================================ Entrées : -------------------------------------------------------------------------------- - Sorties : -------------------------------------------------------------------------------- + iorties : Effets de bord : néant ================================================================================ */ @@ -238,6 +241,17 @@ localisation_courante(struct_processus * verrouillage_threads_concurrents(s_etat_processus); pid = fork(); + +# ifdef OS2 + if (pid == 0) + { + sem_init(&semaphore_liste_threads, 0, 1); + sem_init(&semaphore_gestionnaires_signaux, 0, 0); + sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); + sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); + } +# endif + deverrouillage_threads_concurrents(s_etat_processus); pthread_sigmask(SIG_SETMASK, &oldset, NULL); @@ -404,8 +418,11 @@ 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; @@ -413,7 +430,11 @@ localisation_courante(struct_processus * if (waitpid(pid, &status, 0) == -1) { +# ifndef SEMAPHORES_NOMMES if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + if (sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -426,7 +447,11 @@ localisation_courante(struct_processus * return; } +# ifndef SEMAPHORES_NOMMES if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + if (sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -447,7 +472,13 @@ localisation_courante(struct_processus * return; } + 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; @@ -457,7 +488,11 @@ localisation_courante(struct_processus * pipes_sortie[0], &(tampon[pointeur]), longueur_lecture)) > 0) { +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -479,14 +514,22 @@ localisation_courante(struct_processus * return; } +# 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; } } +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -515,7 +558,23 @@ localisation_courante(struct_processus * return; } - (*s_etat_processus).localisation = tampon; + if (strlen(tampon) > 0) + { + (*s_etat_processus).localisation = tampon; + } + else + { + free(tampon); + + if (((*s_etat_processus).localisation = malloc((strlen(d_locale) + + 1) * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + strcpy((*s_etat_processus).localisation, d_locale); + } if (sigaction(SIGINT, &action_passee, NULL) != 0) { @@ -536,7 +595,11 @@ localisation_courante(struct_processus * free(arguments); +# 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; @@ -546,20 +609,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); } +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -578,43 +644,29 @@ localisation_courante(struct_processus * return; } -static int -vtransliterated_sprintf(char **strp, const char *fmt, va_list ap) -{ - size_t bs, s; - char *b = NULL; - va_list cap; - - va_copy(cap, ap); - - for(bs = 256;; bs *= 2) - { - va_copy(ap, cap); - if (b != NULL) free(b); - if ((b = malloc(sizeof(*b) * bs)) == NULL) return -1; - if (((int) (s = vsnprintf(b, bs, fmt, ap))) < 0) - { va_end(ap); free(b); return -1; } - va_end(ap); - if (s < bs) break; - } - - if (((*strp) = realloc(b, ((s = strlen(b)) + 1) * sizeof(*b))) - == NULL) { free(b); return -1; } - return s; -} int transliterated_fprintf(struct_processus *s_etat_processus, file *flux, const char *format, ...) { int ios; - char *tampon; + + unsigned char *tampon; unsigned char *tampon2; + va_list arguments; va_start(arguments, format); - if (vtransliterated_sprintf(&tampon, format, arguments) < 0) +# ifdef OS2 + unsigned char *ptr_e;; + unsigned char *ptr_l;; + unsigned char *tampon3; + + unsigned long i; +# endif + + if (valsprintf(&tampon, format, arguments) < 0) { va_end(arguments); @@ -644,6 +696,107 @@ transliterated_fprintf(struct_processus tampon2 = tampon; } +# ifdef OS2 + 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(NULL); + } + + 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) + { + if ((errno != EINTR) && (errno != 0)) + { + break; + } + } +# else + ios = fprintf(flux, "%s", tampon2); +# endif + + free(tampon2); + + return(ios); +} + + +int +tex_fprintf(struct_processus *s_etat_processus, + file *flux, const char *format, ...) +{ + int ios; + + unsigned char *tampon; + unsigned char *tampon2; + + va_list arguments; + + va_start(arguments, format); + + if (valsprintf(&tampon, format, arguments) < 0) + { + va_end(arguments); + + if (s_etat_processus != NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + } + + return(-1); + } + + va_end(arguments); + + if ((tampon2 = transliteration(s_etat_processus, tampon, + d_locale, ds_tex_encodage_3)) == NULL) + { + free(tampon); + return(-1); + } + + free(tampon); + # ifdef SunOS while((ios = fprintf(flux, "%s", tampon2)) < 0) {