Télécharger ooover.eso

Retour à la liste

Numérotation des lignes :

ooover
  1. C OOOVER SOURCE PV090527 26/04/24 08:23:26 12524
  2. SUBROUTINE OOOVER (UNIT,REPERE,KDUMP,NBERR)
  3. C----------------------------------------------------------------------
  4. C
  5. C VERIFIER L'INTEGRITE DE LA ZONE MEMOIRE GEREE PAR GEMAT
  6. C
  7. C UNIT NUMERO DU FICHIER D'IMPRESSION
  8. C REPERE CHAINE DE CARACTERES REPERANT LE OOOVER
  9. C KDUMP = 0 PAS DE MINI DUMP
  10. C = 1 SORTIE D'UN MINI DUMP
  11. C ->NBERR NOMBRE D'ERREURS DETECTEES
  12. C
  13. C PROGRAMMEUR : MOUGIN
  14. C CREE : 08/02/88 POUR LE JEUNE RAVIER
  15. C MODIF : 26/02/88 VERIF DU SEGMENT DES DESCRIPTEURS
  16. C MODIF : 11/03/88 IMPRESSIONS AMELIORES DES DESCRIPTEURS
  17. C MODIF : 13/06/88 COMPTER LES VALEURS NON NULLES D'UN TROU
  18. C MODIF : 08/09/88 CORRECTION D'UN FORMAT
  19. C MODIF : 13/12/88 CORRECTION D'UNE ERREUR
  20. C MODIF : 20/02/89 VERIFIER SUPER SEGMENT
  21. C MODIF : 22/2/90 MODIF DES /A/A PAR /,A,/
  22. C-----------------------------------------------------------------------
  23. C
  24. %INC IOOSGM
  25. %INC IOODES
  26. C MSLSM NOMBRE DE MOTS MINI POUR UN SEGMENT
  27. C MSLZ1 NOMBRE DE MOTS DE CONTROLE EN DEBUT DE SEGMENT
  28. C MSLZ2 NOMBRE DE MOTS DE CONTROLE EN FIN DE SEGMENT
  29. C MDLDE NOMBRE DE MOTS POUR UN DESCRIPTEUR
  30.  
  31. C PARAMETER ( MSLSM = 8 )
  32. C PARAMETER ( MSLZ1 = 4 ) faux ! pv
  33. C PARAMETER ( MSLZ2 = 1 )
  34. C PARAMETER ( MDLDE = 8 )
  35. C PARAMETER ( MDISOLE = 0 )
  36. C PARAMETER ( MDMARK = 3 )
  37.  
  38. SEGMENT , BIDON
  39. INTEGER BID1
  40. ENDSEGMENT
  41. C
  42. INTEGER UNIT , KDUMP , NBERR
  43. CHARACTER*(*) REPERE
  44.  
  45. CHARACTER*60 HDDIA(13)
  46. CHARACTER*60 HSDIA(14)
  47. DATA HDDIA
  48. 1 / 'Le premier mot est non nul'
  49. 2 , 'L''indice du descripteur suivant est trop petit'
  50. 3 , 'L''indice du descripteur suivant est trop grand'
  51. 4 , 'Descripteur suivant , parite adresse'
  52. 5 , 'Le descripteur suivant est non libre'
  53. 6 , 'Analyse OOOVER incoherente'
  54. 7 , 'Cycle dans la chaine des libres'
  55. 8 , 'Il n''est pas dans la chaine des libres'
  56. 9 , 'L''adresse est trop petite'
  57. A , 'L''adresse est trop grande'
  58. B , 'L''adresse n''est pas divisible par 8'
  59. C , 'L''adresse n''est pas celle d''un segment'
  60. D , 'Super-segment incoherent'
  61. * /
  62. DATA HSDIA
  63. 1 / 'Segment : Longueur nulle'
  64. 2 , 'Segment : Longueur non multiple de 8'
  65. 3 , 'Segment : Longueur trop grande => Debordement'
  66. 4 , 'Segment : Longueur debut /= Longueur fin'
  67. 5 , 'Segment : Un pointeur est trop petit'
  68. 6 , 'Segment : Un pointeur est trop grand'
  69. 7 , 'Segment : Un pointeur n''a pas la bonne parite'
  70. 8 , 'Segment : Un pointeur designe un segment supprime'
  71. 9 , 'Segment : Incoherence : Pointeur <=> Adresse descripteur'
  72. A , 'Segment : Adresse Descripteur /= Adresse segment'
  73. 1 , 'Segment : Adresse trou suivant/precedent trop petite'
  74. 2 , 'Trou : Adresse trou suivant/precedent trop grande'
  75. 3 , 'Trou : Deuxieme mot du trou different de zero'
  76. 4 , 'Trou : Au moins un mot du trou different de zero'
  77. * /
  78. C---------------------------------------------------------------------
  79. C
  80. C QUELQUES PARAMETRES
  81. C
  82. C ITMIN => OOV(ITMIN+1) : PREMIER MOT DU PREMIER TROU
  83. C ITMAX => OOV(ITMAX+1) : PREMIER MOT DU DERNIER TROU POSSIBLE
  84. C
  85. C ISMIN => OOV(ISMIN+1) : PREMIER MOT DU PREMIER SEGMENT
  86. C ISMAX => OOV(ISMAX+1) : PREMIER MOT DU DERNIER SEGMENT POSSIBLE
  87.  
  88. NBERR = 0
  89. LZA = OOV(OOA(1)+1)
  90. ITMIN = OOA(1)+ 2*MSLSM-MSLZ1
  91. ITMAX = OOA(1)+LZA-MSLSM-MSLZ1
  92. ISMIN = ITMIN+2*MSLSM
  93. ISMAX = ITMAX
  94.  
  95. C ISDES => OOV(ISDES+1) : PREMIER MOT DU SEGMENT DES DESCRIPTEURS
  96. C LSDES = OOV(ISDES+1) : LONGUEUR DU SEGMENT DES DESCRIPTEURS
  97. C IDDES => OOA(OOT+IDDES) : PREMIER MOT DU DESCRIPTEUR
  98. C DU SEGMENT DES DESCRIPTEURS
  99. C IDMIN = VALEUR MINIMUM POUR UN DESCRIPTEUR
  100. C IDMAX = VALEUR MAXIMUM POUR UN DESCRIPTEUR
  101. C IDLIB = DESCRIPTEUR TETE DE LA CHAINE DES DESCRIPTEURS LIBRES
  102.  
  103. ISDES = OOT-MSLZ1-3
  104. LSDES = OOV(ISDES+1)
  105. IDDES = OOV(ISDES+2)
  106. IDMIN = OOV(ISMIN+2)
  107. IDMAX = LSDES-MSLZ1-MSLZ2-2
  108. IDLIB = IDMIN-MDLDE
  109.  
  110. IF (KDUMP.EQ.1) THEN
  111. WRITE (UNIT,'(20X)')
  112. WRITE (UNIT,'(20X,A)')
  113. 1 ' ------------------------------------- '
  114. 2 , 'I I'
  115. 3 , 'I PARAMETRES DU MINI-DUMP DE OOOVER I'
  116. 4 , 'I I'
  117. 5 , ' ------------------------------------- '
  118. WRITE (UNIT,'(/,A,A,A,/)')' CALL OOOVER (,''',REPERE,''',,)'
  119. WRITE (UNIT,'(A,I10)')
  120. 1 ' I eme mot zone Esope => OOV(OOA(1)+I) : OOA(1) = ',OOA(1)
  121. 2 ,' Longueur zone Esope => OOV(OOA(1)+1) = ',LZA
  122. 3 ,' Premier mot Descripteur => OOA(OOT+Pi) : OOT = ',OOT
  123. WRITE (UNIT,'(20X)')
  124. WRITE (UNIT,'(A,I10)')
  125. 1 ' Adresse MINI pour un Trou : A1 = ',ITMIN
  126. 2 ,' Adresse MAXI pour un Trou : A2 = ',ITMAX
  127. 3 ,' Adresse MINI pour un Segment : Ax = ',ISMIN
  128. 4 ,' Adresse MAXI pour un Segment : Ay = ',ISMAX
  129. 5 ,' Chaine des DESCRIPTEURS libres : Pl = ',IDLIB
  130. 6 ,' Valeur MINI Pour un Pointeur : Px = ',IDMIN
  131. 7 ,' Valeur MAXI Pour un Pointeur : Py = ',IDMAX
  132. 8 ,' Pointeur Segment DESCRIPTEURS : Pd = ',IDDES
  133. 9 ,' Adresse Segment DESCRIPTEURS : Ad = ',ISDES
  134. WRITE (UNIT,'(20X)')
  135. WRITE (UNIT,'(20X,A)')
  136. 1 ' ------------------------------------- '
  137. 2 , 'I I'
  138. 3 , 'I LE SEGMENT DES DESCRIPTEURS I'
  139. 4 , 'I I'
  140. 5 , ' ------------------------------------- '
  141. WRITE (UNIT,'(20X)')
  142. WRITE (UNIT,'(1X,A,5X,2A,/)')
  143. 1 ' Pointeur' , ' Adresse' , ' Type'
  144. DO I = 0,LSDES,2
  145. IF (OOV(ISDES+I+1).LT.0) THEN
  146. WRITE (UNIT,'(1X,I10,5X,I12,12X,I12)')
  147. 1 (I-5),OOV(ISDES+I),OOV(ISDES+I+1)
  148. ELSE
  149. WRITE (UNIT,'(1X,I10,5X,3I12)')
  150. 1 (I-5),OOV(ISDES+I),OOV(ISDES+I+1)/16777216
  151. 2 ,MOD(OOV(ISDES+I+1),16777216)
  152. ENDIF
  153. ENDDO
  154. ENDIF
  155.  
  156. C VERIFER LA CHAINE DES DESCRIPTEURS LIBRES
  157.  
  158. NDDIA = 0
  159. NBLIB = 0
  160. DO IDE = IDLIB,IDMAX,MDLDE
  161. IF (OOA(OOT+IDE+1).LT.0) THEN
  162. IF (OOA(OOT+IDE ).NE.0) NDDIA = 1
  163. NBLIB = NBLIB+1
  164. ENDIF
  165. ENDDO
  166. IF (NDDIA.EQ.0) THEN
  167. DO IDE = IDMIN,IDMAX,MDLDE
  168. IF (OOA(OOT+IDE+1).LT.0) OOA(OOT+IDE) = IDE
  169. ENDDO
  170.  
  171. NBD = 0
  172. IDE = IDLIB
  173. ID2 = ABS(OOA(OOT+IDE+1))
  174. DO WHILE (ID2.NE.IDLIB .AND. NDDIA.EQ.0)
  175. NBD = NBD+1
  176. IF (ID2.LT.IDMIN) THEN
  177. NDDIA = 2
  178. ELSEIF (ID2.GT.IDMAX) THEN
  179. NDDIA = 3
  180. ELSEIF (MOD(ID2-IDMIN,MDLDE).NE.0) THEN
  181. NDDIA = 4
  182. ELSEIF (OOA(OOT+ID2+1).GE.0) THEN
  183. NDDIA = 5
  184. ELSEIF (OOA(OOT+ID2 ).NE.ID2) THEN
  185. NDDIA = 6
  186. ELSEIF (NBD.GE.NBLIB) THEN
  187. NDDIA = 7
  188. ELSE
  189. OOA(OOT+ID2) = 0
  190. IDE = ID2
  191. ID2 = ABS(OOA(OOT+IDE+1))
  192. ENDIF
  193. ENDDO
  194.  
  195. DO ID2 = IDMIN,IDMAX,MDLDE
  196. IF (OOA(OOT+ID2+1).LT.0) THEN
  197. IF (OOA(OOT+ID2 ).NE.0) THEN
  198. OOA(OOT+ID2) = 0
  199. IF (NDDIA.EQ.0) THEN
  200. NDDIA = 8
  201. IDE = ID2
  202. ENDIF
  203. ENDIF
  204. ENDIF
  205. ENDDO
  206.  
  207. ENDIF
  208.  
  209.  
  210. C MESSAGE D'ERREUR EVENTUEL
  211.  
  212. IF (NDDIA.NE.0) THEN
  213. NBERR = NBERR+1
  214. IF (NBERR.EQ.1) THEN
  215. WRITE (UNIT,'(/,A,A,A)')
  216. 1 ' --- ERROR OOOVER --- CALL OOOVER (,''',REPERE,''',,)'
  217. ENDIF
  218. WRITE (UNIT,'(/,A,I10,/,A,A)')
  219. 1 ' --- ERROR --- Pour le descripteur libre : ',IDE,
  220. 2 ' --- --- ',HDDIA(NDDIA)
  221. WRITE (UNIT,'(/,1X,I10,5X,2I12)')
  222. 1 IDE,OOA(OOT+IDE),OOA(OOT+IDE+1)
  223. ENDIF
  224.  
  225. C VERIFER DANS LE MOT 1 DES DESCRIPTEURS
  226. C LES ADRESSES DES SEGMENTS EN MEMOIRE
  227.  
  228. NDDIA = 0
  229. DO IDE = IDLIB,IDMAX,MDLDE
  230. IF (OOA(OOT+IDE+1).GE.0) THEN
  231. IF (OOA(OOT+IDE+1)/16777216/64.EQ.0) THEN
  232. JS = ABS(OOA(OOT+IDE))-MSLZ1
  233. IF (JS.LT.ISMIN) THEN
  234. NDDIA = 9
  235. ELSEIF (JS.GT.ISMAX) THEN
  236. NDDIA = 10
  237. ELSEIF (MOD(JS,MSLSM).NE.MSLZ1) THEN
  238. NDDIA = 11
  239. ELSEIF (OOV(JS+2).NE.IDE) THEN
  240. NDDIA = 12
  241. ENDIF
  242.  
  243. IF (NDDIA.EQ.0 .AND. IDE.GE.IDDES) THEN
  244. C ITYP = MDTYP (IDE)
  245. ITYP = (OOA(OOT+(IDE)+1)/16777216)
  246. C ICAT = MDCAT(ITYP)
  247. ICAT = MOD(ITYP,64)/16
  248. IF (ICAT.NE.MDISOLE .AND. ICAT.NE.MDMARK)THEN
  249. C IDMK = MDMK(IDE)
  250. IDMK = MOD(OOA(OOT+(IDE)+1),16777216)
  251. IF (IDMK.LT.IDMIN) NDDIA = 13
  252. IF (IDMK.GT.IDMAX) NDDIA = 13
  253. IF (MOD(IDMK-IDMIN,MDLDE).NE.0) NDDIA = 13
  254. C IF (MDCAT(MDTYP(IDMK)).NE.MDMARK) NDDIA = 13
  255. IF((MOD((OOA(OOT+(IDMK)+1)/16777216),64)/16).NE.3)
  256. 1 NDDIA = 13
  257. ENDIF
  258. ENDIF
  259.  
  260. ENDIF
  261. ENDIF
  262. IF (NDDIA.NE.0) GO TO 12
  263. ENDDO
  264. 12 CONTINUE
  265.  
  266.  
  267. C MESSAGE D'ERREUR EVENTUEL
  268.  
  269. IF (NDDIA.NE.0) THEN
  270. NBERR = NBERR+1
  271. IF (NBERR.EQ.1) THEN
  272. WRITE (UNIT,'(/,A,A,A)')
  273. 1 ' --- ERROR OOOVER --- CALL OOOVER (,''',REPERE,''',,)'
  274. ENDIF
  275. WRITE (UNIT,'(/A,I10/A,A)')
  276. 1 ' --- ERROR --- Pour le descripteur de segment : ',IDE,
  277. 2 ' --- --- ',HDDIA(NDDIA)
  278. WRITE (UNIT,'(/,1X,I10,5X,3I12)')
  279. 1 IDE,OOA(OOT+IDE),OOA(OOT+IDE+1)/16777216
  280. 2 ,MOD(OOA(OOT+IDE+1),16777216)
  281. ENDIF
  282.  
  283. IF (KDUMP.EQ.1) THEN
  284. WRITE (UNIT,'(20X)')
  285. WRITE (UNIT,'(20X,A)')
  286. 1 ' ------------------------------------- '
  287. 2 , 'I I'
  288. 3 , 'I MINI_DUMP DES SEGMENTS ET TROUS I'
  289. 4 , 'I I'
  290. 5 , ' ------------------------------------- '
  291. WRITE (UNIT,'(1X/1X,A,5X,4X,A,4X,A,5X,A,3X,A,/)')
  292. 1 ' Adresse','Longueur','Pointeur','P-avant','P-arriere'
  293. ENDIF
  294. C----------------------------------------------------------------------
  295. C
  296. C INTEGRITE DE LA ZONE MEMOIRE OCCUPEES PAR LES SEGMENTS ET LES TROUS
  297. C
  298. C IX => OOV(IX+1) : PREMIER MOT DU SEGMENT OU TROU EXAMINE
  299. C JX => OOV(JX+1) : PREMIER MOT DU SEGMENT OU TROU SUIVANT
  300. C
  301. C ->NBERR NOMBRE D'ERREURS DETECTEES
  302. C ->NSDIA NUMERO D'UN MESSAGE D'ERREUR
  303. C
  304. JX = ISMIN
  305. DO WHILE (JX.LE.ISMAX)
  306. IX = JX
  307. JX = IX+ABS(OOV(IX+1))
  308.  
  309. C VERIFIER LES LONGUEURS ASSOCIES A UN SEGMENT
  310.  
  311. IF (OOV(IX+1).EQ.0) THEN
  312. NSDIA = 1
  313. ELSEIF (MOD(ABS(OOV(IX+1)),MSLSM).NE.0) THEN
  314. NSDIA = 2
  315. ELSEIF (JX.GT.ISMAX+MSLSM) THEN
  316. NSDIA = 3
  317. ELSEIF (OOV(IX+1).NE.OOV(JX)) THEN
  318. NSDIA = 4
  319. ELSE
  320. NSDIA = 0
  321. ENDIF
  322.  
  323. C VERIFIER LES POINTEURS ASSOCIES A UN SEGMENT
  324.  
  325. IF (OOV(IX+1).GT.0) THEN
  326. IS = IX
  327. DO I=2,4
  328. IF (NSDIA.EQ.0) THEN
  329. IDE = OOV(IS+I)
  330. IF (IDE.LT.IDMIN) THEN
  331. NSDIA = 5
  332. ELSEIF (IDE.GT.IDMAX) THEN
  333. NSDIA = 6
  334. ELSEIF (MOD(IDE-IDMIN,MDLDE).NE.0) THEN
  335. NSDIA = 7
  336. ELSEIF (OOA(OOT+IDE+1).LT.0) THEN
  337. NSDIA = 8
  338. ENDIF
  339. ENDIF
  340. ENDDO
  341. IF (NSDIA.EQ.0) THEN
  342. IDE = OOV(IS+2)
  343. IF (IDE.LE.IDDES .AND. IS.GT.ISDES) THEN
  344. NSDIA = 9
  345. ELSEIF (ABS(OOA(OOT+IDE)).NE.IS+MSLZ1) THEN
  346. NSDIA = 10
  347. ENDIF
  348. ENDIF
  349.  
  350. C VERIFIER LES ADRESSES ASSOCIEES A UN TROU
  351.  
  352. ELSE
  353. IT = IX
  354. DO I=3,4
  355. IF (NSDIA.EQ.0) THEN
  356. IF (OOV(IT+I).LT.ITMIN) THEN
  357. NSDIA = 11
  358. ELSEIF (OOV(IT+I).GT.ITMAX) THEN
  359. NSDIA = 12
  360. ENDIF
  361. ENDIF
  362. ENDDO
  363. IF (NSDIA.EQ.0) THEN
  364. IF (OOV(IT+2).NE.0) THEN
  365. NSDIA = 13
  366. ELSE
  367. LT = ABS(OOV(IT+1))
  368. NBNZER = 0
  369. DO I = 5,LT-1
  370. IF (OOV(IT+I).NE.0) NBNZER = NBNZER+1
  371. ENDDO
  372. IF (NBNZER.NE.0) NSDIA = 14
  373. ENDIF
  374. ENDIF
  375. ENDIF
  376.  
  377. C MESSAGE D'ERREUR EVENTUEL
  378.  
  379. IF (KDUMP.EQ.1) THEN
  380. WRITE (UNIT,'(1X,I10,5X,4I12)') IX , (OOV(IX+I),I=1,4)
  381. ENDIF
  382. IF (NSDIA.GT.0) THEN
  383. NBERR = NBERR+1
  384. IF (NBERR.EQ.1) THEN
  385. WRITE (UNIT,'(/,A,A,A)')
  386. 1 ' --- ERROR OOOVER --- CALL OOOVER (,''',REPERE,''',,)'
  387. ENDIF
  388. WRITE (UNIT,'(/,A,A)')
  389. 1 ' --- ERROR --- ',HSDIA(NSDIA)
  390. IF (NBNZER.NE.0) THEN
  391. WRITE (UNIT,'( A,I10,A)')
  392. 1 ' --- --- ',NBNZER , ' Valeurs non nulles'
  393. ENDIF
  394. IF (KDUMP.NE.1) THEN
  395. WRITE (UNIT,'(1X/1X,A,5X,4X,A,4X,A,5X,A,3X,A,/)')
  396. 1 ' Adresse','Longueur','Pointeur','P-avant','P-arriere'
  397. WRITE (UNIT,'(1X,I10,5X,4I12)') IX , (OOV(IX+I),I=1,4)
  398. ENDIF
  399. ENDIF
  400. IF (NSDIA.GT.0 .AND. NSDIA.LT.5) RETURN
  401. ENDDO
  402.  
  403. IF (OOV(ISMAX+MSLSM+1).NE.0) THEN
  404. NBERR = NBERR+1
  405. IF (NBERR.EQ.1) THEN
  406. WRITE (UNIT,'(/,A,A,A)')
  407. 1 ' --- ERROR OOOVER --- CALL OOOVER (,''',REPERE,''',,)'
  408. ENDIF
  409. WRITE (UNIT,'(/,A,/)')
  410. 1 ' --- ERROR --- MOT NON NUL EN FIN DE ZONE ESOPE'
  411. ENDIF
  412. RETURN
  413. END
  414.  
  415.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales