C----------------------------------------------------------------------- C C Subroutine IBMFIL to OPEN and CLOSE all files for the NRCVAX system C C The need for this routine was caused by the inability of Unix and C MS/DOS to interpret global symbols transparently during OPEN and C CLOSE statements. NRCVAX only uses one such symbol GROUPS, which C must be expanded before attempting to open the actual files involved. C C The routine essentially performs a straight OPEN or CLOSE function, C once the actual file-name is known. C The specification of the RECL parameter for SEQUENTIAL files is C NOT standard F77 and is included only for writing plot files. C C The calling sequence is as follows :-- C C CALL IBMFIL (ACTUAL,IUNIT,IBMREC,ST,IERR) C C The parameters are :-- C ACTUAL - the actual file name as in all sensible computers C IUNIT - the unit number; negative to CLOSE file C IBMREC - the record length for all files. Non-standard F77 C Only required for direct-access files. C ST - a 2-character STATUS/ACCESS code made up as follows, C For OPEN statements : C N, O, U or T for NEW, OLD, UNKNOWN or SCRATCH C S or D for SEQUENTIAL or DIRECT. C F can be specified for UNformatted files, which are then C assumed to be Sequential. C L is used only in the VAX to specify C CARRIAGECONTROL = 'LIST' C If blanks are used the defaults are U and S. C Files are assumed to be Formatted for S & Unformatted for D C For CLOSE statements : C As above except, C DE means delete the file after closing C IERR - Error flag returned. 0 for OK. C C----------------------------------------------------------------------- SUBROUTINE IBMFIL (ACTUAL,IUNIT,IBMREC,STT,IERR) INCLUDE 'IATSIZ' CHARACTER ACTUAL*(*),STT*(*),ST*2,SA*2,STATUS*8, $ FORM*12,ACCESS*12,CARRIJ*8,WORK*128 DIMENSION STUFF(100) ST(1:2) = STT(1:2) IERR = 0 LENGTH = IBMREC C----------------------------------------------------------------------- C Is the call for an OPEN or CLOSE function ? C----------------------------------------------------------------------- IF (IUNIT .LT. 0) THEN C----------------------------------------------------------------------- C **** It is a CLOSE **** C C For Sun machines find the end of direct-access files and rewrite the C last record to prevent the file being truncated. C----------------------------------------------------------------------- STATUS = 'KEEP' IUNIT = -IUNIT IF (ST .EQ. 'DE') THEN STATUS = 'DELETE' ELSE C IF (MNCODE .EQ. 'UNXSUN' .OR. MNCODE .EQ. 'UNXSGI') THEN IF (MNCODE .EQ. 'UNXSUN') THEN INQUIRE (UNIT = IUNIT, ACCESS = ACCESS, RECL = LENSUN) IF (ACCESS(1:3) .EQ. 'DIR') THEN IVLEN = 4 IF (MNCODE .EQ. 'UNXSGI') IVLEN = 1 CALL LENFIL (IUNIT,LASTBL) LENVAR = LENSUN/IVLEN READ (IUNIT,REC = LASTBL) (STUFF(J),J = 1,LENVAR) WRITE (IUNIT,REC = LASTBL) (STUFF(J),J = 1,LENVAR) ENDIF ENDIF ENDIF CLOSE (UNIT = IUNIT, STATUS = STATUS) RETURN ELSE C----------------------------------------------------------------------- C **** It is an OPEN **** C C For Unix and MS/DOS machines get the full name from the ACTUAL name. C This allows names to be expanded across sub-directories if the ACTUAL C name is GROUPS. In UNIX this should have a SETENV statement in C .cshrc to expand the name to the full local name. C C *** The call to GETENV should be uncommented for Unix machines *** C C----------------------------------------------------------------------- LENAME = LEN(ACTUAL) DO 120 I = 1,LENAME J = LENAME + 1 - I IF (ACTUAL(J:J) .NE. ' ') GO TO 130 120 CONTINUE 130 LENAME = J WORK = ACTUAL IF (MNCODE .NE. 'VAXVMS') then IF (MNCODE .EQ. 'PCMSDS') THEN c c Avoid a compiler problem with '\'. char(92) is '\'! c CCC IF (ACTUAL .EQ. 'GROUPS') WORK = '\NRCVAX\GROUPS.DAT' IF (ACTUAL .EQ. 'GROUPS') + WORK = char(92) // 'NRCVAX' // char(92) // 'GROUPS.DAT' C ELSE C IF (ACTUAL .EQ. 'GROUPS') C $ CALL GETENV (ACTUAL(1:LENAME),WORK) ENDIF ENDIF C----------------------------------------------------------------------- C The ST code can be in any form of C N, O, U, T or blank with D, S, F, L or blank in any order. C----------------------------------------------------------------------- SA = ST FORM = 'FORMATTED' IF (ST(1:1) .EQ. 'F' .OR. ST(2:2) .EQ. 'F') THEN FORM = 'UNFORMATTED' IF (ST(1:1) .EQ. 'F') ST(1:1) = ' ' IF (ST(2:2) .EQ. 'F') ST(2:2) = ' ' ENDIF CARRIJ = 'FORTRAN' IF (ST(1:1) .EQ. 'L' .OR. ST(2:2) .EQ. 'L') THEN CARRIJ = 'LIST' IF (ST(1:1) .EQ. 'L') ST(1:1) = ' ' IF (ST(2:2) .EQ. 'L') ST(2:2) = ' ' ENDIF IF (ST .EQ. 'DN') SA = 'ND' IF (ST .EQ. 'DO') SA = 'OD' IF (ST .EQ. 'ST') SA = 'TS' IF (ST .EQ. 'DT') SA = 'TD' IF (ST .EQ. ' N' .OR. ST .EQ. 'N ' .OR. ST .EQ. 'SN') SA = 'NS' IF (ST .EQ. ' O' .OR. ST .EQ. 'O ' .OR. ST .EQ. 'SO') SA = 'OS' IF (ST .EQ. ' D' .OR. ST .EQ. 'D ' .OR. ST .EQ. 'DU') SA = 'UD' IF (ST .EQ. ' ' .OR. ST .EQ. ' S' .OR. ST .EQ. 'S ' .OR. $ ST .EQ. ' U' .OR. ST .EQ. 'U ' .OR. ST .EQ. 'SU') SA = 'US' STATUS = 'UNKNOWN' IF (SA(1:1) .EQ. 'N') STATUS = 'NEW' IF (SA(1:1) .EQ. 'O') STATUS = 'OLD' IF (SA(1:1) .EQ. 'T') STATUS = 'SCRATCH' ACCESS = 'SEQUENTIAL' IF (SA(2:2) .EQ. 'D') THEN ACCESS = 'DIRECT' FORM = 'UNFORMATTED' ENDIF C----------------------------------------------------------------------- C Open the file at last. Safeguard the record length for VAX C The first OPEN statement (for the VAX) must be commented out in C versions for other computers C----------------------------------------------------------------------- IF (LENGTH .EQ. 0) LENGTH = 80 IF (MNCODE .EQ. 'VAXVMS') THEN C OPEN (UNIT = IUNIT, FILE = WORK, STATUS = STATUS, C $ ACCESS = ACCESS, FORM = FORM, RECL = LENGTH, C $ CARRIAGECONTROL = CARRIJ, ERR = 200) CONTINUE ELSE IF (STATUS .NE. 'SCRATCH') THEN IF (ACCESS .EQ. 'DIRECT') THEN OPEN (UNIT = IUNIT, FILE = WORK, STATUS = STATUS, $ ACCESS = ACCESS, FORM = FORM, RECL = LENGTH, $ ERR = 200) ELSE OPEN (UNIT = IUNIT, FILE = WORK, STATUS = STATUS, $ ACCESS = ACCESS, FORM = FORM, ERR = 200) ENDIF ELSE IF (ACCESS .EQ. 'DIRECT') THEN OPEN (UNIT = IUNIT, STATUS = STATUS, $ ACCESS = ACCESS, FORM = FORM, RECL = LENGTH, $ ERR = 200) ELSE OPEN (UNIT = IUNIT, STATUS = STATUS, $ ACCESS = ACCESS, FORM = FORM, ERR = 200) ENDIF ENDIF ENDIF RETURN ENDIF C----------------------------------------------------------------------- C Some sort of error was made. Go back and try again probably. C----------------------------------------------------------------------- 200 IERR = 1 RETURN END