!!!!!!!
!
!fichier g2s_lecture.F90
!
! Ce fichier contient le code source complet de la fonction LEC_ECR de sunset.
! Cette fonction permet de lire et d'ecrite dans un fichier, les donnees
! contenues dans un objet de type PyLCM.
! En phase de developpement de programmes utilisant des objets PyLCM, la
! routine "quoiDansStruc" peut etre tres utile. Elle doit etre appellee
! par exemple ainsi :
!  call quoiDansStruc(ip,1,unitNbr)
! avec : ip adresse de l'objet a examiner
!        unitNbr numero logique du fichier dans lequel le resultat sera ecrit
!
!!!!!

recursive subroutine quoiDansStruc(ip,deep,filenumber)
  use GANLIB
  implicit none

  type(c_ptr),intent(inout) :: ip
  integer,intent(in)      :: deep,filenumber

  character*12       :: namp,savename,namlcm,nammy
  logical            :: empty,lcm
  integer            :: type, long, i, ilong
  character*18       :: formatrep  = '   |-----",a12)   '
  character*18       :: formatrep2 = '      |-----",a12)'
  character*18       :: formatfic  = '   +",a12   )     '
  character*18       :: formatfic2 = '      +",a12)     '
  character*2000     :: formatsortie

  formatsortie = ' '
  write(formatsortie(1:2),'(a2)') '("'
  do i=1,deep-1
     write(formatsortie(7*i-4:7*i+2),'(a7)') "   |   "
  end do

  namp = ' '
  call LCMINF(ip,namlcm,nammy,empty,ilong,lcm)
  if (empty) return
  call LCMNXT(ip,namp)
  savename = namp
  do 
     if (namp == ' ') exit
     call LCMLEN(ip,namp,long,type)
     if (type == 0) then
        if (deep == 1) then
           write(formatsortie(3:20),'(a18)') formatrep
        else
           write(formatsortie(7*(deep-1):7*deep+10),'(a18)') formatrep2
        end if
        write(filenumber,formatsortie) namp
        call LCMSIX(ip,namp,1)
        call quoiDansStruc(ip,deep+1,filenumber)
        call LCMSIX(ip,namp,2)
     else
        if (deep == 1) then
           write(formatsortie(3:20),'(a18)') formatfic
        else
           write(formatsortie(7*(deep-1):7*deep+10),'(a18)') formatfic2
        end if
        call ecritDonnees(formatsortie,deep,namp,ip,type,long)
        write(filenumber,formatsortie) namp
     end if
     call LCMNXT(ip,namp)
     if (namp == savename) exit
  end do

end subroutine quoiDansStruc

subroutine ecritDonnees(formatsortie,deep,namp,ip,type,long)
  use GANLIB
  use my_lcmget_mod
  implicit none
  character*2000,intent(inout):: formatsortie
  character*12,intent(in)     :: namp
  type(c_ptr),intent(in)      :: ip
  integer,intent(in)          :: deep, type, long

  integer,dimension(:),allocatable          :: dataI
  real,dimension(:),allocatable             :: dataR
  character*4,dimension(:),allocatable      :: dataCh4
  double precision,dimension(:),allocatable :: dataDP
  logical,dimension(:),allocatable          :: dataL
  complex,dimension(:),allocatable          :: dataCplx

  integer,parameter :: int=1,float=2,char=3,dbl=4,bool=5,cplx=6
  character*2000    :: chaineTemp

  write(chaineTemp(1:2),'(",""")')

  select case(type)
  case(int)
     allocate(dataI(long))
     call my_lcmget(ip,namp,dataI)
     write(chaineTemp(3:),*) dataI
     deallocate(dataI)
  case(float)
     allocate(dataR(long))
     call my_lcmget(ip,namp,dataR)
     write(chaineTemp(3:),*) dataR
     deallocate(dataR)
  case(char)
     allocate(dataCh4(long))
     call LCMGET(ip,namp,dataCh4)
     write(chaineTemp(3:),*) dataCh4
     deallocate(dataCh4)
  case(dbl)
     allocate(dataDP(long/2))
     call my_lcmget(ip,namp,dataDP)
     write(chaineTemp(3:),*) dataDP
     deallocate(dataDP)
  case(bool)
     allocate(dataL(long))
     call LCMGET(ip,namp,dataL)
     write(chaineTemp(3:),*) dataL
     deallocate(dataL)
  case(cplx)
     allocate(dataCplx(long/2))
     call LCMGET(ip,namp,dataCplx)
     write(chaineTemp(3:),*) dataCplx
     deallocate(dataCplx)
  case default
     print *,'type de donnees inconnu : ',type
     call XABORT('LEC_ECR: in subroutine ecritDonnees')
  end select

  chaineTemp = trim(chaineTemp)//'")'

  if (deep==1) then
     write(formatsortie(15:),*) trim(chaineTemp)
  else
     write(formatsortie(7*deep+5:),*) trim(chaineTemp)
  end if
end subroutine ecritDonnees
