#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h> /* pour la structure stat */
#include <string.h> /* pour memcpy() */

#include "endian_util.h" /* pour les fonctions lit_... */

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

void aide(char *progname)
{
  fprintf(stderr,"Utilisation de %s :\n",progname);
  fprintf(stderr,"%s 'fichier'\n",progname);
  fprintf(stderr,"\t ou 'fichier' est le nom du fichier a lire\n");
}

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

void check_cmdline(int argc,char **argv){
/* verification de l'exactitude de l'appel du programme */

if(argc==1){ /* il manque le nom du fichier a lire */
  fprintf(stderr,"!!! Erreur (fatale)!!!\n");
  aide(argv[0]);
  exit(0); /* arret du programme*/
}

if(argc>=3){ /* il y a trop d'arguments */
  fprintf(stderr,"!!! Erreur !!!\n");
  aide(argv[0]);
  fprintf(stderr,"Seul le fichier %s sera traite...\n\n",argv[1]);
}

}

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

int guess_schema(char *filename){
int FILENUMBER;
/* a priori le nom du fichier commence par fort.##...
   reste a lire le nombre ## */
sscanf(filename+5,"%d",&FILENUMBER);

fprintf(stdout,"! Fichier de 'type': fort.%d  --> Simulation ",FILENUMBER);
fprintf(stdout,"par schema temporel ");
switch (FILENUMBER){
  case 20: fprintf(stdout,"ABCN\n"); break;
  case 22: fprintf(stdout,"ABER2\n"); break;
  case 23: fprintf(stdout,"ABER3\n"); break;
  case 24: fprintf(stdout,"ABER4\n"); break;
  default: fprintf(stdout,"???? (c'est mal parti...)\n");
}

return FILENUMBER;
}

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


int main(int argc,char *argv[]) 
{
  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,j;	/* indices de boucles */
  int FILENUMBER; /* numero d'identification du fichier */
  double d;	/* pour lire des doubles */
  int k;	/* pour lire des entiers */

/* variables "fortran" lues (c.f. writedisk.f) */
  int NDIM,NPER,NCOMP,NNONV,NVAR;
  double RE,PR,RA,PE,GR,SC,RM;
  double Ax,Ay,Az;
  int Nx,Ny,Nz;

  /* 1. Verification de la validite de la ligne de commande */
  check_cmdline(argc,argv);
  
  /* 1.1 ouverture du fichier */
  if(NULL == (input_fid=fopen(argv[1],"r")) ) {
    fprintf( stderr, "! Fichier %s inexistant! \n",argv[1]);
    exit(1);
  }
  else {
    fprintf( stderr, "! Lecture du fichier: %s\n",argv[1]);
  }
  
  /* 1.2 construction du buffer */
  statbuf = (struct stat *) malloc( sizeof(struct stat) );
  stat(argv[1], statbuf);
  if( NULL == (buf=malloc((size_t)(statbuf->st_size))) ) {
    fprintf( stderr, "\n!Echec de l'allocation de buf !!!\n");
    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);

  /* printf("%d\n",statbuf->st_size); */

  /* 1.5 evaluation, d'apres le nom du fichier, du type de la simulation */
  FILENUMBER=guess_schema(argv[1]);
  
  /* 2. lecture SPECIFIQUE des donnees du fichier (c.f. writedisk.f) */

/* WRITE(IDSKWW) NDIM,NPER,NCOMP,NNONV,NVAR */
  fprintf(stdout,"! Geometrie et nombre de variables:\n");
  ptr=debut_ligne(ptr);
  /* NDIM */
  ptr=lit_int(ptr,&NDIM); fprintf(stdout,"NDIM= %d",NDIM); 
  /* NPER */
  ptr=lit_int(ptr,&NPER); fprintf(stdout,"\tNPER= %d",NPER); 
  /* NCOMP */
  ptr=lit_int(ptr,&NCOMP); fprintf(stdout,"\tNCOMP= %d",NCOMP); 
  /* NNONV */
  ptr=lit_int(ptr,&NNONV); 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 */
  fprintf(stdout,"! Rapports de forme:\n");
  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 */
  fprintf(stdout,"! Conditions aux limites:\n");
  for(i=1;i<=(6*NDIM*NVAR);i=i+6){
   for(j=i;j<(i+6);j++){
    ptr=lit_double(ptr,&d);
    fprintf(stdout,"ABC[%2d]=%g\t",j,d);
   }
   fprintf(stdout,"\n");
  }
  fprintf(stdout,"! Degres polynomiaux:\n");
  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");}
  fprintf(stdout,"! Parametres:\n");
  ptr=lit_double(ptr,&RE); 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,&PE); fprintf(stdout,"PE=%g\n",PE);
  ptr=lit_double(ptr,&GR); fprintf(stdout,"GR=%g\n",GR);
  ptr=lit_double(ptr,&SC); fprintf(stdout,"SC=%g\n",SC);
  ptr=lit_double(ptr,&RM); 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,&d); fprintf(stdout,"DT=%g\n",d);
  /* on laisse tomber les donnees elles-memes */
  /* fin de la lecture SPECIFIQUE des donnees */


  free(statbuf);
  free(buf);
  return 0;
}


