5 * Revision 1.5 1998/09/25 09:33:35 mclareni
6 * Modifications for the Mklinux port flagged by CERNLIB_PPC
8 * Revision 1.4 1997/09/02 15:16:11 mclareni
11 * Revision 1.3 1997/03/14 17:21:19 mclareni
14 * Revision 1.2 1996/04/24 17:26:50 mclareni
15 * Extend the include file cleanup to dzebra, rz and tq, and also add
16 * dependencies in some cases.
18 * Revision 1.1.1.1 1996/03/06 10:47:23 mclareni
22 #include "zebra/pilot.h"
23 SUBROUTINE RZFILE(LUNIN,CHDIR,CHOPT)
25 ************************************************************************
27 * Routine to access an already existing RZ file
28 * To create a new RZ file routine RZMAKE should be used
30 * LUNP Logical unit number associated with the RZ file. A FORTRAN
31 * OPEN statement must precede the call to RZFILE.
32 * Starting address of the memory area which will contain the RZ
33 * information ('M' option)
34 * CHDIR Character variable specifying the name of the top directory
35 * to be associated with unit LUN.
36 * CHOPT Character variable specifying the selected options.
41 * In this case space has already been allocated starting
44 * 'U' UPDATE mode default is READ mode only
45 * 'S' SHARED mode default is exclusive access
46 * '1' UPDATE mode with only one user (no LOCKs required)
47 * 'L' Show all locked directories and lock-ids
48 * 'D' Reset LOCKing word in first record
50 * 'H' Hook user routine to RZIODO
51 * 'X' Exchange mode file
53 * 'B' Rebuild bit map of file occupancy from file itself
57 * Author : R.Brun DD/US/PD
59 * Last mod: 22.09.94 JDS - include Z=RZCYCLE and call to RZVCYC
60 * 06.07.95 JDS - return RZ file version in IQUEST(13)
62 ************************************************************************
64 #include "zebra/zunit.inc"
65 #include "zebra/zstate.inc"
66 #include "zebra/rzcl.inc"
67 #include "zebra/rzdir.inc"
68 #include "zebra/rzclun.inc"
69 #include "zebra/rzk.inc"
70 #include "zebra/rzckey.inc"
71 #include "zebra/rzcycle.inc"
72 #include "zebra/rzbuff.inc"
73 #if defined(CERNLIB_QMVAX)
76 CHARACTER CHOPT*(*),CHDIR*(*)
79 EQUIVALENCE (IOPTM,IOPTV(1)), (IOPTU,IOPTV(2))
80 EQUIVALENCE (IOPTS,IOPTV(3)), (IOPTL,IOPTV(4))
81 EQUIVALENCE (IOPT1,IOPTV(5)), (IOPTD,IOPTV(6))
82 EQUIVALENCE (IOPTC,IOPTV(7)), (IOPTX,IOPTV(8))
83 EQUIVALENCE (IOPTB,IOPTV(9)), (IOPTH,IOPTV(10))
85 *-----------------------------------------------------------------------
87 #include "zebra/q_jbit.inc"
88 #include "zebra/q_jbyt.inc"
96 * Save existing material (if any)
100 CALL UOPTC (CHOPT,'MUSL1DCXBH',IOPTV)
101 #if !defined(CERNLIB_QCFIO)
102 *SELF,IF=-QMCRY,IF=-QMVAX,IF=-QMCV64,IF=-QMAPO,IF=-QMAPO9,IF=-QMUIX,IF=-QMDOS.
104 WRITE(IQPRNT,*) 'RZFILE. option C ignored - valid only ',
105 + 'for MSDOS, Unix and VMS systems'
113 #if (defined(CERNLIB_QMLNX) && !defined(CERNLIB_PPC))
114 C RZfile with Exchange mode for NonPPC-LINUX
118 * Take LRECL and LUNP from IQUEST(10-11) in case of C I/O
125 * Take LRECL and address of user routine from IQUEST(10-11)
126 * in case of user I/O routine
134 * Find record length (as specified in the OPEN statement)
136 * A, Memory option. LUN contains the buffer address
137 * and the value of LUNP is the block length
142 ELSEIF(IOPTH.EQ.0) THEN
144 * B, Standard option DISK. Use information as specified
145 * in the Fortran OPEN statement
147 #if defined(CERNLIB_QMVAX)
149 INQUIRE(UNIT=LUNP,ORGANIZATION=CHORG)
150 IF(CHORG.EQ.'RELATIVE')IRELAT=1
155 CALL RZIODO(LUNP,50,2,ITEST,1)
157 * If option X not specified, determine mode (eXchange, native)
161 #if defined(CERNLIB_QMVAX)||defined(CERNLIB_QMVMI)||defined(CERNLIB_QMDOS)||(defined(CERNLIB_QMLNX) && !defined(CERNLIB_PPC))||defined(CERNLIB_WINNT)
162 CALL VXINVB(ITEST(9),1)
164 IF(JBIT(ITEST(9),12).NE.0)THEN
166 #if defined(CERNLIB_QMVAX)||defined(CERNLIB_QMVMI)||defined(CERNLIB_QMDOS)||(defined(CERNLIB_QMLNX) && !defined(CERNLIB_PPC))||defined(CERNLIB_WINNT)
167 CALL RZIODO(LUNP,50,2,ITEST,1)
169 CALL VXINVB(ITEST(9),1)
174 IF(IQUEST(1).NE.0)GO TO 30
176 IF(LB.GT.48)CALL RZIODO(LUNP,LB+6,2,ITEST,1)
178 IF(LOGLV.GE.-1) WRITE(IQLOG,10000)
179 10000 FORMAT(' RZFILE. WARNING!! Top directory is big')
182 #if defined(CERNLIB_QMALT)||defined(CERNLIB_QMAPO)||defined(CERNLIB_QMDOS)||defined(CERNLIB_WINNT)
183 IF(IOPTC.EQ.0.AND.IOPTH.EQ.0) THEN
184 INQUIRE(UNIT=LUNP,RECL=LRECL)
185 * DEC Fortran takes "longword" units
187 #if (defined(CERNLIB_QFDEC))&&(defined(CERNLIB_QMDOS))
188 IF(LRECP.NE.LRECL)THEN
190 #if (defined(CERNLIB_QMALT)||defined(CERNLIB_QMAPO)||defined(CERNLIB_QMDOS)||defined(CERNLIB_WINNT))&&(!defined(CERNLIB_QFDEC))
191 IF(LRECP.NE.LRECL/4)THEN
193 #if defined(CERNLIB_QMALT)||defined(CERNLIB_QMAPO)||defined(CERNLIB_QMDOS)||defined(CERNLIB_WINNT)
195 IF(LOGLV.GE.-2) WRITE(IQLOG,10100)LUNP,LRECP,LRECL/4
196 10100 FORMAT(' RZFILE. Unit ',I6,'RECL on file ',I5,
197 + ' incompatible with RECL in OPEN =',I5)
206 IF(LOGLV.GE.0) WRITE(IQLOG,10200) LUN,LRECP,CHOPT
207 10200 FORMAT(' RZFILE. UNIT ',I6,' Initializing with LREC=',I6,
211 * Check if LUN not already defined
215 IF(IQ(KQSP+LRZ-5).EQ.LUN)THEN
217 IF(LOGLV.GE.-2) WRITE(IQLOG,10300)
218 10300 FORMAT(' RZFILE. Unit is already in use')
227 * First call to RZFILE, create link area
230 CALL MZLINK(JQPDVS,'RZCL',LTOP,LTOP,LFROM)
231 CALL MZBOOK (JQPDVS,LRZ0,LQRS,1,'RZ0 ',2,2,36,2,0)
238 IF(NCHD.GT.16)NCHD=16
239 CHTOP = CHDIR(1:NCHD)
241 * Create control bank
243 CALL MZBOOK(JQPDVS,LTOP,LQRS,1,'RZ ',10,9,LRECP,2,0)
248 IQ(KQSP+LTOP-5) = LUN
252 IF(IOPTC.NE.0) CALL SBIT1(IQ(KQSP+LTOP),5)
257 CALL SBIT1(IQ(KQSP+LTOP),6)
258 CALL SBYT(LUSER,IQ(KQSP+LTOP),7,7)
263 IQ(KQSP+LTOP-5)=-NMEM
264 IF(2*NMEM.GT.IQ(KQSP+LRZ0-1))THEN
265 CALL MZPUSH(JQPDVS,LRZ0,0,10,' ')
267 IQ(KQSP+LRZ0+2*NMEM-1)=LOCF(LUNP)-LOCF(IQ(1))+1
268 IQ(KQSP+LRZ0+2*NMEM )=LRECP
272 * Read 1st record of directory
274 CALL RZIODO(LUN,LRECP,2,IQ(KQSP+LTOP+1),1)
275 IF(IQUEST(1).NE.0)GO TO 30
276 LD = IQ(KQSP+LTOP+KLD)
277 LB = IQ(KQSP+LTOP+KLB)
278 LREC = IQ(KQSP+LTOP+LB+1)
279 NRD = IQ(KQSP+LTOP+LD)
280 #if defined(CERNLIB_FQXISN)
282 * Set exchange mode bit
284 CALL SBIT1(IQ(KQSP+LTOP+KPW1+2),12)
286 IMODEX=JBIT(IQ(KQSP+LTOP+KPW1+2),12)
288 * Increase size of control bank if required
289 * and read all records for top directory
292 IF(NPUSH.NE.0)CALL MZPUSH(JQPDVS,LTOP,0,NPUSH,'I')
294 CALL RZIODO(LUN,LREC,IQ(KQSP+LTOP+LD+I),
295 + IQ(KQSP+LTOP+(I-1)*LREC+1),1)
296 IF(IQUEST(1).NE.0)GO TO 30
298 CALL VBLANK(IQ(KQSP+LTOP+1),4)
299 CALL UCTOH(CHDIR,IQ(KQSP+LTOP+1),4,NCHD)
300 CALL ZHTOI(IQ(KQSP+LTOP+1),IQ(KQSP+LTOP+1),4)
301 CALL SBYT(NCHD,IQ(KQSP+LTOP+KPW1+2),1,5)
302 CALL UCOPY(IQ(KQSP+LTOP+KPW1),IHPWD,2)
303 NHPWD=JBYT(IQ(KQSP+LTOP+KPW1+2),6,5)
304 IQ(KQSP+LTOP+KIRIN)=0
305 IQ(KQSP+LTOP+KIROUT)=0
306 #if defined(CERNLIB_NOTNEW)
308 * Check that the file is not in the NEW format
310 IF (IQ(KQSP+LTOP+KRZVER).NE.0) THEN
312 + (' RZFILE. file cannot be processed by this version of RZ')
328 * Reset LOCKing word in record 1
339 #if defined(CERNLIB_QMVAX)
341 * Set ORGANIZATION type
345 CALL SBIT1(IQ(KQSP+LTOP),4)
349 * Store default LOG level
352 CALL SBYT(LOGL,IQ(KQSP+LTOP),15,3)
357 IQUEST(13) = IQ(KQSP+LTOP+KRZVER)
361 IF(IOPTB.NE.0) CALL RZVERI('//'//CHTOP(1:NCHD),'B')
365 CALL SBIT1(IQ(KQSP+LTOP),1)
366 IF(IOPTU.NE.0.OR.IOPT1.NE.0)THEN
368 * Allocate free records
370 CALL SBIT0(IQ(KQSP+LTOP),1)
371 CALL MZBOOK(JQPDVS,LFREE,LTOP,-2,'RZFR',0,0,21,2,0)
374 * IF(IOPTU.EQ.0.AND.IOPT1.EQ.0)THEN
376 CALL SBIT1(IQ(KQSP+LTOP),3)
377 CALL RZLOCK('RZFILE')
378 IF(IQUEST(1).NE.0)THEN
379 CALL SBIT1(IQ(KQSP+LTOP),1)
381 CALL MZDROP(JQPDVS,LFREE,' ')
387 CALL SBIT0(IQ(KQSP+LTOP),3)
390 * Allocate space for used records
392 CALL MZBOOK(JQPDVS,LUSED,LTOP,-3,'RZUS',0,0,21,2,0)
395 IQUEST(7)=IQ(KQSP+LCDIR+KNKEYS)
396 IQUEST(8)=IQ(KQSP+LCDIR+KNWKEY)