--- rpl/src/instructions_r4.c 2022/09/07 13:40:38 1.115 +++ rpl/src/instructions_r4.c 2024/01/17 16:57:15 1.122 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.34 - Copyright (C) 1989-2021 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.36 + Copyright (C) 1989-2024 Dr. BERTRAND Joël This file is part of RPL/2. @@ -962,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') @@ -2534,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) { @@ -2541,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) { @@ -2565,20 +2576,11 @@ instruction_read(struct_processus *s_eta if (caractere == '"') { - if (position_finale > 0) + if (tampon_lecture[position_finale - 1] + != '\\') { - if (tampon_lecture[position_finale - 1] - != '\\') - { - presence_chaine = (presence_chaine == - d_vrai) ? d_faux : d_vrai; - } - } - else - { - presence_chaine = - (presence_chaine == d_vrai) - ? d_faux : d_vrai; + presence_chaine = (presence_chaine == + d_vrai) ? d_faux : d_vrai; } } else @@ -2783,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; @@ -3177,7 +3178,7 @@ instruction_read(struct_processus *s_eta return; } - if (ios <= 0) + if (ios < 0) { nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); @@ -3208,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. @@ -3699,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; + } } - } while(longueur_effective == longueur_questure); + else + { + trame_complete = d_vrai; + } + } 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++; + } } } @@ -3741,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 {