# MEDversionedApiC.c

Aller à la documentation de ce fichier.

    00001 /*  This file is part of MED.
    00002  *
    00003  *  COPYRIGHT (C) 1999 - 2011  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