# libmedimport.c

Aller à la documentation de ce fichier.

    00001 /*  This file is part of MED.
    00002  *
    00003  *  COPYRIGHT (C) 1999 - 2012  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
    00083
    00084 #ifdef __cplusplus
    00085 extern "C" void _MEDmodeErreurVerrouiller(void);
    00086 #endif
    00087
    00088
    00089
    00090 int MEDimport(char * filein, char *  fileout) {
    00091
    00092   med_idt fid, gid;
    00093   med_err ret;
    00094   med_int majeur, mineur, release;
    00095   med_bool hdfok=MED_FALSE;
    00096   med_bool medok=MED_FALSE;
    00097   char *_fileout,*tmp=NULL;
    00098   int   _fileoutsize;
    00099   bool  hasfileout=false;
    00100   char *commande;
    00101   med_int nprofil;
    00102   char chemin_profils[MED_TAILLE_PROFILS+1];
    00103   char chemin_liens[MED_TAILLE_LIENS+1];
    00104   char version[9];
    00105   int MAJ_21_22 = 0, MAJ_231_232 = 0, MAJ_236_300 = 0;
    00106 #ifdef PPRO_NT
    00107   char *drive, *dir, *ext;
    00108 #endif
    00109   unsigned char reponse='o';
    00110   med_bool      _noversion=MED_FALSE;
    00111
    00112   EXIT_IF(filein == NULL,"Le nom du fichier d'entrée est vide : ", filein);
    00113
    00114   hasfileout = strcmp(fileout,"");
    00115   if ( hasfileout ) {
    00116     _fileoutsize = strlen(fileout);
    00117     _fileout     = fileout;
    00118   } else {
    00119     _fileoutsize = strlen(filein)+strlen(PACKAGE_VERSION);
    00120     tmp          = (char *) malloc(sizeof(char)*(_fileoutsize+1));
    00121     strcpy(tmp,filein);
    00122     strcat(tmp,PACKAGE_VERSION);
    00123 #ifdef PPRO_NT
    00124     _splitpath( tmp, drive, dir, _fileout, ext );
    00125 #else
    00126     _fileout     = basename(tmp);
    00127 #endif
    00128     _fileoutsize = strlen(_fileout);
    00129
    00130   }
    00131
    00132   /* Test du format du fichier */
    00133
    00134   ret = MEDfileCompatibility(filein,&hdfok,&medok);
    00135
    00136   if (ret < 0 ) {
    00137     fprintf(stdout,">>> Attention le fichier %s ne contient pas de numéro de version. \n",filein);
    00138     fprintf(stdout,">>> Le fichier  %s est supposé être en version 2.1.1. \n",filein);
    00139     /* PAs d'interactif dans une bibliothèque !*/
    00140 /*     fprintf(stdout,">>> Voulez-vous essayer une conversion d'un fichier  < 2.2 (o/n) ? "); */
    00141 /*     scanf("%c",&reponse); */
    00142     if ( (reponse != 'o') && (reponse != 'O') && (reponse != 'y') && (reponse != 'Y') ) {
    00143       EXIT_IF(MEDfileCompatibility(filein,&hdfok,&medok) < 0,
    00144               "Erreur d'appel de  MEDfileCompatibility : ", filein);
    00145     }
    00146     _noversion = MED_TRUE;
    00147   }
    00148   EXIT_IF( !hdfok ,
    00149           "Le fichier d'entrée n'est pas dans un  format HDF compatible : ", filein);
    00150
    00151 /*   EXIT_IF( !medok , */
    00152 /*        "MEDimport ne gère pas le format  MED de ce fichier : ", filein); */
    00153
    00154   /* Creation et ouverture du fichier que l'on va convertir au format MED actuel */
    00155   commande = (char *) malloc(sizeof(char)*(strlen("cp ")+strlen(filein)+
    00156                                            strlen(" ")+_fileoutsize + 4 +1  ) );
    00157   EXIT_IF(commande == NULL,NULL,NULL);
    00158   strcpy(commande,"cp \"");
    00159   strcat(commande,filein);
    00160   strcat(commande,"\" \"");
    00161   strcat(commande,_fileout);
    00162   strcat(commande,"\"");
    00163   fprintf(stdout,">>> Creation du fichier %s : %s \n",_fileout,commande);
    00164   system(commande);
    00165   free(commande);
    00166   commande = (char *) malloc(sizeof(char)*(strlen("chmod u+w \"") + _fileoutsize +1 +1  ) );
    00167   EXIT_IF(commande == NULL,NULL,NULL);
    00168   strcpy(commande,"chmod u+w \"");
    00169   strcat(commande,_fileout);
    00170   strcat(commande,"\"");
    00171   fprintf(stdout,">>> Chmod +w du fichier %s : %s \n",_fileout,commande);
    00172   system(commande);
    00173   free(commande);
    00174
    00175   fid = MEDfileOpen(_fileout,MED_ACC_RDWR);
    00176   EXIT_IF(fid < 0,"Ouverture du fichier : ", _fileout);
    00177
    00178   /* Verification du numero de version */
    00179   if (! _noversion)
    00180     ret = MEDfileNumVersionRd(fid,&majeur,&mineur,&release);
    00181   else {
    00182     ret=0;
    00183     majeur=2;
    00184     mineur=1;
    00185     release=1;
    00186   }
    00187   sprintf(version, IFORMAT"_"IFORMAT"_"IFORMAT, majeur, mineur, release);
    00188   EXIT_IF(ret < 0,"Lecture du numero de version de MED-fichier",NULL);
    00189   if (strcmp(version, "2_2_0") < 0)
    00190     MAJ_21_22 = 1;
    00191   if (strcmp(version, "2_3_2") < 0)
    00192     MAJ_231_232 = 1;
    00193   if (strcmp(version, "3_0_0") < 0)
    00194     MAJ_236_300 = 1;
    00195
    00196 /*   SSCRUTE(version); */
    00197
    00198   if (MAJ_236_300 == 0) {
    00199     fprintf(stdout,"Le fichier %s est déjà au bon format !!! \n",_fileout);
    00200     ret = MEDfileClose(fid);
    00201     EXIT_IF(ret < 0,"Fermeture du fichier",filein);
    00202     return 0;
    00203   }
    00204
    00205   /* On avertit qu'on commence la conversion */
    00206   fprintf(stdout,">>> Lancement de la normalisation du fichier selon le format " PACKAGE_VERSION " ...\n");
    00207
    00208   /* On inhibe le gestionnaire d'erreur HDF5 */
    00209   _MEDmodeErreurVerrouiller();
    00210
    00211   /* Mise a jour du numero de version */
    00212   fprintf(stdout,"- Lancement de la mise à jour du numéro de version ... \n");
    00213 /*   La mise à jour MAJ_version(fid); doit être différée pour que les majs des fichiers anciens
    00214  fonctionnent correctement*/
    00215 /*   MAJ_version(fid); */
    00216   MAJ_write_version_num(fid,2,3,6);
    00217   fprintf(stdout,"  Numéro de version : ... OK ... \n");
    00218
    00219   if (MAJ_21_22) {
    00220
    00221     /* Mise a jour des maillages : type = MED_NON_STRUCTURE, description, ... */
    00222     fprintf(stdout,"- Lancement de la mise à jour des maillages ... \n");
    00223     MAJ_21_22_maillages(fid);
    00224     fprintf(stdout,"  Maillage(s) : ... OK ...\n");
    00225
    00226     /* Mise a jour des champs */
    00227     fprintf(stdout,"- Lancement de la mise à jour des champs de résultats ... \n");
    00228     MAJ_21_22_champs(fid);
    00229     fprintf(stdout,"  Champs(s) : ... OK ...\n");
    00230
    00231     /* Mise a jour des profils eventuels */
    00232     nprofil = MEDnProfil(fid);
    00233     if (nprofil > 0) {
    00234       fprintf(stdout,"- Lancement de la mise à jour des profils ... \n");
    00235       MAJ_21_22_profils(fid,nprofil);
    00236       fprintf(stdout,"  Profils(s) : ... OK ...\n");
    00237     } else {
    00238       strncpy(chemin_profils,MED_PROFILS,MED_TAILLE_PROFILS-1);
    00239       chemin_profils[MED_TAILLE_PROFILS-1] = '\0';
    00240       gid = _MEDdatagroupCreer(fid,chemin_profils);
    00241       EXIT_IF(gid < 0,"Creation du groupe HDF sur les profils",chemin_profils);
    00242       ret = _MEDdatagroupFermer(gid);
    00243       EXIT_IF(ret < 0,"Fermeture du groupe HDF sur les profils",chemin_profils);
    00244     }
    00245
    00246     /* On cree le groupe HDF pour les liens */
    00247     strncpy(chemin_liens,MED_LIENS,MED_TAILLE_LIENS-1);
    00248     chemin_liens[MED_TAILLE_LIENS-1] = '\0';
    00249     gid = _MEDdatagroupCreer(fid,chemin_liens);
    00250     EXIT_IF(gid < 0,"Creation du groupe HDF sur les liens",chemin_liens);
    00251     ret = _MEDdatagroupFermer(gid);
    00252     EXIT_IF(ret < 0,"Fermeture du groupe HDF sur les liens",chemin_liens);
    00253   }
    00254
    00255   if (MAJ_231_232) {
    00256     /* Mise a jour des champs */
    00257     fprintf(stdout,"- Lancement de la mise à jour des champs de résultats ... \n");
    00258     MAJ_231_232_champs(fid);
    00259     fprintf(stdout,"  Champs(s) : ... OK ...\n");
    00260     fprintf(stdout,"- Lancement de la mise à jour des noms de maillages ... \n");
    00261     MAJ_231_232_maillages(fid);
    00262     fprintf(stdout,"  Noms(s) de maillage(s): ... OK ...\n");
    00263   }
    00264
    00265   if (MAJ_236_300) {
    00266     /* Mise a jour des champs */
    00267     fprintf(stdout,"- Lancement de la mise à jour des champs de résultats ... \n");
    00268     MAJ_236_300_champs(fid);
    00269     fprintf(stdout,"  Champs(s) : ... OK ...\n");
    00270
    00271     MAJ_version(fid);
    00272
    00273     fprintf(stdout,"- Lancement de la mise à jour des maillages ... \n");
    00274     MAJ_236_300_maillages(fid);
    00275     fprintf(stdout,"  Maillage(s): ... OK ...\n");
    00276
    00277     MAJ_version(fid);
    00278
    00279   }
    00280
    00281   MAJ_write_version_num(fid,MED_NUM_MAJEUR,MED_NUM_MINEUR,MED_NUM_RELEASE);
    00282
    00283   /* Fermeture du fichier */
    00284   ret = MEDfileClose(fid);
    00285   EXIT_IF(ret < 0,"Fermeture du fichier",_fileout);
    00286
    00287   /* On avertit que c'est fini */
    00288   fprintf(stdout,">>> Conversion du fichier %s au format MED V" PACKAGE_VERSION " terminée\n",
    00289           _fileout);
    00290
    00291   /* On libere la memoire */
    00292   if (!hasfileout) free(tmp);
    00293
    00294   return 0;
    00295 }
    00296