MED fichier
MEDversionedApi3C.c
Aller à la documentation de ce fichier.
1 /* This file is part of MED.
2  *
3  * COPYRIGHT (C) 1999 - 2016 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 <stdio.h>
20 #include <med_config.h>
21 #include <med_misc.h>
22 #include <med_utils.h>
23 
24 extern MedFuncType getVersionedApi3(const char * const keycharpart,
25  const char * const keynumpart);
26 
27 
28 /* La gestion suivante suppose d'utiliser un digit par numéro intervenant dans la verion X.Y.Z */
29 /* ex 9.10.9 ne peut pas être géré. */
30 MedFuncType _MEDversionedApi3( const char * const key,
31  const med_int majeur,const med_int mineur,const med_int release) {
32 
33  MedFuncType func=(MedFuncType) NULL;
34  char _version[4]="", _version236[4]="236";
35  int _n=0;
36  int _fversionMM = 100*majeur+10*mineur;
37  int _fversionMMR = _fversionMM+release;
38  int _litminor = mineur;
39  const int _lminminor = 0;
40 
41  if ( _fversionMMR < 220 ) {
42  MESSAGE("Cette bibliothèque MED n'est pas capable de lire un fichier MED de version < 2.2.0");
43  MESSAGE("La version demandée est :");
44  ISCRUTE_int(_fversionMMR);
45  goto QUIT;
46  }
47 
48  if ( _fversionMM > 100*MED_NUM_MAJEUR+10*MED_NUM_MINEUR ) {
49  MESSAGE("Cette bibliothèque MED n'est pas capable de lire un fichier MED dont le mineur de la version "
50  "excède celui de la bibliothèque.");
51  MESSAGE("La version demandée est :");ISCRUTE_int(_fversionMMR);
52  goto QUIT;
53  }
54 
55 
56 
57  /* Dans la bibliothèque 3.0 toutes les APIs en lecture/info
58  * sont versionées en 2.3.6. Celles-ci sont capables de compatibilité
59  * ascendante des fichiers 2.2.0 à 2.3.6 */
60  if ( _fversionMMR <= 236 ) { func=getVersionedApi3(key,_version236); goto QUIT;}
61 
62 
63  /* - Recherche du dernier numéro mineur disponible pour la routine versionné
64  dans la bibliothèque MED actuelle versionMMR 100*MED_NUM_MAJEUR+10*MED_NUM_MINEUR
65  -A partir de la 2.4.0, on oblige le developpeur à versionner
66  uniquement des routines en x.y.0 ; x.y+1.* et x.y.* étant incompatibles (en terme de modèle)
67  et x.y.0 et x.y.a étant compatible, x.y.a n'apparait pas dans la table
68  de versionement
69  */
70 
71  /*
72  * Lorsqu'une routine non versionnée doit être versionnée, la nouvelle
73  * implémentation est numérotée en "MED_NUM_MAJEUR"MED_NUM_MINEUR" et l'ancienne
74  * en "MED_NUM_MAJEUR".0
75  *
76  */
77 
78  /*
79  * La recherche d'une routine compatible se fait de façon décroissante
80  * à partir du mineur du fichier jusqu'à 0 ou une poentielle rupture de compatibilité
81  * (le mineur a changé)
82  *
83  */
84 
85 
86  /*Rem (_fversionMMR > 290) car cette version est une version de developpement et aucun fichier
87  issu de bibliotèques 2.y.z ne devrait être en circulation.*/
88  if ( (_fversionMMR > 290) ||
89  (_fversionMM <= (100*MED_NUM_MAJEUR+10*MED_NUM_MINEUR) )
90  ) {
91 
92  /* Recherche décroissante à partir du numéro de release de la bibliothèque */
93  while ( ( func == (MedFuncType)NULL) && (_litminor >= _lminminor ) ) {
94 
95 #ifdef PPRO_NT
96  _n = _snprintf(_version,4,"%d%d%d",(int) majeur,_litminor,0);
97 #else
98  _n = snprintf(_version,4,"%d%d%d",(int) majeur,_litminor,0);
99 #endif
100  if ( (_n < 0) || (_n > 3) ) {
101  MESSAGE("Impossible d'obtenir un numéro de version valide : ");
102  _version[3]='\0';SSCRUTE(_version);
103  break;
104  }
105 
106  func=getVersionedApi3(key,_version);
107  --_litminor;
108  }
109  goto QUIT;
110  }
111 
112 
113  QUIT:
114 
115  if (func == NULL) {
116  MESSAGE("Impossible d'obtenir une implémentation de : ");
117  SSCRUTE(key);
118  MESSAGE("en version :");
119  ISCRUTE_int(_fversionMMR);
120  MESSAGE("Vérifiez votre fichier .med et votre version de bibliothèque.");
121  }
122 
123  return func;
124 }
125 
126 
#define MESSAGE(chaine)
Definition: med_utils.h:316
#define ISCRUTE_int(entier)
Definition: med_utils.h:307
MedFuncType _MEDversionedApi3(const char *const key, const med_int majeur, const med_int mineur, const med_int release)
void(* MedFuncType)(int,...)
Definition: med_misc.h:29
int med_int
Definition: med.h:316
#define MED_NUM_MAJEUR
Definition: med.h:58
#define MED_NUM_MINEUR
Definition: med.h:59
MedFuncType getVersionedApi3(const char *const keycharpart, const char *const keynumpart)
#define SSCRUTE(chaine)
Definition: med_utils.h:315