5 * Revision 1.2 1996/04/24 17:26:44 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 RZCOPY(CHPATH,KEYU,ICYCLE,KEYUN,CHOPT)
16 ************************************************************************
18 * Routine to copy an object from CHPATH or the whole tree to the CWD
20 * CHPATH The pathname of the directory tree which has to be copied to
22 * KEYU KEY of the object to be copied from CHPATH
23 * ICYCLE Cycle number of the key to be copied
24 * KEYUN New value of the key in CWD (may be the same as KEYU)
25 * CHOPT Character string to specify various options
26 * default ' ' copy the object with (KEYU,ICYCLE) from CHPATH to the CWD
27 * If KEYUN already exists, a new cycle is created
28 * 'C' copy all cycles for the specified key
29 * 'K' copy all keys (If 'C' option is given, copy all cycles)
30 * 'T' copy the complete tree CHPATH
31 * When the option 'T' is given, by default only the highest
32 * cycle of each key is copied
33 * To copy all cycles use 'TC' option
37 * Author : R.Brun DD/US/PD
39 * Last mod: 14.05.92 Add CHOPT on call to RZFDIR
40 * : 04.03.94 S.Banerjee (Change in cycle structure)
41 * : 23.03.95 J.Shiers - key # in cycles block is KEY(1)
43 ************************************************************************
44 #include "zebra/zunit.inc"
45 #include "zebra/rzcl.inc"
46 #include "zebra/rzk.inc"
47 #include "zebra/rzckey.inc"
48 #include "zebra/rzdir.inc"
49 #include "zebra/rzch.inc"
50 #include "zebra/rzcycle.inc"
51 #if defined(CERNLIB_QMVAX)
52 #include "zebra/rzclun.inc"
54 CHARACTER*(*) CHPATH,CHOPT
55 DIMENSION KEYU(*),KEYUN(*)
56 DIMENSION IOPTV(3),ISD(NLPATM),NSD(NLPATM),IHDIR(4)
57 CHARACTER*16 CHFPAT(NLPATM)
58 EQUIVALENCE (IOPTC,IOPTV(1)),(IOPTK,IOPTV(2))
62 *-----------------------------------------------------------------------
64 #if defined(CERNLIB_QMVAX)
65 #include "zebra/q_jbit.inc"
67 #include "zebra/q_jbyt.inc"
70 LOGLV=JBYT(IQ(KQSP+LTOP),15,3)-3
72 * Save existing material (if any)
76 CALL UOPTC(CHOPT,'CKT',IOPTV)
78 * Check if WRITE permission on file and directory
80 IF(LQRS.EQ.0)GO TO 999
82 CALL RZMODS('RZCOPY',IFLAG)
83 IF(IFLAG.NE.0)GO TO 999
87 CALL RZCDIR(CHWOLD,'R')
89 * Load directory CHPATH
96 CALL RZFDIR('RZCOPY',LT,LFROM,' ')
102 NSD(NLPAT1)=IQ(KQSP+LFROM+KNSD)
103 CALL SBIT0(IQ(KQSP+LFROM),IQDROP)
105 LROLD =IQ(KQSP+LT+LB+1)
107 NKEYS=IQ(KQSP+LFROM+KNKEYS)
108 NWKEY=IQ(KQSP+LFROM+KNWKEY)
110 * Check if KEY descriptors matches
112 IF(NWKEY.NE.IQ(KQSP+LCDIR+KNWKEY).OR.
113 + IQ(KQSP+LFROM+KKDES).NE.IQ(KQSP+LCDIR+KKDES))THEN
115 IF(LOGLV.GE.-2) WRITE(IQLOG,1000)
116 1000 FORMAT(' RZCOPY. Key descriptors do not match')
122 5 IF(LBANK.NE.LTOP)THEN
123 LBANK=LQ(KQSP+LBANK+1)
124 IF(LBANK.EQ.LFROM)THEN
125 IF(LOGLV.GE.-2) WRITE(IQLOG,3000)
126 3000 FORMAT(' RZCOPY. Cannot copy mother tree in daughter')
135 IF(IOPTK.EQ.0.AND.IOPTT.EQ.0)GO TO 999
139 * Convert KEYU,KEYUN (If only one key to be copied)
141 IF(IOPTK.EQ.0.AND.IOPTT.EQ.0)THEN
144 IKBIT1=3*I-30*IKDES-2
145 IF(JBYT(IQ(KQSP+LFROM+KKDES+IKDES),IKBIT1,3).LT.3)THEN
149 CALL ZHTOI(KEYU(I),KEY(I),1)
150 CALL ZHTOI(KEYUN(I),KEY2(I),1)
154 15 IF(IOPTT.NE.0)THEN
156 NSD(NLPAT1)=IQ(KQSP+LFROM+KNSD)
159 * Loop on all keys of level 0
162 LK=IQ(KQSP+LFROM+KLK)
163 LKC=LK+(NWKEY+1)*(I-1)
164 IF(IOPTK.EQ.0.AND.IOPTT.EQ.0)THEN
166 IF(IQ(KQSP+LFROM+LKC+K).NE.KEY(K))GO TO 80
170 KEY2(K)=IQ(KQSP+LFROM+LKC+K)
173 LCYC =IQ(KQSP+LFROM+LKC)
174 IF (KVSCYC.NE.0) THEN
175 * IF (IQ(KQSP+LCDIR+LCYC+KKYCYC).NE.I) THEN
176 IF (IQ(KQSP+LCDIR+LCYC+KKYCYC).NE.IQ(KQSP+LFROM+LKC+1)) THEN
182 * Store cycles in reverse order for 'C' option
186 CALL MZBOOK(JQPDVS,LCORD,LTOP,-4,'RZCO',0,0,50,2,-1)
189 30 NORD=IQ(KQSP+LCORD+1)+1
190 IF (KVSCYC.NE.0) THEN
191 LCOLD = JBYT(IQ(KQSP+LFROM+LCYC+KPPCYC), 1,16)
193 LCOLD = IQ(KQSP+LFROM+LCYC+KPPCYC)
195 IF(NORD.GT.IQ(KQSP+LCORD-1))THEN
196 CALL MZPUSH(JQPDVS,LCORD,0,50,'I')
198 IQ(KQSP+LCORD+1)=NORD
199 IQ(KQSP+LCORD+NORD+1)=LCYC
200 IF(LCOLD.NE.0.AND.LCOLD.NE.LCYC)THEN
205 LCYC=IQ(KQSP+LCORD+IC+1)
206 CALL RZCOP1(LUNOLD,LROLD,KEY2,IQ(KQSP+LFROM+LCYC+1))
207 IF(IQUEST(1).NE.0) GO TO 900
210 50 IF (KVSCYC.NE.0) THEN
211 LCOLD = JBYT(IQ(KQSP+LFROM+LCYC+KPPCYC), 1,16)
213 LCOLD = IQ(KQSP+LFROM+LCYC+KPPCYC)
215 ICY = JBYT(IQ(KQSP+LFROM+LCYC+KCNCYC),21,12)
216 COPY=ICYCLE.GE.ICY.OR.(ICYCLE.LE.0.AND.LCOLD.EQ.0).OR.
217 + IOPTT.NE.0.OR.IOPTK.NE.0
219 CALL RZCOP1(LUNOLD,LROLD,KEY2,IQ(KQSP+LFROM+LCYC+1))
220 IF(IQUEST(1).NE.0) GO TO 900
222 IF(LCOLD.NE.0.AND.LCOLD.NE.LCYC)THEN
228 IF(IOPTK.EQ.0.AND.IOPTT.EQ.0)GO TO 900
232 100 IF(IOPTT.EQ.0)GO TO 900
234 * Copy subdirectories
236 110 ISD(NLPAT1)=ISD(NLPAT1)+1
237 IF(ISD(NLPAT1).LE.NSD(NLPAT1))THEN
239 LSF=IQ(KQSP+LFROM+KLS)
240 IH=LSF+7*(ISD(NLPAT1-1)-1)
241 CALL ZITOH(IQ(KQSP+LFROM+IH),IHDIR,4)
242 CALL UHTOC(IHDIR,4,CHFPAT(NLPAT1),16)
244 120 CHPAT(I)=CHFPAT(I)
246 CALL RZFDIR('RZCOPY',LT,LFROM,' ')
251 NKEYS=IQ(KQSP+LFROM+KNKEYS)
252 NWKEY=IQ(KQSP+LFROM+KNWKEY)
253 KTAGS=KKDES+(NWKEY-1)/10+1
255 130 CHCDIR(I)=CHFPAT(I)
256 CALL RZPAFF(CHCDIR,NLPAT1-1,CHL)
258 CALL RZMDIR(CHFPAT(NLPAT1),NWKEY,'?',' ')
259 IF(IQUEST(1).NE.0)GO TO 900
260 CALL RZPAFF(CHCDIR,NLPAT1,CHL)
262 IF(IQ(KQSP+LCDIR-1).LT.2*NWKEY+KTAGS+20)THEN
263 CALL RZEXPD('RZCOPY',100)
264 IF(IQUEST(1).NE.0)GO TO 900
266 CALL UCOPY(IQ(KQSP+LFROM+KKDES),IQ(KQSP+LCDIR+KKDES),
267 + 2*NWKEY+KTAGS-KKDES)
268 CALL SBIT1(IQ(KQSP+LTOP),2)
269 CALL SBIT1(IQ(KQSP+LCDIR),2)
273 IF(NLPAT1.GE.NLPAT0)THEN
275 CALL MZDROP(JQPDVS,LFROM,' ')
281 900 IRCOD = IQUEST(1)
283 CALL MZDROP(JQPDVS,LCORD,' ')
287 CALL MZDROP(JQPDVS,LRIN ,' ')
290 CALL RZCDIR(CHWOLD,' ')
291 IF(LFROM.NE.LCDIR)CALL SBIT1(IQ(KQSP+LFROM),IQDROP)
293 #if defined(CERNLIB_QMVAX)
294 IF(IRELAT.NE.0)UNLOCK(UNIT=LUN)
295 IF(LUNOLD.NE.LUN)THEN
296 IF(JBIT(IQ(KQSP+LFROM),4).NE.0)UNLOCK(UNIT=LUNOLD)