--- rpl/src/instructions_r4.c 2013/09/26 15:38:38 1.83 +++ rpl/src/instructions_r4.c 2016/03/29 12:27:35 1.99 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.16 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.25 + Copyright (C) 1989-2016 Dr. BERTRAND Joël This file is part of RPL/2. @@ -850,12 +850,14 @@ instruction_read(struct_processus *s_eta int c; int ios; + int timeout; integer8 element; integer8 i; integer8 id; - integer8 position_clef; + integer8 index; integer8 longueur; + integer8 position_clef; integer8 longueur_effective; integer8 longueur_enregistrement; @@ -878,12 +880,16 @@ instruction_read(struct_processus *s_eta struct flock lock; + struct pollfd fds[1]; + struct sockaddr_un adresse_unix; struct sockaddr_in adresse_ipv4; # ifdef IPV6 struct sockaddr_in6 adresse_ipv6; # endif + struct termios tc; + struct timespec attente; struct_descripteur_fichier *descripteur; @@ -906,6 +912,39 @@ instruction_read(struct_processus *s_eta unsigned char *tampon_lecture; unsigned char *tampon; unsigned char *tampon2; + unsigned char *tampon3; + + int vitesses[] = + { + 50, 75, 110, 134, 150, 200, 300, 600, + 1200, 1800, 2400, 4800, 9600, 19200, 38400, +#ifdef B57600 + 57600, +#endif +#ifdef B115200 + 115200, +#endif +#ifdef B230400 + 230400, +#endif + 0 + }; + + tcflag_t vitesses_constantes[] = + { + B50, B75, B110, B134, B150, B200, B300, B600, + B1200, B1800, B2400, B4800, B9600, B19200, B38400, +#ifdef B57600 + B57600, +#endif +#ifdef B115200 + B115200, +#endif +#ifdef B230400 + B230400, +#endif + 0 + }; (*s_etat_processus).erreur_execution = d_ex; @@ -1236,6 +1275,7 @@ instruction_read(struct_processus *s_eta indicateur_48 = test_cfsf(s_etat_processus, 48); cf(s_etat_processus, 48); + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); free((*s_etat_processus).instruction_courante); @@ -1291,9 +1331,9 @@ instruction_read(struct_processus *s_eta return; } - if (alsprintf(&commande, "select data from data where " - "id = %lld", (*((integer8 *) (*s_objet_argument_2) - .objet))) < 0) + if (alsprintf(s_etat_processus, &commande, + "select data from data where id = %lld", + (*((integer8 *) (*s_objet_argument_2).objet))) < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -1390,6 +1430,7 @@ instruction_read(struct_processus *s_eta indicateur_48 = test_cfsf(s_etat_processus, 48); cf(s_etat_processus, 48); + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); if ((*s_etat_processus).erreur_execution != d_ex) @@ -1463,8 +1504,8 @@ instruction_read(struct_processus *s_eta // Récupération de la position de la clef - if (alsprintf(&commande, "select key from control " - "where id = 1") < 0) + if (alsprintf(s_etat_processus, &commande, + "select key from control where id = 1") < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -1537,8 +1578,9 @@ instruction_read(struct_processus *s_eta // Récupération de l'identifiant de la clef - if (alsprintf(&commande, "select id from key where key = " - "'{ \"%s\" }'", clef_utf8) < 0) + if (alsprintf(s_etat_processus, &commande, + "select id from key where key = '{ \"%s\" }'", + clef_utf8) < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -1630,7 +1672,8 @@ instruction_read(struct_processus *s_eta free(commande); - if (alsprintf(&commande, "select data from data where " + if (alsprintf(s_etat_processus, &commande, + "select data from data where " "key_id = %lld order by sequence asc", id) < 0) { (*s_etat_processus).erreur_systeme = @@ -1697,6 +1740,7 @@ instruction_read(struct_processus *s_eta indicateur_48 = test_cfsf(s_etat_processus, 48); cf(s_etat_processus, 48); + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); if ((*s_etat_processus).erreur_execution != d_ex) @@ -1759,8 +1803,8 @@ instruction_read(struct_processus *s_eta return; } - if (alsprintf(&tampon2, "{ \"%s\" }", - (*s_etat_processus) + if (alsprintf(s_etat_processus, &tampon2, + "{ \"%s\" }", (*s_etat_processus) .instruction_courante) < 0) { (*s_etat_processus).erreur_systeme = @@ -1775,6 +1819,7 @@ instruction_read(struct_processus *s_eta indicateur_48 = test_cfsf(s_etat_processus, 48); cf(s_etat_processus, 48); + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); if ((*s_etat_processus).erreur_execution @@ -1974,6 +2019,7 @@ instruction_read(struct_processus *s_eta BUG(((*descripteur).type != 'C'), uprintf("Bad filtype !\n")); longueur_enregistrement = 0; + device = d_faux; if ((position_initiale = ftell((*descripteur).descripteur_c)) @@ -2016,7 +2062,8 @@ instruction_read(struct_processus *s_eta return; } - if ((format_chaine = conversion_majuscule((unsigned char *) + if ((format_chaine = conversion_majuscule( + s_etat_processus, (unsigned char *) (*(*l_element_courant_format).donnee).objet)) == NULL) { @@ -2073,14 +2120,88 @@ instruction_read(struct_processus *s_eta } free(format_chaine); + tampon3 = NULL; if (format_degenere == d_vrai) { + if (device == d_vrai) + { + longueur_questure = 4096; + index = 0; + + if ((tampon3 = malloc(((size_t) longueur_questure) * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + tampon3[index] = d_code_fin_chaine; + + fds[0].fd = fileno((*descripteur).descripteur_c); + fds[0].events = POLLIN; + fds[0].revents = 0; + + tcgetattr(fileno((*descripteur).descripteur_c), + &tc); + timeout = 0; + + for(i = 0; vitesses[i] != 0; i++) + { + if (cfgetispeed(&tc) == vitesses_constantes[i]) + { + // La durée entre deux caractères sur le + // périphérique série ne doit pas dépasser + // la moitié de la durée de transmission + // d'un caractère complet. + + timeout = (int) (((double) 1000) / + (((double) vitesses_constantes[i]) / + 4)); + break; + } + } + } + else + { + // Évite un warning de gcc. + longueur_questure = 0; + index = 0; + timeout = 0; + } + do { + if (device == d_vrai) + { + if (poll(fds, 1, timeout) == 0) + { + break; + } + } + c = getc((*descripteur).descripteur_c); longueur_enregistrement++; - } while((c != '\n') && (c != EOF)); + + if (device == d_vrai) + { + if (longueur_enregistrement >= + longueur_questure) + { + if ((tampon3 = realloc(tampon3, + (size_t) (longueur_questure *= 2))) + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + } + + tampon3[index++] = (unsigned char) c; + } + } while(c != EOF); if (device == d_faux) { @@ -2102,19 +2223,27 @@ instruction_read(struct_processus *s_eta longueur_enregistrement = longueur; } - if ((tampon_lecture = malloc(((size_t) - longueur_enregistrement) * sizeof(unsigned char))) - == NULL) + if ((device == d_vrai) && (format_degenere == d_vrai)) { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return; + longueur_effective = longueur_enregistrement; + tampon_lecture = tampon3; } + else + { + if ((tampon_lecture = malloc(((size_t) + longueur_enregistrement) * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } - longueur_effective = (integer8) fread(tampon_lecture, - sizeof(unsigned char), - (size_t) longueur_enregistrement, - (*descripteur).descripteur_c); + longueur_effective = (integer8) fread(tampon_lecture, + sizeof(unsigned char), + (size_t) longueur_enregistrement, + (*descripteur).descripteur_c); + } if (l_element_courant == NULL) { @@ -2154,11 +2283,23 @@ instruction_read(struct_processus *s_eta if (format_degenere == d_vrai) { - if (((*(*l_element_courant).donnee).objet = - analyse_flux(s_etat_processus, tampon_lecture, - longueur_enregistrement - 1)) == NULL) + if (device == d_faux) { - return; + if (((*(*l_element_courant).donnee).objet = + analyse_flux(s_etat_processus, tampon_lecture, + longueur_enregistrement - 1)) == NULL) + { + return; + } + } + else + { + if (((*(*l_element_courant).donnee).objet = + analyse_flux(s_etat_processus, tampon_lecture, + longueur_enregistrement)) == NULL) + { + return; + } } } else @@ -2628,6 +2769,7 @@ instruction_read(struct_processus *s_eta indicateur_48 = test_cfsf(s_etat_processus, 48); cf(s_etat_processus, 48); + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); if ((*s_etat_processus).erreur_execution != d_ex)