5 * Revision 1.2 1996/04/24 17:26:43 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 RZCOP1(LUNOLD,LROLD,KEY,IOLD)
16 ************************************************************************
18 * Copy one (KEY,CYCLE) from LFROM to the CWD
20 * LUNOLD Logical unit number of the file from which the copy is made
21 * LROLD Record size of LUNOLD
22 * KEY Identification (array) of the key to created in the CWD
23 * IOLD Array of 4 words describing the cycle which is copied
27 * Author : R.Brun DD/US/PD
29 * Last mod: 01.09.92 Dave Morrison (MIT) handle append mode bit
30 * : 04.03.94 S.Banerjee (Change in cycle structure)
31 * : 23.03.95 J.Shiers - key # in cycles block is KEY(1)
33 ************************************************************************
34 #include "zebra/rzcl.inc"
35 #include "zebra/rzclun.inc"
36 #include "zebra/rzk.inc"
37 #include "zebra/rzcycle.inc"
38 DIMENSION KEY(*),IOLD(4)
40 *-----------------------------------------------------------------------
42 #include "zebra/q_jbit.inc"
43 #include "zebra/q_jbyt.inc"
46 * Get last record written in that directory
50 IR1OLD = JBYT(IOLD(KFRCYC),17,16)
51 IP1OLD = JBYT(IOLD(KORCYC), 1,16)
52 IR2OLD = JBYT(IOLD(KSRCYC),17,16)
53 NDATA = JBYT(IOLD(KNWCYC), 1,20)
54 IFORM = JBYT(IOLD(KFLCYC), 1, 3)
57 IP1OLD = JBYT(IOLD(KORCYC), 1,20)
60 IFORM = JBYT(IOLD(KFLCYC), 1, 3)
62 LROUT = LQ(KQSP+LTOP-6)
63 IROUT = IQ(KQSP+LTOP+KIROUT)
64 IRLOUT = IQ(KQSP+LCDIR+KRLOUT)
65 IP1 = IQ(KQSP+LCDIR+KIP1)
67 CALL MZBOOK(JQPDVS,LROUT,LTOP,-6,'RZOU',0,0,LREC+1,2,-1)
72 IF(IROUT.NE.IRLOUT.AND.IRLOUT.NE.0)THEN
73 CALL RZIODO(LUN,LREC,IRLOUT,IQ(KQSP+LROUT+1),1)
74 IF(IQUEST(1).NE.0)GO TO 999
75 #if defined(CERNLIB_QMVAX)
76 IF(IRELAT.NE.0)UNLOCK(UNIT=LUN)
79 IQ(KQSP+LTOP+KIROUT)=IROUT
80 IP1=IQ(KQSP+LCDIR+KIP1)
81 IF(IQ(KQSP+LTOP+KIRIN).EQ.IROUT)IQ(KQSP+LTOP+KIRIN) = 0
84 * Is directory big enough to accomodate new cycle ?
86 IF(IQ(KQSP+LCDIR+KNFREE).LT.IQ(KQSP+LCDIR+KNWKEY)+4*KLCYCL+1)THEN
87 CALL RZEXPD('RZCOPY',10*(IQ(KQSP+LCDIR+KNWKEY)+KLCYCL+1))
88 IF(IQUEST(1).NE.0) GO TO 999
90 LK = IQ(KQSP+LCDIR+KLK)
91 LF = IQ(KQSP+LCDIR+KLF)
92 LC = IQ(KQSP+LCDIR+KLC)
93 NWFREE=IQ(KQSP+LCDIR+KNFREE)
95 * Compute how many records
96 * are necessary to write data structure.
99 IF(NDATA.LE.NLEFT)THEN
104 NR=(NDATA-NLEFT-1)/LREC + 1
106 IF(IRLOUT.EQ.0)NR=NR+1
108 CALL RZALLO('RZCOPY',NR,IALLOC)
109 IF(IALLOC.EQ.0) GO TO 999
110 IF(IRLOUT.EQ.0)IRLOUT=IALLOC
113 * Search if KEY is already entered
115 NKEYS = IQ(KQSP+LCDIR+KNKEYS)
116 NWKEY = IQ(KQSP+LCDIR+KNWKEY)
122 LKC=LK+(NWKEY+1)*(I-1)
124 IF(IQ(KQSP+LCDIR+LKC+K).NE.KEY(K))GO TO 20
126 LCOLD = IQ(KQSP+LCDIR+LKC)
127 IF (KVSCYC.NE.0) THEN
128 * IF (IQ(KQSP+LCDIR+LCOLD+KKYCYC).NE.I) THEN
129 IF (IQ(KQSP+LCDIR+LCOLD+KKYCYC).NE.
130 + IQ(KQSP+LCDIR+LKC+1)) THEN
135 ICOLD = JBYT(IQ(KQSP+LCDIR+LCOLD+KCNCYC),21,12)
138 IKYV = IQ(KQSP+LCDIR+LKC+1)
143 * New KEY, append to the list
145 NWFREE=NWFREE-NWKEY-1
146 IQ(KQSP+LCDIR+KNKEYS)=IQ(KQSP+LCDIR+KNKEYS)+1
151 IQ(KQSP+LCDIR+LKC+I)=KEY(I)
154 * IKYV = IQ(KQSP+LCDIR+KNKEYS)
155 IKYV = IQ(KQSP+LCDIR+LKC+1)
159 50 LKCSV = IQ(KQSP+LCDIR+LKC)
161 NWFREE= NWFREE-KLCYCL
162 IQ(KQSP+LCDIR+LKC) = LC
163 IQ(KQSP+LCDIR+LC+KPPCYC) = LCOLD
164 IQ(KQSP+LCDIR+LC+KFLCYC)=0
165 CALL RZDATE (IQ(KQSP+LCDIR+LC+KFLCYC),IDATE,ITIME,2)
167 c DPM: Added this to handle append mode.
169 IBIT4 = JBIT(IOLD(KFLCYC),4)
170 IF(IBIT4.EQ.1)CALL SBIT1(IQ(KQSP+LCDIR+LC+KFLCYC),4)
172 c DPM: End of changes.
174 CALL SBYT (IFORM,IQ(KQSP+LCDIR+LC+KFLCYC),1,3)
175 IQ(KQSP+LCDIR+LC+KORCYC) = IP1
176 IQ(KQSP+LCDIR+LC+KNWCYC) = NDATA
177 CALL SBYT(ICYCLE,IQ(KQSP+LCDIR+LC+KCNCYC),21,12)
178 IF (KVSCYC.EQ.0) THEN
179 IF(N1.LT.NDATA)CALL SBYT(IALLOC,IQ(KQSP+LCDIR+LC+KSRCYC),17,16)
180 CALL SBYT(IRLOUT,IQ(KQSP+LCDIR+LC+KFRCYC),17,16)
182 IF (N1.LT.NDATA) THEN
183 IQ(KQSP+LCDIR+LC+KSRCYC) = IALLOC
185 IQ(KQSP+LCDIR+LC+KSRCYC) = 0
187 IQ(KQSP+LCDIR+LC+KFRCYC) = IRLOUT
188 IQ(KQSP+LCDIR+LC+KKYCYC) = IKYV
197 * Start filling current block
200 CALL MZBOOK(JQPDVS,LRIN,LTOP,-7,'RZIN',0,0,LROLD+1,2,-1)
201 IQ(KQSP+LRIN-5)=IQ(KQSP+LTOP-5)
204 IF(NOLD.LT.LROLD)THEN
205 CALL MZPUSH(JQPDVS,LRIN,0,LROLD-NOLD,'I')
208 CALL RZIODO(LUNOLD,LROLD,IR1OLD,IQ(KQSP+LRIN+1),1)
209 IF(IQUEST(1).NE.0) GO TO 900
212 55 IF(NWC.GT.LROLD-IP1OLD+1)THEN
214 CALL UCOPY(IQ(KQSP+LRIN+IP1OLD),IQ(KQSP+LROUT+IP1),NWC)
218 CALL RZIODO(LUNOLD,LROLD,IRN,IQ(KQSP+LRIN+1),1)
219 IF(IQUEST(1).NE.0) GO TO 900
224 CALL UCOPY(IQ(KQSP+LRIN+IP1OLD),IQ(KQSP+LROUT+IP1),NWC)
233 CALL RZIODO(LUN,LREC,IRLOUT,IQ(KQSP+LROUT+1),2)
234 IF(IQUEST(1).NE.0) GO TO 900
235 IF(IP1.GT.NDATA)IRLOUT=0
244 IF(NW.GT.LREC)NW=LREC
246 57 IF(NWC.GT.LROLD-IP1OLD+1)THEN
248 CALL UCOPY(IQ(KQSP+LRIN+IP1OLD),IQ(KQSP+LROUT+IP1),NWC)
252 CALL RZIODO(LUNOLD,LROLD,IRN,IQ(KQSP+LRIN+1),1)
253 IF(IQUEST(1).NE.0) GO TO 900
258 CALL UCOPY(IQ(KQSP+LRIN+IP1OLD),IQ(KQSP+LROUT+IP1),NWC)
262 CALL RZIODO(LUN,LREC,IROUT,IQ(KQSP+LROUT+1),2)
263 IF(IQUEST(1).NE.0) GO TO 900
273 * Update internal pointers in the directory
275 IQ(KQSP+LTOP+KIROUT)=IROUT
276 IQUEST(9)=IQ(KQSP+LCDIR+KQUOTA)-IQ(KQSP+LCDIR+KRUSED)
277 IQ(KQSP+LCDIR+KRUSED)=IQ(KQSP+LCDIR+KRUSED)+NR
278 NWUSED=IQ(KQSP+LCDIR+KWUSED)+NDATA
279 IF(NWUSED.GT.1000000)THEN
280 IQ(KQSP+LCDIR+KMEGA)=IQ(KQSP+LCDIR+KMEGA)+1
281 IQ(KQSP+LCDIR+KWUSED)=NWUSED-1000000
283 IQ(KQSP+LCDIR+KWUSED)=NWUSED
285 IQ(KQSP+LCDIR+KRLOUT)=IRLOUT
286 IQ(KQSP+LCDIR+KIP1)=IP1
287 IQ(KQSP+LCDIR+KNFREE)=NWFREE
288 IQ(KQSP+LCDIR+KLF)=LF
289 IQ(KQSP+LCDIR+KLC)=LC
294 CALL RZUSED(NR,IALLOC)
297 * Reset internal pointers in case of I/O problem
299 900 IF(ICYCLE.EQ.1)THEN
300 IQ(KQSP+LCDIR+KNKEYS)=IQ(KQSP+LCDIR+KNKEYS)-1
302 IQ(KQSP+LCDIR+LKC)=LKCSV