00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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
00042
00043
00044
00045
00046 int HAVE_MEDimport=1;
00047
00048
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
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
00068
00069
00070
00071
00072
00073
00074
00075 #include "MEDimport.h"
00076 #include "MAJ_version.h"
00077
00078
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
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
00142
00143
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
00154
00155
00156
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
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
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
00211 fprintf(stdout,">>> Lancement de la normalisation du fichier selon le format " PACKAGE_VERSION " ...\n");
00212
00213
00214 _MEDmodeErreurVerrouiller();
00215
00216
00217 fprintf(stdout,"- Lancement de la mise à jour du numéro de version ... \n");
00218
00219
00220
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
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
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
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
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
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
00272
00273 _MEDfileVersion(fid);
00274
00275
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
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
00287
00288 }
00289
00290 if (MAJ_300_310) {
00291
00292
00293
00294 MAJ_write_version_num(fid,3,0,8);
00295 _MEDfileVersion(fid);
00296
00297 MAJ_version_num(fid,3,0,8);
00298
00299
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
00309
00310
00311 MAJ_write_version_num(fid,3,1,0);
00312 _MEDfileVersion(fid);
00313
00314 MAJ_version_num(fid,3,1,0);
00315
00316
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
00323
00324
00325
00326 MAJ_version(fid);
00327 MAJ_write_version_num(fid,MED_NUM_MAJEUR,MED_NUM_MINEUR,MED_NUM_RELEASE);
00328
00329
00330 ret = MEDfileClose(fid);
00331 EXIT_IF(ret < 0,"Fermeture du fichier",_fileout);
00332
00333
00334 fprintf(stdout,">>> Conversion du fichier %s au format MED V" PACKAGE_VERSION " terminée\n",
00335 _fileout);
00336
00337
00338 if (!hasfileout) free(tmp);
00339
00340 return 0;
00341 }
00342