5 * Revision 1.2 1996/04/24 17:26:45 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:23 mclareni
13 #include "zebra/pilot.h"
14 SUBROUTINE RZDELK(KEYU,ICYCLE,CHOPT)
16 ************************************************************************
18 * To delete one or all keys in the CWD
20 * KEYU Key array of dimension NWKEY (see RZMDIR)
21 * ICYCLE Cycle number of the key to be deleted
22 * ICYCLE > highest cycle number means delete the highest cycle
23 * ICYCLE = 0 means delete the lowest cycle
24 * ICYCLE = -1, -2,... means delete the highest cycle -1, -2,...
25 * CHOPT Character variable specifying the options selected.
27 * Delete the explicitly specified cycle ICYCLE only.
28 * If cycle ICYCLE does not exist, no action is taken.
29 * 'C' Delete ALL cycles corresponding to key (ICYCLE not used)
30 * 'S' Delete all cycles smaller then cycle ICYCLE.
31 * 'K' Delete ALL cycles for all Keys (KEYU,ICYCLE not used )
35 * Author : R.Brun DD/US/PD
37 * Last mod: 16.04.93 JDS. Return codes, deletion of objects at beginning
39 * : 04.03.94 S.Banerjee (Change in cycle structure)
40 * : 23.03.95 J.Shiers - key # in cycles block is KEY(1)
42 * IQUEST(1) = 1: specified object not found
43 * IQUEST(1) = 2: directory is empty
44 * IQUEST(1) = 3: no RZ control bank (LQRS=0)
45 * IQUEST(1) = 4: no write permission
46 * IQUEST(1) =11: key/cycle discrepency
48 ************************************************************************
49 #include "zebra/zunit.inc"
50 #include "zebra/rzcl.inc"
51 #include "zebra/rzclun.inc"
52 #include "zebra/rzk.inc"
53 #include "zebra/rzckey.inc"
54 #include "zebra/rzcycle.inc"
58 EQUIVALENCE (IOPTC,IOPTV(1)), (IOPTS,IOPTV(2))
59 EQUIVALENCE (IOPTK,IOPTV(3))
61 *-----------------------------------------------------------------------
63 #include "zebra/q_jbyt.inc"
67 CALL UOPTC(CHOPT,'CSK',IOPTV)
69 * Check if write permission
77 CALL RZMODS('RZDELK',IFLAG)
88 NKEYS =IQ(KQSP+LCDIR+KNKEYS)
89 NWKEY =IQ(KQSP+LCDIR+KNWKEY)
90 IF(NKEYS.EQ.0)GOTO 220
92 * Look for cycles marked for deletion by a previous call
93 * Set IQUEST(2) to warn application to rebuild bit map
95 DO 10 LKC=LC,LE-KLCYCL+1,KLCYCL
96 IF(IQ(KQSP+LCDIR+LKC).EQ.-1)GOTO 20
104 NPURG=IQ(KQSP+LPURG+1)
106 NPUOLD=NPUOLD+IQ(KQSP+LPURG+2*I+1)-IQ(KQSP+LPURG+2*I)+1
110 * Option K. delete all keys
113 DO 50 LKC=LC,LE-KLCYCL+1,KLCYCL
114 IF (KVSCYC.EQ.0) THEN
115 IR1 = JBYT(IQ(KQSP+LCDIR+LKC+KFRCYC),17,16)
116 IP1 = JBYT(IQ(KQSP+LCDIR+LKC+KORCYC), 1,16)
117 NW = JBYT(IQ(KQSP+LCDIR+LKC+KNWCYC), 1,20)
118 IR2 = JBYT(IQ(KQSP+LCDIR+LKC+KSRCYC),17,16)
120 IR1 = IQ(KQSP+LCDIR+LKC+KFRCYC)
121 IP1 = JBYT(IQ(KQSP+LCDIR+LKC+KORCYC), 1,20)
122 NW = IQ(KQSP+LCDIR+LKC+KNWCYC)
123 IR2 = IQ(KQSP+LCDIR+LKC+KSRCYC)
129 NR=(NW-NLEFT-1)/LREC+1
132 CALL RZPURF(NR+1,IR1)
135 IF(NR.NE.0)CALL RZPURF(NR,IR2)
140 NRD=IQ(KQSP+LCDIR+LD)
141 IQ(KQSP+LCDIR+KRUSED) =NRD
142 IQ(KQSP+LCDIR+KWUSED) =NRD*LREC
143 IQ(KQSP+LCDIR+KMEGA) =0
144 IQ(KQSP+LCDIR+KIP1) =1
145 IQ(KQSP+LCDIR+KNFREE) =LC-LF
146 IQ(KQSP+LCDIR+KLF) =LF
147 IQ(KQSP+LCDIR+KLC) =LC
148 IQ(KQSP+LCDIR+KNKEYS) =0
152 * Search KEY and CYCLE
156 IKBIT1=3*I-30*IKDES-2
157 IF(JBYT(IQ(KQSP+LCDIR+KKDES+IKDES),IKBIT1,3).LT.3)THEN
160 CALL ZHTOI(KEYU(I),KEY(I),1)
165 LKC=LK+(NWKEY+1)*(I-1)
166 IF(IQ(KQSP+LCDIR+LKC+K).NE.KEY(K))GOTO 80
168 LCYC =IQ(KQSP+LCDIR+LKC)
171 IF (KVSCYC.NE.0) THEN
172 * IF (IQ(KQSP+LCDIR+LCYC+KKYCYC).NE.I) GO TO 250
173 IF (IQ(KQSP+LCDIR+LCYC+KKYCYC).NE.
174 + IQ(KQSP+LCDIR+LKC+1)) GO TO 250
176 ICTOP =JBYT(IQ(KQSP+LCDIR+LCYC+KCNCYC),21,12)
178 IF(KCYCLE.GT.ICTOP)KCYCLE=ICTOP
183 * Do we keep this cycle ?
185 90 IF (KVSCYC.EQ.0) THEN
186 LCOLD = JBYT(IQ(KQSP+LCDIR+LCYC+KPPCYC), 1,16)
188 LCOLD = IQ(KQSP+LCDIR+LCYC+KPPCYC)
191 ICY =JBYT(IQ(KQSP+LCDIR+LCYC+KCNCYC),21,12)
192 IF(KCYCLE.EQ.ICY.AND.IOPTS.EQ.0)IDEL=1
196 IF(ICY.LT.ICYCLE)IDEL=1
198 IF(ICYCLE.EQ.0.AND.LCOLD.EQ.0)IDEL=1
200 IF(ICY.EQ.ICTOP-ICYCLE)IDEL=1
203 * Mark all records that can be purged in first pass
207 IQ(KQSP+LCDIR+LKK)=LCOLD
209 IF(LCOLD.EQ.0.AND.IOPTC.NE.0)THEN
211 IQ(KQSP+LCDIR+LCPRE)=-1
213 CALL SBYT(LCOLD,IQ(KQSP+LCDIR+LCPRE),1,16)
216 IF (KVSCYC.EQ.0) THEN
217 IR1 = JBYT(IQ(KQSP+LCDIR+LCYC+KFRCYC),17,16)
218 IP1 = JBYT(IQ(KQSP+LCDIR+LCYC+KORCYC), 1,16)
219 NW = JBYT(IQ(KQSP+LCDIR+LCYC+KNWCYC), 1,20)
220 IR2 = JBYT(IQ(KQSP+LCDIR+LCYC+KSRCYC),17,16)
222 IR1 = IQ(KQSP+LCDIR+LCYC+KFRCYC)
223 IP1 = JBYT(IQ(KQSP+LCDIR+LCYC+KORCYC), 1,20)
224 NW = IQ(KQSP+LCDIR+LCYC+KNWCYC)
225 IR2 = IQ(KQSP+LCDIR+LCYC+KSRCYC)
231 IF(NW1.GE.NLEFT)NW1=NLEFT
234 IF(NR.GT.1) CALL RZPURF(NR-1,IR2)
236 NWL=NW-NW1-(NR-1)*LREC
246 IRLOUT=IQ(KQSP+LCDIR+KRLOUT)
247 IF(IRL.EQ.IRLOUT.AND.NWL+1.EQ.IQ(KQSP+LCDIR+KIP1))THEN
251 IQ(KQSP+LCDIR+LCYC)=-1
252 IQ(KQSP+LCDIR+LCYC+1)=IR1
253 IQ(KQSP+LCDIR+LCYC+2)=IRL
254 IQ(KQSP+LCDIR+LCYC+3)=NWL
255 IF(IR1.NE.0)CALL SBYT(NW1,IQ(KQSP+LCDIR+LCYC+3),21,12)
260 IF(LCOLD.NE.0.AND.LCOLD.NE.LCYC)THEN
261 IF(KCYCLE.LT.ICY.OR.IOPTS.NE.0.OR.IOPTK.NE.0.OR.IOPTC.NE.0)THEN
267 * Now loop on all purged cycles to find complete records
270 DO 130 LKC=LC,LE-KLCYCL+1,KLCYCL
271 IF(IQ(KQSP+LCDIR+LKC).NE.-1)GOTO 130
272 IR1=IQ(KQSP+LCDIR+LKC+1)
273 IRL=IQ(KQSP+LCDIR+LKC+2)
275 DO 100 LKC1=LC,LE-KLCYCL+1,KLCYCL
276 IF(IQ(KQSP+LCDIR+LKC1).EQ.-1)GOTO 100
277 IF (KVSCYC.EQ.0) THEN
278 KR1 = JBYT(IQ(KQSP+LCDIR+LKC1+KFRCYC),17,16)
279 KP1 = JBYT(IQ(KQSP+LCDIR+LKC1+KORCYC), 1,16)
280 NW = JBYT(IQ(KQSP+LCDIR+LKC1+KNWCYC), 1,20)
281 KR2 = JBYT(IQ(KQSP+LCDIR+LKC1+KSRCYC),17,16)
283 KR1 = IQ(KQSP+LCDIR+LKC1+KFRCYC)
284 KP1 = JBYT(IQ(KQSP+LCDIR+LKC1+KORCYC), 1,20)
285 NW = IQ(KQSP+LCDIR+LKC1+KNWCYC)
286 KR2 = IQ(KQSP+LCDIR+LKC1+KSRCYC)
291 IF(NW1.GE.NLEFT)NW1=NLEFT
296 IF(KR1.EQ.IR1.OR.KRL.EQ.IR1)GOTO 110
302 DO 120 LKC1=LC,LE-KLCYCL+1,KLCYCL
303 IF(IQ(KQSP+LCDIR+LKC1).EQ.-1)GOTO 120
304 IF (KVSCYC.EQ.0) THEN
305 KR1 = JBYT(IQ(KQSP+LCDIR+LKC1+KFRCYC),17,16)
306 KP1 = JBYT(IQ(KQSP+LCDIR+LKC1+KORCYC), 1,16)
307 NW = JBYT(IQ(KQSP+LCDIR+LKC1+KNWCYC), 1,20)
308 KR2 = JBYT(IQ(KQSP+LCDIR+LKC1+KSRCYC),17,16)
310 KR1 = IQ(KQSP+LCDIR+LKC1+KFRCYC)
311 KP1 = JBYT(IQ(KQSP+LCDIR+LKC1+KORCYC), 1,20)
312 NW = IQ(KQSP+LCDIR+LKC1+KNWCYC)
313 KR2 = IQ(KQSP+LCDIR+LKC1+KSRCYC)
318 IF(NW1.GE.NLEFT)NW1=NLEFT
323 IF(KR1.EQ.IRL.OR.KRL.EQ.IRL)GOTO 130
329 * Garbage collection on cycles area + relocation
332 140 IF(LKC3.LT.LC)GOTO 190
334 * Found a deleted object. Now look for previous undeleted object
336 IF(IQ(KQSP+LCDIR+LKC3).EQ.-1)THEN
348 150 IF(IQ(KQSP+LCDIR+LKC2).NE.-1)THEN
351 IF(LKC1.LT.LC)LKC1=LC
352 160 IF(IQ(KQSP+LCDIR+LKC1).EQ.-1)THEN
354 + (LKC1.EQ.LC.AND.LKC2.NE.LC))LKC1=LKC1+KLCYCL
364 * Update pointers in cycles block
366 DO 170 LKC=LC,LKC2-KLCYCL,KLCYCL
367 IF(IQ(KQSP+LCDIR+LKC).NE.-1)THEN
368 IF (KVSCYC.EQ.0) THEN
369 LCOLD = JBYT(IQ(KQSP+LCDIR+LKC+KPPCYC),1,16)
371 LCOLD = IQ(KQSP+LCDIR+LKC+KPPCYC)
373 IF(LCOLD.GE.LKC1.AND.LCOLD.LT.LKC2)THEN
375 IF (KVSCYC.EQ.0) THEN
376 CALL SBYT(LCOLD,IQ(KQSP+LCDIR+LKC+KPPCYC),1,16)
378 IQ(KQSP+LCDIR+LKC+KPPCYC) = LCOLD
384 * Update pointers from KEYS block to CYCLES block
387 LCYC=IQ(KQSP+LCDIR+LK+(NWKEY+1)*(IK-1))
388 IF(LCYC.GE.LKC1.AND.LCYC.LT.LKC2)THEN
389 IQ(KQSP+LCDIR+LK+(NWKEY+1)*(IK-1))=
390 + IQ(KQSP+LCDIR+LK+(NWKEY+1)*(IK-1))+NPUSH
394 * Squeeze out deleted cycles
396 CALL UCOPY2(IQ(KQSP+LCDIR+LKC1),IQ(KQSP+LCDIR+LKC1+NPUSH),
401 * Only deleted objects before this block?
403 IF(IQ(KQSP+LCDIR+LKC2).EQ.-1.AND.LKC2.EQ.LC) THEN
408 IF(LKC1.NE.LC)GOTO 150
415 * Only deleted objects before this block?
417 IF(IQ(KQSP+LCDIR+LKC2).EQ.-1.AND.LKC2.EQ.LC) THEN
422 IF(LKC2.GE.LC)GOTO 150
430 * Remove KEY from K area if only one cycle
433 IF(IQ(KQSP+LCDIR+LKK).EQ.0)THEN
434 IF(LKK+NWKEY+1.LT.LF)THEN
435 CALL UCOPY2(IQ(KQSP+LCDIR+LKK+NWKEY+1),
436 + IQ(KQSP+LCDIR+LKK),LF-LKK)
439 IQ(KQSP+LCDIR+KNFREE)=IQ(KQSP+LCDIR+KNFREE)+NWKEY+1
440 IQ(KQSP+LCDIR+KLF)=LF
441 IQ(KQSP+LCDIR+KNKEYS)=IQ(KQSP+LCDIR+KNKEYS)-1
442 IF(IQ(KQSP+LCDIR+KNKEYS).EQ.0)LC=LE+1
445 * Reset internal pointers
449 NPURG=IQ(KQSP+LPURG+1)
451 NPUNEW=NPUNEW+IQ(KQSP+LPURG+2*I+1)-IQ(KQSP+LPURG+2*I)+1
455 IQUEST( 9)=IQ(KQSP+LCDIR+KQUOTA)-IQ(KQSP+LCDIR+KRUSED)+NPU
456 IQUEST(11)=(LC-IQ(KQSP+LCDIR+KLC))/KLCYCL
460 IQ(KQSP+LCDIR+KRUSED)=IQ(KQSP+LCDIR+KRUSED)-NPU
463 IQ(KQSP+LCDIR+KMEGA)=IQ(KQSP+LCDIR+KMEGA)-NMEGA
464 NWP=NWP-1000000*NMEGA
465 IQ(KQSP+LCDIR+KWUSED)=IQ(KQSP+LCDIR+KWUSED)-NWP
466 IQ(KQSP+LCDIR+KNFREE)=IQ(KQSP+LCDIR+KNFREE)+LC-IQ(KQSP+LCDIR+KLC)
467 IQ(KQSP+LCDIR+KLC)=LC
472 210 IF(JBYT(IQ(KQSP+LTOP),15,3)-3.GE.-2) WRITE(IQLOG,10000)
473 10000 FORMAT(' RZDELK. Key not found')
478 220 IF(JBYT(IQ(KQSP+LTOP),15,3)-3.GE.-2) WRITE(IQLOG,10100)
479 10100 FORMAT(' RZDELK. directory is empty')
490 250 IF(JBYT(IQ(KQSP+LTOP),15,3)-3.GE.-2) WRITE(IQLOG,10100)
491 10200 FORMAT(' RZDELK. mismatch in key/cycle pointing')