Télécharger sauv.eso

Retour à la liste

Numérotation des lignes :

sauv
  1. C SAUV SOURCE PV090527 25/01/07 18:18:28 12116
  2.  
  3. C=======================================================================
  4. C DIRECTIVE SAUVER
  5. C ----------------
  6. C
  7. C SAUVER (FORMAT) OBJ1 ...OBJN ;
  8. C ($GEO)
  9. C BUT: SAUVEGARDE DES OBJETS NOMMES ET DE CEUX QU ILS
  10. C SOUS-TENDENT, SUR LE FICHIER IOSAU
  11. C IOSAU EST DEFINI PAR: OPTIO SAUV IOSAU ;
  12. C
  13. C ON SAIT SAUVER LES OBJETS DONT LE TYPE EST CONTENU
  14. C DANS LE SP TYPFIL
  15. C
  16. C APPELLE TYPFIL CREPIL FILLLU FILLP1 FILLPI SORTRI FILLNO
  17. C IMPPIL MAXP1 MAXP32 WRPIL RESTPI SUPPIL SAVEPI
  18. C PILOBJ
  19. C ECRIT PAR FARVACQUE
  20. C REPRIS PAR LENA
  21. C ---------------------------------------------------------------------
  22. C POUR SAUVER UN AUTRE TYPE IL FAUT INTERVENIR DANS TYPFIL:
  23. C RAJOUTER DANS IPOSSI LES DEUX MOTS ASSOCIES
  24. C INCREMENTER NPOSSI DE 2
  25. C VERIFIER QUE LA DIM DU TABLEAU IPOSSI EST GE NPOSSI
  26. C ET FAIRE LE TRAITEMENT DANS CHAQUE SP VIA LES GO TO
  27. C=======================================================================
  28.  
  29. SUBROUTINE SAUV
  30.  
  31. IMPLICIT INTEGER(I-N)
  32. IMPLICIT REAL*8(A-H,O-Z)
  33.  
  34. -INC PPARAM
  35. -INC CCOPTIO
  36. -INC CCNOYAU
  37. -INC CCFXDR
  38. -INC CCASSIS
  39.  
  40. -INC SMCOORD
  41. -INC SMLENTI
  42.  
  43. -INC TMLCHA8
  44. -INC TMCOLAC
  45.  
  46. SEGMENT ISORTA
  47. CHARACTER*8 ISORTC(KS)
  48. INTEGER ISORTI(KS)
  49. ENDSEGMENT
  50.  
  51. EXTERNAL LONG
  52.  
  53. CHARACTER*(8) CTYP
  54. CHARACTER*4 MOFORM(3)
  55. CHARACTER*72 LABEL
  56. SAVE ILABAU
  57. DATA ILABAU/0/
  58. DATA MOFORM /'FORM','LABE','MUET'/
  59.  
  60. iun=1
  61. iimpil = IIMPI
  62.  
  63. C --- NIVEAU MAXIMAL COURANT : IONIVR (voir REST lipil.eso)
  64. IONIVR = 26
  65. IONIVS = IONIVE
  66. C --- NIVEAU DE SAUVEGARDE ACTUEL (si 0 -> niveau MAXIMAL)
  67. NIVEAU = IONIVE
  68. IF (NIVEAU.EQ.0) NIVEAU = IONIVR
  69. C --- VERIFICATIONS SUR LE NIVEAU DE SAUVEGARDE DEMANDE
  70. IF (NIVEAU.LT.1 .OR. NIVEAU.GT.IONIVR) THEN
  71. INTERR(1) = NIVEAU
  72. INTERR(2) = 1
  73. INTERR(3) = IONIVR
  74. CALL ERREUR(1068)
  75. RETURN
  76. ENDIF
  77. C --- NIVEAU DE SAUVEGARDE CHOISI
  78. IONIVE = NIVEAU
  79.  
  80. C---- LE NIVEAU 22 A INTRODUIT LES NOMS DE PLUS DE 8 CARACTERES
  81. IF (IONIVE.LT.22) THEN
  82. INTERR(1)=IONIVE
  83. CALL ERREUR(-359)
  84. ENDIF
  85.  
  86. C=======================================================================
  87. C * attention aux assistants ....
  88. if (NBESC.NE.0) then
  89. if (iimpil.eq.1234)
  90. & write(ioimp,*) ' il faut bloquer les assistants'
  91. mestra=imestr
  92. SEGACT MESTRA*MOD
  93. if (iimpil.eq.1234)
  94. & write(ioimp,*) ' assistants en attente'
  95. * on passe en mode force
  96. call ooofrc(1)
  97. * lodesl=.true.
  98. call setass(1)
  99. endif
  100.  
  101. C=======================================================================
  102. C ---- LECTURE DES MOTS-CLES : AVEC OU SANS FORMAT-----------
  103. IFORM = 0
  104. ISILE = 0
  105. IAUTO = 1
  106. LABEL = ' '
  107.  
  108. 46 CONTINUE
  109. CALL LIRMOT(MOFORM,3,IFURM,0)
  110. IF (IERR.NE.0) GOTO 5000
  111. IF (IFURM.EQ.1) THEN
  112. IFORM=1
  113. if (isafor.ne.iform) then
  114. call erreur(21)
  115. goto 5000
  116. endif
  117. GO TO 46
  118. ELSEIF (IFURM.EQ.2) THEN
  119. CALL LIRCHA(LABEL,1,IRETOU)
  120. IF (IERR.NE.0) GOTO 5000
  121. IAUTO=0
  122. GO TO 46
  123. ELSEIF (IFURM.EQ.3) THEN
  124. ISILE=1
  125. GO TO 46
  126. ENDIF
  127. iform = isafor
  128. * write (6,*) ' iformx dans sauv ',iformx
  129. if (iformx.eq.2) iform = 2
  130.  
  131. C=======================================================================
  132. IF (IAUTO.EQ.1) THEN
  133. ILABAU=ILABAU+1
  134. LABEL='LABEL_AUTOMATIQUE_'
  135. IF(ilabau.lt.10) then
  136. WRITE(LABEL(19:19),FMT='(I1)') ILABAU
  137. ELSEIF(ilabau.lt.100) then
  138. WRITE(LABEL(19:20),FMT='(I2)') ILABAU
  139. ELSEIF(ilabau.lt.1000) then
  140. WRITE(LABEL(19:21),FMT='(I3)') ILABAU
  141. ELSEIF(ilabau.lt.10000) then
  142. WRITE(LABEL(19:22),FMT='(I4)') ILABAU
  143. ELSE
  144. WRITE(LABEL(19:23),FMT='(I5)') ILABAU
  145. ENDIF
  146. ENDIF
  147.  
  148. IF (iimpil.EQ.5) WRITE(IOIMP,799)
  149. 799 FORMAT(' LECTURE DES OBJETS A SAUVER')
  150.  
  151. KS=0
  152. SEGINI ISORTA
  153.  
  154. 1 CONTINUE
  155. CTYP=' '
  156. CALL QUETYP(CTYP,0,IRETOU)
  157. IF (IERR.NE.0) RETURN
  158. IF (IRETOU.NE.1) GOTO 100
  159.  
  160. CALL LIROBJ(CTYP,IRET,0,IRETOU)
  161. C------- ON CONTROLE LA VALIDITE DU TYPE DEMANDE
  162. K=0
  163. CALL TYPFIL(CTYP,K)
  164. IF (K.LT.0) THEN
  165. C---------- ON NE SAIT PAS SORTIR UN OBJET DE CE TYPE
  166. MOTERR(1:8)=CTYP
  167. CALL ERREUR(242)
  168. GO TO 5000
  169. ENDIF
  170.  
  171. C------- LE TYPE EST OK
  172. KS=ISORTI(/1)+1
  173. SEGADJ ISORTA
  174. ISORTC(KS)=CTYP
  175. ISORTI(KS)=IRET
  176. GO TO 1
  177.  
  178. C---- ON A EXPLORE TOUTES LES DEMANDES
  179. 100 CONTINUE
  180. LOBJ=ISORTI(/1)
  181. IF (LOBJ.EQ.0) THEN
  182. c** SEGDES ISORTA
  183. ELSE
  184. IF (iimpil.EQ.5) WRITE (IOIMP,821) LOBJ
  185. 821 FORMAT(' NOMBRE D OBJETS A SAUVER : ',I6)
  186. ENDIF
  187.  
  188. C ---------------------------------------------------------
  189. C **** A PARTIR DES OBJETS DE ISORTA, ON REMPLIT LES PILES
  190. C **** ICOLAC EST INITIALISEE DANS CREPIL
  191.  
  192. ICOLAC=0
  193. C---- Cet appel a TYPFIL renvoie -NPOSSI dans K
  194. CTYP=' '
  195. K=-1
  196. CALL TYPFIL(CTYP,K)
  197. C---- NITLAC = nombre de types 'sauvegardables'
  198. NITLAC=-K
  199. IF (IPSAUV.NE.0) THEN
  200. ICOLAC=IPSAUV
  201. CALL CREPI0(ICOLAC)
  202. SEGACT ICOLAC*MOD
  203. IFORM = icolac.IFFORM
  204. ELSE
  205. CALL CREPIL(ICOLAC,NITLAC)
  206. SEGACT ICOLAC*MOD
  207. icolac.IFFORM = IFORM
  208. ENDIF
  209. C---- Cet appel cree un 1 segment ICOLAC(NITLAC) ainsi que NITLAC :
  210. C - segments ITLACC dont les adresses sont stockees dans KCOLA
  211. C (faisant partie de ICOLAC)
  212. C - segments ISGTR(KS) avec KS=0 dont les adresses sont stockees
  213. C dans ICOLA (faisant partie de ICOLAC)
  214. C Les MCOLA et KCOLAC sont initialises a 0. A la fin ICOLAC est desactive.
  215.  
  216. IF (iimpil.EQ.5) WRITE(IOIMP,801) NITLAC
  217. 801 FORMAT(' NOMBRE DE PILES CREEES : ',I5)
  218.  
  219. SEGACT ICOLAC
  220. ILISSE=ILISSP
  221. SEGACT ILISSE*MOD
  222. ILISSE=ILISSG
  223. SEGACT ILISSE*MOD
  224. C
  225. C on met la configuration courante dans la pile si pas deja
  226. C
  227. ITLACC=KCOLA(33)
  228. c* SEGACT ITLACC*MOD <- Fait dans AJOUN
  229. ICFCO= MCOORD
  230. ** write(6,*) 'configuration courante dans sauv',icfco
  231. CALL AJOUN(ITLACC,ICFCO,ILISSE,iun)
  232.  
  233. C --- REMPLISSAGE DES PILES A PARTIR DES DEMANDES
  234.  
  235. IF (LOBJ.EQ.0) THEN
  236. C ------ PAS D OBJETS NOMMES : ON SAUVE TOUT
  237. CALL LISTYP(MLCHA8)
  238. CALL FILLPO(ICOLAC,MLCHA8)
  239. SEGSUP,MLCHA8
  240. ELSE
  241. CALL FILLLU(ISORTA,ICOLAC)
  242. ENDIF
  243. SEGSUP,ISORTA
  244. CMB-- Maintenant ICOLAC contient la liste des objets a sauvegarder
  245.  
  246. C --- FORMULATION HHO : Initialisations/Verifications --------
  247. CALL HHOPIL(1,IONIVE,iun)
  248.  
  249. C---- PETITE MAGOUILLE POUR LES OBJETS RIGIDITES ET LES SUPER ELEMENTS
  250. CALL SORTRI(ICOLAC)
  251. C --- IER PASSAGE POUR COMPLETER LES PILES SANS CHANGER LES POINTEURS
  252. CALL FILLPI(ICOLAC)
  253.  
  254. IF (iimpil.EQ.5) WRITE(IOIMP,802)
  255. 802 FORMAT(' PREMIER REMPLISSAGE DES PILES EFFECTUE')
  256.  
  257. C --- ON CHERCHE A COMPLETER LES CHAPEAUX DE CERTAINS OBJETS
  258. CALL HATRIG(ICOLAC)
  259. CALL HATSTR(ICOLAC)
  260.  
  261. * IL FAUT REAPPELLER SORTRI POUR LA PETITE MAGOUILLE
  262. * POUR LES EVENTUELLES RIGIDITES AJOUTEES PAR HATRIG
  263. C----PETITE MAGOUILLE POUR LES OBJETS RIGIDITES ET LES SUPER ELEMENTS
  264. CALL SORTRI(ICOLAC)
  265.  
  266. C --- RECHERCHE DU NUMERO MAX DE POINT A PARTIR DE L ETAT DES PILES 1 ET 32
  267. CALL MAXP1 (ICOLAC,IMAX)
  268. CALL MAXP32(ICOLAC,I32MAX)
  269. IMAX = MAX(IMAX,I32MAX)
  270. C --- ON COMPLETE EVENTUELLEMENT LA PILE 1 A PARTIR DE TOUS LES OBJETS
  271. C MAILLAGE DONT LES NOEUDS SONT INFERIEURS A IMAX
  272. CALL FILLP1(ICOLAC,IMAX)
  273. C --- 2EME PASSAGE SANS CHANGER LES POINTEURS SUITE A AJOUT MELEME NOUVEAUX
  274. CALL FILLPI(ICOLAC)
  275.  
  276. IF (iimpil.EQ.5) WRITE (IOIMP,803)
  277. 803 FORMAT(' SECOND REMPLISSAGE DES PILES EFFECTUE')
  278.  
  279. IF (IERR.NE.0) THEN
  280. CALL ERREUR(558)
  281. GOTO 5000
  282. ENDIF
  283. C -------------------------------------------------------
  284. C --- RECHERCHE DES NOMS
  285. CALL FILLNO (ICOLAC)
  286.  
  287. C --- IMPRESSIONS INTERMEDIAIRES DES PILES
  288. IVOULU=0
  289. IF (iimpil.EQ.5) CALL IMPPIL(ICOLAC,IVOULU)
  290.  
  291. C --- 3EME PASSAGE CHANGEMENT DES POINTEURS
  292. CALL SAVEPI (ICOLAC)
  293. IF (iimpil.EQ.5) WRITE(IOIMP,804)
  294. 804 FORMAT(' CHANGEMENT DES POINTEURS EFFECTUE')
  295. C
  296. C--------------------------------------------------------
  297. C **** ECRITURE SUR LE FICHIER DE SORTIE
  298. C --- ECRITURE DES PILES
  299. C REWIND IOSAU
  300. CALL WRPIL(ICOLAC,IMAX,IFORM,LABEL,ISILE)
  301.  
  302. IF (iimpil.EQ.5) WRITE(IOIMP,805)
  303. 805 FORMAT(' SAUVEGARDE EFFECTUEE')
  304.  
  305. C --- RESTAURATION DES POINTEURS
  306. CALL RESTPI(ICOLAC)
  307.  
  308. IF (iimpil.EQ.5) WRITE(IOIMP,806)
  309. 806 FORMAT(' RESTAURATION DES POINTEURS EFFECTUEE')
  310.  
  311. C-------------------------------------------------------------
  312. C --- SUPPRESSION DES PILES (IVOULU=0)
  313. IVOULU=0
  314. CALL SUPPIL(ICOLAC,IVOULU)
  315.  
  316. C --- FORMULATION HHO : MENAGE -------------------------------
  317. CALL HHOPIL(9,iun,iun)
  318.  
  319. IF (iimpil.EQ.5) WRITE (IOIMP,807)
  320. 807 FORMAT(' SUPPRESSION DES PILES EFFECTUEE ')
  321.  
  322. CALL ERREUR(-276)
  323. C MODI N.BLAY LE 17/09/91 POUR VIDER LES BUFFERS.-------------
  324. C REWIND IOSAU
  325. if (iform.eq.2) then
  326. if (ixdrw.ne.0) ios=IXDRCLOSE( ixdrw,.TRUE. )
  327. * write (ioimp,*) ' sauv reouverture de ',NOMSAU
  328. ios = initxdr(NOMSAU(1:long(NOMSAU)),'a',.TRUE.)
  329. endif
  330.  
  331. 5000 CONTINUE
  332. C * attention aux assistants ....
  333. if (NBESC.NE.0) then
  334. C * il faut liberer le segment de dialogue
  335. mestra=imestr
  336. * repasser en mode normal
  337. call ooofrc(0)
  338. SEGDES MESTRA
  339. * lodesl=.false.
  340. call setass(0)
  341. end if
  342.  
  343. IONIVE = IONIVS
  344.  
  345. RETURN
  346. END
  347.  
  348.  
  349.  
  350.  

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