SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/LFI/mt/lficap_mt.F
Go to the documentation of this file.
00001 C Jan-2011 P. Marguinaud Thread-safe LFI
00002       SUBROUTINE LFICAP_MT (LFI, KREP, KNUMER, CDNOMA, KLONG, 
00003      S                      KPOSEX, LDRECU )
00004       USE LFIMOD, ONLY : LFICOM
00005       USE PARKIND1, ONLY : JPRB
00006       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00007 C****
00008 C        SOUS-PROGRAMME DONNANT LES CARACTERISTIQUES ( NOM, LONGUEUR,
00009 C     POSITION ) DE L'ARTICLE LOGIQUE *DE DONNEES* PRECEDENT, SUR UNE
00010 C     UNITE LOGIQUE OUVERTE POUR LE LOGICIEL DE FICHIERS INDEXES *LFI* .
00011 C**
00012 C    ARGUMENTS : KREP   (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME;
00013 C                KNUMER (ENTREE) ==> LFI%NUMERO DE L'UNITE LOGIQUE;
00014 C                CDNOMA (SORTIE) ==> NOM DE L'ARTICLE SUIVANT;
00015 C                KLONG  (SORTIE) ==> LONGUEUR DE L'ARTICLE PRECEDENT;
00016 C                KPOSEX (SORTIE) ==> POSITION ( DANS LE FICHIER, DU PRE-
00017 C                                    MIER MOT ) DE L'ARTICLE PRECEDENT;
00018 C                LDRECU (ENTREE) ==> VRAI SI ON DOIT "RECULER" LE
00019 C                                    POINTEUR DU FICHIER.
00020 C
00021 C     SI L'ON SOUHAITE LIRE ENSUITE L'ARTICLE EN QUESTION (VIA *LFILAP*)
00022 C     IL FAUT PRECISER A L'APPEL LDRECU=.FALSE. ; CET ARGUMENT EXISTE
00023 C     SURTOUT PAR HOMOGENEITE AVEC *LFICAS*.
00024 C
00025 C     SI LE FICHIER EST VIDE OU QUE LE DERNIER ARTICLE LOGIQUE LU ETAIT
00026 C     LE PREMIER, LE SOUS-PROGRAMME "RETOURNE" KLONG=0, ET CDNOMA=' ' .
00027 C
00028 #ifndef f77
00029 #include "precision.h"
00030 #endif
00031 C
00032       TYPE(LFICOM) :: LFI
00033       CHARACTER CDNOMA*(*), CLNOMA*(LFI%JPNCPN)
00034 C
00035       INTEGER KREP, KNUMER, KLONG, KPOSEX, IREP, ILCDNO, IDECBL, IPOSBL
00036       INTEGER ILCLNO, IRANG, IRGPIM, IARTIC, IRGPIF, INIMES, IRETIN
00037 C
00038       LOGICAL LDRECU, LLVERF
00039 C
00040 #include "lficom2.h"
00041 #include "lficom_mt.h"
00042 C**
00043 C     1.  -  CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS.
00044 C-----------------------------------------------------------------------
00045 C
00046 C        Appel legerement anticipe a LFINUM, garantissant l'initialisa-
00047 C     tion des variables globales du logiciel a la 1ere utilisation.
00048 C
00049       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00050       IF (LHOOK) CALL DR_HOOK('LFICAP_MT',0,ZHOOK_HANDLE)
00051       CALL LFINUM_MT (LFI, KNUMER,IRANG)
00052       LLVERF=.FALSE.
00053       IREP=0
00054       KLONG=0
00055       KPOSEX=0
00056       ILCDNO=LEN (CDNOMA)
00057 C
00058       IF (ILCDNO.LE.0) THEN
00059         IREP=-15
00060         CLNOMA=LFI%CHINCO(:LFI%JPNCPN)
00061         ILCLNO=LFI%JPNCPN
00062         GOTO 1001
00063       ELSE
00064         CDNOMA=' '
00065         CLNOMA=' '
00066         ILCLNO=1
00067       ENDIF
00068 C
00069       IF (IRANG.EQ.0) THEN
00070         IREP=-1
00071         GOTO 1001
00072       ENDIF
00073 C
00074        IF (LFI%LMULTI) CALL LFIVER_MT (LFI, LFI%VERRUE(IRANG),'ON')
00075       LLVERF=LFI%LMULTI
00076 C**
00077 C     2.  -  EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
00078 C            A LA RECHERCHE DE L'ARTICLE LOGIQUE DEMANDE,
00079 C            DEFINI PAR SON RANG "A PRIORI" DANS LE FICHIER.
00080 C-----------------------------------------------------------------------
00081 C
00082       CALL LFICAQ_MT (LFI, IREP,IRANG,IRGPIM,IARTIC,IRETIN)
00083 C
00084       IF (IRETIN.EQ.1) THEN
00085         GOTO 903
00086       ELSEIF (IRETIN.EQ.2) THEN
00087         GOTO 904
00088       ELSEIF (IRETIN.NE.0.OR.IARTIC.EQ.0) THEN
00089         GOTO 1001
00090       ENDIF
00091 C*
00092 C     2.1 -  ARTICLE DE DONNEES TROUVE... APRES CONTROLES SUPPLEMENTAI-
00093 C            RES, ON RETOURNE SES CARACTERISTIQUES.
00094 C-----------------------------------------------------------------------
00095 C
00096       IRGPIF=LFI%MRGPIF(IRGPIM)
00097 C
00098       IF (.NOT.LFI%LPHASP(IRGPIM)) THEN
00099 C
00100         CALL LFIPHA_MT (LFI, IREP,IRANG,IRGPIM,IRETIN)
00101 C
00102         IF (IRETIN.EQ.1) THEN
00103           GOTO 903
00104         ELSEIF (IRETIN.EQ.2) THEN
00105           GOTO 904
00106         ELSEIF (IRETIN.NE.0) THEN
00107           GOTO 1001
00108         ENDIF
00109 C
00110       ENDIF
00111 C
00112       KLONG=LFI%MLGPOS(IXM(2*IARTIC-1,IRGPIM))
00113       KPOSEX=LFI%MLGPOS(IXM(2*IARTIC,IRGPIM))
00114       CLNOMA=LFI%CNOMAR(IXC(IARTIC,IRGPIM))
00115 C
00116 C        Recherche de la longueur "utile" du nom d'article.
00117 C        (c'est-a-dire sans tenir compte des blancs terminaux eventuels)
00118 C
00119       IDECBL=0
00120 C
00121   211 CONTINUE
00122       IPOSBL=IDECBL+INDEX (CLNOMA(IDECBL+1:),' ')
00123 C
00124       IF (IPOSBL.LE.IDECBL) THEN
00125         ILCLNO=LFI%JPNCPN
00126       ELSEIF (CLNOMA(IPOSBL:).EQ.' ') THEN
00127         ILCLNO=IPOSBL-1
00128       ELSE
00129         IDECBL=IPOSBL
00130         GOTO 211
00131       ENDIF
00132 C
00133       IF (ILCDNO.GE.ILCLNO) THEN
00134         CDNOMA=CLNOMA(:ILCLNO)
00135       ELSE
00136         IREP=-24
00137         CLACTI=CLNOMA
00138         GOTO 1001
00139       ENDIF
00140 C
00141       IF (LDRECU) THEN
00142 C
00143 C          ON RECULE LE "POINTEUR" DU FICHIER...
00144 C       ET ON REINITIALISE LES "POINTEURS" SUIVANT ET PRECEDENT.
00145 C
00146         LFI%NDERGF(IRANG)=LFI%JPNAPP*LFI%MFACTM(IRANG)*(IRGPIF-1)+IARTIC
00147         LFI%CNDERA(IRANG)=CLNOMA
00148         LFI%NSUIVF(IRANG)=LFI%JPNIL
00149         LFI%NPRECF(IRANG)=LFI%JPNIL
00150       ENDIF
00151 C
00152       GOTO 1001
00153 C**
00154 C     9.  - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
00155 C-----------------------------------------------------------------------
00156 C
00157   903 CONTINUE
00158       CLACTI='WRITE'
00159       GOTO 909
00160 C
00161   904 CONTINUE
00162       CLACTI='READ'
00163 C
00164   909 CONTINUE
00165 C
00166 C      AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
00167 C
00168       IREP=IABS (IREP)
00169 C**
00170 C    10.  -  PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
00171 C            VIA LE SOUS-PROGRAMME "LFIEMS" .
00172 C-----------------------------------------------------------------------
00173 C
00174  1001 CONTINUE
00175       KREP=IREP
00176       LLFATA=LLMOER (IREP,IRANG)
00177 C
00178       IF (IRANG.NE.0) THEN
00179         LFI%NDEROP(IRANG)=17
00180         LFI%NDERCO(IRANG)=IREP
00181          IF (LLVERF) CALL LFIVER_MT (LFI, LFI%VERRUE(IRANG),'OFF')
00182       ENDIF
00183 C
00184       IF (LLFATA.OR.IXNIMS (IRANG).EQ.2) THEN
00185         INIMES=2
00186       ELSE
00187         IF (LHOOK) CALL DR_HOOK('LFICAP_MT',1,ZHOOK_HANDLE)
00188         RETURN
00189       ENDIF
00190 C
00191       CLNSPR='LFICAP'
00192       WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KNUMER='
00193 ',I3,     S    '', CDNOMA='''''',A,'''''', KLONG='',I7,'', KPOSEX='
00194 ',I8,     S    '', LDRECU= '',L1)')
00195      S  KREP,KNUMER,CLNOMA(:ILCLNO),KLONG,KPOSEX,LDRECU
00196       CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,LLFATA,
00197      S                CLMESS,CLNSPR,CLACTI)
00198 C
00199       IF (LHOOK) CALL DR_HOOK('LFICAP_MT',1,ZHOOK_HANDLE)
00200       END
00201