5 * Revision 1.2 1996/04/24 17:27:16 mclareni
6 * Extend the include file cleanup to dzebra, rz and tq, and also add
7 * dependencies in some cases.
9 * Revision 1.1.1.1 1996/03/06 10:47:27 mclareni
13 #include "zebra/pilot.h"
14 SUBROUTINE RZVER1(CHL,CHOPT,IRET)
15 ************************************************************************
17 * Slave routine to RZVERI
20 * Author : J.Shiers CN/AS/DL
22 * Last mod: 18.04.94 - set ISTAT2
23 * : 02.02.95 - cater for new RZ file format
25 ************************************************************************
27 #include "zebra/zunit.inc"
28 #include "zebra/rzcl.inc"
29 #include "zebra/rzk.inc"
30 #include "zebra/rzclun.inc"
31 #include "zebra/rzbmap.inc"
32 #include "zebra/rzover.inc"
33 #include "zebra/rzcycle.inc"
34 CHARACTER*(*) CHL,CHOPT
37 *...............................................................
39 #include "zebra/q_jbit.inc"
40 #include "zebra/q_jbyt.inc"
43 LOGLV = JBYT(IQ(KQSP+LTOP),15,3)-3
44 IF(LOGLV.GE.1) WRITE(IQPRNT,*)
45 + 'Processing directory: ',CHL(1:NCHL)
49 NKEYS = IQ(KQSP+LCDIR+KNKEYS)
50 NWKEY = IQ(KQSP+LCDIR+KNWKEY)
51 LB = IQ(KQSP+LTOP+KLB)
52 LK = IQ(KQSP+LCDIR+KLK)
53 LDS = IQ(KQSP+LCDIR+KLD)
57 IOPTB = INDEX(CHOPT(1:NCHO),'B')
58 IOPTC = INDEX(CHOPT(1:NCHO),'C')
59 IOPTO = INDEX(CHOPT(1:NCHO),'O')
60 IOPTP = INDEX(CHOPT(1:NCHO),'P')
62 * Process all records of this directory
64 NRD = IQ(KQSP+LCDIR+LDS)
68 IREC = IQ(KQSP+LCDIR+LDS+I)
69 IWORD = (IREC-1)/32 + 1
70 IBIT = IREC-32*(IWORD-1)
72 * Print directory name and record number if rec. no in list
75 IF(IOPTP.NE.0.AND.NBAD.GT.0) THEN
76 IF(IUFIND(IREC,IBAD,1,NBAD).LE.NBAD) WRITE(IQPRNT,*)
77 + 'Directory: ',CHL(1:LENOCC(CHL)),' uses record ',IREC
80 * Is this record marked as free?
83 + JBIT(IQ(KQSP+LTOP+LB+2+IWORD),IBIT).EQ.0) THEN
84 WRITE(IQPRNT,*) 'RZVER1. warning - record ',IREC,
85 + ' is in use but is marked as free in bit map'
89 * Set bit to mark record as used
91 IF(IOPTB.NE.0) CALL SBIT1(IQ(KQSP+LTOP+LB+2+IWORD),IBIT)
95 * Check for overwriting at the directory level
97 IF(IOPTO.NE.0) CALL RZVER2(IW1,IW2,ISTAT)
103 PRINT 10000, DIRNAM(1:NCHL),(IQ(KQSP+LCDIR+LDS+I),I=1,NRD)
105 * Store record numbers for second pass
107 IF(NBAD+NRD.LE.MAXBAD) THEN
109 IBAD(NBAD+I) = IQ(KQSP+LCDIR+LDS+I)
116 * Check records used for objects in this directory
121 LKC = LK+(NWKEY+1)*(I-1)
122 LCYC = IQ(KQSP+LCDIR+LKC)
127 LCOLD = JBYT(IQ(KQSP+LCDIR+LCYC), 1,16)
128 IR1 = JBYT(IQ(KQSP+LCDIR+LCYC+2),17,16)
129 IR2 = JBYT(IQ(KQSP+LCDIR+LCYC ),17,16)
130 IP1 = JBYT(IQ(KQSP+LCDIR+LCYC+2), 1,16)
131 NW = JBYT(IQ(KQSP+LCDIR+LCYC+3), 1,20)
133 LCOLD = IQ(KQSP+LCDIR+LCYC)
134 IR1 = IQ(KQSP+LCDIR+LCYC+2)
135 IR2 = IQ(KQSP+LCDIR+LCYC+5)
136 IP1 = JBYT(IQ(KQSP+LCDIR+LCYC+3),1,20)
137 NW = IQ(KQSP+LCDIR+LCYC+4)
142 IW2=(IR1-1)*LREC+IP1+MIN(NLEFT,NW)-1
144 * Check for overwriting at the object level
147 CALL RZVER2(IW1,IW2,ISTAT)
148 IF(ISTAT.NE.0.AND.NBAD.LT.MAXBAD) THEN
154 IWORD = (IR1-1)/32 + 1
155 IBIT = IR1-32*(IWORD-1)
157 * Is this record marked as free?
159 IF(IOPTC.NE.0.AND.JBIT(IQ(KQSP+LTOP+LB+2+IWORD),IBIT)
161 WRITE(IQPRNT,*) 'RZVER1. warning - record ',IR1,' is in '
162 + //'use but is marked as free in bit map'
166 * Set bit to mark record as used
168 IF(IOPTB.NE.0) CALL SBIT1(IQ(KQSP+LTOP+LB+2+IWORD),IBIT)
170 * Is this record in the list of overwritten records?
172 IF(IOPTP.NE.0.AND.NBAD.GT.0) THEN
173 IF(IUFIND(IR1,IBAD,1,NBAD).LE.NBAD) THEN
175 WRITE(IQPRNT,*) 'Directory: ',CHL(1:NCHL),
176 + ' has objects in record ',IR1
177 CALL RZPRNK(CHL(1:NCHL),I,LCYC,' ')
181 * Any more records for this object?
187 IF(IOPTP.NE.0.AND.NBAD.GT.0) THEN
188 IF(IUFIND(J,IBAD,1,NBAD).LE.NBAD) THEN
190 WRITE(IQPRNT,*) 'Directory: ',
191 + CHL(1:NCHL),' has objects in record ',IR1
192 CALL RZPRNK(CHL(1:NCHL),I,LCYC,' ')
197 IBIT = J-32*(IWORD-1)
199 * Is this record marked as free?
201 IF(IOPTC.NE.0.AND.JBIT(IQ(KQSP+LTOP+LB+2+IWORD),
203 WRITE(IQPRNT,*) 'RZVER1. warning - record ',J,
204 + ' is in use but is marked as free in bit map'
208 * Set bit to mark record as used
210 IF(IOPTB.NE.0) CALL SBIT1(IQ(KQSP+LTOP+LB+2+IWORD),
216 IF(IOPTO.NE.0) CALL RZVER2(IW1,IW2,ISTAT2)
219 IF(ISTAT2.NE.0.AND.NW.GT.NLEFT)THEN
221 IF(NBAD.LT.MAXBAD) THEN
226 ICYC = JBYT(IQ(KQSP+LCDIR+LCYC+3),21,12)
231 * Get and print key of corrupted object
233 PRINT 10100, DIRNAM(1:NCHL),IR1,((NW-1)/LREC)+1
234 CALL RZPRNK(DIRNAM(1:NCHL),I,LCYC,' ')
236 IF(LCOLD.NE.0.AND.LCOLD.NE.LCYC)THEN
245 10000 FORMAT(' **** WARNING: Directory ',A,' possibly overwritten ****',
246 + /,' records numbers: ',/10(1X,I6))
247 10100 FORMAT(' **** WARNING: Object in directory ',A,' corrupted ****',
248 + /,' start record: ',I6,' number of records: ',I6)