      SUBROUTINE LFIRAN ( KREP, KRANG, CDNOMA, KRGPIM, KARTEX, KRETIN )
#include "lficomt.h"
C****
C        SOUS-PROGRAMME *INTERNE* DU LOGICIEL DE FICHIERS INDEXES LFI
C     RECHERCHE D'UN ARTICLE LOGIQUE PAR NOM, DANS UNE UNITE LOGIQUE.
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                CDNOMA (ENTREE) ==> NOM DE L'ARTICLE A RECHERCHER;
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
      CHARACTER CDNOMA*(*)
C
      INTEGER KREP, KRANG, KRGPIM, KARTEX, ILCDNO, IRANG, IFACTM, INALPP
      INTEGER INBALO, INTPPI, IRANGF, IRGPIF, J, ILFORC, INPILE, IRANGM
      INTEGER IRGPIM, IARTIC, INPIME, IRPIFN, INPPIM, IDEBEX, INUMER
      INTEGER JNPAGE, INALPI, IRETOU, INIMES, INBVAL, KRETIN, IRETIN
      INTEGER IEXPLO (JPNPIA+JPNPIS), INDICE (JPNAPX)
C
#include "lficom2.h"
C**
C     1.  -  PREAMBULES.
C-----------------------------------------------------------------------
C*
C     1.1 - CONTROLES DES PARAMETRES D'APPEL ET INITIALISATIONS.
C-----------------------------------------------------------------------
C
      ILCDNO=LEN (CDNOMA)
C
      IF (KRANG.LE.0.OR.KRANG.GT.JPNXFI.OR.
     S    ILCDNO.LE.0.OR.ILCDNO.GT.JPNCPN.OR.CDNOMA.EQ.' ') THEN
        KREP=-16
        GOTO 1001
      ENDIF
C
      IRANG=KRANG
      KREP=0
      IFACTM=MFACTM(IRANG)
      INALPP=JPNAPP*IFACTM
      INBALO=MDES1D(IXM(JPNALO,IRANG))
      INTPPI=(INBALO-1+INALPP)/INALPP
      IF (LMISOP) PRINT *,'LFIRAN - INBALO= ',INBALO,', INTPPI= ',INTPPI
C*
C     1.2 - CAS "ELEMENTAIRES" OU CHANCEUX.
C-----------------------------------------------------------------------
C
      IF (INBALO.EQ.0) THEN
C
C          Fichier vide ou depourvu d'articles logiques de donnees.
C
        GOTO 300
C
      ELSEIF (NDERGF(IRANG).NE.JPNIL.AND.CNDERA(IRANG).EQ.CDNOMA) THEN
C
C          Le dernier article demande via LFINFO (cas le plus probable)
C     ou LFILAS/LFILAP/LFICAS/LFICAP etait celui cherche !
C
        IRANGF=NDERGF(IRANG)
        IRGPIF=1+(IRANGF-1)/INALPP
C
        IF (IRANGF.LE.INALPP) THEN
          IRGPIM=MRGPIM(1,IRANG)
        ELSEIF (IRANGF.GT.INALPP*(INTPPI-1)) THEN
          IRGPIM=MRGPIM(NPODPI(IRANG),IRANG)
        ELSE
C
          DO 121 J=2,NPPIMM(IRANG)
          IRGPIM=MRGPIM(J,IRANG)
          IF (MRGPIF(IRGPIM).EQ.IRGPIF) GOTO 122
  121     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,
     S                 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
  122   CONTINUE
        IARTIC=IRANGF-INALPP*(IRGPIF-1)
C
        IF (CNOMAR(IXC(IARTIC,IRGPIM)).EQ.CDNOMA) THEN
          KRGPIM=IRGPIM
          KARTEX=IARTIC
        ELSE
          KREP=-16
        ENDIF
C
        GOTO 1001
C
      ENDIF
C
      INPIME=0
      IRPIFN=1
      INPPIM=NPPIMM(IRANG)
C
      IF (NPODPI(IRANG).EQ.2) THEN
        IDEBEX=3
      ELSE
        IDEBEX=2
      ENDIF
C**
C     2.  -  EXPLORATION DES PAGES ET ARTICLES D'INDEX "NOMS",
C            A LA RECHERCHE DE L'ARTICLE LOGIQUE. ( ON COMMENCE
C            PAR EXPLORER LES PAGES D'INDEX )
C-----------------------------------------------------------------------
C
      DO 205 JNPAGE=1,INTPPI
C
      IF (JNPAGE.LE.INPPIM) THEN
C
C           IL S'AGIT D'UNE EXPLORATION EN MEMOIRE ( PAGE D'INDEX ).
C
        IRGPIM=MRGPIM(JNPAGE,IRANG)
        IRGPIF=MRGPIF(IRGPIM)
        INPIME=INPIME+1
        IEXPLO(INPIME)=IRGPIF
        IF (IRGPIF.EQ.(IRPIFN+1)) IRPIFN=IRGPIF
      ELSE
C
C           IL S'AGIT D'UNE EXPLORATION "HORS MEMOIRE";
C         ON CHERCHE LA PROCHAINE P.A.I. NON EXPLOREE .
C
        IF (JNPAGE.EQ.INPPIM+1) IRGPIF=IRPIFN
C
  201   CONTINUE
        IRGPIF=IRGPIF+1
C
        DO 202 J=IDEBEX,INPIME
        IF (IEXPLO(J).EQ.IRGPIF) GOTO 201
  202   CONTINUE
C
        ILFORC=1
        INPILE=1
        CALL LFIPIM (KREP,IRANG,IRANGM,IRGPIM,IRGPIF,ILFORC,INPILE,
     S               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
      INALPI=MIN0 (INALPP,INBALO-(IRGPIF-1)*INALPP)
C
      DO 204 J=1,INALPI
C
      IF (CNOMAR(IXC(J,IRGPIM)).EQ.CDNOMA) THEN
        KRGPIM=IRGPIM
        KARTEX=J
        GOTO 1001
      ENDIF
C
  204 CONTINUE
C
  205 CONTINUE
C
  300 CONTINUE
C**
C     3.  -  CAS OU L'ARTICLE N'A PAS ETE TROUVE.
C-----------------------------------------------------------------------
C
      KRGPIM=0
      KARTEX=0
      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='LFIRAN'
        WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KRANG='',I3,
     S  '', CDNOMA='''''',A,'''''', KRGPIM='',I3,'', KARTEX='',I5,
     S  '', KRETIN='',I2)')
     S    KREP,KRANG,CDNOMA,KRGPIM,KARTEX,KRETIN
        CALL LFIEMS (INUMER,INIMES,KREP,.FALSE.,CLMESS,CLNSPR,CLACTI)
      ENDIF
C
      RETURN
C
      END
