C
C This file is issued from the MODULEF library, but has been 
C subsequently modified
C
      SUBROUTINE LIBLIG (LIGNE)
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C BUT :
C     FORMAT LIBRE
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C PROGRAMMEUR : F. HECHT - INRIA - AVRIL 86
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      CHARACTER*(*) LIGNE
C
C //////////////////////////////////////////////////////////////////////
C     DEBUT DES COMMON  DU FORMAT LIBRE
C ----------------------------------------
C
      DOUBLE PRECISION RVAL
      INTEGER PTBUF,IVAL,TYPVAL,SIZDEN,CARLUE
C
      INTEGER MXETIQ
      PARAMETER (MXETIQ=20)
      LOGICAL ECHO,SOUFFL
      INTEGER PTETIQ,NUETIQ(MXETIQ),TRACE,LGNETI(MXETIQ),PPILE,KKMODE
C
C     MXID=NOMBRE MAXI D'ID
C     MXVAL=TAILLE DE LA PILE D'EVALUATION DES EXPRESSIONS
C     MXOPER = TAILLE DE LA PILE DES OPERATEURS
C     ID=NOMS DES IDENTIFICATEURS (12 CARAC)
C     VALID= VALEUR DE L'IDENTIFICATEUR
C           C'EST LE NOMBRE D'ELEMENTS DE L'ID
C
      INTEGER MXVAL,MXID,MXOPER
      PARAMETER(MXID=200,MXVAL=100,MXOPER=50)
      DOUBLE PRECISION VALID(MXID)
      INTEGER NBID
      CHARACTER ID(MXID)*12
C
C
      CHARACTER IDENT*256
      CHARACTER IBUF(256)*1,BUF*256,CSTRNG*256
C
       DOUBLE PRECISION RESULT
       INTEGER TYPEAT,LSTRNG
       LOGICAL STRING,ERRLEC,IDEM,ERRSMT
      INTEGER INISCN
      COMMON /LIB001/ RESULT,VALID,RVAL
     +               ,TYPEAT,LSTRNG
     +               ,STRING,ERRLEC,ERRSMT,IDEM
     +               ,INISCN,NBID
     +               ,PTBUF,TYPVAL,IVAL,SIZDEN,CARLUE
     +               ,ECHO,TRACE,PTETIQ,NUETIQ,LGNETI,SOUFFL,PPILE
     +               ,KKMODE
      COMMON /LIB002/ ID, IBUF,BUF,IDENT,CSTRNG
C     FIN DES COMMON  DU FORMAT LIBRE
C ----------------------------------------
C //////////////////////////////////////////////////////////////////////
      INTEGER LECTEU,IMPRIM,INTERA,NFNEWS,NFSAUV
      COMMON /UNITES/ LECTEU,IMPRIM,INTERA,NFNEWS,NFSAUV
      IF(SOUFFL) WRITE (IMPRIM, *) 'ENTREZ UNE LIGNE '
    3 CONTINUE
      READ(NUETIQ(PTETIQ),'(A)',END=203) LIGNE
      I=INDEX(LIGNE,'--')
      IF (I.NE.0) LIGNE(I:) = ' '
      LGNETI(PTETIQ)=LGNETI(PTETIQ)+1
      IF(TRACE.NE.0.AND.NUETIQ(1).EQ.NUETIQ(PTETIQ))
     +    WRITE (TRACE,'(A)') LIGNE
      IF(ECHO)THEN
        WRITE(IMPRIM,'(1X,I2,'','',I4,'' :'',A)')PTETIQ,LGNETI(PTETIQ)
     +        ,LIGNE
      ENDIF
CFJ
      CALL NETTOIE(LIGNE)
CFJ
      RETURN
  203 CONTINUE
      IF(PTETIQ.LE.1) THEN
         WRITE (IMPRIM, *)'FATAL ERROR :FIN DE FICHIER SUR SDT INPUT'
         STOP 'SUBROUTINE LIBLIG'
      ENDIF
      IF(NUETIQ(1).NE.NUETIQ(PTETIQ)) CLOSE(NUETIQ(PTETIQ))
      PTETIQ=PTETIQ-1
      GOTO 3
      END
C----------------------------------------------------------
      subroutine nettoie(ligne)
      character*(*) ligne
      character*256  buf,moelle
      common / souterrain / moelle,lmoelle,inombre_var
c
      i=0
   10 i=i+1
      if (ligne(i:i).eq.' ') goto 10
      j = 257
   11 j = j-1
      if (ligne(j:j).eq.' ') goto 11
      buf(1:j-i+1) = ligne(i:j)
      if (inombre_var.eq.2) then
        ligne(1:7) = 'Z(X,Y)='
        n=7
      else
        ligne(1:5) = 'F(X)='
        n=5
      endif
      do k=1,j-i+1
        if (buf(k:k).ne.' ') then
          n=n+1
          iii = ichar(buf(k:k))
          if (iii.ge.97.and.iii.le.122) then
            ligne(n:n) = char(iii-32)
          else
            ligne(n:n) = buf(k:k)
          endif
        endif
      enddo
      ligne(n+1:n+1) = ';'
      if (n+1.le.256) then
        do i=n+2,256
          ligne(i:i) = ' '
        enddo
      endif
c
      lmoelle = n
      do i=1,lmoelle
        iii = ichar(ligne(i:i))
        if (iii.ge.65.and.iii.le.92) then
          moelle(i:i) = char(iii+32)
        else
          moelle(i:i) = ligne(i:i)
        endif
      enddo
      end
