--- rpl/src/instructions_i3.c 2010/01/26 15:22:45 1.1 +++ rpl/src/instructions_i3.c 2012/01/05 10:19:02 1.32 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.9 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.5 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -48,6 +48,8 @@ instruction_inquire(struct_processus *s_ long position_courante; + struct_descripteur_fichier *dfichier; + struct flock lock; struct_objet *s_objet_argument_1; @@ -55,6 +57,7 @@ instruction_inquire(struct_processus *s_ struct_objet *s_objet_resultat; unsigned char caractere; + unsigned char *nom; unsigned char *requete; unsigned char verrou; @@ -185,42 +188,73 @@ instruction_inquire(struct_processus *s_ return; } - /* - * La fin du fichier renvoyée ne correspond pas à la fin physique - * du fichier mais à un défaut d'enregistrement. - */ - - if ((fichier = descripteur_fichier(s_etat_processus, - (struct_fichier *) (*s_objet_argument_2).objet)) == NULL) + if ((dfichier = descripteur_fichier(s_etat_processus, + (struct_fichier *) (*s_objet_argument_2).objet)) == + NULL) { return; } - if ((position_courante = ftell(fichier)) == -1) + if ((*dfichier).type != 'C') { - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + free(requete); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_type_fichier; return; } - fin_fichier = d_vrai; - - while(feof(fichier) == 0) + if ((*((struct_fichier *) (*s_objet_argument_2).objet)).binaire + != 'F') { - if (fread(&caractere, sizeof(unsigned char), (size_t) 1, - fichier) > 0) + /* + * La fin du fichier renvoyée ne correspond pas à la fin + * physique du fichier mais à un défaut d'enregistrement. + */ + + if ((position_courante = ftell((*dfichier).descripteur_c)) + == -1) { - if (caractere == '{') + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + fin_fichier = d_vrai; + + while(feof((*dfichier).descripteur_c) == 0) + { + if (fread(&caractere, sizeof(unsigned char), (size_t) 1, + (*dfichier).descripteur_c) > 0) { - fin_fichier = d_faux; - break; + if (caractere == '{') + { + fin_fichier = d_faux; + break; + } } } - } - if (fseek(fichier, position_courante, SEEK_SET) != 0) + if (fseek((*dfichier).descripteur_c, position_courante, + SEEK_SET) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + } + else { - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; - return; + // Fichier de type FLOW + if (feof((*dfichier).descripteur_c) == 0) + { + fin_fichier = d_faux; + } + else + { + fin_fichier = d_vrai; + } } if (fin_fichier == d_faux) @@ -430,14 +464,23 @@ instruction_inquire(struct_processus *s_ * La question porte sur un fichier fermé. */ + if ((nom = transliteration(s_etat_processus, + (unsigned char *) (*s_objet_argument_2).objet, + d_locale, "UTF-8")) == NULL) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + return; + } + if (strcmp(requete, "EXISTENCE") == 0) { - erreur = caracteristiques_fichier(s_etat_processus, - (unsigned char *) (*s_objet_argument_2).objet, + erreur = caracteristiques_fichier(s_etat_processus, nom, &existence, &ouverture, &unite); if (erreur != d_absence_erreur) { + free(nom); free(requete); liberation(s_etat_processus, s_objet_argument_1); @@ -474,13 +517,13 @@ instruction_inquire(struct_processus *s_ } else if (strcmp(requete, "LOCK") == 0) { - erreur = caracteristiques_fichier(s_etat_processus, - (unsigned char *) (*s_objet_argument_2).objet, + erreur = caracteristiques_fichier(s_etat_processus, nom, &existence, &ouverture, &unite); if (erreur != d_absence_erreur) { free(requete); + free(nom); liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); @@ -504,6 +547,7 @@ instruction_inquire(struct_processus *s_ */ free(requete); + free(nom); liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); @@ -519,10 +563,10 @@ instruction_inquire(struct_processus *s_ * Fichier existant */ - if ((fichier = fopen((unsigned char *) - (*s_objet_argument_2).objet, "r+")) == NULL) + if ((fichier = fopen(nom, "r+")) == NULL) { free(requete); + free(nom); liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); @@ -541,6 +585,8 @@ instruction_inquire(struct_processus *s_ if (fcntl(fileno(fichier), F_GETLK, &lock) == -1) { + free(nom); + if (fclose(fichier) != 0) { free(requete); @@ -580,6 +626,8 @@ instruction_inquire(struct_processus *s_ if (fcntl(fileno(fichier), F_GETLK, &lock) == -1) { + free(nom); + if (fclose(fichier) != 0) { free(requete); @@ -668,6 +716,7 @@ instruction_inquire(struct_processus *s_ if (fclose(fichier) != 0) { free(requete); + free(nom); liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); @@ -680,6 +729,7 @@ instruction_inquire(struct_processus *s_ } else { + free(nom); free(requete); liberation(s_etat_processus, s_objet_argument_1); @@ -688,6 +738,8 @@ instruction_inquire(struct_processus *s_ (*s_etat_processus).erreur_execution = d_ex_erreur_requete_fichier; return; } + + free(nom); } else {