MED fichier: Fichier source de MEDfileCompatibility.c

MED fichier

MEDfileCompatibility.c
Aller à la documentation de ce fichier.
1 /* This file is part of MED.
2 *
3 * COPYRIGHT (C) 1999 - 2023 EDF R&D, CEA/DEN
4 * MED is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * MED is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with MED. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18
19 #include <med.h>
20 #include <med_config.h>
21 #include <med_outils.h>
22
23
33 med_err
34 MEDfileCompatibility(const char* const filename,
35 med_bool* const hdfok,
36 med_bool* const medok)
37 {
38 med_err _ret = -1;
39 med_idt _fid = 0;
40 med_idt _id = 0;
41 med_int _major = 0;
42 med_int _minor = 0;
43 med_int _release = 0;
44 med_int _hmajeur=0, _hmineur=0, _hrelease=0;
45 med_int _hversionMMR = 0;
46 med_int _fversionMM = 0;
47
48
49
50 _MEDmodeErreurVerrouiller();
51
52 *hdfok = MED_FALSE;
53 *medok = MED_FALSE;
54
55 /* Si le fichier n'est pas un fichier hdf retourne en indiquant hdfok=false et medok=false
56 mais pas de code d'erreur */
57 if ( H5Fis_hdf5(filename) <= 0 ) {goto SORTIE;};
58
59 /* Si l'on ne peut pas déterminer la version de la bibliothèque med, renvoie une erreur */
60 if (MEDlibraryHdfNumVersion(&_hmajeur, &_hmineur, &_hrelease) < 0) {
61 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDlibraryNumVersion");
62 goto ERROR;
63 }
64
65
66 /* Si la bibliothèque HDF n'est pas conforme à la version HDF de référence
67 de cette version de la bibliothèque MED renvoie hdfok=false et medok=false */
68 /* Il se peut tout de même que cette version d'HDF soit partiellement utilisable par la bibliothèque
69 ... on test aussi la version du modèle med */
70
71 _hversionMMR=10000*_hmajeur+100*_hmineur+_hrelease;
72 /* ISCRUTE(_hversionMMR); */
73 /* ISCRUTE(HDF_VERSION_NUM_REF); */
74 if ( (_hversionMMR >= HDF_VERSION_NUM_REF) &&
75 (_hmajeur == HDF_VERSION_MAJOR_REF ) &&
76 (_hmineur == HDF_VERSION_MINOR_REF ) ) *hdfok = MED_TRUE;
77
78 /* TODO : Vérifier si la version mineure HDF du fichier est supérieure
79 à la version mineure de la bibliothèque HDF utilisée :
80 - Je n'ai pas trouvé de mécanisme HDF pour trouver
81 les versions minimale et maximale des objets HDF du fichier
82 */
83
84 /* On appelle _MEDfileOpen et non MEDfileOpen car l'accessibilité du fichier
85 peut-être testée au préalable par l'utilisateur via
86 MEDfileExist (le fichier est supposé accessible).
87 Si le fichier ne s'ouvre pas, il n'est pas conforme, on n'affiche pas de message d'erreur car l'information est renvoyée par medok
88 */
89 if ((_fid = _MEDfileOpen((char *)filename,MED_ACC_RDONLY)) < 0) {
90 /* MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_FILE,filename); */
91 /* _ret = MED_ERR_OPEN MED_ERR_FILE; */
92 /* SSCRUTE(filename); */
93 /* goto ERROR; */
94 goto SORTIE;
95 }
96
97
98 if ( MEDfileNumVersionRd(_fid,&_major,&_minor,&_release) < 0) {
99 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDfileNumVersionRd");
100 goto ERROR;
101 }
102
103 _fversionMM = 100*_major+10*_minor;
104
105 *medok= MED_TRUE;
106 /* if ( (_major > 2) || ((_major == 2) && (_minor > 1)) ) *medok = MED_TRUE; */
107 if ( _fversionMM < 220 ) *medok = MED_FALSE;
108 /* Si le mineur du fichier est plus récent que celui de la bibliothèque,
109 la bibliothèque n'est pas capable de relire le modèle.*/
110 /* Les versions 3.y.z des fichiers med sont compatibles avec la bibliothèque 4.
111 La bibliothèque 4 autorise la création de fichiers 3.y.z et sait les gérer.
112 Celà est dû au fait que l'on a figé le modèle interne hdf à la version 1.8
113 */
114 if ( _fversionMM > 100*MED_NUM_MAJEUR+10*MED_NUM_MINEUR ) *medok = MED_FALSE;
115
116 #if MED_NUM_MAJEUR != 5
117 #error "Don't forget to update the test version here when you change the major version of the library !"
118 #endif
119 #if H5_VERS_MINOR > 12
120 #error "Don't forget to check the compatibility version of the library, depending on the internal hdf model choice !"
121 #error "Cf. _MEDfileCreate ..."
122 #endif
123
124 SORTIE:
125 _ret = 0;
126 ERROR:
127
128 if (_id > 0)
129 if (_MEDdatagroupFermer(_id) < 0) {
130 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,MED_INFOS);
131 _ret = -1;
132 }
133
134 if (_fid > 0)
135 if (MEDfileClose(_fid) < 0) {
136 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_FILE,filename);
137 _ret = -1;
138 }
139
140 return _ret;
141 }
MED_ACC_RDONLY
Definition: med.h:122
MED_ERR_API
#define MED_ERR_API
Definition: med_err.h:111
MED_TRUE
Definition: med.h:262
filename
#define filename
Definition: 4.0.1/test10.c:75
med_idt
hid_t med_idt
Definition: med.h:333
MED_FALSE
Definition: med.h:262
MED_ERR_
#define MED_ERR_(rt, r1, r2, r3)
Definition: med_utils.h:160
_MEDfileOpen
MEDC_EXPORT med_idt _MEDfileOpen(const char *const filename, const med_access_mode accessmode)
med_err
herr_t med_err
Definition: med.h:334
med_outils.h
MED_ERR_CLOSE
#define MED_ERR_CLOSE
Definition: med_err.h:30
MEDfileNumVersionRd
MEDC_EXPORT med_err MEDfileNumVersionRd(const med_idt fid, med_int *const major, med_int *const minor, med_int *const release)
Lecture du numéro de version de la bibliothèque MED utilisée pour créer le fichier.
Definition: MEDfileNumVersionRd.c:34
med_int
int med_int
Definition: med.h:344
MED_ERR_FILE
#define MED_ERR_FILE
Definition: med_err.h:82
med_config.h
med_bool
med_bool
Definition: med.h:262
MED_ERR_CALL
#define MED_ERR_CALL
Definition: med_err.h:48
HDF_VERSION_MAJOR_REF
#define HDF_VERSION_MAJOR_REF
Definition: med.h:33
MEDfileClose
MEDC_EXPORT med_err MEDfileClose(med_idt fid)
Fermeture d'un fichier MED.
Definition: MEDfileClose.c:30
MED_ERR_DATAGROUP
#define MED_ERR_DATAGROUP
Definition: med_err.h:99
MED_INFOS
#define MED_INFOS
Definition: med_outils.h:256
med.h
MEDlibraryHdfNumVersion
MEDC_EXPORT med_err MEDlibraryHdfNumVersion(med_int *const major, med_int *const minor, med_int *const release)
Renvoie les 3 numéros de version de la librairie HDF5 utilisée par MED.
Definition: MEDlibraryHdfNumVersion.c:33
MEDfileCompatibility
med_err MEDfileCompatibility(const char *const filename, med_bool *const hdfok, med_bool *const medok)
Vérification de la compatibilité d'un fichier avec HDF et MED.
Definition: MEDfileCompatibility.c:34
MED_NUM_MINEUR
#define MED_NUM_MINEUR
Definition: med.h:68
_MEDmodeErreurVerrouiller
MEDC_EXPORT void _MEDmodeErreurVerrouiller(void)
HDF_VERSION_NUM_REF
#define HDF_VERSION_NUM_REF
Definition: med.h:36
HDF_VERSION_MINOR_REF
#define HDF_VERSION_MINOR_REF
Definition: med.h:34
_MEDdatagroupFermer
MEDC_EXPORT med_err _MEDdatagroupFermer(med_idt id)
MED_NUM_MAJEUR
#define MED_NUM_MAJEUR
Definition: med.h:67