00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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
00046
00047
00048
00049
00050 int HAVE_MEDimport=1;
00051
00052
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
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
00072
00073
00074
00075
00076
00077
00078
00079 #include "MEDimport.h"
00080 #include "MAJ_version.h"
00081
00082
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
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
00144
00145
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
00156
00157
00158
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
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
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
00210 fprintf(stdout,">>> Lancement de la normalisation du fichier selon le format " PACKAGE_VERSION " ...\n");
00211
00212
00213 _MEDmodeErreurVerrouiller();
00214
00215
00216 fprintf(stdout,"- Lancement de la mise à jour du numéro de version ... \n");
00217
00218
00219
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
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
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
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
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
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
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
00286 ret = MEDfileClose(fid);
00287 EXIT_IF(ret < 0,"Fermeture du fichier",_fileout);
00288
00289
00290 fprintf(stdout,">>> Conversion du fichier %s au format MED V" PACKAGE_VERSION " terminée\n",
00291 _fileout);
00292
00293
00294 if (!hasfileout) free(tmp);
00295
00296 return 0;
00297 }
00298