      SUBROUTINE LFILED ( KREP, KRANG, KTAB, KLONG, KRGPIM, KPOSEX,
     S                    KRETIN )
#include "lficomt.h"
C****
C        SOUS-PROGRAMME *INTERNE* DU LOGICIEL DE FICHIERS INDEXES LFI
C     LECTURE DES DONNEES PROPREMENT DITES, UNE FOIS L'ARTICLE LOGIQUE
C     DEFINI (PAR NOM, OU PAR POSITION) .
C**
C    ARGUMENTS : KREP   (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME;
C                KRANG  (ENTREE) ==> RANG ( DANS LA TABLE *NUMERO* )
C                                    DE L'UNITE LOGIQUE CONCERNEE;
C                KTAB   (ENTREE) ==> PREMIER MOT A LIRE;
C                KLONG  (ENTREE) ==> LONGUEUR DE L'ARTICLE A LIRE;
C                KRGPIM (ENTREE) ==> RANG DANS LES TABLES CNOMAR,MLGPOS,
C                                    ETC. DE LA P.P.I. OU FIGURE
C                                    L'ARTICLE;
C                KPOSEX (ENTREE) ==> POSITION ( DANS LE FICHIER ) OU
C                                    COMMENCER A LIRE L'ARTICLE;
C                KRETIN (SORTIE) ==> CODE-RETOUR INTERNE.
C
#include "lficom0.h"
#ifndef f77
#include "precision.h"
#endif
#include "lficom1.h"
C
      INTEGER KREP, KRANG, KLONG, KRGPIM, KPOSEX, KRETIN
#ifndef f77
      INTEGER (KIND=JPDBLE)  KTAB (KLONG), IFOURT (JPLARX)
#else
      INTEGER KTAB (KLONG), IFOURT (JPLARX)
#endif
      INTEGER INUCPL (JPNPDF), INAPHY, INUMER, ILARPH, IPODEB, IPOFIN
      INTEGER IARDEB, IARFIN, IDCDEB, IDCFIN, ICPLTI, ICPLTF, ICPTTN
      INTEGER ICPTTX, INCPLT, INUMAP, J, JD, IDECDE, IPAREC, ITAMLI
      INTEGER INUMPJ, INUMPD, IARTIC, INPDRE, INPDTA, INPDIS, INDIK1
      INTEGER INDIK2, INDIC1, INDIC2, JI, IFACTM, IRETOU, INIMES
      INTEGER IRETIN
C
      LOGICAL LLADON, LLDERN
C
#include "lficom2.h"
C**
C     1.  -  CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS.
C-----------------------------------------------------------------------
C
      IRETOU=0
C
      IF (KRANG.LE.0.OR.KRANG.GT.JPNXFI.OR.KRGPIM.LE.0.OR.KPOSEX.EQ.0)
     S     THEN
        KREP=-16
        GOTO 1001
      ENDIF
C
C        ON COMPLETE LES CARACTERISTIQUES DE L'ARTICLE.
C
      INAPHY=0
C
      IF (.NOT.LPHASP(KRGPIM)) THEN
C
        CALL LFIPHA (KREP,KRANG,KRGPIM,IRETIN)
C
        IF (IRETIN.EQ.1) THEN
          GOTO 903
        ELSEIF (IRETIN.EQ.2) THEN
          GOTO 904
        ELSEIF (IRETIN.NE.0) THEN
          GOTO 1001
        ENDIF
C
      ENDIF
C
      INUMER=NUMERO(KRANG)
      IFACTM=MFACTM(KRANG)
      ILARPH=JPLARD*IFACTM
      KREP=0
C**
C     2.  -   LECTURE DES DONNEES .
C-----------------------------------------------------------------------
C*
C     2.1 - UTILISATION DES ARTICLES PHYSIQUES PRESENTS EN MEMOIRE,
C           ET QUE L'ON S'APPRETE A LIRE *EN ENTIER*;
C-----------------------------------------------------------------------
C
      IPODEB=KPOSEX
      IPOFIN=KPOSEX+KLONG-1
      IARDEB=1+(IPODEB-1)/ILARPH
      IARFIN=1+(IPOFIN-1)/ILARPH
      IDCDEB=MOD (IPODEB-1,ILARPH)
      IDCFIN=MOD (IPOFIN  ,ILARPH)
      LLDERN=IDCFIN.NE.0.AND.((IARFIN.NE.IARDEB)
     S                        .OR.(IARFIN.EQ.IARDEB.AND.IDCDEB.EQ.0))
      ICPLTI=IARDEB+(IDCDEB+ILARPH-1)/ILARPH
      ICPLTF=IARFIN-1+(ILARPH-IDCFIN)/ILARPH
      ICPTTN=ICPLTF+1
      ICPTTX=ICPLTI-1
      INCPLT=0
C
      IF (LMISOP) THEN
       PRINT *,'KPOSEX= ',KPOSEX,', IPODEB= ',IPODEB,', IPOFIN= ',IPOFIN
       PRINT *,'IARDEB= ',IARDEB,', IARFIN= ',IARFIN,', IDCDEB= ',IDCDEB
       PRINT *,'IDCFIN= ',IDCFIN,', ICPLTI= ',ICPLTI,', ICPLTF= ',ICPLTF
       PRINT *,'ICPTTN= ',ICPTTN,', ICPTTX= ',ICPTTX,', LLDERN= ',LLDERN
      ENDIF
C
      IF (ICPLTF.GE.ICPLTI) THEN
C
        DO 213 J=0,JPNPDF-1
        INUMAP=NUMAPD(J,KRANG)
C
        IF (INUMAP.GE.ICPLTI.AND.INUMAP.LE.ICPLTF) THEN
          INCPLT=INCPLT+1
          INUCPL(INCPLT)=INUMAP
          ICPTTN=MIN0 (ICPTTN,INUMAP)
          ICPTTX=MAX0 (ICPTTX,INUMAP)
          IDECDE=(INUMAP-IARDEB)*ILARPH-IDCDEB
C
          IF (NLONPD(J,KRANG).LT.ILARPH) THEN
C
            IF (INUMAP.GT.MDES1D(IXM(JPAXPD,KRANG)).OR.
     S          .NOT.LECRPD(J,KRANG)) THEN
              KREP=-16
              GOTO 1001
            ELSE
              INAPHY=INUMAP
              CALL LFILDO (KREP,INUMER,INUMAP,IFOURT,NBREAD(KRANG),
     S                     IFACTM,IRETIN)
C
              IF (IRETIN.NE.0) THEN
                GOTO 904
              ENDIF
C
              DO 211 JD=NLONPD(J,KRANG)+1,ILARPH
              MTAMPD(IXT(JD,J,KRANG))=IFOURT(JD)
  211         CONTINUE
C
            ENDIF
C
            NLONPD(J,KRANG)=ILARPH
          ENDIF
C
          DO 212 JD=1,ILARPH
          KTAB(IDECDE+JD)=MTAMPD(IXT(JD,J,KRANG))
  212     CONTINUE
C
          IF (INCPLT.GT.(ICPLTF-ICPLTI)) THEN
            GOTO 220
          ENDIF
C
        ENDIF
C
  213   CONTINUE
C
      ENDIF
C
  220 CONTINUE
C*
C     2.2 - TRAITEMENT DE LA PREMIERE PAGE DE DONNEES, SI L'ARTICLE
C           LOGIQUE NE COMMENCE PAS JUSTE EN DEBUT D'ARTICLE PHYSIQUE.
C           CETTE PAGE EST CONSERVEE... DES FOIS QUE L'ACCES
C           SUIVANT AU FICHIER SOIT POUR L'ARTICLE LOGIQUE IMMEDIATEMENT
C           DEVANT (CAS DE BALAYAGE INVERSE DU FICHIER, PAR EXEMPLE) .
C-----------------------------------------------------------------------
C
      IDECDE=0
C
      IF (IDCDEB.EQ.0) THEN
        IPAREC=0
        ITAMLI=JPNPDF
      ELSE
        IPAREC=MIN0 (ILARPH*IARDEB,IPOFIN)-KPOSEX+1
        ITAMLI=JPNPDF-1
C
C           L'ARTICLE DE DONNEES A LIRE NE COMMENCE PAS AU DEBUT D'UN
C         ARTICLE PHYSIQUE. IL FAUT DONC AVOIR CET ARTICLE PHYSIQUE
C         EN MEMOIRE POUR LE COMPLETER.
C
        DO 222 J=0,JPNPDF-1
        INUMPJ=MOD (NDERPD(KRANG)+J,JPNPDF)
C
        IF (NUMAPD(INUMPJ,KRANG).EQ.IARDEB) THEN
C
C           ARTICLE PHYSIQUE CHERCHE EN MEMOIRE.
C
          IF (NLONPD(INUMPJ,KRANG).LT.(IDCDEB+IPAREC)) THEN
C
            IF (IARDEB.GT.MDES1D(IXM(JPAXPD,KRANG))) THEN
              KREP=-16
              GOTO 1001
            ELSEIF (LECRPD(INUMPJ,KRANG)) THEN
              INAPHY=IARDEB
              CALL LFILDO (KREP,INUMER,IARDEB,IFOURT,
     S                     NBREAD(KRANG),IFACTM,IRETIN)
C
              IF (IRETIN.NE.0) THEN
                GOTO 904
              ENDIF
C
              DO 221 JD=NLONPD(INUMPJ,KRANG)+1,ILARPH
              MTAMPD(IXT(JD,INUMPJ,KRANG))=IFOURT(JD)
  221         CONTINUE
C
            ELSE
              NUMAPD(INUMPJ,KRANG)=JPNIL
              INAPHY=IARDEB
              CALL LFILDO (KREP,INUMER,IARDEB,
     S                     MTAMPD(IXT(1,INUMPJ,KRANG)),
     S                     NBREAD(KRANG),IFACTM,IRETIN)
C
              IF (IRETIN.NE.0) THEN
                GOTO 904
              ENDIF
C
              NUMAPD(INUMPJ,KRANG)=IARDEB
            ENDIF
C
            NLONPD(INUMPJ,KRANG)=ILARPH
          ENDIF
C
          INUMPD=INUMPJ
          GOTO 223
        ENDIF
C
  222   CONTINUE
C
C     ARTICLE PHYSIQUE CHERCHE PAS EN MEMOIRE... ON DOIT DONC LE LIRE.
C
        INUMPD=MOD (1+NDERPD(KRANG),JPNPDF)
        INAPHY=0
C
        IF (LECRPD(INUMPD,KRANG)) THEN
C
          CALL LFIVID (KREP,KRANG,INUMPD,IFOURT,IRETIN)
C
          IF (IRETIN.EQ.1) THEN
            GOTO 903
          ELSEIF (IRETIN.EQ.2) THEN
            GOTO 904
          ELSEIF (IRETIN.NE.0) THEN
            GOTO 1001
          ENDIF
C
        ENDIF
C
        NUMAPD(INUMPD,KRANG)=JPNIL
        INAPHY=IARDEB
        CALL LFILDO (KREP,INUMER,IARDEB,MTAMPD(IXT(1,INUMPD,KRANG)),
     S               NBREAD(KRANG),IFACTM,IRETIN)
C
        IF (IRETIN.NE.0) THEN
          GOTO 904
        ENDIF
C
        NUMAPD(INUMPD,KRANG)=IARDEB
        NLONPD(INUMPD,KRANG)=ILARPH
C
  223   CONTINUE
C
C         TRANSFERT DE LA PARTIE UTILE DES DONNEES POUR CE DEBUT
C       D'ARTICLE LOGIQUE.
C
        DO 224 JD=1,IPAREC
        KTAB(JD)=MTAMPD(IXT(IDCDEB+JD,INUMPD,KRANG))
  224   CONTINUE
C
        NDERPD(KRANG)=INUMPD
      ENDIF
C*
C     2.3 - LECTURE DES ARTICLES PHYSIQUES COMPLETS NE TENANT PAS OU NE
C           DEVANT PAS ETRE STOCKES DANS LES PAGES DE DONNEES "TAMPON".
C-----------------------------------------------------------------------
C
      IF (.NOT.LTAMPL(KRANG)) THEN
        ITAMLI=0
      ELSEIF (LLDERN) THEN
        ITAMLI=ITAMLI-1
      ENDIF
C
      IARTIC=ICPLTI-1
      INPDRE=(KLONG-IPAREC-IDCFIN+ILARPH-1)/ILARPH-INCPLT
      INPDTA=MIN0 (INPDRE,ITAMLI)
      INPDIS=INPDRE-ITAMLI
      INDIK1=1
      INDIK2=INCPLT
      LLADON=.TRUE.
C
      DO 235 J=1,INPDIS
C
  231 CONTINUE
      IARTIC=IARTIC+1
      IF (LMISOP) PRINT *,
     S      'BOUCLE 235, J= ',J,', IARTIC= ',IARTIC,', IDECDE= ',IDECDE
C
      IF (IARTIC.GE.ICPTTN.AND.IARTIC.LE.ICPTTX) THEN
        IF (IARTIC.EQ.ICPTTN) ICPTTN=ICPTTN+1
        IF (IARTIC.EQ.ICPTTX) ICPTTX=ICPTTX-1
        INDIC1=INDIK1
        INDIC2=INDIK2
C
C          ON FILTRE LES ARTICLES PHYSIQUES DEJA STOCKES DANS DES PAGES
C        DE DONNEES LORS DE LA PARTIE 2.1 ...
C
        DO 232 JI=INDIC1,INDIC2
C
        IF (IARTIC.EQ.INUCPL(JI)) THEN
          IF (JI.EQ.INDIK1) INDIK1=INDIK1+1
          IF (JI.EQ.INDIK2) INDIK2=INDIK2-1
          GOTO 231
        ENDIF
C
  232   CONTINUE
C
      ENDIF
C
      IDECDE=(IARTIC-IARDEB)*ILARPH-IDCDEB
      INAPHY=IARTIC
      CALL LFILDO (KREP,INUMER,IARTIC,KTAB(IDECDE+1),
     S             NBREAD(KRANG),IFACTM,IRETIN)
C
      IF (IRETIN.NE.0) THEN
        GOTO 904
      ENDIF

  235 CONTINUE
C*
C     2.4 - LECTURE DES ARTICLES PHYSIQUES COMPLETS QUE L'ON PEUT STOC-
C           KER DANS LES PAGES DE DONNEES "TAMPON".
C           ( TOUT EN PRESERVANT LES EMPLACEMENTS DE LA PREMIERE ET/OU
C             DE LA DERNIERE PAGE DE DONNEES, SI INCOMPLETE(S) )
C-----------------------------------------------------------------------
C
      DO 246 J=1,INPDTA
      INUMPD=MOD (NDERPD(KRANG)+J,JPNPDF)
C
  241 CONTINUE
      IARTIC=IARTIC+1
C
      IF (IARTIC.GE.ICPTTN.AND.IARTIC.LE.ICPTTX) THEN
        IF (IARTIC.EQ.ICPTTN) ICPTTN=ICPTTN+1
        IF (IARTIC.EQ.ICPTTX) ICPTTX=ICPTTX-1
        INDIC1=INDIK1
        INDIC2=INDIK2
C
C          ON FILTRE LES ARTICLES PHYSIQUES DEJA STOCKES DANS DES PAGES
C        DE DONNEES LORS DE LA PARTIE 2.1 ...
C
        DO 242 JI=INDIC1,INDIC2
C
        IF (IARTIC.EQ.INUCPL(JI)) THEN
          IF (JI.EQ.INDIK1) INDIK1=INDIK1+1
          IF (JI.EQ.INDIK2) INDIK2=INDIK2-1
          GOTO 241
        ENDIF
C
  242   CONTINUE
C
      ENDIF
C
C         SI NECESSAIRE, "VIDAGE" SUR FICHIER DE LA PAGE A UTILISER.
C
      INAPHY=0
C
      IF (LECRPD(INUMPD,KRANG)) THEN
C
        CALL LFIVID (KREP,KRANG,INUMPD,IFOURT,IRETIN)
C
        IF (IRETIN.EQ.1) THEN
          GOTO 903
        ELSEIF (IRETIN.EQ.2) THEN
          GOTO 904
        ELSEIF (IRETIN.NE.0) THEN
          GOTO 1001
        ENDIF
C
      ENDIF
C
C         LECTURE SUR FICHIER DE LA PAGE DE DONNEES TAMPON.
C
      NUMAPD(INUMPD,KRANG)=JPNIL
      INAPHY=IARTIC
      CALL LFILDO (KREP,INUMER,IARTIC,MTAMPD(IXT(1,INUMPD,KRANG)),
     S             NBREAD(KRANG),IFACTM,IRETIN)
C
      IF (IRETIN.NE.0) THEN
        GOTO 904
      ENDIF
C
      NUMAPD(INUMPD,KRANG)=IARTIC
      NLONPD(INUMPD,KRANG)=ILARPH
      IDECDE=(IARTIC-IARDEB)*ILARPH-IDCDEB
C
C         TRANSFERT DANS LA ZONE UTILISATEUR.
C
      DO 245 JD=1,ILARPH
      KTAB(IDECDE+JD)=MTAMPD(IXT(JD,INUMPD,KRANG))
  245 CONTINUE
C
  246 CONTINUE
C
      NDERPD(KRANG)=MOD (NDERPD(KRANG)+INPDTA,JPNPDF)
C*
C     2.5 - TRAITEMENT DE LA DERNIERE PAGE DE DONNEES SI ELLE EST
C           INCOMPLETE, ET SI ON EST DANS L'UN DES 2 CAS SUIVANTS
C           SOIT ELLE DIFFERE DE LA PREMIERE, SOIT C'EST LA MEME QUE LA
C           PREMIERE ET ELLE COMMENCE JUSTE EN DEBUT D'ARTICLE.
C           CETTE PAGE EST CONSERVEE... CAR ON ESPERE QUE L'ACCES
C           SUIVANT AU FICHIER SERA POUR L'ARTICLE LOGIQUE IMMEDIATEMENT
C           DERRIERE ( LECTURE SEQUENTIELLE DU FICHIER, PAR EXEMPLE ) .
C-----------------------------------------------------------------------
C
      IF (LLDERN) THEN
C
        DO 252 J=1,JPNPDF
        INUMPJ=MOD (NDERPD(KRANG)+J,JPNPDF)
C
        IF (NUMAPD(INUMPJ,KRANG).EQ.IARFIN) THEN
C
C           ARTICLE PHYSIQUE CHERCHE EN MEMOIRE.
C
          IF (NLONPD(INUMPJ,KRANG).LT.IDCFIN) THEN
C
            IF (IARFIN.GT.MDES1D(IXM(JPAXPD,KRANG))) THEN
              KREP=-16
              GOTO 1001
            ELSEIF (LECRPD(INUMPJ,KRANG)) THEN
              INAPHY=IARFIN
              CALL LFILDO (KREP,INUMER,IARFIN,IFOURT,
     S                     NBREAD(KRANG),IFACTM,IRETIN)
C
              IF (IRETIN.NE.0) THEN
                GOTO 904
              ENDIF
C
              DO 251 JD=NLONPD(INUMPJ,KRANG)+1,ILARPH
              MTAMPD(IXT(JD,INUMPJ,KRANG))=IFOURT(JD)
  251         CONTINUE
C
            ELSE
              NUMAPD(INUMPJ,KRANG)=JPNIL
              INAPHY=IARFIN
              CALL LFILDO (KREP,INUMER,IARFIN,
     S                     MTAMPD(IXT(1,INUMPJ,KRANG)),
     S                     NBREAD(KRANG),IFACTM,IRETIN)
C
              IF (IRETIN.NE.0) THEN
                GOTO 904
              ENDIF
C
              NUMAPD(INUMPJ,KRANG)=IARFIN
            ENDIF
C
            NLONPD(INUMPJ,KRANG)=ILARPH
          ENDIF
C
          INUMPD=INUMPJ
          GOTO 253
        ENDIF
C
  252   CONTINUE
C
C           ARTICLE PHYSIQUE CHERCHE PAS EN MEMOIRE...
C
        INUMPD=MOD (1+NDERPD(KRANG),JPNPDF)
        INAPHY=0
C
        IF (LECRPD(INUMPD,KRANG)) THEN
C
          CALL LFIVID (KREP,KRANG,INUMPD,IFOURT,IRETIN)
C
          IF (IRETIN.EQ.1) THEN
            GOTO 903
          ELSEIF (IRETIN.EQ.2) THEN
            GOTO 904
          ELSEIF (IRETIN.NE.0) THEN
            GOTO 1001
          ENDIF
C
        ENDIF
C
        IF (IARFIN.LE.MDES1D(IXM(JPAXPD,KRANG))) THEN
          NUMAPD(INUMPD,KRANG)=JPNIL
          INAPHY=IARFIN
          CALL LFILDO (KREP,INUMER,IARFIN,MTAMPD(IXT(1,INUMPD,KRANG)),
     S                 NBREAD(KRANG),IFACTM,IRETIN)
C
          IF (IRETIN.NE.0) THEN
            GOTO 904
          ENDIF
C
          NLONPD(INUMPD,KRANG)=ILARPH
        ELSE
          NLONPD(INUMPD,KRANG)=0
        ENDIF
C
        NUMAPD(INUMPD,KRANG)=IARFIN
C
  253   CONTINUE
        IDECDE=(IARFIN-IARDEB)*ILARPH-IDCDEB
C
C         COMPLEMENT DE LA PAGE DE DONNEES ASSOCIEE AU DERNIER ARTICLE
C       PHYSIQUE OU DOIVENT ETRE STOCKEES LES DONNEES A ECRIRE.
C
        DO 254 JD=1,IDCFIN
        KTAB(IDECDE+JD)=MTAMPD(IXT(JD,INUMPD,KRANG))
  254   CONTINUE
C
        NDERPD(KRANG)=INUMPD
      ENDIF
C
      GOTO 1001
C**
C     9.  - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
C      AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
C-----------------------------------------------------------------------
C
  903 CONTINUE
      IRETOU=1
      CLACTI='WRITE'
      GOTO 909
C
  904 CONTINUE
      IRETOU=2
      CLACTI='READ'
C
  909 CONTINUE
      KREP=IABS (KREP)
      IF (INAPHY.NE.0) NUMAPH(KRANG)=INAPHY
C**
C    10.  -  PHASE TERMINALE : MESSAGERIE INTERNE EVENTUELLE,
C            VIA LE SOUS-PROGRAMME "LFIEMS", PUIS RETOUR.
C-----------------------------------------------------------------------
C
 1001 CONTINUE
      LLFATA=LLMOER (KREP,KRANG)
C
      IF (KREP.EQ.0) THEN
        KRETIN=0
      ELSEIF (KREP.GT.0) THEN
        KRETIN=IRETOU
      ELSE
        KRETIN=3
      ENDIF
C
      IF (LMISOP.OR.LLFATA) THEN
        INIMES=2
        CLNSPR='LFILED'
        WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KRANG='',I3,
     S  '', KLONG='',I7,'', KRGPIM='',I3,'', KPOSEX='',I8,
     S  '', KRETIN='',I2)') KREP,KRANG,KLONG,KRGPIM,KPOSEX,KRETIN
        CALL LFIEMS (INUMER,INIMES,KREP,.FALSE.,CLMESS,CLNSPR,CLACTI)
      ENDIF
C
      RETURN
C
      END
