--- rpl/src/instructions_r4.c 2013/09/26 14:19:28 1.82 +++ rpl/src/instructions_r4.c 2023/08/07 17:42:57 1.116 @@ -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.35 + Copyright (C) 1989-2023 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; @@ -867,6 +869,7 @@ instruction_read(struct_processus *s_eta logical1 device; logical1 format_degenere; + logical1 format_oriente_ligne; logical1 indicateur_48; logical1 presence_chaine; logical1 presence_indicateur; @@ -878,12 +881,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 +913,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 +1276,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 +1332,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 +1431,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 +1505,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 +1579,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 +1673,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 +1741,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 +1804,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 +1820,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 +2020,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 +2063,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) { @@ -2025,42 +2073,29 @@ instruction_read(struct_processus *s_eta return; } - if (strncmp("LENGTH*(", format_chaine, 8) != 0) + if (strcmp("LINE*(*)", format_chaine) == 0) { - liberation(s_etat_processus, s_objet_argument_1); - liberation(s_etat_processus, s_objet_resultat); - free(format_chaine); - - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return; + format_degenere = d_vrai; + format_oriente_ligne = d_vrai; } - - longueur = (integer8) strlen(format_chaine); - - if (format_chaine[longueur - 1] != ')') + else { - liberation(s_etat_processus, s_objet_argument_1); - liberation(s_etat_processus, s_objet_resultat); - free(format_chaine); + format_oriente_ligne = d_faux; - (*s_etat_processus).erreur_execution = - d_ex_erreur_format_fichier; - return; - } + if (strncmp("LENGTH*(", format_chaine, 8) != 0) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_resultat); + free(format_chaine); - format_chaine[longueur] = d_code_fin_chaine; + (*s_etat_processus).erreur_execution = + d_ex_erreur_format_fichier; + return; + } - if (format_chaine[8] == '*') - { - format_degenere = d_vrai; - } - else - { - // Détermination de la longueur - format_degenere = d_faux; + longueur = (integer8) strlen(format_chaine); - if (sscanf(&(format_chaine[8]), "%lld", &longueur) != 1) + if (format_chaine[longueur - 1] != ')') { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_resultat); @@ -2070,17 +2105,124 @@ instruction_read(struct_processus *s_eta d_ex_erreur_format_fichier; return; } + + format_chaine[longueur] = d_code_fin_chaine; + + if (format_chaine[8] == '*') + { + format_degenere = d_vrai; + } + else + { + // Détermination de la longueur + format_degenere = d_faux; + + if (sscanf(&(format_chaine[8]), "%lld", &longueur) + != 1) + { + liberation(s_etat_processus, + s_objet_argument_1); + liberation(s_etat_processus, s_objet_resultat); + free(format_chaine); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_format_fichier; + return; + } + } } 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; + } + + if (format_oriente_ligne == d_vrai) + { + if (c == '\n') + { + break; + } + } + } while(c != EOF); if (device == d_faux) { @@ -2102,19 +2244,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 +2304,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 +2790,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) @@ -3380,13 +3543,12 @@ instruction_read(struct_processus *s_eta } else { // FLOW -#if 0 longueur_questure = 256; do { - if ((tampon_lecture = malloc((longueur_questure + 1) * - sizeof(unsigned char))) == NULL) + if ((tampon_lecture = malloc((((size_t) longueur_questure) + 1) + * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -3414,7 +3576,8 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_unix); longueur_effective = recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, longueur_questure, + tampon_lecture, (long unsigned int) + longueur_questure, MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_unix, &longueur_adresse); } @@ -3424,7 +3587,8 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_ipv4); longueur_effective = recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, longueur_questure, + tampon_lecture, (long unsigned int) + longueur_questure, MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv4, &longueur_adresse); } @@ -3435,7 +3599,8 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_ipv6); longueur_effective = recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, longueur_questure, + tampon_lecture, (long unsigned int) + longueur_questure, MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); # else @@ -3563,8 +3728,8 @@ instruction_read(struct_processus *s_eta return; } - if (((*s_objet_type).objet = malloc(longueur_enregistrement * - sizeof(unsigned char))) == NULL) + if (((*s_objet_type).objet = malloc((size_t) longueur_enregistrement + * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -3647,7 +3812,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = 0; recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, tampon_lecture, - position_finale, MSG_DONTWAIT, + (long unsigned int) longueur_effective, MSG_DONTWAIT, NULL, &longueur_adresse); (*s_objet_adresse).objet = NULL; @@ -3658,7 +3823,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_ipv4); recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, tampon_lecture, - position_finale, MSG_DONTWAIT, + (long unsigned int) longueur_effective, MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv4, &longueur_adresse); if (((*s_objet_adresse).objet = @@ -3738,7 +3903,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_ipv6); recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, tampon_lecture, - position_finale, MSG_DONTWAIT, + (long unsigned int) longueur_effective, MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); if (((*s_objet_adresse).objet = @@ -3819,7 +3984,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = 0; recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, tampon_lecture, - position_finale, MSG_DONTWAIT, + (long unsigned int) longueur_effective, MSG_DONTWAIT, NULL, &longueur_adresse); } @@ -3830,7 +3995,6 @@ instruction_read(struct_processus *s_eta { return; } -#endif } } else