--- rpl/src/instructions_r4.c 2016/03/29 12:27:35 1.99 +++ rpl/src/instructions_r4.c 2023/11/27 13:56:46 1.120 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.25 - Copyright (C) 1989-2016 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. @@ -869,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; @@ -961,10 +962,12 @@ instruction_read(struct_processus *s_eta printf("(read a record of a file)\n\n"); } - printf(" 1: %s, %s\n\n", d_FCH, d_SCK); + printf(" 1: %s, %s\n", d_FCH, d_SCK); + printf("-> 1: %s\n\n", d_LST); printf(" 2: %s, %s\n", d_INT, d_CHN); printf(" 1: %s\n", d_FCH); + printf("-> 1: %s\n\n", d_LST); return; } else if ((*s_etat_processus).test_instruction == 'Y') @@ -2072,42 +2075,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); @@ -2117,6 +2107,31 @@ 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); @@ -2201,6 +2216,14 @@ instruction_read(struct_processus *s_eta tampon3[index++] = (unsigned char) c; } + + if (format_oriente_ligne == d_vrai) + { + if (c == '\n') + { + break; + } + } } while(c != EOF); if (device == d_faux) @@ -2513,6 +2536,8 @@ instruction_read(struct_processus *s_eta } // Une donnée a été reçue. + // Attention : on peut TOUJOURS recevoir 0 + // indiquant que la socket est close. if (ios >= 0) { @@ -2520,23 +2545,30 @@ instruction_read(struct_processus *s_eta position_initiale = 0; presence_indicateur = d_faux; - do + if (ios > 0) { - if (tampon_lecture[position_initiale] == '{') + do { - presence_indicateur = d_vrai; - break; - } + if (tampon_lecture[position_initiale] == '{') + { + presence_indicateur = d_vrai; + break; + } - position_initiale++; - } while(position_initiale < longueur_effective); + position_initiale++; + } while(position_initiale < longueur_effective); + } + else + { + presence_indicateur = d_vrai; + } if (presence_indicateur == d_vrai) { position_finale = position_initiale + 1; presence_chaine = d_faux; presence_indicateur = d_faux; - niveau = 1; + niveau = 0; while(position_finale < longueur_effective) { @@ -2544,20 +2576,11 @@ instruction_read(struct_processus *s_eta if (caractere == '"') { - if (position_finale > 0) - { - if (tampon_lecture[position_finale - 1] - != '\\') - { - presence_chaine = (presence_chaine == - d_vrai) ? d_faux : d_vrai; - } - } - else + if (tampon_lecture[position_finale - 1] + != '\\') { - presence_chaine = - (presence_chaine == d_vrai) - ? d_faux : d_vrai; + presence_chaine = (presence_chaine == + d_vrai) ? d_faux : d_vrai; } } else @@ -2762,7 +2785,6 @@ instruction_read(struct_processus *s_eta } } while(trame_complete == d_faux); - tampon_lecture[++position_finale] = d_code_fin_chaine; tampon = (*s_etat_processus).instruction_courante; (*s_etat_processus).instruction_courante = tampon_lecture; @@ -3156,7 +3178,7 @@ instruction_read(struct_processus *s_eta return; } - if (ios <= 0) + if (ios < 0) { nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); @@ -3187,7 +3209,7 @@ instruction_read(struct_processus *s_eta position_initiale = 0; presence_indicateur = d_faux; } - else if (ios > 0) + else if (ios >= 0) { // On retire une trame du buffer. @@ -3522,13 +3544,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; @@ -3556,7 +3577,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); } @@ -3566,7 +3588,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); } @@ -3577,7 +3600,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 @@ -3676,22 +3700,44 @@ instruction_read(struct_processus *s_eta if (longueur_effective == longueur_questure) { + trame_complete = d_faux; free(tampon_lecture); - longueur_questure *= 2; + + // Taille standard des jumbo frames + if (longueur_questure <= 9000) + { + longueur_questure *= 2; + } + else + { + longueur_questure += 9000; + } + } + else + { + trame_complete = d_vrai; } - } while(longueur_effective == longueur_questure); + } while(trame_complete == d_faux); longueur_enregistrement = 1; for(i = 0; i < longueur_effective; i++) { - if (isprint(tampon_lecture[i]) != 0) + if (isprint(tampon_lecture[i]) == 0) { longueur_enregistrement += 4; } else { - longueur_enregistrement++; + if ((tampon_lecture[i] == '"') || + (tampon_lecture[i] == '"')) + { + longueur_enregistrement += 2; + } + else + { + longueur_enregistrement++; + } } } @@ -3705,8 +3751,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; @@ -3718,8 +3764,19 @@ instruction_read(struct_processus *s_eta { if (isprint(tampon_lecture[i]) != 0) { - (*ptr) = tampon_lecture[i]; - ptr++; + if ((tampon_lecture[i] == '"') || + (tampon_lecture[i] == '"')) + { + (*ptr) = '\\'; + ptr++; + (*ptr) = tampon_lecture[i]; + ptr++; + } + else + { + (*ptr) = tampon_lecture[i]; + ptr++; + } } else { @@ -3789,7 +3846,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; @@ -3800,7 +3857,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 = @@ -3880,7 +3937,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 = @@ -3961,7 +4018,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); } @@ -3972,7 +4029,6 @@ instruction_read(struct_processus *s_eta { return; } -#endif } } else