SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/LFI/mt/lfidst_mt.F
Go to the documentation of this file.
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