SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/LFI/mt/lfiree_mt.F
Go to the documentation of this file.
00001 C Jan-2011 P. Marguinaud Thread-safe LFI
00002       SUBROUTINE LFIREE_MT (LFI, KREP, KRANG, CDNOMA, KLONG, KRPIEX, 
00003      S                    KARTEX,
00004      S                    KLONEX, KRPIEC, KARTEC, KPOSEC, KDTROU,
00005      S                    KLONUT, KRETIN )
00006       USE LFIMOD, ONLY : LFICOM
00007       USE PARKIND1, ONLY : JPRB
00008       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00009 C****
00010 C        SOUS-PROGRAMME *INTERNE* DU LOGICIEL DE FICHIERS INDEXES LFI
00011 C     RECHERCHE D'UN EMPLACEMENT OU ECRIRE UN ARTICLE LOGIQUE, DANS
00012 C     L'UNITE LOGIQUE CONCERNEE.
00013 C**
00014 C    ARGUMENTS : KREP   (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME;
00015 C                KRANG  (ENTREE) ==> RANG ( DANS LA TABLE *LFI%NUMERO* )
00016 C                                    DE L'UNITE LOGIQUE CONCERNEE;
00017 C                CDNOMA (ENTREE) ==> NOM DE L'ARTICLE A RECHERCHER;
00018 C                KLONG  (ENTREE) ==> LONGUEUR DE L'ARTICLE A ECRIRE;
00019 C                KRPIEX (SORTIE) ==> RANG ( DANS LE FICHIER ) DE L'ARTI-
00020 C                                    CLE S'IL EXISTAIT DEJA ( 0 SINON );
00021 C                KARTEX (SORTIE) ==> RANG ( DANS LA PAGE D'INDEX ) DE L'
00022 C                                    ARTICLE S'IL EXISTAIT ( 0 SINON );
00023 C                KLONEX (SORTIE) ==> LONGUEUR DE L'ARTICLE S'IL EXISTAIT
00024 C                                    DEJA ( 0 SINON );
00025 C                KRPIEC (SORTIE) ==> RANG ( DANS LE FICHIER ) DE L'ARTI-
00026 C                                    CLE A ECRIRE;
00027 C                KARTEC (SORTIE) ==> RANG ( DANS LA PAGE D'INDEX ) DE L'
00028 C                                    ARTICLE A ECRIRE;
00029 C                KPOSEC (SORTIE) ==> POSITION ( DANS LE FICHIER ) OU
00030 C                                    COMMENCER A ECRIRE L'ARTICLE;
00031 C                KDTROU (SORTIE) ==> VARIATION DU NOMBRE DE TROUS DANS
00032 C                                    L'INDEX, DUE A CETTE ECRITURE;
00033 C                KLONUT (SORTIE) ==> SI L'ON VA CREER UN TROU DANS L'IN-
00034 C                                    DEX, LONGUEUR TOTALE UTILISABLE DE
00035 C                                    CE TROU;
00036 C                KRETIN (SORTIE) ==> CODE-RETOUR INTERNE.
00037 C*
00038 C    METHODE: SI L'ARTICLE EXISTE DEJA DANS LE FICHIER, ON ESSAIE AUTANT
00039 C             QUE POSSIBLE DE "REECRIRE" SUR PLACE, CE QUI EST POSSIBLE
00040 C             SI L'ON A UNE LONGUEUR D'ARTICLE INFERIEURE OU EGALE A
00041 C             CELLE EXISTANTE, MAIS EST AUSSI POSSIBLE PAR RECYCLAGE
00042 C             DE "TROUS" DE 2 CATEGORIES: EN FIN D'ARTICLE EXISTANT
00043 C             ( AVANT L'ARTICLE LOGIQUE OU L'ARTICLE D'INDEX SUIVANT ),
00044 C             ET/OU S'IL EXISTE UN "TROU" REPERTORIE DANS L'INDEX CORRE-
00045 C             SPONDANT A UN ARTICLE LOGIQUE JUSTE DERRIERE CELUI EXIS-
00046 C             TANT.
00047 C                SI LA REECRITURE N'EST PAS POSSIBLE, ON ESSAIE ALORS DE
00048 C             REUTILISER UN EVENTUEL "TROU" REPERTORIE DANS L'INDEX;
00049 C             EN DESESPOIR DE CAUSE, ON ECRIT EN FIN DE FICHIER.
00050 C
00051 #ifndef f77
00052 #include "precision.h"
00053 #endif
00054 C
00055       TYPE(LFICOM) :: LFI
00056       CHARACTER CDNOMA*(*)
00057 C
00058       INTEGER KREP, KRANG, KLONG, KRPIEX, KARTEX, KLONEX, KRPIEC, KARTEC
00059       INTEGER KPOSEC, KDTROU, KLONUT, ILCDNO, IRANG, ILTSUF, INTTRU, J
00060       INTEGER INBALO, INBPIR, IFACTM, ILARPH, INALPP, INTPPI, IRNGSU
00061       INTEGER INPPIM, INPIME, INTROU, INPPI1, IDEBEX, IARTIC, IRGPIF
00062       INTEGER INALPI, INPAGE, IRGPIM, IRPIFN, ILFORC, INBVAL, IPOSEX
00063       INTEGER IPOSDX, IRECPI, ILSUIV, IPOSUI, IRGPI, IRPIMS, INPILE
00064       INTEGER IRNGMS, INTRPI, ILTROU, IPTROU, IRPITR, IARTTR, IPOSTR
00065       INTEGER IRPIMD, IRPIFD, INALDP, IRETOU, INIMES, INUMER, IRANGM
00066       INTEGER IEXPLO (LFI%JPNPIA+LFI%JPNPIS+1), INDICE (LFI%JPNAPX), 
00067      S        KRETIN, IRETIN
00068 C
00069       LOGICAL LLTSUF, LLTOPT, LLTTRU, LLRCHA
00070 C
00071 #include "lficom2.h"
00072 #include "lficom_mt.h"
00073 C**
00074 C     1.  -  CONTROLES DES PARAMETRES D'APPEL ET INITIALISATIONS.
00075 C-----------------------------------------------------------------------
00076 C
00077       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00078       IF (LHOOK) CALL DR_HOOK('LFIREE_MT',0,ZHOOK_HANDLE)
00079       ILCDNO=LEN (CDNOMA)
00080 C
00081       IF (KRANG.LE.0.OR.KRANG.GT.LFI%JPNXFI.OR.KLONG.LE.0.OR.
00082      S    ILCDNO.LE.0.OR.ILCDNO.GT.LFI%JPNCPN.OR.CDNOMA.EQ.' ') THEN
00083         KREP=-16
00084         GOTO 1001
00085       ENDIF
00086 C
00087       IRANG=KRANG
00088       KREP=0
00089       LLTSUF=.FALSE.
00090       LLTOPT=.FALSE.
00091       KARTEX=0
00092       KARTEC=0
00093       KRPIEC=0
00094       KRPIEX=0
00095       KLONEX=0
00096       KLONUT=LFI%JPNIL
00097       IRETOU=0
00098       ILTSUF=0
00099       INTTRU=LFI%MDES1D(IXM(LFI%JPNTRU,IRANG))+LFI%NBTROU(IRANG)
00100       INBALO=LFI%MDES1D(IXM(LFI%JPNALO,IRANG))
00101       INBPIR=LFI%MDES1D(IXM(LFI%JPNPIR,IRANG))
00102       LLTTRU=INTTRU.EQ.0
00103       IFACTM=LFI%MFACTM(IRANG)
00104       ILARPH=LFI%JPLARD*IFACTM
00105       INALPP=LFI%JPNAPP*IFACTM
00106       INTPPI=(INBALO-1+INALPP)/INALPP
00107       IF (LFI%LMISOP) WRITE (UNIT=LFI%NULOUT,FMT=*)
00108      S        'INBALO= ',INBALO,', INTTRU= ',INTTRU,', INTPPI= ',INTPPI,
00109      S        ', INBPIR= ',INBPIR
00110 C
00111       IF (INBALO.EQ.0) GOTO 240
00112 C
00113       IRNGSU=0
00114       IRPIFN=1
00115       INPPIM=LFI%NPPIMM(IRANG)
00116       INPIME=0
00117       INTROU=0
00118 C
00119 C**
00120 C     2.  -  EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
00121 C            A LA RECHERCHE DE L'ARTICLE ET/OU D'UN "TROU" DANS L'INDEX,
00122 C            SUFFISANT POUR Y "CASER" L'ARTICLE. ( ON COMMENCE
00123 C            PAR EXPLORER LES PAGES D'INDEX )
00124 C-----------------------------------------------------------------------
00125 C
00126       INPPI1=INPPIM
00127       LLRCHA=.TRUE.
00128 C
00129       IF (LFI%NPODPI(IRANG).EQ.2) THEN
00130         IDEBEX=3
00131       ELSE
00132         IDEBEX=2
00133       ENDIF
00134 C
00135       IF (LLTTRU) THEN
00136 C
00137         CALL LFIRAN_MT (LFI, KREP,IRANG,CDNOMA,IRGPIM,IARTIC,IRETIN)
00138 C
00139         IF (IRETIN.EQ.1) THEN
00140           GOTO 903
00141         ELSEIF (IRETIN.EQ.2) THEN
00142           GOTO 904
00143         ELSEIF (IRETIN.NE.0) THEN
00144           GOTO 1001
00145         ELSEIF (IARTIC.NE.0) THEN
00146 C
00147 C         ARTICLE TROUVE.
00148 C
00149           IRGPIF=LFI%MRGPIF(IRGPIM)
00150           INALPI=MIN0 (INALPP,INBALO-(IRGPIF-1)*INALPP)
00151 C
00152 C         La ligne ci-dessous sert a eviter les ennuis entre les
00153 C         etiquettes 213 et 215.
00154 C
00155           INPAGE=INTPPI+1
00156           GOTO 212
00157         ELSE
00158 C
00159 C         IL VA FALLOIR CREER UN ARTICLE SUPPLEMENTAIRE.
00160 C
00161           GOTO 240
00162         ENDIF
00163 C
00164       ENDIF
00165 C
00166 C     ... DEBUT D'UNE STRUCTURE DE TYPE "BOUCLE" SUR INPAGE,
00167 C         QUI NE PEUT PAS (PLUS) ETRE UNE BOUCLE "DO" A PARTIR DU
00168 C         MOMENT OU ON VEUT UTILISER, DES QUE POSSIBLE, "LFIRAN"
00169 C         POUR UNE RECHERCHE D'ARTICLE MOINS COUTEUSE, SURTOUT LORSQUE
00170 C         L'ARTICLE QUE L'ON CHERCHE ETAIT LE DERNIER TRAITE ...
00171 C
00172       INPAGE=1
00173 C
00174   201 CONTINUE
00175 C
00176       IF (INPAGE.LE.INPPI1) THEN
00177 C
00178 C           IL S'AGIT D'UNE EXPLORATION EN MEMOIRE ( PAGES D'INDEX ) .
00179 C
00180         IRGPIM=LFI%MRGPIM(INPAGE,IRANG)
00181         IRGPIF=LFI%MRGPIF(IRGPIM)
00182         INPIME=INPIME+1
00183         IEXPLO(INPIME)=IRGPIF
00184         IF (IRGPIF.EQ.(IRPIFN+1)) IRPIFN=IRGPIF
00185       ELSE
00186 C
00187 C           IL S'AGIT D'UNE EXPLORATION "HORS MEMOIRE";
00188 C         ON CHERCHE LA PROCHAINE P.A.I. NON EXPLOREE .
00189 C
00190         IF (INPAGE.EQ.INPPI1+1) THEN
00191 C
00192           IF (IRNGSU.EQ.0) THEN
00193             IRGPIF=IRPIFN
00194           ELSE
00195 C
00196 C          Cas ou il y a eu, dans la recherche "en memoire",
00197 C        recyclage d'une P.P.I. que l'on avait exploree precedemment.
00198 C          Cette P.P.I. est restee sur place, n'a pas ete exploree,
00199 C        et il serait bete de l'oublier, au risque de la dupliquer...
00200 C
00201             IRGPIM=LFI%MRGPIM(IRNGSU,IRANG)
00202             IRGPIF=LFI%MRGPIF(IRGPIM)
00203             INPIME=INPIME+1
00204             IEXPLO(INPIME)=IRGPIF
00205             IF (IRGPIF.EQ.(IRPIFN+1)) IRPIFN=IRGPIF
00206             GOTO 210
00207           ENDIF
00208 C
00209         ENDIF
00210 C
00211   202   CONTINUE
00212         IRGPIF=IRGPIF+1
00213 C
00214         DO 203 J=IDEBEX,INPIME
00215         IF (IEXPLO(J).EQ.IRGPIF) GOTO 202
00216   203   CONTINUE
00217 C
00218         ILFORC=1
00219         INPILE=1
00220         CALL LFIPIM_MT (LFI, KREP,IRANG,IRANGM,IRGPIM,IRGPIF,ILFORC, 
00221      S                  INPILE, IRETIN)
00222 C
00223         IF (IRETIN.EQ.1) THEN
00224           GOTO 903
00225         ELSEIF (IRETIN.EQ.2) THEN
00226           GOTO 904
00227         ELSEIF (IRETIN.NE.0) THEN
00228           GOTO 1001
00229         ENDIF
00230 C
00231         INPPIM=MAX0 (INPPIM,IRANGM)
00232       ENDIF
00233 C*
00234 C     2.1 -  "BOUCLE" DE RECHERCHE SUR LES ARTICLES PRESENTS DANS
00235 C             LA (PAIRE DE) PAGE D'INDEX DE RANG IRGPIF DANS LE FICHIER.
00236 C-----------------------------------------------------------------------
00237 C
00238   210 CONTINUE
00239       INALPI=MIN0 (INALPP,INBALO-(IRGPIF-1)*INALPP)
00240       IARTIC=0
00241 C
00242       IF (LLRCHA) THEN
00243 C
00244         DO 211 J=1,INALPI
00245 C
00246         IF (LFI%CNOMAR(IXC(J,IRGPIM)).EQ.CDNOMA) THEN
00247           IARTIC=J
00248           GOTO 212
00249         ENDIF
00250 C
00251   211   CONTINUE
00252 C
00253       ENDIF
00254 C
00255   212 CONTINUE
00256 C
00257       IF (IARTIC.NE.0) THEN
00258 C
00259 C        ON A TROUVE DANS LE FICHIER UN ARTICLE DE MEME NOM QUE CELUI A
00260 C        ECRIRE.
00261 C
00262         LLRCHA=.FALSE.
00263 C
00264         IF (.NOT.LFI%LPHASP(IRGPIM)) THEN
00265 C
00266           CALL LFIPHA_MT (LFI, KREP,IRANG,IRGPIM,IRETIN)
00267 C
00268           IF (IRETIN.EQ.1) THEN
00269             GOTO 903
00270           ELSEIF (IRETIN.EQ.2) THEN
00271             GOTO 904
00272           ELSEIF (IRETIN.NE.0) THEN
00273             GOTO 1001
00274           ENDIF
00275 C
00276         ENDIF
00277 C
00278         KRPIEX=IRGPIF
00279         KLONEX=LFI%MLGPOS(IXM(2*IARTIC-1,IRGPIM))
00280         IPOSEX=LFI%MLGPOS(IXM(2*IARTIC,IRGPIM))
00281         KARTEX=IARTIC
00282 C
00283         IF (KLONG.LE.KLONEX) THEN
00284 C
00285 C       L'ARTICLE TROUVE EST AU MOINS AUSSI LONG QUE CELUI QUE L'ON VEUT
00286 C       ECRIRE: UNE ECRITURE AU MEME EMPLACEMENT EST DONC POSSIBLE.
00287 C
00288           KRPIEC=IRGPIF
00289           KARTEC=IARTIC
00290           KPOSEC=IPOSEX
00291           GOTO 240
00292         ELSE
00293 C
00294 C     CAS DE REECRITURE + LONGUE QUE L'ARTICLE EXISTANT SUR LE FICHIER.
00295 C
00296           IPOSDX=LFI%MLGPOS(IXM(2*IARTIC,IRGPIM))+KLONG-1
00297 C
00298           IF (IARTIC.EQ.1.AND.IRGPIF.GT.INBPIR) THEN
00299 C
00300 C            IL Y A EU DEBORDEMENT DES P.A.I. PREALLOUEES, ET IL Y A
00301 C        EN OUTRE UNE P.A.I. SUR LE FICHIER, JUSTE DERRIERE L'ARTICLE
00302 C        LOGIQUE AUQUEL ON S'INTERESSE. ON REGARDE S'IL Y A ASSEZ DE
00303 C        PLACE AVANT LA P.A.I. POUR UNE REECRITURE AU MEME ENDROIT.
00304 C        ( P.A.I. = PAIRE D'ARTICLES D'INDEX )
00305 C
00306             IRECPI=LFI%MDES1D(IXM(ILARPH+1-(IRGPIF-INBPIR),IRANG))
00307             KLONUT=ILARPH*(IRECPI-1)-IPOSEX+1
00308 C
00309             IF (KLONG.LE.KLONUT) THEN
00310               KRPIEC=IRGPIF
00311               KARTEC=IARTIC
00312               KPOSEC=IPOSEX
00313               GOTO 240
00314             ELSE
00315               GOTO 216
00316             ENDIF
00317 C
00318           ELSEIF (IARTIC.EQ.INALPI.AND.IRGPIF.EQ.INTPPI) THEN
00319 C
00320 C           CAS OU L'ARTICLE TROUVE EST LE DERNIER ARTICLE LOGIQUE DE
00321 C        DONNEES, SANS P.A.I. JUSTE DERRIERE. IL Y A DE LA PLACE DONC...
00322 C
00323             KRPIEC=IRGPIF
00324             KARTEC=IARTIC
00325             KPOSEC=IPOSEX
00326             GOTO 240
00327           ENDIF
00328 C
00329         ENDIF
00330 C
00331 C            EN ARRIVANT ICI, ON EST DONC SUR QUE L'ARTICLE TROUVE
00332 C          N'EST PAS LE DERNIER ARTICLE LOGIQUE.
00333 C
00334 C     ON VA REGARDER SI, PAR CHANCE, L'ARTICLE LOGIQUE SUIVANT N'EST
00335 C     PAS UN TROU SUFFISANT POUR "CASER" L'EXCEDENT DE DONNEES,
00336 C     OU S'IL N'Y A PAS UN TROU DE DONNEES ( NON ASSOCIE A UN TROU DANS
00337 C     LA PARTIE "NOMS" DE L'INDEX ) SUFFISANT EN FIN D'ARTICLE EXISTANT,
00338 C     AVANT L'ARTICLE LOGIQUE SUIVANT...
00339 C
00340         IF (IARTIC.NE.INALPI) THEN
00341 C
00342 C             L'ARTICLE SUIVANT EST DANS LA MEME PAGE D'INDEX...
00343 C
00344           ILSUIV=LFI%MLGPOS(IXM(2*IARTIC+1,IRGPIM))
00345           IPOSUI=LFI%MLGPOS(IXM(2*IARTIC+2,IRGPIM))
00346           KLONUT=IPOSUI-IPOSEX
00347 C
00348           IF (KLONG.LE.KLONUT) THEN
00349 C
00350 C     ... ET IL Y A UN "TROU" SUFFISANT AVANT CET ARTICLE POUR POUVOIR
00351 C         ECRIRE LES DONNEES EXCEDENTAIRES.
00352 C
00353             KRPIEC=IRGPIF
00354             KARTEC=IARTIC
00355             KPOSEC=IPOSEX
00356             GOTO 240
00357 C
00358           ELSEIF (LFI%CNOMAR(IXC(IARTIC+1,IRGPIM)).EQ.' '
00359      S            .AND.KLONG.LE.(KLONUT+ILSUIV)) THEN
00360 C
00361 C     ... ET C'EST UN TROU QUI PERMET, AVEC L'AIDE EVENTUELLE
00362 C         D'UNE ZONE DE DONNEES "MORTE" ENTRE LES 2 ARTICLES,
00363 C         DE MENAGER UNE PLACE SUFFISANTE POUR L'EXCES DE DONNEES.
00364 C
00365             LFI%MLGPOS(IXM(2*IARTIC+1,IRGPIM))=IPOSUI+ILSUIV-(IPOSDX+1)
00366             LFI%MLGPOS(IXM(2*IARTIC+2,IRGPIM))=IPOSDX+1
00367             LFI%LECRPI(IRGPIM,2)=.TRUE.
00368             KRPIEC=IRGPIF
00369             KARTEC=IARTIC
00370             KPOSEC=IPOSEX
00371 C
00372             IF (LFI%MLGPOS(IXM(2*IARTIC+1,IRGPIM)).EQ.0) THEN
00373               GOTO 230
00374             ELSE
00375               GOTO 240
00376             ENDIF
00377 C
00378           ENDIF
00379 C
00380 C     ... L'ARTICLE SUIVANT N'EST PAS EXPLOITABLE POUR ECRIRE L'EXCES
00381 C         DE DONNEES.
00382 C
00383           GOTO 216
00384         ELSE
00385 C
00386 C     L'ARTICLE TROUVE EST CERTES TROP COURT, MAIS IL EST EN PLUS EN FIN
00387 C     DE PAGE D'INDEX...
00388 C
00389           DO 213 J=2,INPPIM
00390           IRGPI=LFI%MRGPIM(J,IRANG)
00391 C
00392           IF (LFI%MRGPIF(IRGPI).EQ.(IRGPIF+1)) THEN
00393 C
00394             IRPIMS=IRGPI
00395 C
00396             IF (.NOT.LFI%LPHASP(IRPIMS)) THEN
00397 C
00398               CALL LFIPHA_MT (LFI, KREP,IRANG,IRPIMS,IRETIN)
00399 C
00400               IF (IRETIN.EQ.1) THEN
00401                 GOTO 903
00402               ELSEIF (IRETIN.EQ.2) THEN
00403                 GOTO 904
00404               ELSEIF (IRETIN.NE.0) THEN
00405                 GOTO 1001
00406               ENDIF
00407 C
00408             ENDIF
00409 C
00410             GOTO 215
00411 C
00412           ENDIF
00413 C
00414   213     CONTINUE
00415 C
00416 C             LA P.A.I. SUIVANTE (EN RANG DANS LE FICHIER) N'EST PAS
00417 C          EN MEMOIRE; DECIDEMENT, CELA SE GATE ! ... ON L'Y MET.
00418 C
00419 C             Noter que ce cas de figure ne peut se presenter q'une
00420 C          seule fois par exploration de l'index.
00421 C
00422           INPILE=2
00423           CALL LFIPIM_MT (LFI, KREP,IRANG,IRNGMS,IRPIMS,IRGPIF+1,IRGPIF,
00424      S                    INPILE, IRETIN)
00425 C
00426           IF (IRETIN.EQ.1) THEN
00427             GOTO 903
00428           ELSEIF (IRETIN.EQ.2) THEN
00429             GOTO 904
00430           ELSEIF (IRETIN.NE.0) THEN
00431             GOTO 1001
00432           ENDIF
00433 C
00434           IF (INPAGE.LE.INPPIM) THEN
00435 C
00436 C               On est dans le cadre d'une exploration "en memoire"...
00437 C
00438             IF (IRNGMS.GT.INPPIM) THEN
00439 C
00440 C               ... et il y aura une P.P.I. a explorer en plus,
00441 C                   a la fin du balayage "en memoire".
00442 C
00443               INPPI1=INPPI1+1
00444             ELSEIF (IRNGMS.LT.INPAGE) THEN
00445 C
00446 C               ... et il y aura une P.P.I. a explorer en plus,
00447 C                   mais apres le balayage "en memoire".
00448 C
00449               IRNGSU=IRNGMS
00450             ENDIF
00451 C
00452           ENDIF
00453 C
00454           INPPIM=MAX0 (INPPIM,IRNGMS)
00455 C
00456   215     CONTINUE
00457 C
00458 C            LA PAIRE D'ARTICLES D'INDEX SUIVANTE EST EN MEMOIRE.
00459 C
00460           ILSUIV=LFI%MLGPOS(IXM(1,IRPIMS))
00461           IPOSUI=LFI%MLGPOS(IXM(2,IRPIMS))
00462           KLONUT=IPOSUI-IPOSEX
00463 C
00464           IF (KLONG.LE.KLONUT) THEN
00465 C
00466 C     ... ET IL Y A UN "TROU" SUFFISANT AVANT CETTE PAIRE POUR POUVOIR
00467 C         ECRIRE LES DONNEES EXCEDENTAIRES.
00468 C
00469             KRPIEC=IRGPIF
00470             KARTEC=IARTIC
00471             KPOSEC=IPOSEX
00472             GOTO 240
00473 C
00474           ELSEIF (LFI%CNOMAR(IXC(1,IRPIMS)).EQ.' '
00475      S           .AND.KLONG.LE.(KLONUT+ILSUIV)) THEN
00476 C
00477 C     ... ET C'EST UN TROU QUI PERMET, AVEC L'AIDE EVENTUELLE
00478 C         D'UNE ZONE DE DONNEES "MORTE" ENTRE LES 2 ARTICLES,
00479 C         DE MENAGER UNE PLACE SUFFISANTE POUR L'EXCES DE DONNEES.
00480 C
00481             LFI%MLGPOS(IXM(1,IRPIMS))=IPOSUI+ILSUIV-(IPOSDX+1)
00482             LFI%MLGPOS(IXM(2,IRPIMS))=IPOSDX+1
00483             LFI%LECRPI(IRPIMS,2)=.TRUE.
00484             KRPIEC=IRGPIF
00485             KARTEC=IARTIC
00486             KPOSEC=IPOSEX
00487 C
00488             IF (LFI%MLGPOS(IXM(1,IRPIMS)).EQ.0) THEN
00489               GOTO 230
00490             ELSE
00491               GOTO 240
00492             ENDIF
00493 C
00494           ENDIF
00495 C
00496 C              SI ON ARRIVE ICI, IL FAUT PASSER A LA PAGE SUIVANTE .
00497 C
00498         ENDIF
00499 C
00500       ENDIF
00501 C
00502   216 CONTINUE
00503 C
00504 C        RECHERCHE EVENTUELLE DE TROUS D'INDEX DE LONGUEUR ADEQUATE.
00505 C
00506       IF (LLTTRU.OR.LLTOPT) THEN
00507 C
00508         IF (.NOT.LLRCHA) THEN
00509           GOTO 240
00510         ELSE
00511           GOTO 229
00512         ENDIF
00513 C
00514       ELSE
00515         INTRPI=0
00516 C
00517         DO 217 J=1,INALPI
00518 C
00519         IF (LFI%CNOMAR(IXC(J,IRGPIM)).EQ.' ') THEN
00520           INTRPI=INTRPI+1
00521           INDICE(INTRPI)=J
00522         ENDIF
00523 C
00524   217   CONTINUE
00525 C
00526       ENDIF
00527 C
00528       IF (INTRPI.NE.0) THEN
00529 C
00530         IF (.NOT.LFI%LPHASP(IRGPIM)) THEN
00531 C
00532           CALL LFIPHA_MT (LFI, KREP,IRANG,IRGPIM,IRETIN)
00533 C
00534           IF (IRETIN.EQ.1) THEN
00535             GOTO 903
00536           ELSEIF (IRETIN.EQ.2) THEN
00537             GOTO 904
00538           ELSEIF (IRETIN.NE.0) THEN
00539             GOTO 1001
00540           ENDIF
00541 C
00542         ENDIF
00543 C
00544         DO 218 J=1,INTRPI
00545         IARTIC=INDICE(J)
00546         ILTROU=LFI%MLGPOS(IXM(2*IARTIC-1,IRGPIM))
00547         IPTROU=LFI%MLGPOS(IXM(2*IARTIC,IRGPIM))
00548 C
00549         IF (ILTROU.GE.KLONG) THEN
00550 C
00551 C             "TROU" D'INDEX DE LONGUEUR SUFFISANTE POUR L'ARTICLE.
00552 C
00553           IF (.NOT.LLTSUF) THEN
00554             LLTSUF=.TRUE.
00555             ILTSUF=ILTROU+1
00556           ENDIF
00557 C
00558           IF (ILTROU.LT.ILTSUF) THEN
00559             ILTSUF=ILTROU
00560             IRPITR=IRGPIF
00561             IARTTR=IARTIC
00562             IPOSTR=IPTROU
00563           ENDIF
00564 C
00565           LLTOPT=ILTSUF.EQ.KLONG
00566         ENDIF
00567 C
00568   218   CONTINUE
00569 C
00570         INTROU=INTROU+INTRPI
00571         LLTTRU=INTROU.EQ.INTTRU
00572       ENDIF
00573 C
00574 C      SI L'ARTICLE A ETE TROUVE PRECEDEMMENT DANS LE FICHIER MAIS TROP
00575 C     COURT, ET SI ON A EXPLORE TOUS LES TROUS REFERENCES DANS L'INDEX,
00576 C     ON ARRETE L'EXPLORATION DE L'INDEX.
00577 C
00578       IF (LLTTRU.AND.KARTEX.NE.0) GOTO 240
00579 C
00580 C     .... FIN DE "BOUCLE", ON REMONTE POUR UNE EVENTUELLE SUITE ...
00581 C
00582   229 CONTINUE
00583       INPAGE=INPAGE+1
00584 C
00585       IF (INPAGE.LE.INTPPI) THEN
00586         GOTO 201
00587       ELSE
00588         GOTO 240
00589       ENDIF
00590 C
00591   230 CONTINUE
00592 C*
00593 C     2.3 - CAS OU L'ON A CREE UN TROU DE LONGUEUR NULLE DANS L'INDEX
00594 C           ON STOCKE DE QUOI S'EN OCCUPER PLUS TARD, A LA FERMETURE.
00595 C-----------------------------------------------------------------------
00596 C
00597       IF (LFI%NTRULZ(IRANG).EQ.0) THEN
00598         LFI%NRFPTZ(IRANG)=IPOSEX
00599         LFI%NRFDTZ(IRANG)=IPOSEX
00600       ELSE
00601         LFI%NRFPTZ(IRANG)=MIN0 (LFI%NRFPTZ(IRANG),IPOSEX)
00602         LFI%NRFDTZ(IRANG)=MAX0 (LFI%NRFDTZ(IRANG),IPOSEX)
00603       ENDIF
00604 C
00605       LFI%NTRULZ(IRANG)=LFI%NTRULZ(IRANG)+1
00606 C
00607   240 CONTINUE
00608       IF (LFI%LMISOP) 
00609      S  WRITE (UNIT=LFI%NULOUT,FMT=*)'LFIREE - APRES ETIQUETTE 240'
00610 C*
00611 C     2.4 - CALCUL DE LA VARIATION DU NOMBRE DE TROUS REFERENCES
00612 C           DANS L'INDEX.
00613 C-----------------------------------------------------------------------
00614 C
00615       IF (KARTEX.NE.0.AND.KARTEC.EQ.0.AND..NOT.LLTSUF) THEN
00616         KDTROU=1
00617       ELSEIF (KARTEX.EQ.0.AND.LLTSUF) THEN
00618         KDTROU=-1
00619       ELSE
00620         KDTROU=0
00621       ENDIF
00622 C*
00623 C     2.5  -   QUAND AUCUN EMPLACEMENT CONVENABLE N'A ETE TROUVE,
00624 C              IL RESTE A DEFINIR LE RANG DE L'ARTICLE DANS LE FICHIER,
00625 C              AINSI QUE LA POSITION DU PREMIER MOT DE DONNEES A ECRIRE.
00626 C-----------------------------------------------------------------------
00627 C
00628       IF (KARTEC.EQ.0) THEN
00629 C
00630         IF (LLTSUF) THEN
00631           KRPIEC=IRPITR
00632           KARTEC=IARTTR
00633           KPOSEC=IPOSTR
00634         ELSE
00635           KRPIEC=1+INBALO/INALPP
00636           KARTEC=INBALO+1-INALPP*(KRPIEC-1)
00637 C
00638           IF (LFI%NALDPI(IRANG).EQ.INALPP
00639      S        .AND.INTPPI.EQ.(INBPIR+ILARPH-LFI%JPLDOC)) THEN
00640             KREP=-17
00641             GOTO 1001
00642           ENDIF
00643 C
00644 C     DEFINITION DE LA POSITION OU ECRIRE, DANS LE CAS D'UN ARTICLE
00645 C     LOGIQUE SUPPLEMENTAIRE.
00646 C
00647           IF (INBALO.EQ.0) THEN
00648             KPOSEC=(1+2*INBPIR)*ILARPH+1
00649           ELSE
00650             IRPIMD=LFI%MRGPIM(LFI%NPODPI(IRANG),IRANG)
00651             INALDP=LFI%NALDPI(IRANG)
00652             KPOSEC=LFI%MLGPOS(IXM(2*INALDP,IRPIMD))
00653      S             +LFI%MLGPOS(IXM(2*INALDP-1,IRPIMD))
00654 C
00655             IF (INTPPI.GT.INBPIR) THEN
00656               IRPIFD=LFI%MDES1D(IXM(ILARPH+1-(INTPPI-INBPIR),IRANG))+1
00657               KPOSEC=MAX0 (KPOSEC,1+ILARPH*IRPIFD)
00658             ENDIF
00659 C
00660           ENDIF
00661 C
00662         ENDIF
00663 C
00664       ENDIF
00665 C
00666       GOTO 1001
00667 C**
00668 C     9.  - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
00669 C      AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
00670 C-----------------------------------------------------------------------
00671 C
00672   903 CONTINUE
00673       IRETOU=1
00674       CLACTI='WRITE'
00675       GOTO 909
00676 C
00677   904 CONTINUE
00678       IRETOU=2
00679       CLACTI='READ'
00680 C
00681   909 CONTINUE
00682       KREP=IABS (KREP)
00683 C**
00684 C    10.  -  PHASE TERMINALE : MESSAGERIE INTERNE EVENTUELLE,
00685 C            VIA LE SOUS-PROGRAMME "LFIEMS", PUIS RETOUR.
00686 C-----------------------------------------------------------------------
00687 C
00688  1001 CONTINUE
00689       LLFATA=LLMOER (KREP,KRANG)
00690 C
00691       IF (KREP.EQ.0) THEN
00692         KRETIN=0
00693       ELSEIF (KREP.GT.0) THEN
00694         KRETIN=IRETOU
00695       ELSE
00696         KRETIN=3
00697       ENDIF
00698 C
00699       IF (LFI%LMISOP.OR.LLFATA) THEN
00700         INIMES=2
00701         CLNSPR='LFIREE'
00702         WRITE (UNIT=CLMESS,
00703      S         FMT='(''ARGUMENTS='',I4,'','',I3,'','''''
00704 ',     S         A,'''''','',I7,'','',I4,'','',I4,'','',I7,'','',I4,'','
00705 ',     S         I4,'','',I9,'','',SP,I2,SS,'','',I7,'','',I2)')
00706      S  KREP,KRANG,CDNOMA,KLONG,KRPIEX,KARTEX,KLONEX,
00707      S  KRPIEC,KARTEC,KPOSEC,KDTROU,KLONUT,KRETIN
00708         INUMER=LFI%NUMERO(KRANG)
00709         CALL LFIEMS_MT (LFI, INUMER,INIMES,KREP,.FALSE.,
00710      S                  CLMESS,CLNSPR,CLACTI)
00711       ENDIF
00712 C
00713       IF (LHOOK) CALL DR_HOOK('LFIREE_MT',1,ZHOOK_HANDLE)
00714       END
00715