# MEDfamCr232.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
    00019 #include <med.h>
    00020 #include <med_config.h>
    00021 #include <med_outils.h>
    00022
    00023 #include <string.h>
    00024 #include <stdlib.h>
    00025
    00026 void
    00027 MEDfamCr232(int dummy,...)
    00028 {
    00029
    00030   med_idt fid;
    00031   char    *maa;
    00032   char    *famille;
    00033   med_int numero;
    00034   med_int *attr_ident;
    00035   med_int *attr_val;
    00036   char    *attr_desc;
    00037   med_int n_attr;
    00038   char    *groupe;
    00039   med_int n_groupe;
    00040   med_err *fret ;
    00041
    00042   med_idt root=0, datagroup=0, famid=0;
    00043   med_err ret=-1;
    00044   med_size dimd[1];
    00045   char chemin[MED_TAILLE_MAA+MED_TAILLE_FAS+MED_TAILLE_FAS_ENTITE+MED_TAILLE_NOM+1];
    00046   char tmp[MED_TAILLE_FAS+1];
    00047   char stockage[MED_TAILLE_FAS_ENTITE+1] = "NONE";
    00048   med_mode_acces MED_MODE_ACCES;
    00049
    00050   va_list params;
    00051   va_start(params,dummy);
    00052
    00053   fid        = va_arg(params,  med_idt );
    00054   maa        = va_arg(params,  char*   );
    00055   famille    = va_arg(params,  char*   );
    00056   numero     = va_arg(params,  med_int );
    00057   attr_ident = va_arg(params,  med_int*);
    00058   attr_val   = va_arg(params,  med_int*);
    00059   attr_desc  = va_arg(params,  char*   );
    00060   n_attr     = va_arg(params,  med_int );
    00061   groupe     = va_arg(params,  char*   );
    00062   n_groupe   = va_arg(params,  med_int );
    00063   fret       = va_arg(params,  med_err*);
    00064
    00065   /*
    00066    * On inhibe le gestionnaire d'erreur HDF 5
    00067    */
    00068   _MEDmodeErreurVerrouiller();
    00069 if (MEDcheckVersion(fid) < 0) {*fret=-1;return;}
    00070
    00071
    00072   if ( (MED_MODE_ACCES = _MEDmodeAcces(fid) ) == MED_UNDEF_MODE_ACCES ) {
    00073     MESSAGE("Impossible de déterminer le mode d'acces au fichier.");
    00074     goto ERROR;
    00075   }
    00076
    00077   if ( MED_MODE_ACCES == MED_LECTURE) {
    00078     MESSAGE("Impossible de créer une famille en mode MED_LECTURE.");
    00079     goto ERROR;
    00080   };
    00081
    00082   /*
    00083    * Si le Data Group FAS n'existe pas, on le cree
    00084    */
    00085   strcpy(chemin,MED_MAA);
    00086   NOFINALBLANK(maa,ERROR);
    00087   strcat(chemin,maa);
    00088   strncpy(tmp,MED_FAS,MED_TAILLE_FAS-1);
    00089   tmp[MED_TAILLE_FAS-1] = '\0';
    00090   strcat(chemin,tmp);
    00091
    00092   if ((root = _MEDdatagroupOuvrir(fid,chemin)) < 0)
    00093     if ((root = _MEDdatagroupCreer(fid,chemin)) < 0) {
    00094       MESSAGE("Erreur à la création du datagroup : ");
    00095       SSCRUTE(chemin);
    00096       goto ERROR;
    00097     }
    00098
    00099
    00100   /*
    00101    * Le lieu de stockage varie selon le signe du "numero"
    00102    * de famille
    00103    * = 0 => FAMILLE NEUTRE
    00104    * > 0 => FAMILLE DE NOEUD
    00105    * < 0 => FAMILLE DE MAILLE/FACE/ARETE
    00106    */
    00107
    00108   if (numero != 0) {
    00109    if ((ret = _MEDdatagroupFermer(root)) < 0) {
    00110     MESSAGE("Impossible de fermer le datagroup : ");
    00111     ISCRUTE_id(root);ret = -1;
    00112     goto ERROR;
    00113    }
    00114
    00115     if (numero > 0)
    00116       strncpy(stockage,MED_FAS_NOEUD,MED_TAILLE_FAS_ENTITE-1);
    00117
    00118     if (numero < 0)
    00119       strncpy(stockage,MED_FAS_ELEME,MED_TAILLE_FAS_ENTITE-1);
    00120
    00121     stockage[MED_TAILLE_FAS_ENTITE-1] = '\0';
    00122     strcat(chemin,stockage);
    00123
    00124     if ((root = _MEDdatagroupOuvrir(fid,chemin)) < 0)
    00125       if ((root = _MEDdatagroupCreer(fid,chemin)) < 0) {
    00126         MESSAGE("Erreur à la création du datagroup : ");
    00127         SSCRUTE(chemin);
    00128         goto ERROR;
    00129       }
    00130   }
    00131
    00132
    00133   /*
    00134    * Si le Data Group de meme nom que famille existe => erreur
    00135    * Sinon on le cree
    00136    */
    00137
    00138   /*
    00139    * POUR LA FAMILLE DE NUMERO 0, ON FORCE LE NOM
    00140    */
    00141   if (numero == 0) {
    00142     if ((famid = _MEDdatagroupCreer(root,FAMILLE_ZERO)) < 0) {
    00143       MESSAGE("Erreur à la création du famille : ");
    00144       SSCRUTE(famille);
    00145       goto ERROR;
    00146     }
    00147   } else {
    00148     /*
    00149      * Création de la famille
    00150      */
    00151     NOFINALBLANK(famille,ERROR);
    00152     if ((famid = _MEDdatagroupCreer(root,famille)) < 0) {
    00153       MESSAGE("Erreur à la création du famille : ");
    00154       SSCRUTE(famille);
    00155       goto ERROR;
    00156     }
    00157   }
    00158
    00159   /*
    00160    * L'attribut NUM
    00161    */
    00162   if ((ret = _MEDattrEntierEcrire(famid,MED_NOM_NUM,&numero)) < 0) {
    00163     MESSAGE("Erreur à l'écriture du numéro de famille : ");
    00164     ISCRUTE(numero);
    00165     goto ERROR;
    00166   }
    00167
    00168
    00169   /*
    00170    * Le Data Group "GRO"
    00171    */
    00172   if (n_groupe > 0)  {
    00173
    00174     /*
    00175      * On cree le Data Group
    00176      */
    00177     if ((datagroup = _MEDdatagroupCreer(famid,MED_NOM_GRO)) < 0) {
    00178       MESSAGE("Erreur à la création du datagroup : ");
    00179       SSCRUTE(MED_NOM_GRO);
    00180       goto ERROR;
    00181     }
    00182     /*
    00183      * L'attribut "NBR"
    00184      */
    00185     if ((ret = _MEDattrEntierEcrire(datagroup,MED_NOM_NBR,&n_groupe)) < 0) {
    00186       MESSAGE("Erreur à l'écriture du nombre de groupe : ");
    00187       ISCRUTE(n_groupe);
    00188       goto ERROR;
    00189     }
    00190     /*
    00191      * Data Set des noms des groupes "NOM"
    00192      */
    00193     dimd[0] = n_groupe*MED_TAILLE_LNOM+1;
    00194     if ((ret = _MEDdatasetStringEcrire(datagroup,MED_NOM_NOM,dimd,groupe))<0) {
    00195       MESSAGE("Erreur à l'écriture des noms des groupes : ");
    00196       SSCRUTE(groupe);
    00197       goto ERROR;
    00198     }
    00199     /*
    00200      * On ferme le Data Group
    00201      */
    00202     if ((ret = _MEDdatagroupFermer(datagroup)) < 0) {
    00203       MESSAGE("Impossible de fermer le datagroup : ");
    00204       ISCRUTE_int(datagroup);
    00205       goto ERROR;
    00206     }
    00207
    00208   }
    00209
    00210
    00211   /*
    00212    * Le Data Group "ATT"
    00213    */
    00214
    00215   if (n_attr > 0) {
    00216
    00217     if ((datagroup = _MEDdatagroupCreer(famid,MED_NOM_ATT)) < 0) {
    00218       MESSAGE("Erreur à la création du datagroup : ");
    00219       SSCRUTE(MED_NOM_ATT);
    00220       goto ERROR;
    00221     }
    00222     /*
    00223      * L'attribut "NBR"
    00224      */
    00225     if ((ret = _MEDattrEntierEcrire(datagroup,MED_NOM_NBR,&n_attr)) < 0) {
    00226       MESSAGE("Erreur à l'écriture du nombre d'attributs : ");
    00227       ISCRUTE(n_attr);
    00228       goto ERROR;
    00229     }
    00230     /*
    00231      * Le Data Set "IDE"
    00232      */
    00233     dimd[0] = n_attr;
    00234 #if defined(HAVE_F77INT64)
    00235     if ((ret = _MEDdatasetNumEcrire(datagroup,MED_NOM_IDE,MED_INT64,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd,
    00236                                     (unsigned char *)attr_ident)) < 0) {
    00237       MESSAGE("Erreur à l'écriture du dataset : ");
    00238       SSCRUTE(MED_NOM_IDE);
    00239       goto ERROR;
    00240     }
    00241 #else
    00242     if ((ret = _MEDdatasetNumEcrire(datagroup,MED_NOM_IDE,MED_INT32,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd,
    00243                                     (unsigned char *)attr_ident)) < 0) {
    00244       MESSAGE("Erreur à l'écriture du dataset : ");
    00245       SSCRUTE(MED_NOM_IDE);
    00246       goto ERROR;
    00247     }
    00248 #endif
    00249     /*
    00250      * Le Data Set "VAL"
    00251      */
    00252     dimd[0] = n_attr;
    00253 #if defined(HAVE_F77INT64)
    00254     if ((ret = _MEDdatasetNumEcrire(datagroup,MED_NOM_VAL,MED_INT64,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd,
    00255                                     (unsigned char*)attr_val)) < 0) {
    00256       MESSAGE("Erreur à l'écriture du dataset : ");
    00257       SSCRUTE(MED_NOM_VAL);
    00258       goto ERROR;
    00259     }
    00260 #else
    00261     if ((ret = _MEDdatasetNumEcrire(datagroup,MED_NOM_VAL,MED_INT32,MED_NO_INTERLACE,MED_DIM1,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,0,MED_NOPG,dimd,
    00262                                     (unsigned char*)attr_val)) < 0) {
    00263       MESSAGE("Erreur à l'écriture du dataset : ");
    00264       SSCRUTE(MED_NOM_VAL);
    00265       goto ERROR;
    00266     }
    00267 #endif
    00268     /*
    00269      * Le Data Set "DES"
    00270      */
    00271     dimd[0] = n_attr*MED_TAILLE_DESC+1;
    00272     if ((ret = _MEDdatasetStringEcrire(datagroup,MED_NOM_DES,dimd,attr_desc)) < 0) {
    00273       MESSAGE("Erreur à l'écriture du dataset : ");
    00274       SSCRUTE(MED_NOM_DES);
    00275       goto ERROR;
    00276     }
    00277     /*
    00278      * On ferme le Data Group
    00279      */
    00280     if ((ret = _MEDdatagroupFermer(datagroup)) < 0) {
    00281       MESSAGE("Impossible de fermer le datagroup : ");
    00282       ISCRUTE_int(datagroup);
    00283       goto ERROR;
    00284     }
    00285   }
    00286
    00287
    00288   /*
    00289    * On ferme tout
    00290    */
    00291   ret=0;
    00292  ERROR:
    00293   if (famid>0)     if (_MEDdatagroupFermer(famid) < 0) {
    00294     MESSAGE("Impossible de fermer le datagroup : ");
    00295     ISCRUTE_id(famid);ret = -1;
    00296   }
    00297
    00298   if (root>0)     if (_MEDdatagroupFermer(root) < 0) {
    00299     MESSAGE("Impossible de fermer le datagroup : ");
    00300     ISCRUTE_id(root); ret = -1;
    00301   }
    00302
    00303   va_end(params);
    00304   *fret = ret;
    00305   return;
    00306 }