--- rpl/src/instructions_r4.c 2010/03/04 10:17:52 1.4 +++ rpl/src/instructions_r4.c 2010/03/06 18:29:07 1.5 @@ -751,7 +751,7 @@ instruction_relax(struct_processus *s_et void instruction_rewind(struct_processus *s_etat_processus) { - file *descripteur; + struct_descripteur_fichier *descripteur; struct_objet *s_objet_argument; @@ -803,11 +803,19 @@ instruction_rewind(struct_processus *s_e return; } - if (fseek(descripteur, (long) 0, SEEK_SET) != 0) + if ((*descripteur).type == 'C') + { + if (fseek((*descripteur).descripteur_c, (long) 0, SEEK_SET) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + } + else { liberation(s_etat_processus, s_objet_argument); - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + (*s_etat_processus).erreur_execution = d_ex_erreur_type_fichier; return; } } @@ -838,8 +846,6 @@ instruction_rewind(struct_processus *s_e void instruction_read(struct_processus *s_etat_processus) { - file *descripteur; - logical1 indicateur_48; logical1 presence_chaine; logical1 presence_indicateur; @@ -862,6 +868,8 @@ instruction_read(struct_processus *s_eta struct timespec attente; + struct_descripteur_fichier *descripteur; + struct_objet *s_objet_adresse; struct_objet *s_objet_argument; struct_objet *s_objet_resultat; @@ -919,6 +927,12 @@ instruction_read(struct_processus *s_eta if ((*s_objet_argument).type == FCH) { + if ((descripteur = descripteur_fichier(s_etat_processus, + (struct_fichier *) (*s_objet_argument).objet)) == NULL) + { + return; + } + /* * Vérification des verrous */ @@ -929,13 +943,8 @@ instruction_read(struct_processus *s_eta lock.l_len = 0; lock.l_pid = getpid(); - if ((descripteur = descripteur_fichier(s_etat_processus, - (struct_fichier *) (*s_objet_argument).objet)) == NULL) - { - return; - } - - if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1) + if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock) + == -1) { liberation(s_etat_processus, s_objet_argument); @@ -966,10 +975,13 @@ instruction_read(struct_processus *s_eta else if ((*((struct_fichier *) (*s_objet_argument).objet)).protection == 'N') { - if (fflush(descripteur) != 0) + if ((*descripteur).type == 'C') { - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; - return; + if (fflush((*descripteur).descripteur_c) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } } } @@ -995,7 +1007,10 @@ instruction_read(struct_processus *s_eta return; } - if ((position_initiale = ftell(descripteur)) == -1) + BUG(((*descripteur).type != 'C'), uprintf("Bad filtype !\n")); + + if ((position_initiale = ftell((*descripteur).descripteur_c)) + == -1) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; @@ -1005,7 +1020,7 @@ instruction_read(struct_processus *s_eta { longueur_effective = fread(tampon_lecture, (size_t) sizeof(unsigned char), longueur_questure, - descripteur); + (*descripteur).descripteur_c); pointeur = 0; presence_indicateur = d_faux; @@ -1042,7 +1057,8 @@ instruction_read(struct_processus *s_eta presence_chaine = d_faux; niveau = 1; - if (fseek(descripteur, position_finale, SEEK_SET) != 0) + if (fseek((*descripteur).descripteur_c, position_finale, + SEEK_SET) != 0) { liberation(s_etat_processus, s_objet_argument); free(tampon_lecture); @@ -1055,7 +1071,7 @@ instruction_read(struct_processus *s_eta { longueur_effective = fread(tampon_lecture, (size_t) sizeof(unsigned char), longueur_questure, - descripteur); + (*descripteur).descripteur_c); pointeur = 0; presence_indicateur = d_faux; @@ -1119,7 +1135,8 @@ instruction_read(struct_processus *s_eta return; } - if (fseek(descripteur, position_initiale, SEEK_SET) != 0) + if (fseek((*descripteur).descripteur_c, position_initiale, + SEEK_SET) != 0) { liberation(s_etat_processus, s_objet_argument); free(tampon_lecture); @@ -1131,7 +1148,7 @@ instruction_read(struct_processus *s_eta longueur_effective = fread(tampon_lecture, (size_t) sizeof(unsigned char), (size_t) longueur_enregistrement, - descripteur); + (*descripteur).descripteur_c); if (longueur_effective != longueur_enregistrement) { @@ -1141,12 +1158,21 @@ instruction_read(struct_processus *s_eta tampon_lecture[longueur_enregistrement] = d_code_fin_chaine; tampon = (*s_etat_processus).instruction_courante; - (*s_etat_processus).instruction_courante = tampon_lecture; + + if (((*s_etat_processus).instruction_courante = + transliteration(s_etat_processus, tampon_lecture, + "UTF-8", d_locale)) == NULL) + { + liberation(s_etat_processus, s_objet_argument); + free(tampon_lecture); + return; + } indicateur_48 = test_cfsf(s_etat_processus, 48); cf(s_etat_processus, 48); recherche_type(s_etat_processus); + free((*s_etat_processus).instruction_courante); if ((*s_etat_processus).erreur_execution != d_ex) {