ooover
C OOOVER SOURCE PV090527 26/04/24 08:23:26 12524 SUBROUTINE OOOVER (UNIT,REPERE,KDUMP,NBERR) C---------------------------------------------------------------------- C C VERIFIER L'INTEGRITE DE LA ZONE MEMOIRE GEREE PAR GEMAT C C UNIT NUMERO DU FICHIER D'IMPRESSION C REPERE CHAINE DE CARACTERES REPERANT LE OOOVER C KDUMP = 0 PAS DE MINI DUMP C = 1 SORTIE D'UN MINI DUMP C ->NBERR NOMBRE D'ERREURS DETECTEES C C PROGRAMMEUR : MOUGIN C CREE : 08/02/88 POUR LE JEUNE RAVIER C MODIF : 26/02/88 VERIF DU SEGMENT DES DESCRIPTEURS C MODIF : 11/03/88 IMPRESSIONS AMELIORES DES DESCRIPTEURS C MODIF : 13/06/88 COMPTER LES VALEURS NON NULLES D'UN TROU C MODIF : 08/09/88 CORRECTION D'UN FORMAT C MODIF : 13/12/88 CORRECTION D'UNE ERREUR C MODIF : 20/02/89 VERIFIER SUPER SEGMENT C MODIF : 22/2/90 MODIF DES /A/A PAR /,A,/ C----------------------------------------------------------------------- C %INC IOOSGM %INC IOODES C MSLSM NOMBRE DE MOTS MINI POUR UN SEGMENT C MSLZ1 NOMBRE DE MOTS DE CONTROLE EN DEBUT DE SEGMENT C MSLZ2 NOMBRE DE MOTS DE CONTROLE EN FIN DE SEGMENT C MDLDE NOMBRE DE MOTS POUR UN DESCRIPTEUR C PARAMETER ( MSLSM = 8 ) C PARAMETER ( MSLZ1 = 4 ) faux ! pv C PARAMETER ( MSLZ2 = 1 ) C PARAMETER ( MDLDE = 8 ) C PARAMETER ( MDISOLE = 0 ) C PARAMETER ( MDMARK = 3 ) SEGMENT , BIDON INTEGER BID1 ENDSEGMENT C INTEGER UNIT , KDUMP , NBERR CHARACTER*(*) REPERE CHARACTER*60 HDDIA(13) CHARACTER*60 HSDIA(14) DATA HDDIA 1 / 'Le premier mot est non nul' 2 , 'L''indice du descripteur suivant est trop petit' 3 , 'L''indice du descripteur suivant est trop grand' 4 , 'Descripteur suivant , parite adresse' 5 , 'Le descripteur suivant est non libre' 6 , 'Analyse OOOVER incoherente' 7 , 'Cycle dans la chaine des libres' 8 , 'Il n''est pas dans la chaine des libres' 9 , 'L''adresse est trop petite' A , 'L''adresse est trop grande' B , 'L''adresse n''est pas divisible par 8' C , 'L''adresse n''est pas celle d''un segment' D , 'Super-segment incoherent' * / DATA HSDIA 1 / 'Segment : Longueur nulle' 2 , 'Segment : Longueur non multiple de 8' 3 , 'Segment : Longueur trop grande => Debordement' 4 , 'Segment : Longueur debut /= Longueur fin' 5 , 'Segment : Un pointeur est trop petit' 6 , 'Segment : Un pointeur est trop grand' 7 , 'Segment : Un pointeur n''a pas la bonne parite' 8 , 'Segment : Un pointeur designe un segment supprime' 9 , 'Segment : Incoherence : Pointeur <=> Adresse descripteur' A , 'Segment : Adresse Descripteur /= Adresse segment' 1 , 'Segment : Adresse trou suivant/precedent trop petite' 2 , 'Trou : Adresse trou suivant/precedent trop grande' 3 , 'Trou : Deuxieme mot du trou different de zero' 4 , 'Trou : Au moins un mot du trou different de zero' * / C--------------------------------------------------------------------- C C QUELQUES PARAMETRES C C ITMIN => OOV(ITMIN+1) : PREMIER MOT DU PREMIER TROU C ITMAX => OOV(ITMAX+1) : PREMIER MOT DU DERNIER TROU POSSIBLE C C ISMIN => OOV(ISMIN+1) : PREMIER MOT DU PREMIER SEGMENT C ISMAX => OOV(ISMAX+1) : PREMIER MOT DU DERNIER SEGMENT POSSIBLE NBERR = 0 LZA = OOV(OOA(1)+1) ITMIN = OOA(1)+ 2*MSLSM-MSLZ1 ITMAX = OOA(1)+LZA-MSLSM-MSLZ1 ISMIN = ITMIN+2*MSLSM ISMAX = ITMAX C ISDES => OOV(ISDES+1) : PREMIER MOT DU SEGMENT DES DESCRIPTEURS C LSDES = OOV(ISDES+1) : LONGUEUR DU SEGMENT DES DESCRIPTEURS C IDDES => OOA(OOT+IDDES) : PREMIER MOT DU DESCRIPTEUR C DU SEGMENT DES DESCRIPTEURS C IDMIN = VALEUR MINIMUM POUR UN DESCRIPTEUR C IDMAX = VALEUR MAXIMUM POUR UN DESCRIPTEUR C IDLIB = DESCRIPTEUR TETE DE LA CHAINE DES DESCRIPTEURS LIBRES ISDES = OOT-MSLZ1-3 LSDES = OOV(ISDES+1) IDDES = OOV(ISDES+2) IDMIN = OOV(ISMIN+2) IDMAX = LSDES-MSLZ1-MSLZ2-2 IDLIB = IDMIN-MDLDE IF (KDUMP.EQ.1) THEN WRITE (UNIT,'(20X)') WRITE (UNIT,'(20X,A)') 1 ' ------------------------------------- ' 2 , 'I I' 3 , 'I PARAMETRES DU MINI-DUMP DE OOOVER I' 4 , 'I I' 5 , ' ------------------------------------- ' WRITE (UNIT,'(/,A,A,A,/)')' CALL OOOVER (,''',REPERE,''',,)' WRITE (UNIT,'(A,I10)') 1 ' I eme mot zone Esope => OOV(OOA(1)+I) : OOA(1) = ',OOA(1) 2 ,' Longueur zone Esope => OOV(OOA(1)+1) = ',LZA 3 ,' Premier mot Descripteur => OOA(OOT+Pi) : OOT = ',OOT WRITE (UNIT,'(20X)') WRITE (UNIT,'(A,I10)') 1 ' Adresse MINI pour un Trou : A1 = ',ITMIN 2 ,' Adresse MAXI pour un Trou : A2 = ',ITMAX 3 ,' Adresse MINI pour un Segment : Ax = ',ISMIN 4 ,' Adresse MAXI pour un Segment : Ay = ',ISMAX 5 ,' Chaine des DESCRIPTEURS libres : Pl = ',IDLIB 6 ,' Valeur MINI Pour un Pointeur : Px = ',IDMIN 7 ,' Valeur MAXI Pour un Pointeur : Py = ',IDMAX 8 ,' Pointeur Segment DESCRIPTEURS : Pd = ',IDDES 9 ,' Adresse Segment DESCRIPTEURS : Ad = ',ISDES WRITE (UNIT,'(20X)') WRITE (UNIT,'(20X,A)') 1 ' ------------------------------------- ' 2 , 'I I' 3 , 'I LE SEGMENT DES DESCRIPTEURS I' 4 , 'I I' 5 , ' ------------------------------------- ' WRITE (UNIT,'(20X)') WRITE (UNIT,'(1X,A,5X,2A,/)') 1 ' Pointeur' , ' Adresse' , ' Type' DO I = 0,LSDES,2 IF (OOV(ISDES+I+1).LT.0) THEN WRITE (UNIT,'(1X,I10,5X,I12,12X,I12)') 1 (I-5),OOV(ISDES+I),OOV(ISDES+I+1) ELSE WRITE (UNIT,'(1X,I10,5X,3I12)') 1 (I-5),OOV(ISDES+I),OOV(ISDES+I+1)/16777216 2 ,MOD(OOV(ISDES+I+1),16777216) ENDIF ENDDO ENDIF C VERIFER LA CHAINE DES DESCRIPTEURS LIBRES NDDIA = 0 NBLIB = 0 DO IDE = IDLIB,IDMAX,MDLDE IF (OOA(OOT+IDE+1).LT.0) THEN IF (OOA(OOT+IDE ).NE.0) NDDIA = 1 NBLIB = NBLIB+1 ENDIF ENDDO IF (NDDIA.EQ.0) THEN DO IDE = IDMIN,IDMAX,MDLDE IF (OOA(OOT+IDE+1).LT.0) OOA(OOT+IDE) = IDE ENDDO NBD = 0 IDE = IDLIB ID2 = ABS(OOA(OOT+IDE+1)) DO WHILE (ID2.NE.IDLIB .AND. NDDIA.EQ.0) NBD = NBD+1 IF (ID2.LT.IDMIN) THEN NDDIA = 2 ELSEIF (ID2.GT.IDMAX) THEN NDDIA = 3 ELSEIF (MOD(ID2-IDMIN,MDLDE).NE.0) THEN NDDIA = 4 ELSEIF (OOA(OOT+ID2+1).GE.0) THEN NDDIA = 5 ELSEIF (OOA(OOT+ID2 ).NE.ID2) THEN NDDIA = 6 ELSEIF (NBD.GE.NBLIB) THEN NDDIA = 7 ELSE OOA(OOT+ID2) = 0 IDE = ID2 ID2 = ABS(OOA(OOT+IDE+1)) ENDIF ENDDO DO ID2 = IDMIN,IDMAX,MDLDE IF (OOA(OOT+ID2+1).LT.0) THEN IF (OOA(OOT+ID2 ).NE.0) THEN OOA(OOT+ID2) = 0 IF (NDDIA.EQ.0) THEN NDDIA = 8 IDE = ID2 ENDIF ENDIF ENDIF ENDDO ENDIF C MESSAGE D'ERREUR EVENTUEL IF (NDDIA.NE.0) THEN NBERR = NBERR+1 IF (NBERR.EQ.1) THEN WRITE (UNIT,'(/,A,A,A)') 1 ' --- ERROR OOOVER --- CALL OOOVER (,''',REPERE,''',,)' ENDIF WRITE (UNIT,'(/,A,I10,/,A,A)') 1 ' --- ERROR --- Pour le descripteur libre : ',IDE, 2 ' --- --- ',HDDIA(NDDIA) WRITE (UNIT,'(/,1X,I10,5X,2I12)') 1 IDE,OOA(OOT+IDE),OOA(OOT+IDE+1) ENDIF C VERIFER DANS LE MOT 1 DES DESCRIPTEURS C LES ADRESSES DES SEGMENTS EN MEMOIRE NDDIA = 0 DO IDE = IDLIB,IDMAX,MDLDE IF (OOA(OOT+IDE+1).GE.0) THEN IF (OOA(OOT+IDE+1)/16777216/64.EQ.0) THEN JS = ABS(OOA(OOT+IDE))-MSLZ1 IF (JS.LT.ISMIN) THEN NDDIA = 9 ELSEIF (JS.GT.ISMAX) THEN NDDIA = 10 ELSEIF (MOD(JS,MSLSM).NE.MSLZ1) THEN NDDIA = 11 ELSEIF (OOV(JS+2).NE.IDE) THEN NDDIA = 12 ENDIF IF (NDDIA.EQ.0 .AND. IDE.GE.IDDES) THEN C ITYP = MDTYP (IDE) ITYP = (OOA(OOT+(IDE)+1)/16777216) C ICAT = MDCAT(ITYP) ICAT = MOD(ITYP,64)/16 IF (ICAT.NE.MDISOLE .AND. ICAT.NE.MDMARK)THEN C IDMK = MDMK(IDE) IDMK = MOD(OOA(OOT+(IDE)+1),16777216) IF (IDMK.LT.IDMIN) NDDIA = 13 IF (IDMK.GT.IDMAX) NDDIA = 13 IF (MOD(IDMK-IDMIN,MDLDE).NE.0) NDDIA = 13 C IF (MDCAT(MDTYP(IDMK)).NE.MDMARK) NDDIA = 13 IF((MOD((OOA(OOT+(IDMK)+1)/16777216),64)/16).NE.3) 1 NDDIA = 13 ENDIF ENDIF ENDIF ENDIF IF (NDDIA.NE.0) GO TO 12 ENDDO 12 CONTINUE C MESSAGE D'ERREUR EVENTUEL IF (NDDIA.NE.0) THEN NBERR = NBERR+1 IF (NBERR.EQ.1) THEN WRITE (UNIT,'(/,A,A,A)') 1 ' --- ERROR OOOVER --- CALL OOOVER (,''',REPERE,''',,)' ENDIF WRITE (UNIT,'(/A,I10/A,A)') 1 ' --- ERROR --- Pour le descripteur de segment : ',IDE, 2 ' --- --- ',HDDIA(NDDIA) WRITE (UNIT,'(/,1X,I10,5X,3I12)') 1 IDE,OOA(OOT+IDE),OOA(OOT+IDE+1)/16777216 2 ,MOD(OOA(OOT+IDE+1),16777216) ENDIF IF (KDUMP.EQ.1) THEN WRITE (UNIT,'(20X)') WRITE (UNIT,'(20X,A)') 1 ' ------------------------------------- ' 2 , 'I I' 3 , 'I MINI_DUMP DES SEGMENTS ET TROUS I' 4 , 'I I' 5 , ' ------------------------------------- ' WRITE (UNIT,'(1X/1X,A,5X,4X,A,4X,A,5X,A,3X,A,/)') 1 ' Adresse','Longueur','Pointeur','P-avant','P-arriere' ENDIF C---------------------------------------------------------------------- C C INTEGRITE DE LA ZONE MEMOIRE OCCUPEES PAR LES SEGMENTS ET LES TROUS C C IX => OOV(IX+1) : PREMIER MOT DU SEGMENT OU TROU EXAMINE C JX => OOV(JX+1) : PREMIER MOT DU SEGMENT OU TROU SUIVANT C C ->NBERR NOMBRE D'ERREURS DETECTEES C ->NSDIA NUMERO D'UN MESSAGE D'ERREUR C JX = ISMIN DO WHILE (JX.LE.ISMAX) IX = JX JX = IX+ABS(OOV(IX+1)) C VERIFIER LES LONGUEURS ASSOCIES A UN SEGMENT IF (OOV(IX+1).EQ.0) THEN NSDIA = 1 ELSEIF (MOD(ABS(OOV(IX+1)),MSLSM).NE.0) THEN NSDIA = 2 ELSEIF (JX.GT.ISMAX+MSLSM) THEN NSDIA = 3 ELSEIF (OOV(IX+1).NE.OOV(JX)) THEN NSDIA = 4 ELSE NSDIA = 0 ENDIF C VERIFIER LES POINTEURS ASSOCIES A UN SEGMENT IF (OOV(IX+1).GT.0) THEN IS = IX DO I=2,4 IF (NSDIA.EQ.0) THEN IDE = OOV(IS+I) IF (IDE.LT.IDMIN) THEN NSDIA = 5 ELSEIF (IDE.GT.IDMAX) THEN NSDIA = 6 ELSEIF (MOD(IDE-IDMIN,MDLDE).NE.0) THEN NSDIA = 7 ELSEIF (OOA(OOT+IDE+1).LT.0) THEN NSDIA = 8 ENDIF ENDIF ENDDO IF (NSDIA.EQ.0) THEN IDE = OOV(IS+2) IF (IDE.LE.IDDES .AND. IS.GT.ISDES) THEN NSDIA = 9 ELSEIF (ABS(OOA(OOT+IDE)).NE.IS+MSLZ1) THEN NSDIA = 10 ENDIF ENDIF C VERIFIER LES ADRESSES ASSOCIEES A UN TROU ELSE IT = IX DO I=3,4 IF (NSDIA.EQ.0) THEN IF (OOV(IT+I).LT.ITMIN) THEN NSDIA = 11 ELSEIF (OOV(IT+I).GT.ITMAX) THEN NSDIA = 12 ENDIF ENDIF ENDDO IF (NSDIA.EQ.0) THEN IF (OOV(IT+2).NE.0) THEN NSDIA = 13 ELSE LT = ABS(OOV(IT+1)) NBNZER = 0 DO I = 5,LT-1 IF (OOV(IT+I).NE.0) NBNZER = NBNZER+1 ENDDO IF (NBNZER.NE.0) NSDIA = 14 ENDIF ENDIF ENDIF C MESSAGE D'ERREUR EVENTUEL IF (KDUMP.EQ.1) THEN WRITE (UNIT,'(1X,I10,5X,4I12)') IX , (OOV(IX+I),I=1,4) ENDIF IF (NSDIA.GT.0) THEN NBERR = NBERR+1 IF (NBERR.EQ.1) THEN WRITE (UNIT,'(/,A,A,A)') 1 ' --- ERROR OOOVER --- CALL OOOVER (,''',REPERE,''',,)' ENDIF WRITE (UNIT,'(/,A,A)') 1 ' --- ERROR --- ',HSDIA(NSDIA) IF (NBNZER.NE.0) THEN WRITE (UNIT,'( A,I10,A)') 1 ' --- --- ',NBNZER , ' Valeurs non nulles' ENDIF IF (KDUMP.NE.1) THEN WRITE (UNIT,'(1X/1X,A,5X,4X,A,4X,A,5X,A,3X,A,/)') 1 ' Adresse','Longueur','Pointeur','P-avant','P-arriere' WRITE (UNIT,'(1X,I10,5X,4I12)') IX , (OOV(IX+I),I=1,4) ENDIF ENDIF IF (NSDIA.GT.0 .AND. NSDIA.LT.5) RETURN ENDDO IF (OOV(ISMAX+MSLSM+1).NE.0) THEN NBERR = NBERR+1 IF (NBERR.EQ.1) THEN WRITE (UNIT,'(/,A,A,A)') 1 ' --- ERROR OOOVER --- CALL OOOVER (,''',REPERE,''',,)' ENDIF WRITE (UNIT,'(/,A,/)') 1 ' --- ERROR --- MOT NON NUL EN FIN DE ZONE ESOPE' ENDIF RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales