SURFEX v7.3
General documentation of Surfex
|
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