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