#ifndef LIRE_FORT_UTIL_SEEN
#define LIRE_FORT_UTIL_SEEN

#include "endian_util.h"

/*--------------------------------------------------------------------*/

void lire_fort_header(char *filename,
	int *NDIM,int *NVAR,
	int *Nx, int *Ny, int *Nz,
	double *Ax, double *Ay,double *Az,
	double *PR, double *RA,
	double *DT){
char func_name[]="lire_fort_header";
FILE *input_fid;  /*  input file */
char *buf;	/* buffer */
char *ptr;	 /* pointeur courant */
struct stat *statbuf; /* la structure stat est definie dans stat.h */
int i;	/* indice de boucles */
double d;	/* pour lire des doubles */
int k;	/* pour lire des entiers */

/* 1. Lecture des donnees */
/* 1.1 ouverture du fichier */
if(NULL == (input_fid=fopen(filename,"r")) ) {
    fprintf( stderr, "! %s: Fichier %s inexistant! \n",func_name,filename);
    exit(1);
}
/*
else {
    fprintf( stderr, "!%s: Lecture du fichier: %s\n",func_name,filename);
}
*/ 
/* 1.2 construction du buffer */
statbuf = (struct stat *) malloc( sizeof(struct stat) );
stat(filename, statbuf);
if( NULL == (buf=malloc((size_t)(statbuf->st_size))) ) {
    fprintf( stderr, "\n! %s: Echec de l'allocation de buf !!!\n",func_name);
    exit(1);
}

ptr = buf;

/* 1.3 remplissage du buffer */
fread(buf,1,(size_t)(statbuf->st_size),input_fid);

/* 1.4 fermeture du fichier */
fclose(input_fid);

/* 2. lecture SPECIFIQUE des donnees du fichier (c.f. writedisk.f)*/

/* WRITE(IDSKWW) NDIM,NPER,NCOMP,NNONV,NVAR */
  ptr=debut_ligne(ptr);
  /* NDIM */
  ptr=lit_int(ptr,NDIM); /* fprintf(stdout,"NDIM= %d",*NDIM); */
  /* NPER */
  ptr=lit_int(ptr,&k); /* fprintf(stdout,"\tNPER= %d",NPER); */
  /* NCOMP */
  ptr=lit_int(ptr,&k); /* fprintf(stdout,"\tNCOMP= %d",NCOMP); */
  /* NNONV */
  ptr=lit_int(ptr,&k); /* fprintf(stdout,"\tNNONV= %d",NNONV); */
  /* NVAR */
  ptr=lit_int(ptr,NVAR); /* fprintf(stdout,"\tNVAR= %d\n",*NVAR); */
  ptr=fin_ligne(ptr);

/* NF=6*NDIM*NVAR
   WRITE(IDSKWW) (AL(I),I=1,NDIM),(ABC(I),I=1,NF),
  &             (N(I),I=1,NDIM),RE,PR,RA,PE,GR,SC,RM */
  ptr=debut_ligne(ptr);
  ptr=lit_double(ptr,Ax); /* fprintf(stdout,"AL[1]=Ax=%g",*Ax); */
  ptr=lit_double(ptr,Ay); /* fprintf(stdout,"\tAL[2]=Ay=%g",*Ay); */
  if ((*NDIM)==3)
  {ptr=lit_double(ptr,Az); /* fprintf(stdout,"\tAL[3]=Az=%g\n",*Az); */}
  /* else {fprintf(stdout,"\n");} */
  /* lecture des conditions aux limites ABC */
  for(i=1;i<=(6*(*NDIM)*(*NVAR));i++){
    ptr=lit_double(ptr,&d);
  }
  ptr=lit_int(ptr,Nx); /* fprintf(stdout,"N[1]=Nx=%d",*Nx); */
  ptr=lit_int(ptr,Ny); /* fprintf(stdout,"\tN[2]=Ny=%d",*Ny); */
  if ((*NDIM)==3)
  {ptr=lit_int(ptr,Nz); /* fprintf(stdout,"\tN[3]=Nz=%d\n",*Nz); */}
  /* else {fprintf(stdout,"\n");} */
  /* RE,PR,RA,PE,GR,SC,RM */
  ptr=lit_double(ptr,&d); /*fprintf(stdout,"RE=%g\n",RE);*/
  ptr=lit_double(ptr,PR); /*fprintf(stdout,"PR=%g\n",*PR);*/
  ptr=lit_double(ptr,RA); /*fprintf(stdout,"RA=%g\n",*RA);*/
  ptr=lit_double(ptr,&d); /*fprintf(stdout,"PE=%g\n",PE);*/
  ptr=lit_double(ptr,&d); /*fprintf(stdout,"GR=%g\n",GR);*/
  ptr=lit_double(ptr,&d); /*fprintf(stdout,"SC=%g\n",SC);*/
  ptr=lit_double(ptr,&d); /*fprintf(stdout,"RM=%g\n",RM);*/
  ptr=fin_ligne(ptr);

/* WRITE(IDSKWW) NVAR*NTOT
   WRITE(IDSKWW) DT,(UVWTN(I),I=1,NVAR*NTOT)
   WRITE(IDSKWW) (UVWTNM1(I),I=1,NVAR*NTOT)
   WRITE(IDSKWW) (UVWTNM1(I+NVAR*NTOT),I=1,NVAR*NTOT) */
  ptr=debut_ligne(ptr);
  ptr=lit_int(ptr,&k); /* fprintf(stdout,"NVAR*NTOT=%d\n",k); */
  ptr=fin_ligne(ptr);
  ptr=debut_ligne(ptr);
  ptr=lit_double(ptr,DT); /* fprintf(stdout,"DT=%g\n",*DT); */
  /* on laisse tomber les donnees elles-memes */
  /* fin de la lecture SPECIFIQUE des donnees */


  free(statbuf);
  free(buf);
}

/*--------------------------------------------------------------------*/

#endif /* of #ifndef LIRE_FORT_UTIL_SEEN */

