libmedimport.c

Aller à la documentation de ce fichier.
00001 /*  This file is part of MED.
00002  *
00003  *  COPYRIGHT (C) 1999 - 2016  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 /* L'utilisation des med_utils n'est pas optionelle
00019    dans l'outil medimport, elle revet cependant deux
00020    formes :
00021    - Si -DWITH_EXCEPTION EXITIF renvoie une exception MEDerreur
00022    - Sinon exécute l'instruction return */
00023 
00024 
00025 #ifdef HAVE_STDBOOL_H
00026 # include <stdbool.h>
00027 #else
00028 # ifndef HAVE__BOOL
00029 #  ifdef __cplusplus
00030 typedef bool _Bool;
00031 #  else
00032 #   define _Bool signed char
00033 #  endif
00034 # endif
00035 # define bool _Bool
00036 # define false 0
00037 # define true 1
00038 # define __bool_true_false_are_defined 1
00039 #endif
00040 
00041 /* #ifdef __cplusplus */
00042 /* extern "C" { */
00043 /* #endif */
00044 
00045 /* Pour faciliter la detection autotools */
00046 int HAVE_MEDimport=1;
00047 
00048 /*Inclusion des .h de la version de la bibliothèque courante*/
00049 #include <med_config.h>
00050 #include <med.h>
00051 #include <med_outils.h>
00052 
00053 #include <stdio.h>
00054 #include <string.h>
00055 
00056 /*TODO : En attendant une conversion totale de l'outil libmedimport en 3.0*/
00057 #include <2.3.6/med23v30.h>
00058 #include <2.3.6/med23v30_proto.h>
00059 #include "2.3.6/med23v30_misc.h"
00060 
00061 #ifdef PPRO_NT
00062 # include <stdlib.h>
00063 #else
00064 # include <libgen.h>
00065 #endif
00066 
00067 /* #ifdef __cplusplus */
00068 /* } */
00069 /* #endif */
00070 
00071 /*Inclusion des .h spécifiques à medimport */
00072 
00073 /* Interface publique de l'outil medimport */
00074 /* MEDimport.h == MEDimport.hxx */
00075 #include "MEDimport.h"
00076 #include "MAJ_version.h"
00077 
00078 /* Interfaces privées à l'outil medimport  */
00079 #include "MAJ_21_22.h"
00080 #include "MAJ_231_232.h"
00081 #include "MAJ_236_300.h"
00082 #include "MAJ_300_310.h"
00083 #include "MAJ_310_320.h"
00084 
00085 
00086 #ifdef __cplusplus
00087 extern "C" void _MEDmodeErreurVerrouiller(void);
00088 #endif
00089 
00090 
00091 
00092 int MEDimport(char * filein, char *  fileout) {
00093 
00094   med_idt fid, gid;
00095   med_err ret;
00096   med_int majeur, mineur, release;
00097   med_bool hdfok=MED_FALSE;
00098   med_bool medok=MED_FALSE;
00099   char *_fileout,*tmp=NULL;
00100   int   _fileoutsize;
00101   bool  hasfileout=false;
00102   char *commande;
00103   med_int nprofil;
00104   char chemin_profils[MED_TAILLE_PROFILS+1];
00105   char chemin_liens[MED_TAILLE_LIENS+1];
00106   char version[9];
00107   int MAJ_21_22 = 0, MAJ_231_232 = 0, MAJ_236_300 = 0, MAJ_300_310 = 0, MAJ_310_320 = 0 ;
00108 #ifdef PPRO_NT
00109   char *drive, *dir, *ext;
00110 #endif
00111   unsigned char reponse='o';
00112   med_bool      _noversion=MED_FALSE;
00113 
00114   EXIT_IF(filein == NULL,"Le nom du fichier d'entrée est vide : ", filein);
00115 
00116   hasfileout = strcmp(fileout,"");
00117   if ( hasfileout ) {
00118     _fileoutsize = strlen(fileout);
00119     _fileout     = fileout;
00120   } else {
00121     _fileoutsize = strlen(filein)+strlen(PACKAGE_VERSION);
00122     tmp          = (char *) malloc(sizeof(char)*(_fileoutsize+1));
00123     strcpy(tmp,filein);
00124     strcat(tmp,PACKAGE_VERSION);
00125 #ifdef PPRO_NT
00126     _splitpath( tmp, drive, dir, _fileout, ext );
00127 #else
00128     _fileout     = basename(tmp);
00129 #endif
00130     _fileoutsize = strlen(_fileout);
00131 
00132   }
00133 
00134   /* Test du format du fichier */
00135 
00136   ret = MEDfileCompatibility(filein,&hdfok,&medok);
00137 
00138   if (ret < 0 ) {
00139     fprintf(stdout,">>> Attention le fichier %s ne contient pas de numéro de version. \n",filein);
00140     fprintf(stdout,">>> Le fichier  %s est supposé être en version 2.1.1. \n",filein);
00141     /* PAs d'interactif dans une bibliothèque !*/
00142 /*     fprintf(stdout,">>> Voulez-vous essayer une conversion d'un fichier  < 2.2 (o/n) ? "); */
00143 /*     scanf("%c",&reponse); */
00144     if ( (reponse != 'o') && (reponse != 'O') && (reponse != 'y') && (reponse != 'Y') ) {
00145       EXIT_IF(MEDfileCompatibility(filein,&hdfok,&medok) < 0,
00146               "Erreur d'appel de  MEDfileCompatibility : ", filein);
00147     }
00148     _noversion = MED_TRUE;
00149   }
00150   EXIT_IF( !hdfok ,
00151           "Le fichier d'entrée n'est pas dans un format HDF compatible : ", filein);
00152 
00153 /*   EXIT_IF( !medok , */
00154 /*        "MEDimport ne gère pas le format  MED de ce fichier : ", filein); */
00155 
00156   /* Creation et ouverture du fichier que l'on va convertir au format MED actuel */
00157   commande = (char *) malloc(sizeof(char)*(strlen("cp ")+strlen(filein)+
00158                                            strlen(" ")+_fileoutsize + 4 +1  ) );
00159   EXIT_IF(commande == NULL,NULL,NULL);
00160   strcpy(commande,"cp \"");
00161   strcat(commande,filein);
00162   strcat(commande,"\" \"");
00163   strcat(commande,_fileout);
00164   strcat(commande,"\"");
00165   fprintf(stdout,">>> Creation du fichier %s : %s \n",_fileout,commande);
00166   system(commande);
00167   free(commande);
00168   commande = (char *) malloc(sizeof(char)*(strlen("chmod u+w \"") + _fileoutsize +1 +1  ) );
00169   EXIT_IF(commande == NULL,NULL,NULL);
00170   strcpy(commande,"chmod u+w \"");
00171   strcat(commande,_fileout);
00172   strcat(commande,"\"");
00173   fprintf(stdout,">>> Chmod +w du fichier %s : %s \n",_fileout,commande);
00174   system(commande);
00175   free(commande);
00176 
00177   fid = MEDfileOpen(_fileout,MED_ACC_RDWR);
00178   EXIT_IF(fid < 0,"Ouverture du fichier : ", _fileout);
00179 
00180   /* Verification du numero de version */
00181   if (! _noversion)
00182     ret = MEDfileNumVersionRd(fid,&majeur,&mineur,&release);
00183   else {
00184     ret=0;
00185     majeur=2;
00186     mineur=1;
00187     release=1;
00188   }
00189   sprintf(version, IFORMAT"_"IFORMAT"_"IFORMAT, majeur, mineur, release);
00190   EXIT_IF(ret < 0,"Lecture du numero de version de MED-fichier",NULL);
00191   if (strcmp(version, "2_2_0") < 0)
00192     MAJ_21_22 = 1;
00193   if (strcmp(version, "2_3_2") < 0)
00194     MAJ_231_232 = 1;
00195   if (strcmp(version, "3_0_0") < 0)
00196     MAJ_236_300 = 1;
00197   if (strcmp(version, "3_1_0") < 0)
00198     MAJ_300_310 = 1;
00199   if (strcmp(version, "3_2_0") < 0)
00200     MAJ_310_320 = 1;
00201 
00202   /* Ne pas oublier que la version cible du fichier à convertir est celui de la bibliothèque. */
00203   if (MAJ_310_320 == 0) {
00204     fprintf(stdout,"Le fichier %s est déjà au bon format !!! \n",_fileout);
00205     ret = MEDfileClose(fid);
00206     EXIT_IF(ret < 0,"Fermeture du fichier",filein);
00207     return 0;
00208   }
00209 
00210   /* On avertit qu'on commence la conversion */
00211   fprintf(stdout,">>> Lancement de la normalisation du fichier selon le format " PACKAGE_VERSION " ...\n");
00212 
00213   /* On inhibe le gestionnaire d'erreur HDF5 */
00214   _MEDmodeErreurVerrouiller();
00215 
00216   /* Mise a jour du numero de version */
00217   fprintf(stdout,"- Lancement de la mise à jour du numéro de version ... \n");
00218   /*   La mise à jour MAJ_version(fid); doit être différée pour que les majs des fichiers anciens
00219        fonctionnent correctement*/
00220   /*   MAJ_version(fid); */
00221   MAJ_write_version_num(fid,2,3,6);
00222   fprintf(stdout,"  Numéro de version : ... OK ... \n");
00223 
00224   if (MAJ_21_22) {
00225 
00226     /* Mise a jour des maillages : type = MED_NON_STRUCTURE, description, ... */
00227     fprintf(stdout,"- Lancement de la mise à jour des maillages (21_22)... \n");
00228     MAJ_21_22_maillages(fid);
00229     fprintf(stdout,"  Maillage(s) : ... OK ...\n");
00230 
00231     /* Mise a jour des champs */
00232     fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (21_22)... \n");
00233     MAJ_21_22_champs(fid);
00234     fprintf(stdout,"  Champs(s) : ... OK ...\n");
00235 
00236     /* Mise a jour des profils eventuels */
00237     nprofil = MEDnProfil(fid);
00238     if (nprofil > 0) {
00239       fprintf(stdout,"- Lancement de la mise à jour des profils (21_22)... \n");
00240       MAJ_21_22_profils(fid,nprofil);
00241       fprintf(stdout,"  Profils(s) : ... OK ...\n");
00242     } else {
00243       strncpy(chemin_profils,MED_PROFILS,MED_TAILLE_PROFILS-1);
00244       chemin_profils[MED_TAILLE_PROFILS-1] = '\0';
00245       gid = _MEDdatagroupCreer(fid,chemin_profils);
00246       EXIT_IF(gid < 0,"Creation du groupe HDF sur les profils",chemin_profils);
00247       ret = _MEDdatagroupFermer(gid);
00248       EXIT_IF(ret < 0,"Fermeture du groupe HDF sur les profils",chemin_profils);
00249     }
00250 
00251     /* On cree le groupe HDF pour les liens */
00252     strncpy(chemin_liens,MED_LIENS,MED_TAILLE_LIENS-1);
00253     chemin_liens[MED_TAILLE_LIENS-1] = '\0';
00254     gid = _MEDdatagroupCreer(fid,chemin_liens);
00255     EXIT_IF(gid < 0,"Creation du groupe HDF sur les liens",chemin_liens);
00256     ret = _MEDdatagroupFermer(gid);
00257     EXIT_IF(ret < 0,"Fermeture du groupe HDF sur les liens",chemin_liens);
00258   }
00259 
00260   if (MAJ_231_232) {
00261     /* Mise a jour des champs */
00262     fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (231_232)... \n");
00263     MAJ_231_232_champs(fid);
00264     fprintf(stdout,"  Champs(s) : ... OK ...\n");
00265     fprintf(stdout,"- Lancement de la mise à jour des noms de maillages (231_232)... \n");
00266     MAJ_231_232_maillages(fid);
00267     fprintf(stdout,"  Noms(s) de maillage(s): ... OK ...\n");
00268   }
00269 
00270   if (MAJ_236_300) {
00271     /* Le système de cache de version a été developpé à partir de la 3.0*/
00272     /* Initialise le cache sur une 2.3.6 (cas d'absence d'INFO)*/
00273     _MEDfileVersion(fid);
00274 
00275     /* Mise a jour des champs */
00276     fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (236_300)... \n");
00277     MAJ_236_300_champs(fid);
00278     fprintf(stdout,"  Champs(s) : ... OK ...\n");
00279 
00280     /* MAJ_version(fid); */
00281 
00282     fprintf(stdout,"- Lancement de la mise à jour des maillages (236_300)... \n");
00283     MAJ_236_300_maillages(fid);
00284     fprintf(stdout,"  Maillage(s): ... OK ...\n");
00285 
00286     /* MAJ_version(fid);  */
00287 
00288   }
00289 
00290   if (MAJ_300_310) {
00291     /* Le système de cache de version a été developpé à partir de la 3.0*/
00292     /* Initialise le cache sur une 3.0.8 (cas d'absence d'INFO)*/
00293     /* s'il n'a pas déjà été instanciée ds les MAJ précédentes */
00294     MAJ_write_version_num(fid,3,0,8);
00295     _MEDfileVersion(fid);
00296     /* Si le cache était dèjà instancié, met à jour le cache */
00297     MAJ_version_num(fid,3,0,8);
00298 
00299     /* Mise a jour des champs */
00300     fprintf(stdout,"- Lancement de la mise à jour des champs de résultats (300_310) ... \n");
00301     MAJ_300_310_champs(fid);
00302     fprintf(stdout,"  Champs(s) : ... OK ...\n");
00303 
00304 
00305   }
00306 
00307   if (MAJ_310_320) {
00308     /* Le système de cache de version a été developpé à partir de la 3.0*/
00309     /* Initialise le cache sur une 3.0.8 (cas d'absence d'INFO)*/
00310     /* s'il n'a pas été déjà été instanciée ds les MAJ_ précédentes */
00311     MAJ_write_version_num(fid,3,1,0);
00312     _MEDfileVersion(fid);
00313     /* Si le cache était dèjà instancié, met à jour le cache */
00314     MAJ_version_num(fid,3,1,0);
00315 
00316     /* Mise a jour des familles/groupes */
00317     fprintf(stdout,"- Lancement de la mise à jour des familles/groupes (310_320) ... \n");
00318     MAJ_310_320_familles(fid);
00319     fprintf(stdout,"  Famille(s)/Groupe(s) : ... OK ...\n");
00320   }
00321 
00322   /* A l'écriture d'une nouvelle version de MAJ ex 310_320,
00323    il est necessaire de revisiter les appels à MAJ_version(fid) pour
00324    les remplacer par les appels MAJ_version(fid,3,1,Lastest31z) */
00325 
00326   MAJ_version(fid);  
00327   MAJ_write_version_num(fid,MED_NUM_MAJEUR,MED_NUM_MINEUR,MED_NUM_RELEASE);
00328 
00329   /* Fermeture du fichier */
00330   ret = MEDfileClose(fid);
00331   EXIT_IF(ret < 0,"Fermeture du fichier",_fileout);
00332 
00333   /* On avertit que c'est fini */
00334   fprintf(stdout,">>> Conversion du fichier %s au format MED V" PACKAGE_VERSION " terminée\n",
00335           _fileout);
00336 
00337   /* On libere la memoire */
00338   if (!hasfileout) free(tmp);
00339 
00340   return 0;
00341 }
00342 

Généré le Thu Jan 21 18:06:07 2016 pour MED fichier par  doxygen 1.6.1