Trailing-Edge
-
PDP-10 Archives
-
decuslib20-05
-
decus/20-0141/opnfil.for
There are 2 other files named opnfil.for in the archive. Click here to see a list.
SUBROUTINE OPNFIL( ITTY, JTTY,KMDNUM,KMDDVC,KMDNAM,
1 KMDEXT,ID1NUM,ID1DVC,ID1EXT,ID2NUM,ID2DVC,ID2EXT,
2 ID3NUM,ID3DVC,ID3EXT,MAXTTL,MAXBFR, KIND,KNDFLG,
3 NUMFLG,LTRTTL,ID1OPN,ID2OPN,IBUFFR)
C RENBR(/OPEN FILES FOR FILE,FILE=FILE,FILE COMMAND)
C
C DONALD BARTH, HARVARD BUSINESS SCHOOL
C
C THIS ROUTINE OPENS THE FILES SPECIFIED BY THE USER IN
C A COMMAND IN WHICH UP TO 2 OUTPUT FILE NAMES ARE
C FOLLOWED BY AN EQUAL SIGN AND THEN BY ANY NUMBER OF
C INPUT FILE NAMES. THE FIRST CALL TO THIS ROUTINE
C OPENS THE FIRST INPUT FILE AND ALL THE OUTPUT FILES.
C SUBSEQUENT CALLS TO THIS ROUTINE OPEN SUBSEQUENT
C INPUT FILES. OUTPUT FILES ARE IDENTIFIED AS BEING OF
C EITHER TYPE ONE OR TYPE TWO BY THE SWITCHES WHICH
C APPEAR WITH THE FILE SPECIFICATIONS. IF NO MORE THAN
C A SINGLE OUTPUT FILE IS SUPPLIED AND NO SWITCHES
C IMPLY ITS TYPE, THEN IT IS ASSUMED TO BE OF TYPE ONE.
C
C OPNFIL ARGUMENTS NAMED ITTY, JTTY, KMDNUM, KMDDVC,
C KMDNAM, KMDEXT, MAXBFR AND IBUFFR ARE IDENTICAL TO
C GETFIL ARGUMENTS HAVING SAME NAMES AND HAVE ALREADY
C BEEN DESCRIBED. FOLLOWING ARGUMENTS, TOGETHER WITH
C ITTY, JTTY, KMDNUM, KMDDVC, KMDNAM, KMDEXT AND
C MAXBFR, ARE USED ONLY FOR INPUT AND ARE RETURNED
C UNCHANGED.
C
C ID1NUM = NUMBER OF UNIT UPON WHICH THIS ROUTINE IS TO
C OPEN OUTPUT FILE WHICH IS TO BE OF TYPE ONE.
C OUTPUT FILE WILL BE OF TYPE ONE IF ITS FILE
C SPECIFICATION IS ASSOCIATED WITH SWITCH FOR
C WHICH CORRESPONDING VALUE IN KNDFLG ARRAY IS
C 1.
C ID1DVC = NAME IN 5H FORM OF DEVICE UPON WHICH TYPE
C ONE OUTPUT FILE IS TO BE WRITTEN IF USER
C DOES NOT SUPPLY DEVICE NAME FOLLOWED BY
C COLON AT START OF SPECIFICATION OF TYPE ONE
C OUTPUT FILE.
C ID1EXT = NAME IN 3H FORM WHICH IS TO BE USED AS
C SECOND COMPONENT (FILE NAME EXTENSION) OF
C NAME OF TYPE ONE OUTPUT FILE IF NO SECOND
C COMPONENT OF NAME OF TYPE ONE OUTPUT FILE IS
C SUPPLIED BY USER. IF USER DOES NOT SPECIFY
C FIRST COMPONENT OF NAME OF OUTPUT FILE, THEN
C FIRST COMPONENT OF NAME OF FIRST INPUT FILE
C IS USED AS FIRST COMPONENT OF NAME OF THIS
C OUTPUT FILE.
C ID2NUM, ID2DVC AND ID2EXT = SIMILAR TO ID1NUM, ID1DVC
C AND ID1EXT RESPECTIVELY, EXCEPT THAT ID2NUM,
C ID2DVC AND ID2EXT REFER TO OUTPUT FILE WHICH
C IS TO BE OF TYPE TWO. OUTPUT FILE WILL BE
C OF TYPE TWO IF ITS FILE SPECIFICATION IS
C ASSOCIATED WITH SWITCH FOR WHICH
C CORRESPONDING VALUE IN KNDFLG ARRAY IS 2.
C ID3NUM = NUMBER OF UNIT UPON WHICH THIS ROUTINE IS TO
C OPEN NEXT INPUT FILE SPECIFIED BY USER.
C ID3DVC = NAME IN 5H FORM OF DEVICE UPON WHICH NEXT
C INPUT FILE IS TO BE OPENED IF NO DEVICE NAME
C HAS BEEN SPECIFIED BY USER FOR ANY PREVIOUS
C INPUT FILE AND IF NO DEVICE NAME IS
C SPECIFIED BY USER FOR THIS NEW INPUT FILE.
C ID3EXT = NAME IN 3H FORM WHICH IS TO BE USED AS
C SECOND COMPONENT (FILE NAME EXTENSION) OF
C NAME OF EACH INPUT FILE FOR WHICH NO SECOND
C COMPONENT OF FILE NAME IS SUPPLIED BY USER.
C MAXTTL = DIMENSION OF LTRTTL ARRAY AND MAXIMUM NUMBER
C OF CHARACTERS WHICH CAN BE RETURNED IN
C LTRTTL ARRAY.
C
C FOLLOWING ARGUMENT MUST BE ZEROED BY CALLING PROGRAM
C BEFORE THIS ROUTINE IS FIRST CALLED, BUT THEN VALUE
C RETURNED BY THIS ROUTINE SHOULD BE SENT TO FOLLOWING
C CALL OF THIS ROUTINE UNCHANGED.
C
C KIND = DEFINED SIMILARLY TO ARGUMENT OF SAME NAME
C IN ARGUMENT LIST OF GETFIL ROUTINE, EXCEPT
C THAT OPNFIL ROUTINE DOES NOT RETURN KIND=5.
C KIND SHOULD BE SET TO ZERO (OR TO 1) BEFORE
C THIS ROUTINE IS FIRST CALLED, OR WHENEVER
C INTERPRETATION OF CURRENT SET OF FILE
C SPECIFICATIONS IS TO BE ABANDONED.
C = 1, RETURNED IF PREVIOUS CALL TO THIS ROUTINE
C OPENED FINAL INPUT FILE SPECIFIED BY USER.
C = 2, RETURNED IF PREVIOUS CALL TO THIS ROUTINE
C OPENED FINAL INPUT FILE SPECIFIED TO LEFT OF
C SEMICOLON. IF THIS ROUTINE IS CALLED AGAIN
C WITHOUT KIND HAVING FIRST BEEN ZEROED, THEN
C EVALUATION OF NEW SET OF FILE SPECIFICATIONS
C WILL BE BEGUN IN TEXT APPEARING TO RIGHT OF
C SEMICOLON.
C = 3, CURRENT CALL TO THIS ROUTINE HAS OPENED
C OUTPUT FILE OR FILES AND HAS OPENED FIRST
C INPUT FILE.
C = 4, CURRENT CALL TO THIS ROUTINE HAS OPENED
C SECOND OR SUBSEQUENT INPUT FILE.
C
C FOLLOWING ARGUMENT IS USED BOTH FOR SENDING
C INFORMATION TO THIS ROUTINE, AND FOR RETURNING
C INFORMATION TO CALLING PROGRAM. CALLING PROGRAM MUST
C DEFINE CONTENTS OF THIS ARRAY BEFORE THIS ROUTINE IS
C FIRST CALLED.
C
C KNDFLG = ARRAY DIMENSIONED AT 27 WHICH MUST INITIALLY
C INDICATE OUTPUT FILE TYPES TO BE ASSOCIATED
C WITH EACH OF SINGLE LETTER SWITCHES /A
C THROUGH /Z AND /' (OR LONE ') RESPECTIVELY.
C IF THIS ROUTINE IS CALLED WITH KIND SET TO 2
C OR LESS, THEN THIS ROUTINE REDEFINES KNDFLG
C ARRAY TO CONTAIN ABSOLUTE VALUES OF ITS
C ORIGINAL CONTENTS. IF CURRENT CALL TO THIS
C ROUTINE BEGINS PROCESSING OF NEW COMMAND
C SUCH THAT KIND IS RETURNED CONTAINING VALUE
C 3, THEN THOSE LOCATIONS WITHIN KNDFLG ARRAY
C HAVING AS THEIR SUBSCRIPTS SERIAL LOCATIONS
C WITHIN ALPHABET OF LETTERS WHICH ARE FOUND
C AS SWITCHES (ASSUMING APOSTROPHE TO BE 27TH
C LETTER OF ALPHABET) ARE THEN RETURNED
C CONTAINING NEGATIVES OF THEIR ABSOLUTE
C VALUES. CONTENTS OF KNDFLG ARRAY ARE
C RETURNED UNCHANGED IF KIND IS RETURNED SET
C TO 4.
C
C IF VALUE IN KNDFLG ARRAY CORRESPONDING TO
C SWITCH IS EITHER -1 OR 1, THEN FILE WITH
C WHICH SWITCH IS ASSOCIATED WILL BE OF TYPE
C ONE. IF VALUE IN KNDFLG ARRAY CORRESPONDING
C TO SWITCH IS EITHER -2 OR 2, THEN FILE WITH
C WHICH SWITCH IS ASSOCIATED WILL BE OF TYPE
C TWO. IF VALUE IN KNDFLG ARRAY CORRESPONDING
C TO SWITCH IS ZERO, THEN ROUTINE NAMED HLPFIL
C IS CALLED TO DISPLAY HELP MESSAGE TO USER
C AND USER IS THEN ASKED TO SUPPLY NEW SET OF
C FILE SPECIFICATIONS. SWITCHES FOR WHICH
C CORRESPONDING LOCATIONS IN KNDFLG ARRAY DO
C NOT CONTAIN ONE OF VALUES -2 THROUGH 2 CAN
C APPEAR WITH EITHER OUTPUT FILE SPECIFICATION
C OR WITH LEFTMOST INPUT FILE SPECIFICATION
C BUT DO NOT IDENTIFY TYPE OF OUTPUT FILES.
C
C FOLLOWING ARGUMENTS ARE USED ONLY FOR RETURNING
C INFORMATION TO CALLING PROGRAM WHEN KIND IS RETURNED
C SET TO 3. THESE ARGUMENTS ARE RETURNED UNCHANGED IF
C KIND IS RETURNED SET TO VALUE OTHER THAN 3.
C
C NUMFLG = ARRAY DIMENSIONED AT 27 WHICH IS USED FOR
C RETURNING VALUES WHICH APPEARED WITH
C SEPARATING COLONS AFTER SWITCHES IN FILE
C SPECIFICATIONS. NUMFLG ARRAY LOCATIONS IN
C WHICH THESE VALUES ARE RETURNED HAVE AS
C THEIR SUBSCRIPTS SERIAL LOCATIONS WITHIN
C ALPHABET OF LETTERS WHICH ARE USED AS
C SWITCHES. SUCH NUMBERS MUST BE SPECIFIED AS
C DECIMAL INTEGERS, BUT CANNOT CONTAIN
C EXPONENTS. NUMFLG(27) IS RETURNED
C CONTAINING NUMBER OF CHARACTERS RETURNED IN
C LTRTTL ARRAY WHICH WERE FOUND TO RIGHT OF
C LEADING APOSTROPHE.
C LTRTTL = ARRAY IN WHICH AT MOST MAXTTL CHARACTERS
C APPEARING TO RIGHT OF APOSTROPHE CAN BE
C RETURNED. NUMFLG(27) IS RETURNED CONTAINING
C NUMBER OF CHARACTERS RETURNED IN LTRTTL
C ARRAY.
C ID1OPN = 0, RETURNED IF TYPE ONE OUTPUT FILE WAS NOT
C OPENED.
C = 1, RETURNED IF TYPE ONE OUTPUT FILE WAS
C OPENED.
C ID2OPN = 0, RETURNED IF TYPE TWO OUTPUT FILE WAS NOT
C OPENED.
C = 1, RETURNED IF TYPE TWO OUTPUT FILE WAS
C OPENED.
C
COMMON/FASPY/NEWNUL(3),NEWDSK(3),NEWNAM(3),
1NEWPTH(3,3),LCNRIT
DIMENSION KNDFLG(27),NUMFLG(27),LTRTTL(MAXTTL),
1IBUFFR(MAXBFR),LTRABC(27),LWRABC(27),LTRDGT(10),
2INILTR(6),KNTLTR(6)
DOUBLE PRECISION KMDNAM,NEWNAM,NEWPTH,PTHONE(3),
1PTHTWO(3),PTHTHR(3),FILONE,FILTWO,FILTHR,FILNAM
DATA LTRABC/1HA,1HB,1HC,1HD,1HE,1HF,1HG,1HH,1HI,1HJ,
1 1HK,1HL,1HM,1HN,1HO,1HP,1HQ,1HR,1HS,1HT,
2 1HU,1HV,1HW,1HX,1HY,1HZ,1H'/
DATA LWRABC/1Ha,1Hb,1Hc,1Hd,1He,1Hf,1Hg,1Hh,1Hi,1Hj,
1 1Hk,1Hl,1Hm,1Hn,1Ho,1Hp,1Hq,1Hr,1Hs,1Ht,
2 1Hu,1Hv,1Hw,1Hx,1Hy,1Hz,1H'/
DATA LTRDGT/1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9/
DATA LTRPLS,LTRMNS,IBLANK/1H+,1H-,5H /
C
C INITIALIZE STORAGE OF COMMAND
INITAL=KIND-2
IF(INITAL.GT.0)GO TO 4
GO TO 2
1 KIND=0
2 ID1OPN=0
ID2OPN=0
DO 3 I=1,27
IF(KNDFLG(I).LT.0)KNDFLG(I)=-KNDFLG(I)
3 NUMFLG(I)=0
KNDONE=0
KNDTWO=0
KNDTHR=0
C
C GET NEXT COMPONENT OF COMMAND TYPED BY USER
4 CALL GETFIL(3,ITTY,JTTY,KMDNUM,KMDDVC,
1KMDNAM,KMDEXT,6,MAXBFR,KIND,NEWNUL,NEWDSK,
2NEWNAM,NEWPTH,LCNRIT,IBUFFR,MAXFLG,INILTR,KNTLTR,
3LCNOWN)
GO TO(45,45,23,31,5),KIND
C
C DECIDE WHICH SWITCH WAS GIVEN
5 IF(MAXFLG.LE.0)GO TO 4
IF(KNTLTR(1).LE.0)GO TO 4
IF(INITAL.GT.0)GO TO 4
LOCLTR=INILTR(1)
LTRNOW=IBUFFR(LOCLTR)
NEWFLG=0
6 NEWFLG=NEWFLG+1
IF(NEWFLG.GT.27)GO TO 4
IF(LTRABC(NEWFLG).EQ.LTRNOW)GO TO 7
IF(LWRABC(NEWFLG).NE.LTRNOW)GO TO 6
7 IF(KNDFLG(NEWFLG).EQ.0)GO TO 35
IF(KNDFLG(NEWFLG).GT.0)KNDFLG(NEWFLG)=-KNDFLG(NEWFLG)
IF(KNDFLG(NEWFLG).EQ.-2)GO TO 11
IF(KNDFLG(NEWFLG).NE.-1)GO TO 15
C
C MARK THAT FILE BEARS TYPE ONE SWITCH
ID1OPN=1
GO TO(8,9,10),LCNOWN
8 IF(KNDONE.EQ.1)GO TO 15
IF(KNDONE.NE.3)KNDONE=KNDONE+1
GO TO 15
9 IF(KNDTWO.EQ.1)GO TO 15
IF(KNDTWO.NE.3)KNDTWO=KNDTWO+1
GO TO 15
10 IF(KNDTHR.EQ.1)GO TO 15
IF(KNDTHR.NE.3)KNDTHR=KNDTHR+1
GO TO 15
C
C MARK THAT FILE BEARS TYPE TWO SWITCH
11 ID2OPN=1
GO TO(12,13,14),LCNOWN
12 IF(KNDONE.LE.1)KNDONE=KNDONE+2
GO TO 15
13 IF(KNDTWO.LE.1)KNDTWO=KNDTWO+2
GO TO 15
14 IF(KNDTHR.LE.1)KNDTHR=KNDTHR+2
C
C STORE QUOTED TEXT STRING
15 IVALUE=0
IF(NEWFLG.LT.27)GO TO 17
LMTLTR=LOCLTR+KNTLTR(1)
16 IF(IVALUE.GE.MAXTTL)GO TO 22
LOCLTR=LOCLTR+1
IF(LOCLTR.GE.LMTLTR)GO TO 22
IVALUE=IVALUE+1
LTRTTL(IVALUE)=IBUFFR(LOCLTR)
GO TO 16
C
C EVALUATE NUMBERS IN RANGE OF SWITCH
17 IF(MAXFLG.LE.1)GO TO 22
IF(KNTLTR(2).LE.0)GO TO 22
LOCLTR=INILTR(2)
LMTLTR=LOCLTR+KNTLTR(2)
I=0
IF(IBUFFR(LOCLTR).EQ.LTRPLS)GO TO 18
IF(IBUFFR(LOCLTR).NE.LTRMNS)GO TO 19
I=1
18 LOCLTR=LOCLTR+1
19 IF(LOCLTR.GE.LMTLTR)GO TO 21
LTRNOW=IBUFFR(LOCLTR)
DO 20 L=1,10
IF(LTRDGT(L).NE.LTRNOW)GO TO 20
IVALUE=(10*IVALUE)+L-1
GO TO 18
20 CONTINUE
21 IF(I.NE.0)IVALUE=-IVALUE
22 NUMFLG(NEWFLG)=IVALUE
GO TO 4
C
C SET DEFAULT OUPUT DEVICE NAMES AND PATHS
23 IF(NEWNUL(LCNRIT).LE.1)GO TO 38
IF(NEWNUL(LCNRIT).EQ.4)GO TO 38
IF(ID1OPN.EQ.ID2OPN)ID1OPN=1
FILONE=NEWNAM(LCNRIT)
FILTWO=FILONE
MORONE=ID1EXT
MORTWO=ID2EXT
PTHONE(1)=0
PTHTWO(1)=0
LOCONE=ID1DVC
LOCTWO=ID2DVC
GO TO(31,24,25),LCNRIT
C
C SINGLE FILE LEFT OF EQUAL SIGN
24 IF(NEWNUL(1).EQ.0)GO TO 31
IF(ID1OPN.EQ.ID2OPN)GO TO 36
KNDONE=1
KNDTWO=1
GO TO 26
C
C TWO FILES LEFT OF EQUAL SIGN
25 IF(KNDONE.GE.3)GO TO 36
IF(KNDTWO.GE.3)GO TO 36
IF(KNDONE.EQ.KNDTWO)GO TO 36
ID1OPN=1
ID2OPN=1
IF(KNDONE.EQ.0)KNDONE=3-KNDTWO
IF(KNDTWO.EQ.0)KNDTWO=3-KNDONE
26 IF(NEWNUL(KNDONE).EQ.0)GO TO 29
IF(NEWDSK(KNDONE).NE.IBLANK)LOCONE=NEWDSK(KNDONE)
DO 27 I=1,3
27 PTHONE(I)=NEWPTH(I,KNDONE)
IF(NEWNUL(KNDONE).LE.1)GO TO 29
FILNAM=NEWNAM(KNDONE)
IF(NEWNUL(KNDONE).LE.3)FILONE=FILNAM
IF(NEWNUL(KNDONE).GE.3)DECODE(10,28,FILNAM)MORONE
28 FORMAT(7X,1A3)
29 IF(NEWNUL(KNDTWO).EQ.0)GO TO 31
IF(NEWDSK(KNDTWO).NE.IBLANK)LOCTWO=NEWDSK(KNDTWO)
DO 30 I=1,3
30 PTHTWO(I)=NEWPTH(I,KNDTWO)
IF(NEWNUL(KNDTWO).LE.1)GO TO 31
FILNAM=NEWNAM(KNDTWO)
IF(NEWNUL(KNDTWO).LE.3)FILTWO=FILNAM
IF(NEWNUL(KNDTWO).GE.3)DECODE(10,28,FILNAM)MORTWO
C
C OPEN INPUT FILE
31 IF(NEWNUL(LCNRIT).EQ.0)GO TO 4
FILTHR=NEWNAM(LCNRIT)
MORTHR=ID3EXT
IF(NEWNUL(LCNRIT).GE.3)DECODE(10,28,FILTHR)MORTHR
LOCTHR=NEWDSK(LCNRIT)
IF(LOCTHR.EQ.IBLANK)LOCTHR=ID3DVC
DO 32 I=1,3
32 PTHTHR(I)=NEWPTH(I,LCNRIT)
ENCODE(10,33,FILNAM)FILTHR,MORTHR
33 FORMAT(1A6,1H.,1A3)
OPEN(UNIT=ID3NUM,FILE=FILNAM,DIRECTORY=PTHTHR,
1DEVICE=LOCTHR,ACCESS='SEQIN',ERR=43)
IF(INITAL.GT.0)GO TO 47
C
C OPEN OUTPUT FILES
IF(ID1OPN.EQ.0)GO TO 34
ENCODE(10,33,FILNAM)FILONE,MORONE
OPEN(UNIT=ID1NUM,FILE=FILNAM,DIRECTORY=PTHONE,
1DEVICE=LOCONE,ACCESS='SEQOUT',ERR=40)
IF(ID2OPN.EQ.0)GO TO 46
34 ENCODE(10,33,FILNAM)FILTWO,MORTWO
OPEN(UNIT=ID2NUM,FILE=FILNAM,DIRECTORY=PTHTWO,
1DEVICE=LOCTWO,ACCESS='SEQOUT',ERR=42)
GO TO 46
C
C ISSUE HELP MESSAGE AND THEN CLEAR COMMAND IF ANY
35 CALL HLPFIL(JTTY)
GO TO 1
C
C ERROR IN COMMAND TYPED BY USER
36 WRITE(JTTY,37)
37 FORMAT(31H AMBIGUOUS OUTPUT SPECIFICATION)
GO TO 1
38 WRITE(JTTY,39)
39 FORMAT(34H 1ST SOURCE FILE MUST BE SPECIFIED)
GO TO 1
40 WRITE(JTTY,41)LOCONE,FILNAM
41 FORMAT(26H CANNOT WRITE OUTPUT FILE ,1A5,1H:,1A10)
GO TO 1
42 WRITE(JTTY,41),LOCTWO,FILNAM
GO TO 1
43 WRITE(JTTY,44)LOCTHR,FILNAM
44 FORMAT(25H CANNOT READ SOURCE FILE ,1A5,1H:,1A10)
GO TO 4
C
C RETURN TO CALLING PROGRAM
45 IF(INITAL.LE.0)GO TO 2
GO TO 47
46 KIND=3
47 RETURN
C024147266970'abcdefghijklmnopqrstuvwxyz:
END