      SUBROUTINE LFICAQ ( KREP, KRANG, KRGPIM, KARTEX, KRETIN )
#include "lficomt.h"
C****
C        SOUS-PROGRAMME *INTERNE* DU LOGICIEL DE FICHIERS INDEXES LFI;
C     RECHERCHE DE L'ARTICLE LOGIQUE *DE DONNEES* PRECEDENT, DANS UNE
C     UNITE LOGIQUE DONNEE.
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                KRGPIM (SORTIE) ==> RANG DANS LES TABLES CNOMAR,MLGPOS,
C                                    ETC. DE LA P.P.I OU FIGURE
C                                    L'ARTICLE ( 0 SI PAS TROUVE );
C                KARTEX (SORTIE) ==> RANG ( DANS LA PAGE D'INDEX ) DE L'
C                                    ARTICLE S'IL EXISTE ( 0 SINON );
C                KRETIN (SORTIE) ==> CODE-RETOUR INTERNE.
C
#include "lficom0.h"
#ifndef f77
#include "precision.h"
#endif
#include "lficom1.h"
C
      INTEGER KREP, KRANG, KRGPIM, KARTEX, IRANG, INBALO, INALPP, INTPPI
      INTEGER INPPIM, IDERGF, IRANGF, IRGPIF, IRGPIM, IRANGM, ILFORC, J
      INTEGER INPILE, IARTIK, IARTIC, IRETOU, INIMES, INUMER, KRETIN
      INTEGER IRETIN
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) THEN
        KREP=-16
        GOTO 1001
      ENDIF
C
      IRANG=KRANG
      KREP=0
      KRGPIM=0
      KARTEX=0
      INBALO=MDES1D(IXM(JPNALO,IRANG))
      INALPP=JPNAPP*MFACTM(IRANG)
      INTPPI=(INBALO-1+INALPP)/INALPP
      INPPIM=NPPIMM(IRANG)
C
      IF (NPRECF(IRANG).EQ.JPNIL) THEN
C
C           ON N'A DONC PAS ENCORE APPELE CE SOUS-PROGRAMME POUR
C        RECHERCHER CET ARTICLE ( A PRIORI, VIA *LFICAP* ) .
C
        IF (NDERGF(IRANG).EQ.JPNIL) THEN
          IDERGF=INBALO+1
        ELSE
          IDERGF=NDERGF(IRANG)
        ENDIF
C
        IF (IDERGF.LE.1) THEN
          NPRECF(IRANG)=0
          GOTO 1001
        ENDIF
C
        IRANGF=IDERGF-1
C
      ELSEIF (NPRECF(IRANG).EQ.0) THEN
C
C        PLUS D'ARTICLE LOGIQUE "PRECEDENT" A LIRE .
C
        GOTO 1001
      ELSEIF (NDERGF(IRANG).EQ.JPNIL.OR.
     S        NPRECF(IRANG).LT.NDERGF(IRANG)) THEN
        IRANGF=NPRECF(IRANG)
      ELSE
        KREP=-16
        GOTO 1001
      ENDIF
C**
C     2.  -  EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
C            A LA RECHERCHE DE L'ARTICLE LOGIQUE DEMANDE,
C            DEFINI PAR SON RANG "A PRIORI" DANS LE FICHIER.
C            ( MAIS IL FAUT "SAUTER" LES TROUS )
C-----------------------------------------------------------------------
C*
C     2.1 -  RECHERCHE DANS LES PAGES D'INDEX .
C-----------------------------------------------------------------------
C
      IRGPIF=1+(IRANGF-1)/INALPP
C
  211 CONTINUE
C
      IF (IRANGF.LE.INALPP) THEN
        IRGPIM=MRGPIM(1,IRANG)
        GOTO 215
      ELSEIF (IRANGF.GT.INALPP*(INTPPI-1)) THEN
        IRGPIM=MRGPIM(NPODPI(IRANG),IRANG)
        GOTO 215
      ENDIF
C
      DO 213 J=2,INPPIM
      IRGPIM=MRGPIM(J,IRANG)
      IF (MRGPIF(IRGPIM).EQ.IRGPIF) GOTO 215
  213 CONTINUE
C
C        MISE EN MEMOIRE DE L'ARTICLE D'INDEX "NOMS" CHERCHE.
C
      ILFORC=1
      INPILE=1
      CALL LFIPIM (KREP,IRANG,IRANGM,IRGPIM,IRGPIF,ILFORC,INPILE,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
      INPPIM=MAX0 (INPPIM,IRANGM)
C
  215 CONTINUE
      IARTIK=IRANGF-INALPP*(IRGPIF-1)
C
C         ON CHERCHE LE PREMIER ARTICLE LOGIQUE *DE DONNEES* DE LA PAGE
C       D'INDEX, A PARTIR DU RANG *IARTIK* DANS CETTE PAGE.
C
      DO 216 J=IARTIK,1,-1
C
      IF (CNOMAR(IXC(J,IRGPIM)).NE.' ') THEN
        IARTIC=J
        GOTO 220
      ENDIF
C
  216 CONTINUE
C
C        CHOU BLANC POUR CETTE PAGE... A PRIORI, ON VA CHERCHER DANS
C     LA P.A.I. PRECEDENTE, EN RANG DANS LE FICHIER.
C
      IF (IRGPIF.GT.1) THEN
        IRGPIF=IRGPIF-1
        IRANGF=INALPP*IRGPIF
        GOTO 211
      ENDIF
C
C    SI ON ARRIVE ICI, C'EST QUE LE PREMIER ARTICLE LOGIQUE EST UN TROU
C
      NPRECF(IRANG)=0
      GOTO 1001
C*
C     2.2 -  ARTICLE DE DONNEES REPERE, ON RENVOIE SES CARACTERISTIQUES.
C-----------------------------------------------------------------------
C
  220 CONTINUE
      KRGPIM=IRGPIM
      KARTEX=IARTIC
      NPRECF(IRANG)=(IRGPIF-1)*INALPP+IARTIC
      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)
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
        INUMER=NUMERO(KRANG)
        INIMES=2
        CLNSPR='LFICAQ'
        WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KRANG='',I3,
     S         '', KRGPIM='',I3,'', KARTEX='',I5,'', KRETIN='',I2)')
     S    KREP,KRANG,KRGPIM,KARTEX,KRETIN
        CALL LFIEMS (INUMER,INIMES,KREP,.FALSE.,CLMESS,CLNSPR,CLACTI)
      ENDIF
C
      RETURN
C
      END
