SURFEX v7.3
General documentation of Surfex
|
00001 C Jan-2011 P. Marguinaud Thread-safe LFI 00002 SUBROUTINE LFIDST_MT (LFI, KREP, KRANG, KRANIE, CDSTRU, KLONG ) 00003 USE LFIMOD, ONLY : LFICOM 00004 USE PARKIND1, ONLY : JPRB 00005 USE YOMHOOK , ONLY : LHOOK, DR_HOOK 00006 C**** 00007 C SOUS-PROGRAMME *INTERNE* DU LOGICIEL DE FICHIERS INDEXES LFI; 00008 C Decorticage de la STructure decrivant un article logique 00009 C de donnees, en vue de son import ou export ulterieur. 00010 C** 00011 C ARGUMENTS : KREP (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME; 00012 C KRANG (ENTREE) ==> RANG ( DANS LA TABLE *LFI%NUMERO* ) 00013 C DE L'UNITE LOGIQUE CONCERNEE; 00014 C KRANIE (Entree) ==> Rang dans les tables d'import/exp; 00015 C CDSTRU (Entree) ==> Structure interne de cet article; 00016 C KLONG (Entree) ==> Longueur (mots) de l'article. 00017 C 00018 C Les syntaxes autorisees pour CDSTRU sont decrites ci-dessous. 00019 C La presence de crochets [ ] indique le cote optionnel, mais dans 00020 C tous les cas ce cote optionnel est reserve a la toute derniere 00021 C partie de la description. Si l'argument optionnel est present, 00022 C il doit etre coherent avec la longueur effective de l'article. 00023 C 00024 C 'type [nbre]' ==> article homogene,ex: 'i', 'r 20' 00025 C 00026 C 'type_1 nbre_1 ... type_n [nbre_n]' ==> juxtaposition de types,ex: 00027 C 'i 2 r', 'i 3 r 2 c 80000' 00028 C 00029 C '(type_1 nbre_1 ... type_n nbre_n) [nbre]' ==> boucle,ex: 00030 C '(i 1 r 1)' 00031 C 00032 C ou une juxtaposition des possibilites ci-dessus. 00033 C 00034 C Les blancs ne sont pas obligatoires, ils sont neutres et utilises 00035 C ci-dessus pour des questions de clarte. 00036 C 00037 #ifndef f77 00038 #include "precision.h" 00039 #endif 00040 C 00041 TYPE(LFICOM) :: LFI 00042 CHARACTER CDSTRU*(*), CLSTRU*(LFI%JPNCPN) 00043 C 00044 INTEGER KREP, KRANG, KRANIE, KLONG, IRANG, ILCLST, ILUSTR 00045 INTEGER J, INMOTS, INIPAR, IDEXPL, INGROU, IJ, IDECAL, IPOSTY 00046 INTEGER INIMES, INUMER, IDECGR, INTYPE 00047 C 00048 #include "lficom2.h" 00049 #include "lficom_mt.h" 00050 C** 00051 C 1. - CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS. 00052 C----------------------------------------------------------------------- 00053 C 00054 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00055 IF (LHOOK) CALL DR_HOOK('LFIDST_MT',0,ZHOOK_HANDLE) 00056 ILUSTR=LEN (CDSTRU) 00057 CLSTRU=' ' 00058 ILCLST=1 00059 C 00060 IF (KRANG.LE.0.OR.KRANG.GT.LFI%JPNXFI.OR.ILUSTR.LE.0.OR. 00061 S KRANIE.LE.0.OR.KRANIE.GT.LFI%JPIMEX) THEN 00062 KREP=-16 00063 ILCLST=MIN0 (LFI%JPNCPN,LEN (CLSTRU)) 00064 CLSTRU=LFI%CHINCO(:ILCLST) 00065 GOTO 1001 00066 ENDIF 00067 C 00068 IRANG=KRANG 00069 KREP=0 00070 ILCLST=MIN0 (ILUSTR,LEN (CLSTRU)) 00071 CLSTRU=CDSTRU(:ILCLST) 00072 INMOTS=0 00073 INIPAR=0 00074 INGROU=0 00075 IDECGR=0 00076 IDEXPL=LFI%NREXPL(LFI%NAEXPL(KRANG),KRANIE) 00077 IJ=0 00078 C** 00079 C 2. - DECORTICAGE PROPREMENT DIT. 00080 C----------------------------------------------------------------------- 00081 C* 00082 C 2.1 - DEBUT "BOUCLE" SUR LES GROUPES. 00083 C----------------------------------------------------------------------- 00084 C 00085 211 CONTINUE 00086 C 00087 IDECAL=IJ 00088 C 00089 IF (IDECAL.GE.ILUSTR) GOTO 301 00090 C 00091 DO 212 J=IDECAL+1,ILUSTR 00092 C 00093 IF (CDSTRU(J:J).EQ.'(') THEN 00094 C 00095 INGROU=INGROU+1 00096 INIPAR=INIPAR+1 00097 C 00098 IF (INIPAR.GT.1) THEN 00099 KREP=-40 00100 GOTO 1001 00101 ENDIF 00102 C 00103 IJ=J 00104 C 00105 ELSEIF (CDSTRU(J:J).NE.' ') THEN 00106 C 00107 IPOSTY=INDEX (LFI%CTYPMX,CDSTRU(J:J)) 00108 C 00109 IF (IPOSTY.EQ.0) THEN 00110 KREP=-40 00111 GOTO 1001 00112 ENDIF 00113 C 00114 INGROU=INGROU+1 00115 IJ=J-1 00116 C 00117 ENDIF 00118 C 00119 212 CONTINUE 00120 C* 00121 C 2.2 - DEBUT "BOUCLE" SUR LES TYPES. 00122 C----------------------------------------------------------------------- 00123 C 00124 INTYPE=0 00125 C 00126 221 CONTINUE 00127 C 00128 IDECAL=IJ 00129 C 00130 DO 227 J=IDECAL+1,ILUSTR 00131 C 00132 IF (CDSTRU(J:J).EQ.')') THEN 00133 C 00134 INIPAR=INIPAR-1 00135 C 00136 IF (INTYPE.EQ.0.OR.INIPAR.NE.0) THEN 00137 KREP=-40 00138 GOTO 1001 00139 ENDIF 00140 C 00141 IJ=J 00142 00143 GOTO 211 00144 C 00145 ELSEIF (CDSTRU(J:J).NE.' ') THEN 00146 C 00147 IPOSTY=INDEX (LFI%CTYPMX,CDSTRU(J:J)) 00148 C 00149 IF (IPOSTY.EQ.0) THEN 00150 KREP=-40 00151 GOTO 1001 00152 ENDIF 00153 C 00154 INTYPE=INTYPE+1 00155 C 00156 IF ((IDEXPL+2).GT.LFI%JPDEXP) THEN 00157 KREP=-42 00158 GOTO 1001 00159 ENDIF 00160 C 00161 LFI%NDEXPL(IDEXPL+1,KRANIE)=IPOSTY 00162 C 00163 IF (J.EQ.ILUSTR) THEN 00164 C 00165 IF (INIPAR.EQ.0) THEN 00166 LFI%NDEXPL(IDEXPL+2,KRANIE)=LFI%JPNIL 00167 IDEXPL=IDEXPL+2 00168 GOTO 301 00169 ELSE 00170 KREP=-40 00171 GOTO 1001 00172 ENDIF 00173 C 00174 ELSE 00175 C 00176 CALL LFICHI_MT (LFI, KREP,CDSTRU(J+1:ILUSTR), 00177 S LFI%NDEXPL(IDEXPL+2,KRANIE), 00178 S IJ) 00179 IF (KREP.NE.0) GOTO 1001 00180 C 00181 IDEXPL=IDEXPL+2 00182 C 00183 ENDIF 00184 C 00185 ENDIF 00186 C 00187 227 CONTINUE 00188 C 00189 00190 00191 C 00192 301 CONTINUE 00193 C 00194 00195 00196 C** 00197 C 10. - PHASE TERMINALE : MESSAGERIE INTERNE EVENTUELLE, 00198 C VIA LE SOUS-PROGRAMME "LFIEMS", PUIS RETOUR. 00199 C----------------------------------------------------------------------- 00200 C 00201 1001 CONTINUE 00202 LLFATA=LLMOER (KREP,KRANG) 00203 C 00204 IF (LFI%LMISOP.OR.LLFATA) THEN 00205 INUMER=LFI%NUMERO(KRANG) 00206 INIMES=2 00207 CLNSPR='LFIDST' 00208 WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KRANG=' 00209 ',I3, S '''''', CDSTRU='''''',A,'''''', KLONG='',I7)') 00210 S KREP,KRANG,CLSTRU(:ILCLST),KLONG 00211 CALL LFIEMS_MT (LFI, INUMER,INIMES,KREP,.FALSE., 00212 S CLMESS,CLNSPR,CLACTI) 00213 ENDIF 00214 C 00215 IF (LHOOK) CALL DR_HOOK('LFIDST_MT',1,ZHOOK_HANDLE) 00216 END 00217