SURFEX v7.3
General documentation of Surfex
|
00001 C Jan-2011 P. Marguinaud Thread-safe LFI 00002 SUBROUTINE LFINFO_MT (LFI, KREP, KNUMER, CDNOMA, KLONG, KPOSEX ) 00003 USE LFIMOD, ONLY : LFICOM 00004 USE PARKIND1, ONLY : JPRB 00005 USE YOMHOOK , ONLY : LHOOK, DR_HOOK 00006 C**** 00007 C SOUS-PROGRAMME CHARGE DE RENSEIGNER SUR EXISTENCE ET CARACTERI- 00008 C STIQUES ( LONGUEUR, POSITION ) D'UN ARTICLE LOGIQUE, POUR UNE 00009 C UNITE LOGIQUE OUVERTE PAR LE LOGICIEL DE FICHIERS INDEXES *LFI*. 00010 C** 00011 C ARGUMENTS : KREP (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME; 00012 C KNUMER (ENTREE) ==> LFI%NUMERO DE L'UNITE LOGIQUE; 00013 C CDNOMA (ENTREE) ==> NOM DE L'ARTICLE A CHERCHER; 00014 C KLONG (SORTIE) ==> LONGUEUR DE L'ARTICLE; 00015 C KPOSEX (SORTIE) ==> POSITION ( DANS LE FICHIER, DU PRE- 00016 C MIER MOT ) DE L'ARTICLE SUIVANT. 00017 C 00018 C Noter que si l'unite logique est ouverte pour le logiciel LFI et 00019 C que l'article demande n'y est pas trouve, KREP, KLONG et KPOSEX 00020 C sont retournes a ZERO. 00021 C 00022 #ifndef f77 00023 #include "precision.h" 00024 #endif 00025 C 00026 TYPE(LFICOM) :: LFI 00027 CHARACTER CDNOMA*(*), CLNOMA*(LFI%JPNCPN) 00028 C 00029 INTEGER KREP, KNUMER, KLONG, KPOSEX, IREP, IRANG, ILCLNO, ILCDNO 00030 INTEGER IDECBL, IPOSBL, IARTEX, IRGPIM, INIMES, INBALO, IRETIN 00031 C 00032 LOGICAL LLVERF 00033 C 00034 #include "lficom2.h" 00035 #include "lficom_mt.h" 00036 C** 00037 C 1. - CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS. 00038 C----------------------------------------------------------------------- 00039 C 00040 C Appel legerement anticipe a LFINUM, garantissant l'initialisa- 00041 C tion des variables globales du logiciel a la 1ere utilisation. 00042 C 00043 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00044 IF (LHOOK) CALL DR_HOOK('LFINFO_MT',0,ZHOOK_HANDLE) 00045 CALL LFINUM_MT (LFI, KNUMER,IRANG) 00046 LLVERF=.FALSE. 00047 ILCDNO=LEN (CDNOMA) 00048 KLONG=0 00049 KPOSEX=0 00050 C 00051 IF (ILCDNO.LE.0) THEN 00052 IREP=-15 00053 CLNOMA=LFI%CHINCO(:LFI%JPNCPN) 00054 ILCLNO=LFI%JPNCPN 00055 GOTO 1001 00056 ELSEIF (CDNOMA.EQ.' ') THEN 00057 IREP=-18 00058 CLNOMA=' ' 00059 ILCLNO=1 00060 GOTO 1001 00061 ENDIF 00062 C 00063 C Recherche de la longueur "utile" du nom d'article specifie. 00064 C (c'est-a-dire sans tenir compte des blancs terminaux eventuels) 00065 C 00066 IDECBL=0 00067 C 00068 101 CONTINUE 00069 IPOSBL=IDECBL+INDEX (CDNOMA(IDECBL+1:),' ') 00070 C 00071 IF (IPOSBL.LE.IDECBL) THEN 00072 ILCLNO=ILCDNO 00073 ELSEIF (CDNOMA(IPOSBL:).EQ.' ') THEN 00074 ILCLNO=IPOSBL-1 00075 ELSE 00076 IDECBL=IPOSBL 00077 GOTO 101 00078 ENDIF 00079 C 00080 IF (ILCLNO.LE.LFI%JPNCPN) THEN 00081 CLNOMA=CDNOMA(:ILCLNO) 00082 ELSE 00083 CLNOMA=CDNOMA(:LFI%JPNCPN) 00084 ILCLNO=LFI%JPNCPN 00085 IREP=-15 00086 GOTO 1001 00087 ENDIF 00088 C 00089 IF (IRANG.EQ.0) THEN 00090 IREP=-1 00091 GOTO 1001 00092 ENDIF 00093 C 00094 IF (LFI%LMULTI) CALL LFIVER_MT (LFI, LFI%VERRUE(IRANG),'ON') 00095 LLVERF=LFI%LMULTI 00096 C 00097 INBALO=LFI%MDES1D(IXM(LFI%JPNALO,IRANG)) 00098 C 00099 IF (INBALO.NE.0) THEN 00100 C** 00101 C 2. - EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX, 00102 C A LA RECHERCHE DE L'ARTICLE LOGIQUE DEMANDE. 00103 C----------------------------------------------------------------------- 00104 C 00105 CALL LFIRAN_MT (LFI, IREP,IRANG,CLNOMA(:ILCLNO), 00106 S IRGPIM,IARTEX,IRETIN) 00107 C 00108 IF (IRETIN.EQ.1) THEN 00109 GOTO 903 00110 ELSEIF (IRETIN.EQ.2) THEN 00111 GOTO 904 00112 ELSEIF (IRETIN.NE.0) THEN 00113 GOTO 1001 00114 ENDIF 00115 C 00116 ELSE 00117 IARTEX=0 00118 IREP=0 00119 ENDIF 00120 C 00121 IF (IARTEX.EQ.0) THEN 00122 KLONG=0 00123 KPOSEX=0 00124 ELSE 00125 C 00126 C ON COMPLETE LES CARACTERISTIQUES DE L'ARTICLE. 00127 C 00128 IF (.NOT.LFI%LPHASP(IRGPIM)) THEN 00129 C 00130 CALL LFIPHA_MT (LFI, IREP,IRANG,IRGPIM,IRETIN) 00131 C 00132 IF (IRETIN.EQ.1) THEN 00133 GOTO 903 00134 ELSEIF (IRETIN.EQ.2) THEN 00135 GOTO 904 00136 ELSEIF (IRETIN.NE.0) THEN 00137 GOTO 1001 00138 ENDIF 00139 C 00140 ENDIF 00141 C 00142 KLONG=LFI%MLGPOS(IXM(2*IARTEX-1,IRGPIM)) 00143 KPOSEX=LFI%MLGPOS(IXM(2*IARTEX,IRGPIM)) 00144 C 00145 C On met a jour ce qui a trait aux acces pseudo-sequentiels... 00146 C ceci surtout pour ne pas faire 2 recherches dans l'index lors 00147 C d'un appel a LFILEC qui suivrait l'appel a LFINFO. 00148 C 00149 LFI%NDERGF(IRANG)=LFI%JPNAPP*LFI%MFACTM(IRANG)* 00150 S (LFI%MRGPIF(IRGPIM)-1)+IARTEX 00151 LFI%CNDERA(IRANG)=CLNOMA(:ILCLNO) 00152 LFI%NSUIVF(IRANG)=LFI%JPNIL 00153 LFI%NPRECF(IRANG)=LFI%JPNIL 00154 ENDIF 00155 C 00156 GOTO 1001 00157 C** 00158 C 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S. 00159 C----------------------------------------------------------------------- 00160 C 00161 903 CONTINUE 00162 CLACTI='WRITE' 00163 GOTO 909 00164 C 00165 904 CONTINUE 00166 CLACTI='READ' 00167 C 00168 909 CONTINUE 00169 C 00170 C AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF. 00171 C 00172 IREP=IABS (IREP) 00173 C** 00174 C 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL, 00175 C VIA LE SOUS-PROGRAMME "LFIEMS" . 00176 C----------------------------------------------------------------------- 00177 C 00178 1001 CONTINUE 00179 KREP=IREP 00180 LLFATA=LLMOER (IREP,IRANG) 00181 C 00182 IF (IRANG.NE.0) THEN 00183 LFI%NDEROP(IRANG)=7 00184 LFI%NDERCO(IRANG)=IREP 00185 IF (LLVERF) CALL LFIVER_MT (LFI, LFI%VERRUE(IRANG),'OFF') 00186 ENDIF 00187 C 00188 IF (LLFATA.OR.IXNIMS (IRANG).EQ.2) THEN 00189 INIMES=2 00190 ELSE 00191 IF (LHOOK) CALL DR_HOOK('LFINFO_MT',1,ZHOOK_HANDLE) 00192 RETURN 00193 ENDIF 00194 C 00195 CLNSPR='LFINFO' 00196 WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KNUMER=' 00197 ',I3, S '', CDNOMA='''''',A,'''''', KLONG='',I7,'', KPOSEX='',I8)') 00198 S KREP,KNUMER,CLNOMA(:ILCLNO),KLONG,KPOSEX 00199 CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,LLFATA, 00200 S CLMESS,CLNSPR,CLACTI) 00201 C 00202 IF (LHOOK) CALL DR_HOOK('LFINFO_MT',1,ZHOOK_HANDLE) 00203 END 00204