--- rpl/src/instructions_i3.c 2010/01/27 22:22:13 1.2 +++ rpl/src/instructions_i3.c 2024/01/17 16:57:14 1.75 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.10 - Copyright (C) 1989-2010 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. @@ -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; @@ -93,6 +96,7 @@ instruction_inquire(struct_processus *s_ printf(" NAME : %s\n", d_CHN); printf(" FORMATTED : %s (true/false)\n", d_INT); printf(" KEY FIELD : %s\n", d_INT); + printf(" FORMAT : %s\n", d_LST); printf(" PROTECTION : %s (WRITEONLY/READONLY/READWRITE)\n\n", d_CHN); @@ -105,7 +109,6 @@ instruction_inquire(struct_processus *s_ printf(" Queries by name:\n\n"); } - printf(" FORMAT : %s\n", d_LST); printf(" EXISTENCE : %s (true/false)\n", d_INT); printf(" LOCK : %s (NONE/READ/WRITE)\n", d_CHN); @@ -150,7 +153,7 @@ instruction_inquire(struct_processus *s_ return; } - if ((requete = conversion_majuscule((unsigned char *) + if ((requete = conversion_majuscule(s_etat_processus, (unsigned char *) (*s_objet_argument_1).objet)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -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 { @@ -737,7 +789,7 @@ instruction_idft(struct_processus *s_eta logical1 presence_longueur_dft; - long longueur_dft_signee; + integer8 longueur_dft_signee; struct_complexe16 *matrice_f77; @@ -745,10 +797,10 @@ instruction_idft(struct_processus *s_eta struct_objet *s_objet_longueur_dft; struct_objet *s_objet_resultat; - unsigned long i; - unsigned long j; - unsigned long k; - unsigned long longueur_dft; + integer8 i; + integer8 j; + integer8 k; + integer8 longueur_dft; (*s_etat_processus).erreur_execution = d_ex; @@ -866,7 +918,7 @@ instruction_idft(struct_processus *s_eta (*s_objet_argument).objet)).taille; } - if ((matrice_f77 = malloc(longueur_dft * + if ((matrice_f77 = malloc(((size_t) longueur_dft) * sizeof(struct_complexe16))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -916,7 +968,7 @@ instruction_idft(struct_processus *s_eta } nombre_lignes = 1; - nombre_colonnes = longueur_dft; + nombre_colonnes = (integer4) longueur_dft; inverse = -1; dft(matrice_f77, &nombre_lignes, &nombre_colonnes, &inverse, &erreur); @@ -956,9 +1008,9 @@ instruction_idft(struct_processus *s_eta (*s_objet_argument).objet)).nombre_colonnes; } - if ((matrice_f77 = malloc(longueur_dft * + if ((matrice_f77 = malloc(((size_t) longueur_dft) * ((size_t) (*((struct_matrice *) (*s_objet_argument).objet)) - .nombre_lignes * sizeof(struct_complexe16))) == NULL) + .nombre_lignes) * sizeof(struct_complexe16))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -1034,9 +1086,9 @@ instruction_idft(struct_processus *s_eta } } - nombre_lignes = (*((struct_matrice *) (*s_objet_argument).objet)) - .nombre_lignes; - nombre_colonnes = longueur_dft; + nombre_lignes = (integer4) (*((struct_matrice *) (*s_objet_argument) + .objet)).nombre_lignes; + nombre_colonnes = (integer4) longueur_dft; inverse = -1; dft(matrice_f77, &nombre_lignes, &nombre_colonnes, &inverse, &erreur); @@ -1063,8 +1115,8 @@ instruction_idft(struct_processus *s_eta longueur_dft; if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau = - malloc((*((struct_matrice *) (*s_objet_resultat).objet)) - .nombre_lignes * sizeof(struct_complexe16 *))) == NULL) + malloc(((size_t) (*((struct_matrice *) (*s_objet_resultat) + .objet)).nombre_lignes) * sizeof(struct_complexe16 *))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -1075,8 +1127,8 @@ instruction_idft(struct_processus *s_eta { if ((((struct_complexe16 **) (*((struct_matrice *) (*s_objet_resultat).objet)).tableau)[i] = - malloc((*((struct_matrice *) - (*s_objet_resultat).objet)).nombre_colonnes * + malloc(((size_t) (*((struct_matrice *) + (*s_objet_resultat).objet)).nombre_colonnes) * sizeof(struct_complexe16))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;