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

Généré le Mon May 16 17:10:23 2011 pour MED fichier par  doxygen 1.6.1