MEDversionedApiC.c

Aller à la documentation de ce fichier.
00001 /*  This file is part of MED.
00002  *
00003  *  COPYRIGHT (C) 1999 - 2015  EDF R&D, CEA/DEN
00004  *  MED is free software: you can redistribute it and/or modify
00005  *  it under the terms of the GNU Lesser General Public License as published by
00006  *  the Free Software Foundation, either version 3 of the License, or
00007  *  (at your option) any later version.
00008  *
00009  *  MED is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *  GNU Lesser General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU Lesser General Public License
00015  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
00016  */
00017 
00018 
00019 #include <stdio.h>
00020 #include <med_config.h>
00021 #include <med_misc.h>
00022 #include <med_utils.h>
00023 
00024 extern MedFuncType getVersionedApi(const char * const keycharpart,
00025                                    const char * const keynumpart);
00026 
00027 
00028 /*  La gestion suivante suppose de ne pas utiliser des versions > 9.9.9 */
00029 /*  ex 9.10.9 ne peut pas être géré. */
00030 MedFuncType _MEDversionedApi( char * key, med_int majeur,
00031                               med_int mineur, med_int release) {
00032   char    version[4]="";
00033   int     n=0;
00034   int     itrelease, minrelease=0;
00035   int     versionMMR,versionMM;
00036   MedFuncType func=(MedFuncType) NULL;
00037   int imajeur=(int)majeur, imineur=(int)mineur, irelease=(int)release;
00038 
00039   versionMM  = 100*imajeur+10*imineur;
00040   versionMMR = versionMM+irelease;
00041 
00042   if ( versionMMR <  220 ) {
00043     MESSAGE("Cette bibliothèque MED n'est pas capable de lire un fichier MED de version < 2.2.0");
00044     MESSAGE("La version demandée est :");
00045     ISCRUTE_int(versionMMR);
00046     goto QUIT;
00047   }
00048 
00049   if ( versionMM > 100*MED_NUM_MAJEUR+10*MED_NUM_MINEUR ) {
00050     MESSAGE("Cette bibliothèque MED n'est pas capable de lire un fichier MED dont le mineur de la version"
00051             "excède celui de la bibliothèque.");
00052     MESSAGE("La version demandée est :");ISCRUTE_int(versionMMR);
00053     goto QUIT;
00054   }
00055 
00056   if ( versionMMR <= 231 ) {
00057     imajeur=2;imineur=3;irelease=1;
00058   }
00059 
00060   /*  Recherche du numéro de release pour les versions de la bibliothèque  */
00061   /*  qui ne respectent pas la règle de versionement MED : 2.3.1, 2.3.2, 2.3.3, (2.3.4) */
00062   /*  Cette recherche de symboles existe uniquement à partir de la 2.3.4 */
00063   /*  Dans les versions précédentes la bibliothèque doit trouver exactement le symbole */
00064   /*  qui contient son numéro de version. */
00065   if (versionMMR < 240 ) {
00066 
00067     minrelease=1;
00068 
00069     /* Recherche décroissante à partir du numéro de release du fichier */
00070     itrelease = irelease;
00071     while ( ( func == (MedFuncType)NULL) && (minrelease <= itrelease ) ) {
00072 
00073 #ifdef PPRO_NT
00074       n = _snprintf(version,4,"%d%d%d",imajeur,imineur,itrelease);
00075 #else
00076       n = snprintf(version,4,"%d%d%d",imajeur,imineur,itrelease);
00077 #endif
00078       if ( (n < 0) || (n > 3) ) {
00079         MESSAGE("Impossible d'obtenir un numéro de version valide : ");
00080         version[3]='\0';
00081         SSCRUTE(version);
00082         break;
00083       }
00084 
00085       func=getVersionedApi(key,version);
00086       --itrelease;
00087     }
00088     goto QUIT;
00089   }
00090 
00091   /* A partir de la 2.4.0, on oblige le developpeur à versionner
00092      uniquement des routines en x.y.0 ;  x.y+1.* et x.y.* étant incompatible
00093      et  x.y.0 et x.y.a étant compatible, x.y.a n'apparait pas dans la table
00094      de versionement */
00095 #ifdef PPRO_NT
00096   n = _snprintf(version,4, IFORMAT IFORMAT IFORMAT,majeur,mineur,0);
00097 #else
00098   n = snprintf(version,4, IFORMAT IFORMAT IFORMAT,majeur,mineur,0);
00099 #endif
00100   if ( (n < 0) || (n > 3) ) {
00101     MESSAGE("Impossible d'obtenir un numéro de version valide : ");
00102     version[3]='\0';
00103     SSCRUTE(version);
00104     goto QUIT;
00105   }
00106 
00107   func=getVersionedApi(key,version);
00108 
00109  QUIT:
00110   if (func == NULL) {
00111     MESSAGE("Impossible d'obtenir une implémentation de : ");
00112     SSCRUTE(key);
00113     MESSAGE("en version :");
00114     ISCRUTE_int(versionMMR);
00115     MESSAGE("Vérifiez votre fichier .med");
00116   }
00117 
00118   return func;
00119 }
00120 
00121 

Généré le Thu Oct 8 14:26:16 2015 pour MED fichier par  doxygen 1.6.1