--- rpl/src/instructions_r4.c 2012/06/21 16:07:25 1.58 +++ rpl/src/instructions_r4.c 2012/06/22 10:12:19 1.59 @@ -864,11 +864,14 @@ instruction_read(struct_processus *s_eta integer8 position_finale; integer8 position_initiale; + logical1 format_degenere; logical1 indicateur_48; logical1 presence_chaine; logical1 presence_indicateur; logical1 trame_complete; + long longueur; + socklen_t longueur_adresse; sqlite3_stmt *ppStmt; @@ -888,6 +891,7 @@ instruction_read(struct_processus *s_eta struct_descripteur_fichier *descripteur; struct_liste_chainee *l_element_courant; + struct_liste_chainee *l_element_courant_format; struct_liste_chainee *l_element_inclus; struct_liste_chainee *l_element_suivant; @@ -901,6 +905,7 @@ instruction_read(struct_processus *s_eta unsigned char caractere; unsigned char *clef_utf8; unsigned char *commande; + unsigned char *format_chaine; unsigned char poubelle[256]; unsigned char *ptr; unsigned char *tampon_lecture; @@ -2056,33 +2061,10 @@ printf("L=%d\n", longueur_enregistrement return; } - do - { - c = getc((*descripteur).descripteur_c); - longueur_enregistrement++; - } while((c != '\n') && (c != EOF)); - - if (fseek((*descripteur).descripteur_c, position_initiale, - SEEK_SET) != 0) - { - liberation(s_etat_processus, s_objet_argument_1); - - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; - return; - } - - if ((tampon_lecture = malloc((longueur_enregistrement) - * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return; - } - - longueur_effective = fread(tampon_lecture, - (size_t) sizeof(unsigned char), - (size_t) longueur_enregistrement - 1, - (*descripteur).descripteur_c); + l_element_courant_format = (struct_liste_chainee *) + (*(*((struct_fichier *) (*s_objet_argument_1).objet)) + .format).objet; + l_element_courant = NULL; if ((s_objet_resultat = allocation(s_etat_processus, LST)) == NULL) @@ -2092,33 +2074,173 @@ printf("L=%d\n", longueur_enregistrement return; } - if (((*s_objet_resultat).objet = - allocation_maillon(s_etat_processus)) == NULL) + while(l_element_courant_format != NULL) { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return; - } + if ((*(*l_element_courant_format).donnee).type != CHN) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_resultat); - (*((struct_liste_chainee *) (*s_objet_resultat).objet)) - .suivant = NULL; + (*s_etat_processus).erreur_execution = + d_ex_erreur_type_argument; + return; + } - if (((*((struct_liste_chainee *) (*s_objet_resultat).objet)) - .donnee = allocation(s_etat_processus, CHN)) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return; - } + if ((format_chaine = conversion_majuscule((unsigned char *) + (*(*l_element_courant_format).donnee).objet)) + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } - if ((((*(*((struct_liste_chainee *) (*s_objet_resultat).objet)) - .donnee)).objet = analyse_flux(s_etat_processus, - tampon_lecture, longueur_enregistrement - 1)) == NULL) - { - 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); - free(tampon_lecture); + (*s_etat_processus).erreur_execution = + d_ex_erreur_format_fichier; + return; + } + + longueur = strlen(format_chaine); + + if (format_chaine[longueur] != ')') + { + 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_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]), "%ld", &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); + + if (format_degenere == d_vrai) + { + do + { + c = getc((*descripteur).descripteur_c); + longueur_enregistrement++; + } while((c != '\n') && (c != EOF)); + + if (fseek((*descripteur).descripteur_c, + position_initiale, SEEK_SET) != 0) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + } + else + { + longueur_enregistrement = longueur; + } + + if ((tampon_lecture = malloc((longueur_enregistrement) + * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + longueur_effective = fread(tampon_lecture, + (size_t) sizeof(unsigned char), + (size_t) longueur_enregistrement, + (*descripteur).descripteur_c); + + if (l_element_courant == NULL) + { + // Premier maillon de la liste + if (((*s_objet_resultat).objet = + allocation_maillon(s_etat_processus)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + l_element_courant = (*s_objet_resultat).objet; + } + else + { + if (((*l_element_courant).suivant = + allocation_maillon(s_etat_processus)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + l_element_courant = (*l_element_courant).suivant; + } + + (*l_element_courant).suivant = NULL; + + if (((*l_element_courant).donnee = + allocation(s_etat_processus, CHN)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (format_degenere == d_vrai) + { + 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; + } + } + + free(tampon_lecture); + + l_element_courant_format = + (*l_element_courant_format).suivant; + } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), @@ -2342,9 +2464,21 @@ printf("L=%d\n", longueur_enregistrement if (caractere == '"') { - presence_chaine = - (presence_chaine == d_vrai) - ? d_faux : d_vrai; + if (position_finale > 0) + { + 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; + } } else {