Trailing-Edge
-
PDP-10 Archives
-
decuslib10-10
-
43,50520/aplb10.for
There are 4 other files named aplb10.for in the archive. Click here to see a list.
C APPLICATIONS MODIFICATION HISTORY -- APLB10.FOR
C
C #1
C #2 24-OCT-77 MTO
C #3 27-NOV-78 WG
C #4 12-JAN-79 RRB
C #5 2-FEB-79 MSL (CALC,DSKSRT)
C
C*******************************************************
C
C SUBROUTINE IO. ORIGINALLY WRITTEN BY SAM ANEMA.
C MODIFIED BY RUSS BARR, AND BERENICE HOUCHARD.
C
C REWRITTEN BY DICK HOUCHARD JAN 1976
C
C CALL SEQUENCE CALL IO(KNOUT,IDEV,DEVNAM,REALDV,FILNAM,IPROJ,IPROG,IBNK)
C WHERE:
C KNOUT - IS A SINGLE WORD QUANTITY USED TO INDICATE WHETHER
C THE USER IS REQUESTING AN INPUT OR OUTPUT.
C 1 = OUTPUT ROUTINE ASKS QUESTION.
C 0 = INPUT , ROUTINE ASKS QUESTION
C -1 = OUTPUT MAINLINE ASKS QUESTION.
C -2 = INPUT, MAINLINES ASKS QUESTION.
C IDEV - DEVICE NUMBER (MUST BE BETWEEN 1 AND 30
C DEVNAM - TWO WORD QUANTITY RETURNED FROM SUBROUTINE
C CONTAINING THE DEVICE NAME INDICATED BY USER.
C REALDV - SINGLE WORD QUANTITY RETURNED BY SUBROUTINE CONTAINING
C "TTY" IF THE DEVICE IS A TELETYPE
C "DSK" IF THE DEVICE IS A DISK
C " " IF THE DEVICE IS OTHER THAN A TELETYPE AND DISK
C FILNAM - TWO WORD VARIABLE CONTAINING THE FILENAME(IF NEEDED)
C OF THE FILE REQUESTED BY THE USER.
C IPROJ - 1 WORD QUANTITY RETURNED BY THE KPROGRAM
C CONTAINING THE PROJECT NUMBER WHERE THE FILE IS FOUND.
C IPRG - 1 WORD QUANTITY RETURNED BY THE PROGRAM TO INDICATED
C PROGRAMMER NUMBER WHERE THE FILE EXISTS.
C IBNK - 1 WORD KVARIABLE RETURNED FROM THE SUBROUTINE
C INDICATING WHETHER THE FILE IS A
C BANK FILE OR NOT (0= IS NOT, 1= IS)
C
C IN RESPONDING TO THE SUBROUTINE THE USER MAY TERMINATE WITH
C A CARRIAGE RETURN OR ALTMODE.
C
C ADDITION ROUTINE NEEDED ARE:
C GES - ROUTINE READS INPUT FROM THE TELETYPE WITH AN A1 FORMAT
C ALSO ALLOWS THE TERMINATION OF A LINE WITH AND ALTMODE.
C DEVCHR - RETURNS THE DEVICE CHARASTICS OF A SPECIFED
C DEVICE
C GETPPN - RETURNS PROJECT PROGRAMMER NUMBER OF USER.
C EXISTS - CHECKS FOR THE EXISTANCE OF A FILE.
C RUNUUO - ENTERS A RUN CLASS COMMAND FROM THE PROGRAM.
C PRINTS - ALLOWS THE PROGRAM TO ENTER A FILE INTO THE
C LINEPRINTER SPOOLER.
C JOBNUM - RETURN JOB NUMBER OF USER.
C
C
C
SUBROUTINE IO(KNOUT,IDEV,DEVNAM,REALDV,FILNAM,IPROJ,IPROG,IBNK)
COMMON /INIO/ IFTR,IFTW,DEVN(30),FILNM(30),IPP(30),DEST(30)
COMMON/IOB/LEFBK,IRTBK,IALT,MAXPAG,IPAGE,IPAGCT,IDLG,ICC,II,OUTDV
DIMENSION IN(80),INN(10),IPN(3)
DOUBLE PRECISION FILNAM,FILNM,TMP,DEVNAM,DEVN
INOUT=KNOUT
IF(INOUT.LT.0) INOUT=INOUT+2
SETSW=0
IALT="155004020100
IRTBK="565004020100
LEFBK="555004020100
IPN(3)=0
1 DEVNAM='TTY'
CALL DEVCHR(DEVNAM,IDCHAR)
FILNAM=' '
CALL GETPPN(IPROJ,IPROG)
IBNK=0
ICOPS=1
IF(KNOUT.LT.0) GO TO 7
IF(INOUT.EQ.1) GO TO 4
IF(IFTR.EQ.0)WRITE(IDLG,2)
2 FORMAT('+INPUT? (for help type HELP) '$)
IF(IFTR.NE.0) WRITE(IDLG,3)
3 FORMAT('+INPUT? ',$)
IFTR=1
GO TO 7
4 IF(IFTW.EQ.0) WRITE(IDLG,5)
5 FORMAT('+OUTPUT? (for help type HELP) ',$)
IF(IFTW.NE.0) WRITE(IDLG,6)
6 FORMAT('+OUTPUT? ',$)
IFTW=1
C
C CALL GES DOES SAME THING AS READ WITH FORMAT OF 80A1,
C EXCEPT IT WILL ALSO TERMINATE WITH AN ALTMODE.
C ICHECK+2 IMPLIES CONTROL Z WAS HIT
C
7 CALL GES(IN,80,ICHECK)
IF(ICHECK.EQ.2) GO TO 90
C
C COMPRESS OUT BLANKS
C
J=1
DO 8 I=1,80
IF(IN(I).EQ.' ') GO TO 8
C CHANGE ALL LOWER CASE TO UPPER CASE LETTERS
IF((IN(I).GE."605004020100).AND.(IN(I).LE."751004020100))
1IN(I)=IN(I).AND."577777777777
IN(J)=IN(I)
J=J+1
8 CONTINUE
IF(J.EQ.81) GO TO 10
DO 9 I=J,80
9 IN(I)=' '
IF(J.EQ.1) GO TO 71
IF(IN(1).EQ.IALT) GO TO 71
C
C DEVICE (PICK UP UNTIL SPACE, ALTMODE, OR <CR>)
C
10 DO 11 I=1,10
11 INN(I)=' '
I=1
J=1
12 IF(IN(I).EQ.' ') GO TO 40
IF(IN(I).EQ.':') GO TO 15
IF(IN(I).EQ.IALT) GO TO 40
IF(IN(I).EQ.LEFBK) GO TO 40
IF(J.GT.10) GO TO 13
INN(J)=IN(I)
J=J+1
I=I+1
GO TO 12
13 WRITE(IDLG,14)
14 FORMAT('+Either a colon was missing or the file name',
1' is too long'/)
GO TO 1
15 ENCODE(10,16,DEVNAM) (INN(J),J=1,10)
16 FORMAT(80A1)
CALL DEVCHR(DEVNAM,IDCHAR)
IF(IDCHAR.NE.0) GO TO 18
WRITE(IDLG,17) DEVNAM
17 FORMAT('+Device ',A6,' does not exist'/)
GO TO 1
18 IF(INOUT.EQ.1) GO TO 20
IF((IDCHAR.AND."000002000000).NE.0) GO TO 35
WRITE(IDLG,19) DEVNAM
19 FORMAT('+Device 'A6,' cannot do input'/)
GO TO 1
20 IF((IDCHAR.AND."000001000000).NE.0) GO TO 22
WRITE(IDLG,21) DEVNAM
21 FORMAT('+Device ',A6,' cannot do output.'/)
GO TO 1
22 IF((IDCHAR.AND."040000000000).EQ.0) GO TO 35
C
C
C *************************************************************
C
C LINE PRINTER SECTION (ONLY HERE IF LPT: SPECIFIED)
C
161 J=100
23 J=J+1
CALL JOBNUM (K)
K=K+100
ENCODE(10,24,FILNAM) J,K
24 FORMAT('WMU',I3,'.',I3)
CALL EXIST(FILNAM,IERR,0,0)
IF(IERR.EQ.0) GO TO 23
I=I+1
IF((IN(I).EQ.' ').OR.(IN(I).EQ.IALT)) GO TO 130
IF(IN(I).EQ.'/') GO TO 27
25 WRITE(IDLG,26)
26 FORMAT('+Only a /COPIES switch may follow a LPT:'/)
GO TO 1
27 IF((IN(I+1).NE.'C').OR.(IN(I+2).NE.'O').OR.
1(IN(I+3).NE.'P').OR.(IN(I+4).NE.'I').OR.
1(IN(I+5).NE.'E').OR.(IN(I+6).NE.'S').OR.(IN(I+7).NE.':'))
1 GO TO 160
I=I+7
160 INN(1)=' '
INN(2)=' '
J=1
I=I+1
28 IF((IN(I).EQ.' ').OR.(IN(I).EQ.IALT)) GO TO 33
IF((IN(I).LT.'0').OR.(IN(I).GT.'9')) GO TO 29
IF(J.GT.2) GO TO 31
INN(J)=IN(I)
J=J+1
I=I+1
GO TO 28
29 WRITE(IDLG,30) IN(I)
30 FORMAT('+Illegal character "',A1,'" in COPIES swicth'/)
GO TO 1
31 WRITE(IDLG,32)
32 FORMAT('+Copies must be between 1 and 63.'/)
GO TO 1
33 IF(J.EQ.1) GO TO 162
IF(INN(2).NE.' ') GO TO 162
INN(2)=INN(1)
INN(1)=' '
162 ENCODE(2,16,ATMP)(INN(J),J=1,2)
DECODE(2,34,ATMP) ICOPS
34 FORMAT(I2)
IF((ICOPS.LT.1).OR.(ICOPS.GT.63)) GO TO 31
130 IF(DEVN(IDEV).EQ.0) GO TO 89
CLOSE(UNIT=IDEV)
CALL DEVCHR(DEVN(IDEV),LCHAR)
IF(DEST(IDEV).LT.-100) IFTW=1
IF((LCHAR.AND."040000000000).EQ.0) GO TO 89
ICOPS=-DEST(IDEV)
IF(ICOPS.GT.100) ICOPS=ICOPS-100
NPAGES=IPAGCT*ICOPS+3
IF(IPAGCT.GT.0)CALL PRINTS(FILNM(IDEV),2,1,ICOPS,NPAGES)
IF(IPAGCT.LT.0) CALL PRINTS(FILNM(IDEV),2,1,ICOPS)
IPAGCT=0
89 OPEN(UNIT=IDEV,DEVICE='DSK',FILE=FILNAM,ACCESS='SEQOUT')
GO TO 76
C
C *************************************************************
C
C
C ##############################################################
C
C ALL OTHER DEVICES ARE CHANNELED THROUGH HERE
C
C FIRST A CHECK IS MADE TO SEE IF IT IS A DIRECTORY DEVICE
C OR NOT (DTA AND DSK ARE DIRECTORY DEVICES).
C
35 IF((IDCHAR.AND."000004000000).EQ.0) GO TO 36
FILNAM='INPUT.DAT'
IF(INOUT.EQ.1) FILNAM='OUTPUT.DAT'
36 I=I+1
IF(IN(I).NE.'/') GO TO 38
WRITE(IDLG,37)
37 FORMAT('+Only switch available if for the LPT'/)
GO TO 1
38 IF((IN(I).EQ.' ').OR.(IN(I).EQ.IALT)) GO TO 71
IF((IDCHAR.AND."000004000000).NE.0) GO TO 41
WRITE(IDLG,39)
39 FORMAT('+Non-directory devices require no additional information'
1/)
GO TO 1
C
C ############################################################
C
C
C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!h
C
C DEVICE HAS BEEN HANDLED. AT THIS POINT IT IS A
C DIRECTORY DEVICE. NOW GET THE FILENAME AND
C PROJECT-PROGRAMMER NUMBER (IF THEY EXIST)
C
41 DO 42 J=1,10
42 INN(J)=' '
J=1
43 IF(IN(I).EQ.' ') GO TO 46
IF(IN(I).EQ.LEFBK) GO TO 46
IF(IN(I).EQ.IALT) GO TO 46
IF(J.GT.10) GO TO 44
INN(J)=IN(I)
J=J+1
I=I+1
GO TO 43
44 WRITE(IDLG,45)
45 FORMAT('+File name too long'/)
GO TO 1
C
C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
C
40 DEVNAM='DSK'
FILNAM='INPUT.DAT'
IF(INOUT.EQ.1) FILNAM='OUTPUT.DAT'
CALL DEVCHR(DEVNAM,IDCHAR)
C
C =============================================================
C
C FILE NAME? CHECK FOR ALL OTHER POSSIBILITIES FIRST
C
46 ENCODE(10,16,TMP) INN
IF(TMP.EQ.' ') GO TO 112
IF(TMP.EQ.'/STP ') GO TO 80
IF(TMP.EQ.'/BANK ') GOTO 80
IF(TMP.EQ.'/REGR ') GO TO 80
IF(TMP.EQ.'/TAB ') GO TO 80
IF(TMP.EQ.'/FREQ ') GO TO 80
IF(TMP.EQ.'/CORL ') GO TO 80
IF(TMP.EQ.'SAME ') GO TO 83
IF(TMP.EQ.'CONTINUE ') GO TO 140
IF(TMP.EQ.'/OUT ') GO TO 100
IF(TMP.EQ.'/OUTPUT ') GO TO 100
IF(TMP.EQ.'END ') GO TO 90
IF(TMP.EQ.'FINI ') GO TO 90
IF(TMP.EQ.'FINISH ') GO TO 90
IF(TMP.EQ.'HELP ') GO TO 150
C
C ===============================================================
C
C
C @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
C
C IT IS A FILE NAME. IS IT A BANK? IS THER A PROJECT-
C PROGRAMMER NUMBER?
C
C
IDP=0
DO 113 J=1,10
IF(INN(J).EQ.' ') GO TO 113
IF(INN(J).EQ.'.') GO TO 115
IF((INN(J).GE.'0').AND.(INN(J).LE.'9')) GO TO 113
IF((INN(J).LE.'Z').AND.(INN(J).GE.'A')) GO TO 113
WRITE(IDLG,114) INN(J)
114 FORMAT('+Character"',a1,'" is not valid in a file name'/)
GO TO 1
115 IDP=IDP+1
IF(IDP.EQ.1) GO TO 113
WRITE(IDLG,116)
116 FORMAT('+Only one period is allowed in the file name.'/)
GO TO 1
113 CONTINUE
IF(IDP.EQ.1) GO TO 117
J=1
118 IF(INN(J).EQ.' ') GO TO 119
J=J+1
IF(J.LE.7) GO TO 118
GO TO 44
119 INN(J)='.'
ENCODE(10,16,TMP) INN
117 J=1
47 J=J+1
IF(J.GT.7) GO TO 49
IF(INN(J).NE.'.') GO TO 47
IF((INN(J+1).NE.'B').OR.(INN(J+2).NE.'N').OR.
1(INN(J+3).NE.'K')) GO TO 49
IBNK=1
IF((IDCHAR.AND."200000000000).NE.0) GO TO 110
WRITE(IDLG,48)
48 FORMAT('+BANK files must be read from the disk'/)
GO TO 1
110 IF(INOUT.EQ.0) GO TO 49
WRITE(IDLG,111)
111 FORMAT('+Bank files can not be used for output.'/)
GO TO 1
49 FILNAM=TMP
112 IF(IN(I).NE.LEFBK) GO TO 71
C %%%%%%%%%%%%%%%%%%%%%%%i( PROJECT NUMBER )%%%%%%%%%%%%%%%%%%%%%
DO 50 J=1,10
50 INN(J)=' '
J=1
I=I+1
51 IF(IN(I).EQ.IRTBK) GO TO 56
IF(IN(I).EQ.',') GO TO 58
IF((IN(I).LT.'0').OR.(IN(I).GT.'7')) GO TO 54
IF(J.GT.6) GO TO 52
INN(J)=IN(I)
J=J+1
I=I+1
GO TO 51
52 WRITE(IDLG,53)
53 FORMAT('+PROJECT or PROGRAMMER number cannont be longer'/
1' than 6 characters'/)
GO TO 1
54 WRITE(IDLG,55) IN(I)
55 FORMAT('+Illegal character "',a1,'" in PROJECT-PROGRAMMMER',
1' number'/)
GO TO 1
56 WRITE(IDLG,57)
57 FORMAT('+ Comma missing between PROJECT and PROGRAMMER number'/)
GO TO 1
58 IF(J.EQ.1) GO TO 65
60 IF(INN(10).NE.' ') GO TO 61
DO 59 J=9,1,-1
59 INN(J+1)=INN(J)
INN(1)=' '
GO TO 60
61 ENCODE(10,16,TMP) INN
DECODE(10,62,TMP) IPROJ
62 FORMAT(O10)
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%i( PROGRAMMER NUMBER )%%%%%%%%%%%%%%i
65 DO 63 J=1,10
63 INN(J)=' '
J=1
I=I+1
64 IF(IN(I).EQ.IRTBK) GO TO 66
IF(IN(I).EQ.' ') GO TO 66
IF(IN(I).EQ.IALT) GO TO 66
IF((IN(I).LT.'0').OR.(IN(I).GT.'7')) GO TO 54
IF(J.GT.6) GO TO 52
INN(J)=IN(I)
J=J+1
I=I+1
GO TO 64
66 IF(J.EQ.1) GO TO 92
67 IF(INN(10).NE.' ') GO TO 68
DO 69 J=9,1,-1
69 INN(J+1)=INN(J)
INN(1)=' '
GO TO 67
68 ENCODE(10,16,TMP) INN
DECODE(10,62,TMP) IPROG
92 IF(IN(I).NE.IRTBK) GO TO 91
I=I+1
91 IF((IN(I).EQ.' ').OR.(IN(I).EQ.IALT)) GO TO 71
WRITE(IDLG,70)
70 FORMAT('+Nothing should follow the closing bracket for the',
1' PROJECT-PROGRAMMER number'/)
GO TO 1
C
C @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
C
C
C $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
C
C THIS PORTION DOES THE ACTUAL OPEN ALL PERTINENT DATA IS AVAILABLE
C IF PROBLEMS EXIST THEY ARE IRONED OUT HERE.
C
71 IPN(1)=IPROJ
IPN(2)=IPROG
IERR=0
IF(INOUT.EQ.0) CALL EXISTS(DEVNAM,FILNAM,IERR,IPROJ,IPROG)
IF(IERR.EQ.0) GO TO 131
WRITE(IDLG,72)
72 FORMAT('+File not found or protected'/)
GO TO 1
131 IF(DEVN(IDEV).EQ.0) GO TO 73
CLOSE(UNIT=IDEV)
CALL DEVCHR(DEVN(IDEV),LCHAR)
IF(DEST(IDEV).LT.-100) IFTW=1
IF((LCHAR.AND."040000000000).EQ.0) GO TO 73
ICOPS=-DEST(IDEV)
IF(ICOPS.GT.100) ICOPS=ICOPS-100
NPAGES=IPAGCT*ICOPS+3
IF(IPAGCT.GT.0) CALL PRINTS(FILNM(IDEV),2,1,ICOPS,NPAGES)
IF(IPAGCT.LT.0) CALL PRINTS(FILNM(IDEV),2,1,ICOPS)
IPAGCT=0
73 IF(IBNK.EQ.1) GO TO 75
IF(INOUT.EQ.0) OPEN(UNIT=IDEV,DEVICE=DEVNAM,FILE=FILNAM,
1ACCESS='SEQIN',DIRECTORY=IPN)
IF(INOUT.EQ.1) OPEN(UNIT=IDEV,DEVICE=DEVNAM,FILE=FILNAM,
1ACCESS='SEQOUT',DIRECTORY=IPN)
GO TO 76
75 OPEN(UNIT=IDEV,DEVICE=DEVNAM,FILE=FILNAM,ACCESS='RANDIN',
1DIRECTORY=IPN,MODE='BINARY',RECORD SIZE=126)
76 DEVN(IDEV)=DEVNAM
FILNM(IDEV)=FILNAM
IPP(IDEV)=IPROJ*8**6+IPROG
DEST(IDEV)=IBNK
REALDV=' '
IF((IDCHAR.AND."000010000000).NE.0) REALDV='TTY'
IF((IDCHAR.AND."200000000000).NE.0) REALDV='DSK'
IF(INOUT.EQ.0) GO TO 77
DEST(IDEV)=-ICOPS
IF(IFTW.EQ.1) DEST(IDEV)=-ICOPS-100
IF(IFTW.EQ.1) OUTDV=REALDV
IF((DEVN(IDEV).EQ.'LPT').AND.(IFTW.EQ.1)) OUTDV='LPT'
IFTW=IFTW+1
77 IF(SETSW.EQ.1) GO TO 105
RETURN
C
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C
C RUN TO ANOTHER BANK PROGRAM
C CLOSE ALL OUTPUT FILES PRIOR TO THE RUN.
C
80 ENCODE(10,81,IN)(INN(J),J=2,5)
81 FORMAT('R ',4A1,4X)
IN(3)=0
DO 82 J=1,30
IF(DEST(J).GE.0) GO TO 82
CLOSE(UNIT=J)
IF(DEVN(J).NE.'LPT') GO TO 82
ICOPS=-DEST(J)
IF(ICOPS.GT.100) ICOPS=ICOPS-100
NPAGES=IPAGCT*ICOPS+3
IF(IPAGCT.GT.0) CALL PRINTS(FILNM(J),2,1,ICOPS,NPAGES)
IF(IPAGCT.LT.0) CALL PRINTS(FILNM(J),2,1,ICOPS)
82 CONTINUE
CALL RUNUUO (IN)
C
C +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C
C
C >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_
C
C SAME WAS USED.
C
C
C
83 IF(DEVN(IDEV).NE.0) GO TO 87
WRITE(IDLG,86)
86 FORMAT('+You must have answered this question in this',
1' program previously to use "SAME" now.'/)
GO TO 1
87 DEVNAM=DEVN(IDEV)
FILNAM=FILNM(IDEV)
IPROJ=IPP(IDEV)/8**6
IPROG=IPP(IDEV)-IPROJ*8**6
IBNK=0
IF(DEST(IDEV).EQ.1) IBNK=1
ICOPS=-DEST(IDEV)
IF(ICOPS.GT.100) ICOPS=ICOPS-100
CALL DEVCHR(DEVNAM,IDCHAR)
IF(INOUT.EQ.1) CLOSE(UNIT=IDEV)
IF((IDCHAR.AND."040000000000).NE.0) GO TO 130
IF((IDCHAR.AND."000020000000).NE.0) BACKFILE IDEV
GO TO 71
C
C >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_>>>>>>>>_>>>>_
C
C
C
C ///////////////////////////////////////////////////////////////
C
C FINI. FINISH, END OR CONTROL Z WAS USED. CLOSE FILES AND
C REOPEN
C
C
90 DO 99 J=1,30
IF(DEST(J).GE.0) GO TO 99
CLOSE(UNIT=J)
IF(DEVN(J).NE.'LPT') GO TO 99
ICOPS=-DEST(J)
IF(ICOPS.GT.100) ICOPS=ICOPS-100
NPAGES=IPAGCT*ICOPS+3
IF(IPAGCT.GT.0) CALL PRINTS(FILNM(J),2,1,ICOPS,NPAGES)
IF(IPAGCT.LT.0) CALL PRINTS(FILNM(J),2,1,ICOPS)
99 CONTINUE
CALL EXIT
C
C /////////////////////////////////////////////////////////////
C
C
C <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<^<<<<<<^
C
C /OUTPUT OR /OUT USED.
C
C
100 IF(SETSW.EQ.0) GO TO 106
WRITE(IDLG,107)
107 FORMAT('+You cannot do a /OUT while answering a /OUT'/)
GO TO 1
106 DO 101 J=1,30
IF(DEST(J).LT.-100) GO TO 103
101 CONTINUE
WRITE(IDLG,102)
102 FORMAT(' No output defined yet'/)
GO TO 1
103 LDEV=IDEV
IDEV=J
LNOUT=INOUT
INOUT=1
SETSW=1
GO TO 1
105 SETSW=0
IDEV=LDEV
INOUT=LNOUT
GO TO 1
C
C >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
C
C ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::]
C
C CONTINUE WAS USED.
C
C
140 IF(DEVN(IDEV).NE.0) GO TO 142
WRITE(IDLG,141)
141 FORMAT('+To use the CONTINUE an input must have already been',
1' defined.'/)
GO TO 1
142 FILNAM=FILNM(IDEV)
DEVNAM=DEVN(IDEV)
IPROJ=IPP(IDEV)/8**6
IPROG=IPP(IDEV)-IPROJ*8**6
IBNK=0
IF(DEST(IDEV).EQ.1) IBNK=1
ICOPS=-DEST(IDEV)
IF(ICOPS.GT.100) ICOPS=ICOPS-100
CALL DEVCHR(DEVNAM,IDCHAR)
IF(INOUT.EQ.1) GO TO 77
GO TO 71
C
C :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::]
C
C
C ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
C
C HELP
C
150 IF(INOUT.EQ.1) GO TO 155
WRITE(IDLG,151)
151 FORMAT(
1' The answer to this question defines where the program is'/
1' to find the data. It usually consists of a device, and'/
1' possibly a file name with or without a PROJECT-PROGRAMMER'/
1' number. Devices may be specified by their physical'/
1' or logical name followed by a colon (:). If the'/
1' device is a directory device (DSK, DTA), then a filename,'/
1' extension and PROJECT-PROGRAMMER number may follow it.'/
1' If the device used is a magtape or dectape, the tape'/
1' must be mounted, and in the case of a magtape it must'/
1' be positioned.'/'0DEFAULTS:'/
1' (1) If no input devices is specified but a filename is'/
1' given, the default device will be DSK:.'/
1' (2) If a device which requires a filename and extension'/
1' is specified, but no filename is given INPUT.DAT'/
1' will be used.'/
1' (3) If no response is given (CARRIAGE RETURN is entered)'/
1' the default is TTY:.'/
1' (4) If DSK: is specified as the input device, but no')
WRITE(IDLG,152)
152 FORMAT(
1' PROJECT-PROGRAMMER number is used, the PROJECT-'/
1' PROGRAMMER number of the job is used.'/
1'0EXAMPLES:'/' DSK:DATA.DAT'/' TEST.DAT[220,220]'/
1' MTA:'/
1'0The following responses may also be used after the first'/
1' response to this question.'/
1' "CONTINUE" - (For MAGTAPE) Use the next set of data'/
1' "SAME" - Use same device specifications as used before.'/
1' "FINI" - End of run.'/
1' "/PROG" - User may initiate the run of a bank program'/
1' (STP, BANK, TAB, FREQ, CORL, or REGR) from'/
1' this program.'/
1' "/OUTPUT" - Redefine the output device, the program will'/
1' respond with "OUTPUT? ".'/)
GO TO 1
155 WRITE(IDLG,157)
157 FORMAT(
1'0The answer to this question defines the destination'/
1' for the program''s results. It usually consists of a device'/
1' and possibly a filename with or without an extension.'/
1' Devices may be indicated by their physical or'/
1' logical name followed by a colon (:). If the device is'/
1' a directory device (DSK, DTA), then a filename,'/
1' extension and PROJECT-PROGRAMMER number may follow it.'/
1' If the device used is a magtape or dectape, the tape'/
1' must be mounted, and in the case of the magtape, it must'/
1' be positioned. If the device is a lineprinter, the user'/
1' may request multiple copies by following the "LPT:" with'/
1' a "/COPIES:" and the number of copies desired (1-63).'/
1'0DEFAULTS:'/
1' (1) - If no input device is specified but a filename is'/
1' given, the default device will be DSK:')
WRITE(IDLG,156)
156 FORMAT(
1' (2) - If a device which requires a filename and extension"'/
1' is specified but no filename is given OUTPUT.DAT is'/
1' used.'/
1' (3) - If no response is given (a CARRIAGE RETURN is entered),'/
1' the default is TTY:.'/
1' (4) - If LPT: is spedified and no /COPEIS switch is used,'/
1' 1 copy is assumed.'/'0EXAMPLES:'/
1' DSK:SAM.F4'/' LPT:/COPIES:3'/' MTA:'/)
GO TO 1
END
C
C SUBROUTINE IOB(DATA BANK AND TTY:SAME MODIFICATION)
C
C
C INPUT/OUTPUT DEVICE/FILENAM/PPN HANDLER FOR FORTRAN
C
C
C
C WRITTEN BY SAM ANEMA - FEB 1972 - WMU COMPUTER CENTER
C
C MODIFICATIONS BY RUSSELL R. BARR - WMU COMPUTER CENTER
C DATE: 16 MAY 1973
C DATE: 25 JUL 1973(^Z ALTERNATIVE TO "FINISH")
C FIXED ON AUGUST 27, BY R. BARR(AFTER B. HOUCHARD) TO
C INITIALIZE IBNK.
C DATE: 31 JAN 1974 - 'CONTINU' OPTION AND 7 LETTER OPTION CHECK.
C DATE: 11 DEC 1974 - MADE COMPATABLE WITH FOROTS DEFINE FILE
C DATE: 5 FEB 75 - PATCH TO PRINT 'LPT' FILE EVERY TIME
C 'OUTPUT?' IS CALLED.
C
C SUBROUTINES USED: EXISTS IN FOROTS - NORM GRANT
C PRINTS - SYSTEM
C
C ARGUMENTS ACCEPTED:
C IORO - 0 = INPUT
C 1 = OUTPUT
C IDLG - DIALOG OUTPUT DEVICE NUMBER
C IRSP - DIALOG INPUT DEVICE NUMBER
C NDEVI - INPUT DEVICE NUMBER
C NDEVO - OUTPUT DEVICE NUMBER
C IDVI - INPUT DEVICE NAME
C IDVO - OUTPUT DEVICE NAME
C ICODE - 0 = TTY JOB
C - 1 = PSEUDO-TTY JOB(BATCH)
C ITYCH - ALTERNATE INPUT DEVICE NUMBER
C (USED FOR TTY: SAME OPTION. SEE NOTE(1))
C
C ARGUMENTS RETURNED:
C
C NDEVI - (SEE NOTE(1))
C IBNK - 0 = EXTENSION IS NOT '.BNK'
C 1 = EXTENSION IS '.BNK'
C NAMI(2) - ASCIZ INPUT FILE NAME
C NAMO(2) - ASCIZ OUTPUT FILE NAME
C IPJ,IPG- [P,PN] FOR INPUT FILE
C NCOPYS - NUMBER OF COPIES TO LPT:
C
C ADD'L OPTIONS:
C
C 'SAME ' - REWIND DEV. AND RETURN.
C (SEE NOTE (1) FOR USE WITH TTY:)
C 'CONTINU' - SAME AS 'SAME' BUT DONT REWIND BEFORE RETURN.
C 'FINISH ' - CLOSE DEV., PRINT IF LPT, EXIT.
C
C
C NOTE(1): TO USE THE TTY:SAME OPTION - IN THE MAIN;
C ASSIGN AN UNUSED FORTRAN DEVICE NUMBER TO ITYCH.
C INSERT CHANGES FOR READ SIMILAR TO THE FOLLOWING:
C
C OLD: READ(NDEVI,IFMT)LIST...
C
C NEW: IF(NDEVI.EQ.ITYCH)GO TO 9998
C READ(NDEVI,IFMT)LIST...
C WRITE(ITYCH)LIST...
C GO TO 9999
C 9998 READ(NDEVI)LIST...
C 9999 .........
C
C NOTE(2): RESPONSES ARE IN THE FORM;
C
C DTA1:FILDAT.DAT
C DATA1.DAT (DSK: AND USER'S PPN ASSUMED)
C LPT:/2
C <CR><LF> (STANDARD ASSUMPTIONS. SEE NOTE(3))
C
C NOTE(3): STANDATD ASSUMPTIONS
C
C FOR A TTY: JOB
C TTY: FOR INPUT
C TTY: FOR OUTPUT
C
C FOR A PSEUDO-TTY: JOB
C CDR: FOR INPUT
C LPT: FOR OUTPUT
C
C IF NO FILE NAME IS SPECIFIED, USES:
C INPUT.DAT FOR INPUT
C OUTPT.DAT FOR OUTPUT
C
SUBROUTINE IOB(IORO)
DIMENSION IN(50),INAME(2),B(10),NAM(2)
DOUBLE PRECISION JNAME
COMMON/IOBLK/IDLG,IRSP,NDEVI,NDEVO,IDVI,IDVO,ICODE,IBNK,NAMI(2)
COMMON/IOBLKA/NAMO(2),IPJ,IPG,NCOPYS,ITYCH
EQUIVALENCE (INAME,JNAME)
DATA L1,L2/"555004020100,"565004020100/
IF(JONCE.EQ.0)ITMP=NDEVI
NDEVI=ITMP
IF((IORO.AND.1).EQ.0)IDV=IDVI
IF((IORO.AND.1).EQ.1)IDV=IDVO
1 GO TO(401,403,402,404),IORO+1
401 WRITE(IDLG,310)
310 FORMAT(' INPUT? (TYPE HELP IF NEEDED)--',$)
402 IDEV=NDEVI
GO TO 405
403 WRITE(IDLG,311)
311 FORMAT(' OUTPUT? (TYPE HELP IF NEEDED)--',$)
404 IDEV=NDEVO
405 READ(IRSP,10,END=201)IN
10 FORMAT(50A1)
IF(IN(1).EQ.'F'.AND.IN(2).EQ.'I'.AND.IN(3).EQ.'N'.AND.
1 IN(4).EQ.'I'.AND.IN(5).EQ.'S'.AND.IN(6).EQ.'H'.AND.
1 IN(7).EQ.' ')GO TO 201
IF(IN(1).EQ.'S'.AND.IN(2).EQ.'A'.AND.IN(3).EQ.'M'.AND.
1 IN(4).EQ.'E'.AND.IN(5).EQ.' '.AND.IN(6).EQ.' '.AND.
1 IN(7).EQ.' ')GO TO 212
IF(IN(1).EQ.'C'.AND.IN(2).EQ.'O'.AND.IN(3).EQ.'N'.AND.
1 IN(4).EQ.'T'.AND.IN(5).EQ.'I'.AND.IN(6).EQ.'N'.AND.
1 IN(7).EQ.'U')RETURN
IF(IN(1).EQ.'H'.AND.IN(2).EQ.'E'.AND.IN(3).EQ.'L'.AND.
1IN(4).EQ.'P'.AND.IN(5).EQ.' '.AND.IN(6).EQ.' '.AND.
1IN(7).EQ.' ')GO TO (500,600),IORO+1
ITYFLG=0
CALL RELEAS(IDEV)
IF((IPR.NE.1).OR.((IORO.AND.1).NE.1))GO TO 491
CALL PRINTS(NAM,2,1,NCOPYS)
IPR=0
491 IBNK=0
NEVER=0
ICOLN=0
ILBR=0
ISL=0
IPROJ=0
IPROG=0
INAME(1)=' '
INAME(2)=' '
IDV=' '
K=0
IDP=0
12 K=K+1
IF(K.GT.50)GO TO 15
IF(IN(K).EQ.'.')IDP=1
IF(IN(K).EQ.':')GO TO 13
IF(IN(K).EQ."555004020100)GO TO 14
IF(IN(K).EQ.'/')GO TO 23
GO TO 12
13 ICOLN=K+4
DO 20 I=50,K+4,-1
20 IN(I)=IN(I-4)
DO 27 I=0,3
27 IN(K+I)=' '
K=K+4
GO TO 12
14 ILBR=K+9
DO 21 I=50,K+9,-1
21 IN(I)=IN(I-9)
DO 22 I=K,K+8
22 IN(I)=' '
K=K+9
GO TO 12
23 ISL=K
GO TO 12
15 IF(ILBR.EQ.0)GO TO 31
30 ENCODE(12,10,B)(IN(I),I=ILBR+1,ILBR+12)
DECODE(12,41,B)IPROJ,IPROG
41 FORMAT(2O)
31 IF(IDP.NE.0)GO TO 32
DO 33 I=ICOLN+9,ICOLN+1,-1
33 IF(IN(I).NE.' ')GO TO 34
I=6
34 IN(I+1)='.'
32 ENCODE(10,10,INAME)(IN(I),I=ICOLN+1,ICOLN+10)
IF(ICOLN.EQ.0)GO TO 101
100 ENCODE(5,10,IDV)(IN(I),I=1,5)
101 IF(ISL.EQ.0)GO TO 24
ENCODE(5,10,B)(IN(I),I=ISL+1,ISL+5)
DECODE(5,46,B)NCOPYS
46 FORMAT(I)
24 IF(IDV.NE.' ')GO TO 124
IF(INAME(1).EQ.' ')GO TO 28
IDV='DSK'
GO TO 124
28 IF(ICODE.EQ.-1)GO TO 125
IDV='TTY'
GO TO 124
125 IF((IORO.AND.1).EQ.0)IDV='CDR'
IF((IORO.AND.1).EQ.1)IDV='LPT'
124 CALL DEVCHG(IDV,IDEV)
D TYPE 9998,IDV,IDEV
D9998 FORMAT(1X,A5,I6)
IF(IDV.EQ.'DSK')GO TO 102
IF(IDV.EQ.'LPT')GO TO 104
IF(IDV.LE."422510134500.AND.IDV.GE."422510130100)GO TO 102
213 IF(IDV.EQ.'TTY'.AND.(IORO.AND.1).EQ.0)GO TO 214
GO TO 410
104 INAME(1)='OUTAA'
INAME(2)='A.AAA'
IPR=1
LPT=IDEV
CALL DEVCHG('DSK',IDEV)
105 CALL EXISTS(IDEV,INAME,MRK)
IF(MRK.EQ.1)GO TO 211
INAME(2)=INAME(2)+2
GO TO 105
211 NAM(1)=INAME(1)
NAM(2)=INAME(2)
102 IBNK=0
DECODE(10,10,INAME)(IN(JJ),JJ=1,10)
DO 1112 IB=10,3,-1
1112 IF(IN(IB).NE.' ')GO TO 1113
1113 IF(IN(IB-2).EQ.'B'.AND.IN(IB-1).EQ.'N'.AND.IN(IB).EQ.'K')
1 IBNK=1
IF(INAME(1).NE.' ')GO TO 302
IF((IORO.AND.1).EQ.0)INAME(1)='INPUT'
IF((IORO.AND.1).EQ.1)INAME(1)='OUTPT'
INAME(2)='.DAT'
302 IF((IORO.AND.1).EQ.1)GO TO 303
CALL EXISTS(IDEV,INAME,MRK,IPROJ,IPROG)
IF(MRK.EQ.0)GO TO 303
WRITE(IDLG,305)
305 FORMAT(' FILE DOES NOT EXIST'/)
D TYPE 9997,IDV,INAME,IPROJ,IPROG
D9997 FORMAT(1X,A5,1X,2A5,O13,O13)
IF(ICODE.EQ.-1)CALL EXIT
GO TO 1
303 CONTINUE
D TYPE 9999,IDEV,INAME,IPROJ,IPROG
D9999 FORMAT(I3,2X,2A5,O12,2X,O12)
ISZ=0
IF(IBNK.EQ.1)ISZ=126
CALL DEFINE FILE(IDEV,ISZ,NEVER,JNAME,IPROJ,IPROG)
GO TO 213
201 IF(IPR.EQ.1)CALL RELEAS(LPT)
IF(IPR.EQ.1)CALL PRINTS(NAM,2,1,NCOPYS)
CALL EXIT
212 IF(ITYFLG.EQ.1)GO TO 215
IF((IORO.AND.1).EQ.0)REWIND IDEV
GO TO 410
C NO TTY: SAME OPTION IF NO CHANNEL PROVIDED IN ITYCH
214 IF(ITYCH.LT.1)GO TO 410
IF(IONCE.NE.1)CALL DEVCHG('DSK',ITYCH)
IONCE=1
IF(ITYFLG.EQ.1)GO TO 215
ITYFLG=1
CALL RELEAS(ITYCH)
ISZ=0
IF(IBNK.EQ.1)ISZ=126
CALL DEFINE FILE(ITYCH,ISZ,NV,'TTYDAT.TMP',0,0)
410 IOROA=IORO.AND.1
IF(IOROA.EQ.1)GO TO 411
IPJ=IPROJ
IPG=IPROG
IDVI=IDV
NDEVI=IDEV
NAMI(1)=INAME(1)
NAMI(2)=INAME(2)
GO TO 412
411 NAMO(1)=INAME(1)
NAMO(2)=INAME(2)
IDVO=IDV
412 CONTINUE
JONCE=1
RETURN
215 REWIND ITYCH
IDEV=ITYCH
GO TO 410
500 WRITE(IDLG,501)
501 FORMAT('-THIS ANSWER DEFINES WHERE THE PROGRAM IS TO FIND THE
1 INPUT DATA. IT'/' USUALLY CONSISTS OF A DEVICE, POSSIBLY A
2 FILENAME WITH OR WITHOUT AN'/' EXTENSION, AND A PROJECT-
3PROGRAMMER NUMBER.'//' POSSIBLE DEVICES ARE:'//6X,'DEVICES',3X,
4 'DESCRIPTION'/6X,7('-'),3X,11('-')/6X,'TTY:',6X,'TERMINAL'/
5 6X,'DSK:',6X,'DISK (FILENAME AND EXTENSION, PROJECT-PROGRAMMER
6 NUMBER'/22X,'MAY BE USED)'/6X,'CDR:',6X,'CARD READER (THIS
7 DEVICE IS NOT APPLICABLE ON TERMINAL'/30X,'JOBS)'/6X,'DTA#:',5X,
8 'DECTAPE UNIT (USER''S DECTAPE SHOULD ALREADY BE MOUNTED)'/6X,
9 'MTA#:',5X,'MAGTAPE UNIT (USER''S MAGTAPE SHOULD ALREADY BE
1 MOUNTED'/30X,'AND POSITIONED)'///' DEFAULTS:'//' (1) IF NO INPUT
2 DEVICE IS SPECIFIED BUT A FILENAME IS GIVEN, THE'/6X,'DEFAULT
3 DEVICE WILL BE DSK:'//' (2) IF A DEVICE WHICH REQUIRES A
4 FILENAME AND EXTENSION IS SPECIFIED,'/6X,'BUT NO FILENAME IS
5 GIVEN, THE DEFAULT NAME WILL BE INPUT.DAT'//' (3) IF NO RESPONSE
6 IS GIVEN, I.E. A CARRIAGE RETURN <CR> IS ENTERED,'/6X,'THE
7 DEFAULT DEVICE IS TTY: ON JOBS RUN FROM TERMINALS; AND'/28X,'CDR:
8 ON BATCH JOBS'//' (4) IF DSK: IS SPECIFIED AS THE INPUT DEVICE
9 AND NO PROJECT-PROGRAMMER'/6X,'NUMBER IS GIVEN, THE USER''S
1 PROJECT-PROGRAMMER NUMBER WILL BE'/6X,'ASSUMED.'///)
WRITE(IDLG,502) L1,L2
502 FORMAT(' EXAMPLES: DATA.DAT'/14X,'TEST.DAT',A1,'420,420',A1/
1 14X,'MTA0:'/14X,'DTA2:FILE1'//' NOTE: THE FOLLOWING RESPONSES
2 ARE VALID AFTER THE FIRST "INPUT?"'//' (1) SAME COMMAND. IF THE
3 DATA FILE TO BE USED IS THE SAME AS THE'/6X,'PRECEEDING ONE, THE
5 USER MAY SIMPLY ENTER "SAME"'//' (2) FINISH COMMAND. THE USER
6 MUST ENTER "FINISH" TO EXIT FROM THE'/6X,'PROGRAM. THIS ENSURES
7 THAT OUTPUT ASSIGNED TO LPT: WILL BE'/6X,'PRINTED. FAILURE TO
8 USE THE "FINISH" COMMAND MAY RESULT IN'/6X,'LOSING THE ENTIRE
9 OUTPUT FILE.'//' (3) A ^Z (CONTROL Z) WILL RESULT IN THE SAME
1 ACTION AS THE "FINISH"'/6X,'COMMAND.'///)
503 CALL RELEAS (IDLG)
GO TO (401,403,401,403),IORO+1
600 WRITE(IDLG,601)
601 FORMAT('-THE ANSWER DEFINES WHERE THE OUTPUT FROM THE PROGRAM
1 IS TO BE PLACED.'/' IT USUALLY CONSISTS OF A DEVICE AND POSSIBLY
2 A FILENAME WITH OR WITH-'/' OUT AN EXTENSION.'//' POSSIBLE
3 DEVICES ARE:'//6X,'DEVICE',3X,'DESCRIPTION'/6X,6('-'),3X,
4 11('-')/6X,'TTY:',5X,'TERMINAL'/6X,'DSK:',5X,'DISK (FILENAME
5 AND EXTENSION MAY BE USED)'/6X,'LPT:',5X,'LINEPRINTER (MULTIPLE
6 COPIES MAY BE REQUESTED BY USE OF'/29X,'THE "/COPIES" COMMAND)'/
7 6X,'DTA#:',4X,'DECTAPE UNIT (USER''S DECTAPE SHOULD ALREADY
8 BE MOUNTED;'/29X,'FILENAME AND EXTENSION MAY BE USED.)'/
9 6X,'MTA#:',4X,'MAGTAPE UNIT (USER''S MAGTAPE SHOULD ALREADY
1 BE MOUNTED'/29X,'AND POSITIONED)'///' DEFAULTS:'//' (1) IF NO
2 OUTPUT DEVICE IS SPECIFIED BUT A FILENAME IS GIVEN, THE'/6X,
3 'DEFAULT DEVICE WILL BE DSK:'//' (2) IF A DEVICE WHICH REQUIRES
4 A FILENAME AND EXTENSION IS SPECIFIED,'/6X,'BUT NO FILENAME IS
5 GIVEN, THE DEFAULT NAME WILL BE OUTPT.DAT'//' (3) IF NO RESPONSE
6 IS GIVEN, I.E. A CARRIAGE RETURN <CR> IS ENTERED,'/6X,'THE
7 DEFAULT DEVICE IS TTY: ON JOBS RUN FROM TERMINALS; AND'/28X,'LPT:
8 ON BATCH JOBS'//' (4) IF LPT: IS LISTED AS THE OUTPUT DEVICE,
9 THE NUMBER OF COPIES WILL'/6X,'DEFAULT TO 1.'///
1 ' EXAMPLES: LPT:/2'/14X,'RPT.DAT'/14X,'DTA0:NAME.DAT'///)
GO TO 503
END
C
C THIS IS A SUBROUTINE WHICH WILL ASK FOR
C A FORMAT, ENTER THAT FORMAT AND RETURN
C
C THE ARGUMENTS ARE:
C
C IDLG - DEVICE NUMBER FOR OUTPUTTING DIALOGUE
C INP - DEVICE NUMBER FOR INPUTTING THE FORMAT
C IFMT - ARRAY WHICH WILL CONTAIN THE FORMAT
C ISTD - WILL INDICATE WHETHER STANDARD FORMAT IS
C REQUESTED
C 1 - STANDARD FORMAT IS REQUESTED
C 0 - FORMAT TO BE USED IS CONTAINED IN IFMT
C N - MAXIMUM SIZE OF THE FORMAT, NORMALLY THIS
C WILL BE THE NUMBER OF WORDS DIMENSIONED IN
C THE MAINLINE FOR IFMT
C ITYPE- INDICATE WHAT TYPE OF FORMAT TO USE
C 1 - IF I-TYPE IS TO BE USED
C 2 - IF F-TYPE IS TO BE USED
C 3 - IF A-TYPE IS TO BE USED
C 4 - NEITHER ONE OF THE ABOVE 3
C
SUBROUTINE GETFOR(IDLG,INP,IFMT,ISTD,N,ITYPE)
DIMENSION IFMT(1),IN(80),IDUM(3)
DATA IDUM/'I','F','A'/
KL=0
12 ISTD=0
L=0
NN=80
KOUNT=0
IF(N.EQ.0)CALL EXIT
IF (ITYPE.EQ.4) WRITE(IDLG,2)
2 FORMAT(' FORMAT'/)
IF (ITYPE.LE.3) WRITE(IDLG,120) IDUM(ITYPE)
120 FORMAT(' FORMAT: (',A1,'-TYPE ONLY)'/)
READ(INP,3)(IN(I),I=1,80)
3 FORMAT(80A1)
IF(L.EQ.1)GO TO 13
IF(IN(1).EQ.'S'.AND.IN(2).EQ.'A'.AND.IN(3).EQ.'M')RETURN
DO 1 I=1,N
1 IFMT(I)=' '
L=1
13 IF(N.LT.16)NN=N*5
DO 4 I=1,NN
IF(IN(I).NE.' ')GO TO 5
4 CONTINUE
6 ISTD=1
RETURN
5 IF(IN(I).NE.'(')GO TO 6
IBEG=1
9 ENCODE(NN,7,IFMT(IBEG))(IN(I),I=1,NN)
7 FORMAT(80A1)
DO 8 I=1,NN
IF(IN(I).EQ.'(')KOUNT=KOUNT+1
IF(IN(I).EQ.')')KOUNT=KOUNT-1
8 CONTINUE
IF(KOUNT.LT.1)RETURN
IBEG=IBEG+16
IF((IBEG+16).GT.N)NN=(N-IBEG+1)*5
IF(NN.LT.1)GO TO 10
READ(INP,3)(IN(I),I=1,80)
GO TO 9
10 IF(KL.EQ.1)CALL EXIT
WRITE(IDLG,11)
11 FORMAT(' ERROR IN FORMAT, TRY AGAIN.'/)
KL=1
GO TO 12
END
FUNCTION TPCT(ALPHA,KDF)
Z=ALPHA*ALPHA
Q=1./Z
T=SQRT(ALOG(Q))
U=((.010328*T+.802853)*T+2.515517)
C****WMU-AM:APLB10.FOR, MOD=3, WG,27-NOV-78 ****
V=(((.001308*T+.189269)*T+1.432788)*T+1.)
C**** END(FUNCTION TPCT), MOD=3
XP=T-U/V
X2=XP*XP
A=XP*(X2+1.)/4.
B=((5.*X2+16.)*X2+3.)*XP/96.
C=(((3.*X2+19.)*X2+17.)*X2-15.)*XP/384.
D=((((79.*X2+776.)*X2+1482.)*X2-1920.)*X2-945.)*XP/92160.
E=(((((27.*X2+339.)*X2+930.)*X2-1782.)*X2-765.)*X2+17955.)*XP/3686
140.
V=1./KDF
TPCT=XP+(A+(B+(C+(D+E*V)*V)*V)*V)*V
RETURN
END
FUNCTION FPCT(ALPHA,K1,K2)
SIG=1./K1+1./K2
DELT=1./K1-1./K2
Z=ALPHA*ALPHA
Q=1./Z
T=SQRT(ALOG(Q))
C=((.010328*T+.802853)*T+2.515517)
D=(((.001308*T+.189269)*T+1.432788)*T+1.)
E=C/D
XP=T-E
X=XP*XP
Z1=SQRT(SIG/2.)*XP
Z2=DELT*(X+2.)/6.
Z3=SQRT(SIG/2.)*(SIG*((X+3.)*XP)/24.+DELT**2*((X+11.)*XP)/(SIG*72.
1))
Z4=DELT*SIG*((X+9.)*X+8.)/120.-DELT**3*((3.*X+7.)*X-16.)/(SIG*3240
1.)
Z5=SQRT(SIG/2.)*(SIG**2*(((X+20.)*X+15.)*XP)/1920.+DELT**2*(((X+44
1.)*X+183.)*XP)/2880.+DELT**4*(((9.*X-284.)*X-1513)*XP)/(SIG**2*155
2520.))
Z6=DELT*SIG**2*(((4.*X-25.)*X-177.)*X+192.)/20160.+DELT**3*(((4.*X
1+101.)*X+117.)*X-480.)/90720.-DELT**5*(((12.*X+513.)*X+841.)*X-256
20.)/(SIG**2*1632960.)
Z7=SQRT(SIG/2.)*(SIG**3*((((X+7.)*X+7.)*X+105.)*XP)/21504.+DELT*SI
1G**2*((((801.*X+10511.)*X+30151.)*X+62241.)*XP)/4838400.-DELT**4*(
2(((477.*X+4507.)*X-82933.)*X-264363)*XP)/(SIG*43545600.)+DELT**6*(
3(((3753.*X+55383.)*X-368897.)*X-1213927.)*XP)/(SIG**3*1175731200.)
4)
ZP=Z1-Z2+Z3-Z4+Z5+Z6-Z7
AN=2.*ZP
FPCT=EXP(AN)
RETURN
END
C SUBROUTINE CALCULATES PROBABILITIES FOR CHI SQUARES
C CALLING SEQUENCE CALL CHIPRB(CHI,NF,PROB)
C WHERE CHI - VALUE OF CHI SQUARE
C NF - FIXED POINT DEGREES OF FREEDOM
C PROB - RETURNS PROBABILITY OF CHISQUARE (99 IF ERROR)
C
C ROUTINE FORM COMMUNICATIONS OF ACM APRIL 1967, CAS
C ALSO THE SUBROUTINE NORMCV. MACHINE ACCURACY ON EVEN DEGREES
C OF FREEDOM, AT LEAST 4 PLACES OF ACCURACY ON ODD DEGREES OF
C FREEDOM.(FOR ALL TABLES COMPARED AGAINST, THE PROBABILITY
C FROM THE PROGRAM AGREED TO ALL PLACES[BEST WAS 5])
C
SUBROUTINE CHIPRB(CHI,NF,PROB)
PROB=99
IF((CHI.LT.0).OR.(NF.LT.1)) RETURN
IEVEN=NF.AND.1
A=.5*CHI
Y=0
C EXP(-85)(=1.216E-37) IS THE BEST WHICH CAN BE USED WITH PDP
IF(((IEVEN.EQ.0).OR.(NF.GT.2)).AND.(A.LT.85)) Y=EXP(-A)
S=Y
IF(IEVEN.EQ.0) GO TO 3
S=-SQRT(CHI)
CALL NORMCV(S,P)
S=2.*P
3 IF(NF.LE.2) GO TO 5
X=.5*(NF-1.)
Z=1.
IF(IEVEN.EQ.1) Z=.5
IF(A.LT.85) GO TO 2
C
C
C
E=0
C .572364942925=LN(SQRT(PIE))
IF(IEVEN.EQ.1) E=.572364942925
C=ALOG(A)
1 E=ALOG(Z)+E
SL=C*Z-A-E
IF((SL.LT.-85).OR.(SL.GT.85)) GO TO 7
S=S+EXP(SL)
7 Z=Z+1.
IF(Z.LE.X) GO TO 1
PROB=S
GO TO 6
C
C
C
2 E=1
C .564189583548=1/SQRT(PIE)
IF(IEVEN.EQ.1) E=.564189583548/SQRT(A)
CL=0
C=0
4 E=E*A/Z
CL=C+E
IF(CL.EQ.C) GO TO 8
C=CL
Z=Z+1.
IF(Z.LT.X) GO TO 4
8 PROB=C*Y+S
GO TO 6
5 PROB=S
6 IF(PROB.LT.0) PROB=0
IF(PROB.GT.1.) PROB=1.
RETURN
END
C **** STAT PACK ****
C SUBROTINE USED TO FIND CUMULATIVE NORMAL PROBABILITIES FOR Z'S.
C CALLING SEQUENCE: CALL NORMCV(X,PROB)
C WHERE X - IS THE Z-VALUE FOR WHICH THE PROBABILITY IS TO BE FOUND
C PROB - IS CUMULATIVE PROBABILITY FOR THE Z.
C
C ROUTINE WRITTEN FROM SPECIFICATIONS IN ACM COMMUNICATIONS
C (JUNE 1967), WITH THE IMPROVEMENTS NOTED IN THE ACM COMMUNICATIONS
C FROM OCTOBER 1969. ROUTINE USED IN CACCULATING THE CHISQUARE
C PROBABILITIES ALSO.
C
SUBROUTINE NORMCV(X,PROB)
IF(X.EQ.0) GO TO 7
Z=ABS(X)
X2=X*X
Y=0
A=.5*X2
IF(A.GT.85) GO TO 6
C .39894228=1/SQRT(2*PIE)
Y=.398942280401432678*EXP(-A)
6 A=Y/Z
IF((X.GT.0).AND.((1.0-A).EQ.1.0)) GO TO 8
IF((X.LT.0).AND.(A.EQ.0)) GO TO 9
IF((Z.GT.2.32).AND.(X.GT.0)) GO TO 2
IF((Z.GT.3.5).AND.(X.LT.0)) GO TO 2
S=Y*Z
Z=S
D=1.
1 D=D+2.
T=S
Z=Z*X2/D
S=S+Z
IF(S.EQ.T) GO TO 5
GO TO 1
5 PROB=.5-S
IF(X.GT.0) PROB=.5+S
GO TO 10
2 A1=2.
A2=0.
D=X2+3.
P1=Y
Q1=Z
P2=(D-1.0)*Y
Q2=D*Z
R=P1/Q1
T=P2/Q2
IF(X.LT.0) GO TO 3
R=1.-R
T=1.-T
3 D=D+4.
A1=A1-8.
A2=A1+A2
S=A2*P1+D*P2
P1=P2
P2=S
S=A2*Q1+D*Q2
Q1=Q2
Q2=S
S=R
R=T
T=P2/Q2
IF(X.GT.0) T=1.-T
IF(R.EQ.T) GO TO 4
IF(S.NE.T) GO TO 3
4 PROB=T
GO TO 10
7 PROB=.5
GO TO 10
8 PROB=1.0
GO TO 10
9 PROB=0
GO TO 10
10 RETURN
END
FUNCTION FISHER(M,N,X)
C
C REFERENCE:
C COMMUNICATIONS OF THE A.C.M.
C FEBRUARY 1971, PAGE 117
C
C COMMENT:
C IF DF1=1 AND DF2>1000, INVERSE INTERPOLATION IS USED;
C FISHER=(1-1000/DF2)*FISHER(INFINITY)+1000/N*FISHER(1000)
C (PER: M. STOLINE - 28 APR 77)
C
C***** WMU-AM: #99.24.1, MOD=2, MTO, 24-OCT-77 *****
C
C MINOR REVISION (MOD=2) BY MTO ON 24-OCT-77
C (1) CLEANUP LOGIC & IMPROVE INTELLIGABLILITY
C (2) ADD INFORMATIVE ERROR MESSAGES FOR BAD DATA
C (3) ADD DOCUMENTAION WHERE CODE IS UNCLEAR
C (4) FIX BUG WHICH CAUSES THE INPUT PARAMETER 'N'
C TO BE MODIFIED (SET TO 0) WHEN 'X' IS ZERO
C (5) PAGINATE THE ENTIRE LIBRARY
C
C INPUT PARAMETERS:
C M = # OF DEGREES OF FREEDOM (BETWEEN)
C N = # OF DEGREES OF FREEDOM WITHIN
C X = 'F' VALUE TO FIND THE PROBABILITY OF
C
LOGICAL ODD, EVEN
ODD (N) = (N.AND.1) .NE. 0
EVEN(N) = .NOT. ODD(N)
C**SAVE 'N' IN 'NX' SO WE CAN RESTORE IT LATER
NX=N
IF(X.EQ.0.0)GO TO 321
IF(M.EQ.1)GO TO 200
C**THIS STATEMENT REMOVED BECAUSE THE ROUTINE AT
C**201 IS INCORRECT**RRB**3MAY77**
C** IF((M+N).GT.400)GO TO 201
200 NX=N
IF(N.GT.1000)N=1000
C** IF M,N IS ODD, SET NA,NB TO 1
C** IF M,N IS EVEN, SET NA,NB TO 2
NA=2*(M/2)-M+2
NB=2*(N/2)-N+2
IF(N.EQ.0) TYPE 1
1 FORMAT (' % FISHER: ZERO DEGREES OF FREEDOM WITHIN')
W=X*FLOAT(M)/FLOAT(N)
Z=1.0/(1.0+W)
IF (ODD (M)) GOTO 10
IF (ODD (N)) GOTO 9
C**(M EVEN, N EVEN)
D=Z*Z
P=W*Z
GO TO 100
C**(M EVEN, N ODD)
9 P=SQRT(Z)
D=0.5*Z*P
P=1.0-P
GO TO 100
C**(M ODD, N EVEN)
10 IF (ODD (N)) GOTO 15
P=SQRT(W*Z)
D=0.5*P*Z/W
GO TO 100
C**(M ODD, N ODD)
15 P=SQRT(W)
Y=.3183098862
D=Y*Z/P
P=2.0*Y*ATAN(P)
100 Y=2.0*W/Z
IF(N.LT.(NB+2))GO TO 111
IF (EVEN (M)) GOTO 105
DO 101 J=NB+2,N,2
D=(1.0+FLOAT(NA)/FLOAT(J-2))*D*Z
101 P=P+D*Y/FLOAT(J-1)
GO TO 111
105 ZK=0
IF((ALOG10(Z)*(N-1)/2).GE.-37) ZK=Z**((N-1)/2)
107 D=D*ZK*FLOAT(N)/FLOAT(NB)
P=P*ZK+W*Z*(ZK-1.0)/(Z-1.0)
111 CONTINUE
Y=W*Z
Z=2.0/Z
NB=N-2
IF(M.LT.(NA+2)) GO TO 103
DO 102 I=NA+2,M,2
J=I+NB
D=Y*D*FLOAT(J)/FLOAT(I-2)
P=P-Z*D/FLOAT(J)
102 CONTINUE
103 FISHER=1-P
IF(FISHER.LT.0)FISHER=0
GO TO 322
321 FISHER=1.0
322 N=NX
IF(N.LE.1000)RETURN
IF(X.LT.0.0) TYPE 2
2 FORMAT (' % FISHER: NEGATIVE F-VALUE')
FP2=(1.-CDFN(SQRT(X)))*2.
FISHER=(1.-1000./N)*FP2+(1000./N)*FISHER
RETURN
C**FROM HERE ON DOWN, CODE IS INCORRECT AND INACCESSABLE
201 IND=0
MI=M
NI=N
XI=X
IF(XI.GE.1)GO TO 203
IND=1
ISAVE=NI
NI=MI
MI=ISAVE
XI=1.0/XI
203 Z1=2.0/FLOAT(9*MI)
Z2=2.0/FLOAT(9*NI)
Z=ABS((1.0-Z2)*XI**(.33333333)-1.0+Z1)
Z=Z/SQRT(Z2*XI**(.66666667)+Z1)
C IF(N.GE.4)GO TO 205
IF(NI.GE.4)GO TO 205
Z=Z*(1.0+.08*Z**4)/FLOAT(NI)**3
205 Z=(1.0+Z*(.196854+Z*(.115194+Z*(.000344+Z*.019527))))**4
FISHER=.5/Z
IF(IND.EQ.1)FISHER=1.0-FISHER
RETURN
C***** WMU-AM: END=FISHER, #205+4 *****
END
FUNCTION CDFN(X)
C
C CDF OF STANDARD UNIT NORMAL
C
C THIS FUNCTION CALCULATES THE CDF
C PROBABILITY CDFN(Y) ASSOCIATED
C WITH THE INPUTTED VALUE Y FOR THE
C STANDARD UNIT NORMAL DISTRIBUTION.
C
C SOURCE: ABRAMOWITZ, M. AND STEGUN, I.A. (1964),
C "HANDBOOK OF MATHEMATICAL FUNCTIONS WITH
C FORMULAS, GRAPHS, AND MATHEMATICAL TABLES"
C (FORMULA 26.2.17, P.932)
C
T = 1./(1.+(.231642)*ABS(X))
TEMP = (.319382)*T-(.356564)*T**2+(1.781478)*T**3-(1.821256)*T**4
#+ (1.330274)*T**5
Z = (.398942)*EXP(-.5*X**2)
CDFN = Z*TEMP
IF(X.GT.0) CDFN = 1.-CDFN
RETURN
END
C FORGEN.F4 - A DIALOGUE FORMAT GENERATOR
C
C WRITTEN BY RUSSELL R. BARR - WMU COMPUTER CENTER
C DATE: 20 JUL 73
C
C THE OBJECT-TIME, SAME AND STANDARD OPTIONS
C ARE ADAPTED FROM THE SUBROUTINE GETFOR.F4
C WRITTEN BY SAM ANEMA - FEB 1972 - WMU COMPUTER CENTER
C
C INPUTS:
C ISIZE - LENGTH OF ARRAY IFT
C MODE* - ARRAY CONTAINING TYPE OF EACH FIELD IN ASCII
C (A,F OR I)
C MSIZE* - NUMBER OF FIELDS
C IDLG - DIALOGUE OUTPUT
C IRSP - DIALOGUE INPUT
C NDEVI - NOT USED
C NDEVO - NOT USED
C IDVI - NOT USED
C IDVO - NOT USED
C ICODE - 0 = TTY INPUT
C 1 = PTY INPUT(BATCH)
C IBNK - NOT USED
C NAMI - NOT USED
C ITYPE - INDICATE WHAT TYPE OF FORMAT TO USE
C 0 - IF ONLY DIALOGUE FORM IS TO BE USED
C 1 - IF I-TYPE IS TO BE USED
C 2 - IF F-TYPE IS TO BE USED
C 3 - IF A-TYPE IS TO BE USED
C 4 - NEITHER ONE OF THE ABOVE 3
C
C * - IF EITHER OR BOTH NOT SPECIFIED, QUESTIONS AT 7751 AND/OR
C 800 WILL BE ASKED.
C
C OUTPUTS:
C IFT - FORMAT
C ISTD - WILL INDICATE WHETHER STANDARD FORMAT IS
C REQUESTED
C 1 - STANDARD FORMAT IS REQUESTED
C 0 - FORMAT TO BE USED IS CONTAINED IN IFT
C ISIZE - LENGTH OF ARRAY IFT
C MODE - ARRAY CONTAINING TYPE OF EACH FIELD IN ASCII
C (A,F OR I)
C MSIZE - NUMBER OF FIELDS
C JLEN - CHARACTERS PER FIELD
C IERR - 0 NO ERRORS
C 1 FATAL ERROR
C -1 RESPONSE ERROR
C
C NOTE: ARGUMENTS NOT PASSED IN CALL STATEMENT, ARE PASSED IN
C COMMON - IOBLK
C
SUBROUTINE FORGEN(IFT,ISIZE,MODE,JLEN,MSIZE,ITYPE,ISTD,IERR)
COMMON/IOBLK/IDLG,IRSP,NDEVI,NDEVO,IDVI,IDVO,ICODE,IBNK,NAMI(2)
DIMENSION IFT(1),MODE(1),JLEN(1),JFT(20)
DIMENSION IDUM(3),IN(80),MESS(3,3)
DATA IDUM/'I','F','A'/
DATA ((MESS(I,J),J=1,3),I=1,3)/'S','A','M','S','T','D','H',
1 'E','L'/
KL=0
N=ISIZE
C INITIAL AND QUERY/RESPONSE PATH
700 IERR=0
KOUNT=0
ISTD=0
L=0
NN=80
IF(ITYPE.EQ.0)GO TO 775
IF(ITYPE.EQ.4)WRITE(IDLG,704)
704 FORMAT(' FORMAT')
IF(ITYPE.LE.3)WRITE(IDLG,708)IDUM(ITYPE)
708 FORMAT(' FORMAT: (',A1,' - TYPE ONLY)')
IF(ITYPE.LE.4)WRITE(IDLG,712)
712 FORMAT(' TYPE "HELP" FOR EXPLANATION',/)
READ(IRSP,756,END=520,ERR=764)IN
C CHECK FOR 'SAM','STD','HEL' OPTION
DO 724 I=1,3
DO 720 J=1,3
IF(IN(J).NE.MESS(I,J))GO TO 724
720 CONTINUE
C TO: SAM STD HEL
GO TO (746,744,772),I
724 CONTINUE
C FORTRAN TYPE INPUT OR BLANKS(STD)
736 IF(L.EQ.1)GO TO 752
C CHECK FOR LEFT PAREN AS FIRST NON BLANK CHAR(IF FIRST LINE ONLY).
DO 740 I=1,NN
IF(IN(I).EQ.' ')GO TO 740
IF(IN(I).NE.'(')GO TO 764
GO TO 748
740 CONTINUE
C 'STD' FORMAT
744 ISTD=1
RETURN
C 'SAM' OPTION
746 RETURN
C ENCODE 'IN' INTO 'IFT'
748 IBEG=1
L=1
752 ENCODE(NN,756,IFT(IBEG))(IN(I),I=1,NN)
756 FORMAT(80A1)
C THIS PAREN COUNT ASSUMES NO PARENS IN HOLLERITHS
DO 760 I=1,NN
IF(IN(I).EQ.'(')KOUNT=KOUNT+1
IF(IN(I).EQ.')')KOUNT=KOUNT-1
760 CONTINUE
C 'KOUNT' DECIDES WHEN TO STOP ASKING FOR LINES
IF(KOUNT.LT.0)GO TO 764
IF(KOUNT.EQ.0)RETURN
IBEG=IBEG+16
IF((IBEG+16).GT.N)NN=(N-IBEG+1)*5
IF(NN.LT.1)GO TO 764
READ(IRSP,756,END=520,ERR=766)IN
GO TO 752
C ERROR PATH
764 IF(KL.NE.1)GO TO 766
765 WRITE(IDLG,784)
7651 IERR=-1
RETURN
C 1ST ERROR ONLY
766 WRITE(IDLG,768)
768 FORMAT(' ERROR IN FORMAT, TRY AGAIN.',/)
KL=1
GO TO 700
C
C HELP PATH
C
772 KL=0
WRITE(IDLG,773)
773 FORMAT(' THERE ARE FOUR METHODS OF FORMAT ENTRY:',/,
1 ' 1 - STANDARD FORMAT',/,' 2 - FORTRAN OBJECT-TIME',/,
1 ' 3 - USE SAME FORMAT AS PREVIOUSLY',/,
1 ' 4 - DIALOGUE',//,' WHICH METHOD?(1,2,3 OR 4) ',$)
READ(IRSP,780,END=520,ERR=774)METHOD
IF(METHOD.LT.1.OR.METHOD.GT.4)GO TO 774
GO TO (744,700,746,775),METHOD
774 IF(KL.EQ.1)GO TO 765
KL=1
WRITE(IDLG,784)
GO TO 772
C DIALOGUE PATH
775 IF(MSIZE.NE.0)GO TO 788
KL=0
7751 WRITE(IDLG,776)
776 FORMAT(' HOW MANY FIELDS? ',$)
778 READ(IRSP,780,END=520,ERR=782)MSIZE
780 FORMAT(I)
IF(MSIZE.GT.0.AND.MSIZE.LE.999)GO TO 788
782 IF(KL.EQ.1)GO TO 765
KL=1
WRITE(IDLG,784)
784 FORMAT(' RESPONSE ERROR',/)
GO TO 7751
788 DO 796 I=1,MSIZE
DO 792 J=1,3
IF(MODE(I).EQ.IDUM(J))GO TO 796
792 CONTINUE
KL=0
GO TO 800
796 CONTINUE
GO TO 820
800 WRITE(IDLG,804)
804 FORMAT(' ENTER TYPES OF FIELDS(A,F OR I) 10 PER LINE',/)
READ(IRSP,808,END=520,ERR=814)(MODE(I),I=1,MSIZE)
808 FORMAT(10A1)
DO 816 I=1,MSIZE
DO 812 J=1,3
IF(MODE(I).EQ.IDUM(J))GO TO 816
812 CONTINUE
814 IF(KL.EQ.1)GO TO 765
KL=1
WRITE(IDLG,784)
GO TO 800
816 CONTINUE
820 X=' '
DO 102 I=1,MSIZE
IF(MODE(I).NE.'F')GO TO 102
X=',D'
GO TO 103
102 CONTINUE
103 WRITE(IDLG,104)X
104 FORMAT(' ENTER SPECIFICATIONS FOR FIELDS IN THE FOLLOWING'
1 ' FORM - A,B,C',A2,/,' WHERE:',/,' A IS THE CARD OR RECORD',
1 ' CONTAINING THE FIELD',/,' B IS THE STARTING COLUMN OF THE',
1 ' FIELD',/,' C IS THE LAST COLUMN OF THE FIELD')
IF(X.NE.' ')WRITE(IDLG,105)
105 FORMAT(' D IS THE NUMBER OF DIGITS FOLLOWING THE DECIMAL',
1 ' POINT',/)
WRITE(IDLG,106)
106 FORMAT(' ENTER SPECIFICATIONS IN ORDER.',/)
DO 108 I=1,ISIZE
108 IFT(I)=0
110 IV=0
ISIZE=300
KHAR=1
KHARL=0
KOLUMN=0
LINE=1
JFT(KHAR)='('
117 KL=0
118 IVP=IV+1
IF(IVP.GT.MSIZE)GO TO 500
WRITE(IDLG,119)IVP
119 FORMAT(1X,I4,':',$)
121 READ(IRSP,122,END=520,ERR=612)KARD,INIT,LAST,IDP
122 FORMAT(4I)
IV=IV+1
IF(KARD.EQ.0)GO TO 610
IF(KARD-LINE+13+KHARL.GT.ISIZE)GO TO 630
IF(KARD.LT.LINE)GO TO 610
IF(INIT-KOLUMN-1.GT.999)GO TO 610
IF(LAST.LT.INIT)GO TO 610
JLEN(IV)=LAST-INIT+1
IF(IDP.GT.LAST-INIT+1.AND.MODE(IV).EQ.'F')
1 GO TO 610
IF(KARD.EQ.LINE)GO TO 200
C / SECTION
DO 130 I=KHAR+1,KHAR+KARD-LINE
130 JFT(I)='/'
KHAR=KHAR+KARD-LINE+1
LINE=KARD
JFT(KHAR)=','
KOLUMN=0
IF(INIT.EQ.0)GO TO 500
200 IF(INIT.LE.KOLUMN)GO TO 610
C X SECTION
JX=INIT-KOLUMN-1
IF(JX.EQ.0)GO TO 300
CALL NUMBER(JFT,KHAR,JX)
KOLUMN=INIT-1
KHAR=KHAR+1
JFT(KHAR)='X'
KHAR=KHAR+1
JFT(KHAR)=','
300 IF(MODE(IV).NE.'A')GO TO 350
CALL ALPHA(INIT,LAST,JFT,KHAR)
GO TO 400
C COMBINED I/F SECTION
350 KHAR=KHAR+1
JFT(KHAR)=MODE(IV)
LONG=LAST-INIT+1
IF(LONG.GT.99)GO TO 610
CALL NUMBER(JFT,KHAR,LONG)
IF(MODE(IV).NE.'F')GO TO 400
C F SECTION
KHAR=KHAR+1
JFT(KHAR)='.'
CALL NUMBER(JFT,KHAR,IDP)
C COMPACTING SECTION
400 ENCODE(KHAR,410,IFT(KHARL+1))(JFT(I),I=1,KHAR)
410 FORMAT(50A1)
KHARL=KHARL+KHAR/5.+.9
KHAR=1
JFT(KHAR)=','
KOLUMN=LAST
GO TO 117
C CLEAN UP AND FINISH
500 KL=0
501 WRITE(IDLG,502)
502 FORMAT(' HOW MANY CARDS PER OBSERVATION? ',$)
READ(IRSP,122,END=520,ERR=504)IOBS
IF(IOBS.GE.LINE)GO TO 508
504 IF(KL.EQ.1)GO TO 765
KL=1
WRITE(IDLG,784)
GO TO 501
508 IF(IOBS.EQ.LINE)GO TO 512
DO 510 I=KHAR+1,KHAR+IOBS-LINE
510 JFT(I)='/'
KHAR=KHAR+IOBS-LINE+1
C OVER WRITE COMMA
512 JFT(KHAR)=')'
ENCODE(KHAR,410,IFT(KHARL+1))(JFT(I),I=1,KHAR)
WRITE(IDLG,514)
514 FORMAT(' OK?(YES OR NO) ',$)
READ(IRSP,516,END=520,ERR=520)ANS
516 FORMAT(A3)
IF(ANS.EQ.'YES')RETURN
IF(ICODE.NE.0)GO TO 7651
534 WRITE(IDLG,535)
535 FORMAT(' START FROM BEGINNING')
GO TO 775
612 IF(KL.EQ.1)GO TO 765
KL=1
610 WRITE(IDLG,784)
WRITE(IDLG,613)
613 FORMAT(' SPECIFICATIONS MUST NOT OVERLAP OR BE OUT OF ORDER',/)
IV=IV-1
GO TO 118
520 WRITE(IDLG,522)
522 FORMAT(' END OF FILE OR NON RECOVERABLE INPUT ERROR')
GO TO 537
630 WRITE(IDLG,632)
632 FORMAT(' STORAGE CAPACITY EXCEEDED FOR FORMAT')
C FATAL ERROR
537 IERR=+1
RETURN
END
C
C ALPHA FORMAT SECTION - MADE TO USE AS A STAND ALONE SUBR.
C
C
SUBROUTINE ALPHA(INIT,LAST,JFT,KHAR)
DIMENSION JLEN(1),JFT(1)
IFULLS=(LAST-INIT+1)/5
IF(IFULLS.EQ.0)GO TO 310
IF(IFULLS.GT.1)CALL NUMBER(JFT,KHAR,IFULLS)
KHAR=KHAR+1
JFT(KHAR)='A'
KHAR=KHAR+1
JFT(KHAR)='5'
310 IDIF=LAST-INIT+1-(IFULLS*5)
IF(IDIF.EQ.0)RETURN
IF(IFULLS.EQ.0)GO TO 312
KHAR=KHAR+1
JFT(KHAR)=','
312 KHAR=KHAR+1
JFT(KHAR)='A'
CALL NUMBER(JFT,KHAR,IDIF)
JLEN(IV)=IFULLS+1
RETURN
END
C
C
C THIS ROUTINE TRANSLATES INTEGER(NUM) TO ASCII AND PLACES
C IT IN THE PROPER PLACES IN ARRAY(IFT) STARTING WITH
C LOCATION: IFT(KHAR+1).
C
SUBROUTINE NUMBER(IFT,KHAR,NUM)
DIMENSION IFT(1)
INTEGER DIGIT(0/9)
DATA DIGIT/'0','1','2','3','4','5','6','7','8','9'/
NUMA=NUM
ID=1000
IFST=0
1 IR=NUMA/ID
IF(IR.NE.0)GO TO 2
IF(IFST.NE.0)GO TO 2
IF(ID.EQ.1)GO TO 2
GO TO 4
2 IFST=1
3 KHAR=KHAR+1
IFT(KHAR)=DIGIT(IR)
4 IF(ID.EQ.1)RETURN
NUMA=NUMA-IR*ID
ID=ID/10
GO TO 1
END
SUBROUTINE GETVAR(N,NAME,IVAR,IERR)
COMMON /IOBLK/IDLG,IRSP,NDEVI,NDEVO,IDVI,IDVO,ICODE,IBNK,NAMI(2)
COMMON /VARTMP/IDUM(72),ISAVE(5)
DIMENSION NAME(1)
C
C
C SUBROUTINE TO GET VARIABLE NAME OR NUMBER FROM TTY
C
C N IS NUMBER OF VARIABLES
C NAME IS VECTOR CONTAINING VARIABLES NAMES
C IVAR IS VARIABLE NUMBER RETURNED
C IERR IS: 0 OK
C : 1 ILLEGAL VARIABLE NAME
C :-1 ILLEAGEL VARIABLE NUMBER
C
C
IERR=0
READ(IDLG,100) (IDUM(I),I=1,10)
100 FORMAT(10A1)
IF((IDUM(1).LT.'0').OR.(IDUM(1).GT.'9')) GOTO 1
C
C INPUT IS VARIABLE NUMBER
C
REREAD 101,IVAR
101 FORMAT(I)
IF((IVAR.GE.1).AND.(IVAR.LE.N)) GOTO 999
IERR=-1
GOTO 999
C
C INPUT IS VARIABLE NAME
C
1 IS=0
DO 2 I=1,5
2 ISAVE(I)=' '
I=0
3 I=I+1
IF(I.GT.10) GOTO 4
IF(IDUM(I).EQ.' ') GOTO 3
IS=IS+1
IF(IS.LE.5) ISAVE(IS)=IDUM(I)
GOTO 3
C
C
4 IVAR=' '
ENCODE(5,100,IVAR) ISAVE
DO 5 I=1,N
IF(NAME(I).NE.IVAR) GOTO 5
IVAR=I
GOTO 999
5 CONTINUE
IERR=1
999 RETURN
END
SUBROUTINE GETLAB(NSIZE,NAME,NUM)
C
C THIS SUBROUTINE WAS WRITTEN BY BERENICE HOUCHARD ON 1974
C
C THE SUBROUTINE ACCEPTS EITHER THE TOTAL NUMBER OF VARIABLES IN
C THE ANALYSIS OR A STRING OF VARIABLE NAMES TO BE ASSIGNED TO
C THE VARIABLES AND HENCE IMPLICITLY DETERMINE THE TOTAL NUMBER OF
C VARIABLES IN THE ANALYSIS.
C
C A VARIABLE NAME CONSISTS OF ONE TO FIVE ALPHANUMERIC CHARACTERS
C THE FIRST BEING NON-NUMERIC. IT MAY NOT CONTAIN ANY OF THE
C FOLLOWING SYMBOLS:
C
C * ? - / , + ' . BLANK
C
C SEVERAL RESERVED WORDS MAY NOT BE USED AS VARIABLE NAMES, THEY
C ARE: ALL HELP EMPTY STOP OBS
C
C
C
C NSIZE=MAXIMUM NUMBER OF VARIABLES WHEN THIS ROUTINE
C IS CALLED AND NSIZE= NUMBER OF VARIABLES ON RETURNING
C
C NAME CONTAINS ASCII NAMES OF VARIABLES (A5)
C NUM CONTAINS NUMBER OF POSTION IN LIST
C
C
DIMENSION NAME(1),NUM(1),IRSYM(9),IRWRD(5)
COMMON/IOBLK/IDLG,ICC,INP,IOUT,IO2,IO3,ICODE,IBNK,NAMI(2)
COMMON /VARTMP/IDUM(72),ISAVE(5)
C
C
C
C
C
C
DATA IRSYM/' ','-','.','*','/','?','"','+',';'/
DATA IRWRD/'ALL','HELP','EMPTY','STOP','OBS'/
DATA IALT,IGRT/"155004020100,'$'/
C
C
MAX=NSIZE
DO 1122 I=1,MAX
1122 NUM(I)=I
C
1 WRITE(IDLG,10)
10 FORMAT(' ENTER # OF VARIABLES OR VARIABLE NAMES'/)
NSIZE=0
11 DO 110 I=1,5
110 ISAVE(I)=' '
CALL GES(IDUM,72,IEND)
NPT=1
IF (IEND.NE.2) GO TO 111
112 IF (ICODE) 1,1,901
111 IF ((IDUM(1).EQ.'H').AND.(IDUM(2).EQ.'E').AND.(IDUM(3).EQ.'L')
1 .AND.(IDUM(4).EQ.'P')) GO TO 90
L=IDUM(1)
IF ((L.LT.'0').OR.(L.GT.'9')) GO TO 20
C
C # OF VARIABLES ENTERED
C
DO 1230 I=10,1,-1
IF (IDUM(I).NE.' ') GO TO 124
1230 CONTINUE
124 J=I
IF ((IDUM(I).EQ.IALT).OR.(IDUM(I).EQ.IGRT)) J=I-1
DO 123 I=1,J
123 ISAVE(I)=IDUM(I)
12 IF (ISAVE(5).NE.' ') GO TO 121
DO 120 I=4,1,-1
120 ISAVE(I+1)=ISAVE(I)
ISAVE(1)=' '
GO TO 12
121 ENCODE(5,151,L) ISAVE
DECODE(5,122,L) NSIZE
122 FORMAT(I5)
C
C GENERATE VARIABLE NUMBERS
C
IF (NSIZE.LE.0) GO TO 19
IF (NSIZE.GT.MAX) GO TO 191
DO 13 I=1,NSIZE
DO 14 J=1,5
14 ISAVE(J)=' '
ENCODE(5,150,NAME(I)) I
150 FORMAT(I5)
DECODE(5,151,NAME(I)) ISAVE
151 FORMAT(5A1)
16 IF (ISAVE(1).NE.' ') GO TO 18
DO 17 K=1,4
17 ISAVE(K)=ISAVE(K+1)
ISAVE(5)=' '
GO TO 16
18 ENCODE(5,151,NAME(I)) ISAVE
NUM(I)=I
13 CONTINUE
RETURN
C
C
C
19 WRITE(IDLG,190) NSIZE
190 FORMAT('-ERROR: NUMBER OF VARIABLES ',I6,' OUTSIDE ALLOWABLE
1 RANGE,'/9X,'TRY AGAIN'/)
IF (ICODE.GE.0) GO TO 1
CALL EXIT
191 WRITE(IDLG,192)
192 FORMAT('-ERROR: VARIABLE NAME LIST TOO LONG, CONTACT COMPUTER
1 CENTER STAFF'/9X,'FOR HELP'/)
CALL EXIT
C
C VARIABLE NAMES ENTERED
C
20 DO 200 LAST=72,1,-1
IF (IDUM(LAST).NE.' ') GO TO 201
200 CONTINUE
GO TO 40
201 ISUB=0
N=0
DO 21 K=1,LAST
L=IDUM(K)
IF ((L.EQ.',').OR.(L.EQ.IALT).OR.(L.EQ.IGRT)) GO TO 30
IF (L.EQ.' ') GO TO 21
DO 22 I=2,9
IF (L.EQ.IRSYM(I)) GO TO 23
22 CONTINUE
IF (N.GE.5) GO TO 21
N=N+1
ISAVE(N)=L
GO TO 21
C
C
C
23 WRITE(IDLG,230) L
230 FORMAT('-ERROR: RESERVED CHARACTER "',A1,'" IN VARIABLE NAME'/)
GO TO 25
24 WRITE(IDLG,240) NAME(NSIZE)
240 FORMAT('-ERROR: VARIABLE NAME "',A5,'" IS RESERVED'/)
25 IF (ICODE.LT.0) CALL EXIT
WRITE(IDLG,250)
250 FORMAT('+RE-ENTER THE LINE'/)
NSIZE=NSIZE-ISUB
GO TO 11
C
C
C
30 IF ((K.EQ.1).AND.((L.EQ.IALT).OR.(L.EQ.IGRT))) GO TO 40
IF (N.LE.0) GO TO 21
301 IF ((ISAVE(1).LT.'0').OR.(ISAVE(1).GT.'9')) GO TO 31
WRITE(IDLG,300) ISAVE
300 FORMAT('-ERROR: VARIABLE NAME "',5A1,'" STARTS WITH A NUMBER'/)
GO TO 25
C
C
C
31 NSIZE=NSIZE+1
IF (NSIZE.GT.MAX) GO TO 191
ISUB=ISUB+1
NAME(NSIZE)=0
ENCODE(5,151,NAME(NSIZE)) ISAVE
DO 32 I=1,5
IF (NAME(NSIZE).EQ.IRWRD(I)) GO TO 24
32 CONTINUE
GO TO (330,1111),NPT
330 N=0
DO 33 I=1,5
33 ISAVE(I)=' '
NUM(NSIZE)=NSIZE
IF ((L.EQ.IALT).OR.(L.EQ.IGRT)) GO TO 40
21 CONTINUE
IF (N.LE.0) GO TO 1111
NPT=2
GO TO 301
C
C
C
40 IF (NSIZE-1) 19,411,410
410 DO 41 I=1,NSIZE-1
DO 41 J=I+1,NSIZE
IF (NAME(I).EQ.NAME(J)) GO TO 42
41 CONTINUE
411 RETURN
C
C
C
42 WRITE(IDLG,420) NAME(I),I,J
420 FORMAT('-ERROR: VARIABLE NAME "',A5,'" IS USED IN VARIABLES ',
1 I5,' AND ',I5)
IF (ICODE.LT.0) CALL EXIT
WRITE(IDLG,421)
421 FORMAT('-ENTER CORRECTION IN THE ORDER: VARIABLE #, COMMA,
1 VARIABLE NAME OR A - TO DELETE'/)
READ(ICC,422) I,L
422 FORMAT(I,A5)
IF (L.EQ.'- ') GO TO 43
NAME(I)=L
NUM(I)=I
GO TO 40
43 DO 44 J=I+1,NSIZE
NAME(J-1)=NAME(J)
44 NUM(J-1)=NUM(J)
NSIZE=NSIZE-1
GO TO 40
C
C ONLY EXPECT MORE NAMES IF LAST CHARACTER IS COMMA
C
1111 IF(IDUM(LAST).NE.',') RETURN
GOTO 11
C
C HELP
C
90 WRITE(IDLG,900)
900 FORMAT('-THIS LINE DEFINES DIRECTLY AND INDIRECTLY THE NUMBER OF
1 VARIABLES TO'/' BE USED IN THE ANALYSIS. IF A NUMBER IS ENTERED,
2 IT IS ASSUMED TO BE'/' THE NUMBER OF VARIABLES AND VARIABLE NAME
3 OPTION IS NOT SELECTED.'//' IF A VARIABLE NAME LIST IS ENTERED,
4 THE NUMBER OF VARIABLES IS'/' COUNTED FROM THE LIST. VARIABLE
5 NAME LIST SHOULD CONFORM TO THE'/' FOLLOWING RULES:'//
6 ' (1) THE LIST IS COMPOSED OF 1 OR MORE LINES. AN ALTMODE OR
7 BLANK'/6X,'LINE MUST FOLLOW IMMEDIATELY AFTER THE LAST VARIABLE
8 NAME'/6X,'IS ENTERED.'//' (2) VARIABLE NAME IS MADE OF 1 TO 5
9 ALPHANUMERIC CHARACTERS, THE'/6X,'FIRST BEING NON-NUMERIC.'//6X,
1 'THE NAMES MAY NOT CONTAIN ANY OF THE FOLLOWING SYMBOLS:'// 6X,
2 '* ? - / , + '' . BLANK'/
4/ 6X,'NOR MAY BE ANY OF THE RESERVED WORDS:'//
5 6X,'ALL HELP EMPTY STOP OBS'/)
IF (ICODE.GE.0) GO TO 1
901 CALL EXIT
END
SUBROUTINE GETLST(N,NLST,NAME,INDEX)
DIMENSION NAME(1),INDEX(1)
COMMON/IOBLK/IDLG,ICC,INP,IOUT,IO2,IO3,ICODE,IBNK,NAMI(2)
COMMON /VARTMP/IDUM(72),ISAVE(5)
DATA IALT,IDOL/"155004020100, '$'/
C
C
100 CALL GES(IDUM,72,IRET)
IF(IRET.EQ.2) CALL EXIT
IF ((IDUM(1).EQ.'H').AND.(IDUM(2).EQ.'E').AND.(IDUM(3).EQ.'L')
1.AND.(IDUM(4).EQ.'P')) GO TO 90
IF ((IDUM(1).EQ.'S').AND.(IDUM(2).EQ.'A').AND.(IDUM(3).EQ.'M')
1.AND.(IDUM(4).EQ.'E')) RETURN
C
C
NLST=0
IDASH=1
12 NF=0
DO 13 LAST=72,1,-1
IF (IDUM(LAST).NE.' ') GO TO 20
13 CONTINUE
14 RETURN
C
C
20 I=0
21 DO 210 J=1,5
210 ISAVE(J)=' '
IS=0
C
22 I=I+1
IF (I.LE.LAST) GO TO 220
L=' '
IF (IS) 321,321,230
C
C
220 L=IDUM(I)
IF (L.EQ.' ') GO TO 22
IF ((L.EQ.',').OR.(L.EQ.'-').OR.(L.EQ.IALT).OR.(L.EQ.IDOL))
1 GO TO 23
IS=IS+1
IF (IS.LE.5) ISAVE(IS)=L
GO TO 22
C
C
23 IF (IS.LE.0) GO TO 22
230 IF ((ISAVE(1).LE.'0').OR.(ISAVE(1).GT.'9')) GO TO 40
C
C #'S
C
24 IF (ISAVE(5).NE.' ') GO TO 26
DO 25 J=4,1,-1
25 ISAVE(J+1)=ISAVE(J)
ISAVE(1)=' '
GO TO 24
C
C
26 ENCODE(5,11,K) ISAVE
11 FORMAT(72A1)
DECODE(5,260,K) NUM
260 FORMAT(I5)
IF ((NUM.GE.1).AND.(NUM.LE.N)) GO TO 30
WRITE(IDLG,27) NUM
27 FORMAT('-ERROR: VARIABLE NUMBER ',I5,' OUTSIDE ALLOWABLE
1 RANGE, RE-ENTER THE LINE'//)
IF (ICODE.GE.0) GO TO 33
CALL EXIT
C
C '-'
C
30 IF (L.NE.'-') GO TO (31,34),IDASH
IDASH=2
NF=NF+1
INDEX(NF)=NUM
GO TO 21
C
C
31 NF=NF+1
INDEX(NF)=NUM
32 IF ((I.LT.LAST).AND.(L.NE.IALT).AND.(L.NE.IDOL)) GO TO 21
321 NLST=NLST+NF
IF ((L.EQ.IALT).OR.(L.EQ.IDOL).OR.(L.NE.',')) RETURN
C
C
33 READ(ICC,11,END=14) IDUM
GO TO 12
C
C
34 DO 35 J=INDEX(NLST+NF)+1,NUM
NF=NF+1
35 INDEX(NF)=J
IDASH=1
GO TO 32
C
C NAMES
C
40 K=' '
ENCODE(5,11,K) ISAVE
IF ((K.EQ.'ALL').OR.(K.EQ.'*')) GO TO 42
DO 41 J=1,N
IF (NAME(J).NE.K) GO TO 41
NUM=J
GO TO 30
41 CONTINUE
WRITE(IDLG,410) K
410 FORMAT('-ERROR: VARIABLE ',A5,' DOES NOT EXIST, RE-ENTER
1 THE LINE'/)
IF (ICODE.GE.0) GO TO 33
CALL EXIT
C
C
42 DO 43 I=1,N
43 INDEX(I)=I
NLST=N
RETURN
C
C HELP
C
90 WRITE(IDLG,91)
91 FORMAT('-EITHER VARIABLE NAMES OR VARIABLE NUMBERS MAY BE USED
1 TO ENTER THE'/' VARIABLES. MORE
2 THAN ONE NAME OR'/' NUMBER MAY OCCUPY A LINE AND ARE SEPARATED
3 BY COMMAS. AN ALTMODE,'/' DOLLAR SIGN, CONTROL Z OR BLANK LINE
4 MUST BE USED TO TERMINATE THE'/' ENTRIES. RANGES MAY BE
5 SPECIFIED BY ENTERING THE TWO EXTREMES'/' SEPARATED BY A MINUS
6 SIGN ("-"). FOR EXAMPLE:'/
7 ' 1,AGE,10-12$'//)
IF (ICODE.GE.0) GO TO 100
CALL EXIT
END
SUBROUTINE CALC(ANS,MODE,IERR)
C
C THIS SUBROUTINE IS DESIGNED TO PROVIDE
C BOTH AN IMMEDIATE CALCULATOR AND VARIABLE STORAGE TO
C ANY PROGRAM THAT CAN HANDLE REAL SCALAR VALUES.
C
C IT IS A COMBINATION OF SAM ANEMA'S CALCULATOR AND RUSS
C BARR'S STORAGE PACKAGE.
C
C ALL EXTERNAL ROUTINES CALLED BY THIS PACKAGE ARE IN
C THE FILE - APLB10.FOR
C
C FINAL MODIFICATIONS FOR NSTORE
C DATE: 21-OCT-75 - RRB.
C
C PARAMETERS:
C
C ANS ANSWER RETURNED
C
C MODE=0 ANSWER IS TO BE PRINTED
C =1 ANSWER IS NOT TO BE PRINTED
C
C IERR=0 IMMEDIATE CALCULATION, ANSWER PRINTED.
C =1 ASSIGNMENT MADE
C =2 INPUT OR EVAL ERROR, MESSAGE PRINTED.
C =3 UNDEFINED NAME, NO MESSAGE.
C =4 EOF ON INPUT, MESSAGE.
C
C COMMON/CALDAT/ (OPTIONAL IN CALLING ROUTINES)
C
C IN 80 WORD VECTOR FOR TELETYPE INPUT LINE (FORMAT=80A1)
C
C WORDS 4 WORD VECTOR (2 DOUBLE PRECISION WORDS) IN WHICH
C KEYWORDS ARE RETURNED TO CALLING ROUTINE
C
C RESULT DOUBLE PRECISION VALUE USED TO STORE VARIABLE NAME
C
C LPASS TTY INPUT FLAG
C
C = 0 READ TTY INPUT LINE IN CALC
C # 0 USE TTY INPUT LINE IN COMMON/CALDAT/
C
C MSGLVL ERROR MESSAGE LEVEL FLAG
C
C = 0 PRINT ALL ERROR MESSAGES
C = 1 PRINT ONLY INTERNAL ERROR MESSAGES
C = 2 PRINT NO ERROR MESSAGES
C
DOUBLE PRECISION B,FUN,WORDS(2),RESULT
DIMENSION IC(10),IN(80),ITY(50),IV(50)
DIMENSION V(0/9),IW(12),FUN(16),L1(50),L2(50),CONST(50),IH(21)
DOUBLE PRECISION ALLOC
DIMENSION HLLOC(1)
COMMON/ALLOCS/INIT,NEXT,LAST,ALLOC(1)
EQUIVALENCE (ALLOC,HLLOC)
C**AM APLB10 #5 MSL 2-FEB-79
C
C CHANGED FORMAT OF /CALDAT/ COMMON
C CHECK MSGLVL BEFORE TYPING ERRORS
C CHECK LPASS BEFORE READING INPUT LINE
COMMON/CALDAT/IN,WORDS,RESULT,LPASS,MSGLVL
DATA LPASS,MSGLVL/0,0/
C**END CALC @ 36 - 14
DATA IC/'(','+','-','/','*',' ',')','.','=','&'/
DATA V/0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0/
DATA FUN/'ATAN ','TANH ','COSH ','SINH ','COS ',
1'SIN ','SQRT ','ALOG10 ','ALOG ','EXP ','ACOS ',
2'ASIN ','ABS ','INT ','RAN ','SETRAN '/
DATA IH/6,5,5,4,4,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,7/
DATA IDLG,IRSP,NC,NF/-1,-4,10,16/
ANS=0
NA=0
IERR=0
IF(LPASS.NE.0)GO TO 38
C WRITE(IDLG,34)
C34 FORMAT('0*',$)
READ(IRSP,36,END=998)IN
36 FORMAT(80A1)
38 IR=0
K=0
I=0
IDP=0
XM1=1.
NW=0
C=0.
K=0
NF=16
N1=0
N2=0
10 I=I+1
IF(I.GT.80)GO TO 501
IF(IN(I).EQ.IC(6))GO TO 10
DO 50 J=1,NC
IF(IC(J).EQ.IN(I))GO TO 1000
50 CONTINUE
IF(IN(I).LT.'0'.OR.IN(I).GT.'9')GO TO 51
J=NC+1
GO TO 1000
51 IF(IN(I).LT.'A'.OR.IN(I).GT.'Z')GO TO 99
J=NC+2
1000 IF(IDP.NE.3)GO TO 1001
IF(J.EQ.1.OR.J.GT.NC)GO TO 1001
1002 ENCODE(11,2000,WORDS)(IW(KK),KK=1,NW),(IC(6),KK=NW+1,12)
2000 FORMAT(12A1)
NW=0
IF(J.EQ.9)GO TO 2001
LOC=LOCNAM(WORDS,KIND,KLAS,NROW,NCOL)
IF(LOC.EQ.0)GO TO 992
C** AM#99.24.1-4 RRB/12-JAN-79
IF(LOC.LT.0)GO TO 986
C**END CALC,APLB10.FOR,@2000+5
C**AM APLB10 #5 MSL 2-FEB-79
IF(KIND.NE.2.OR.KLAS.NE.0)GO TO 994
C**END CALC @ 2001 - 4
C=HLLOC(LOC)
IDP=2
GO TO 1001
2001 IR=1
C NOT AN ERROR, AN ASSIGNMENT FLAG.
IERR=1
RESULT=WORDS(1)
IDP=0
GO TO 10
1001 IF(I.GT.80)GO TO 501
GO TO (1100,102,102,102,102,10,101,103,99,1007,104,105),J
GO TO 10
C
C READ ADDITIONAL LINE OF TTY INPUT IF "&" WAS FOUND
C
1007 READ(IRSP,36,END=998)IN
I=0
GO TO 10
1100 IF(IDP.NE.0)GO TO 440
K=K+1
ITY(K)=1
GO TO 10
101 IF(IDP.NE.0)GO TO 440
K=K+1
ITY(K)=2
GO TO 10
102 IF(IDP.NE.0)GO TO 440
IF(ITY(K).NE.3)GO TO 1102
IF(J.EQ.5)GO TO 1103
IF(J.EQ.4)GO TO 99
K=K+1
ITY(I)=3
IV(K)=J+5
GO TO 10
1103 IF(IV(K).NE.5)GO TO 99
IV(K)=6
GO TO 10
1102 K=K+1
ITY(K)=3
IV(K)=J
GO TO 10
103 IDP=2
GO TO 10
104 IF(IDP.GT.2)GO TO 105
IF(IDP.EQ.2)GO TO 106
IDP=1
C=C*10.+V((IN(I).AND."74000000000)/"4000000000)
GO TO 10
106 XM1=XM1*.1
9123 FORMAT(I)
C=C+V((IN(I).AND."74000000000)/"4000000000)*XM1
GO TO 10
105 NW=NW+1
IF(NW.GT.10)NW=11
IW(NW)=IN(I)
IDP=3
GO TO 10
440 IF(IDP.GT.2)GO TO 441
IDP=0
NA=NA+1
CONST(NA)=C
XM1=1.
C=0.
K=K+1
ITY(K)=4
IV(K)=NA
GO TO 1001
441 B=' '
IF(NW.GT.10)NW=10
ENCODE(10,442,B)(IW(L),L=1,NW)
442 FORMAT(10A1)
NW=0
DO 443 L=1,NF
IF(B.EQ.FUN(L))GO TO 444
443 CONTINUE
GO TO 99
444 K=K+1
ITY(K)=3
IV(K)=L+8
IDP=0
GO TO 1001
891 IF(MSGLVL.LT.2)WRITE(IDLG,892)
892 FORMAT(/,' PROBLEM WITH SUBROUTINE EVAL.',/)
IERR=2
GO TO 131
C** AM#9.24.1-4 RRB/12-JAN-79
986 IF(MSGLVL.LT.2)WRITE(IDLG,989)
989 FORMAT(/,' ?BAD STORAGE AREA IN NSTORE.',/)
IERR=2
GO TO 131
C**END CALC,APLB10.FOR,@892+3
99 IF(MSGLVL.LT.1)WRITE(IDLG,991)
991 FORMAT(' BAD STATEMENT.',/)
IERR=2
GO TO 131
992 CONTINUE
C WRITE(IDLG,993)WORDS(1)
C993 FORMAT(/,1X,A10,' IS NOT DEFINED',/)
IERR=3
GO TO 131
994 IF(MSGLVL.LT.2)WRITE(IDLG,995)KIND,KLAS,WORDS(1)
995 FORMAT(/,' WRONG KIND(',I2,') OR KLAS(',I1,') FOR ',A10,/)
IERR=2
GO TO 131
996 IF(MSGLVL.LT.2)WRITE(IDLG,997)RESULT
997 FORMAT(/,' ERROR ATTEMPTING TO STORE ',A10,/)
IERR=2
GO TO 131
998 IF(MSGLVL.LT.1)WRITE(IDLG,999)
999 FORMAT(/,' END OF FILE ON INPUT IN CALC.',/)
IERR=4
GO TO 131
501 IF(IDP.GT.2)GO TO 1002
IF(IDP.NE.0)GO TO 440
D WRITE(IDLG,9898)(ITY(II),II=1,10),(IV(II),II=1,10)
D9898 FORMAT(1X,10I2)
K=K+1
ITY(K)=3
IV(K)=21
DO 110 I=1,K
GO TO (100,120,140,160),ITY(I)
100 N1=N1+1
L1(N1)=1
GO TO 110
120 IOP=L1(N1)
N1=N1-1
IF(IOP.EQ.1)GO TO 110
IF(IOP.GT.6)GO TO 122
C=CONST(L2(N2))
N2=N2-1
122 IF(IOP.EQ.1)GO TO 891
CALL EVAL(IOP,C,ANS)
GO TO 120
140 IF(N1.EQ.0)GO TO 141
IF(IH(L1(N1)).GT.IH(IV(I)))GO TO 141
IOP=L1(N1)
N1=N1-1
IF(IOP.GT.6)GO TO 142
C=CONST(L2(N2))
N2=N2-1
142 IF(IOP.EQ.1)GO TO 891
CALL EVAL(IOP,C,ANS)
GO TO 140
141 N1=N1+1
L1(N1)=IV(I)
IF(IV(I).GT.6)GO TO 110
N2=N2+1
NA=NA+1
CONST(NA)=ANS
L2(N2)=NA
GO TO 110
160 ANS=CONST(IV(I))
110 CONTINUE
IF(N1.GT.1.OR.N2.GT.1)GO TO 99
IF(IR.EQ.0)GO TO 111
LOC=INCLRS(RESULT,2,0,1,1)
IF(LOC.LE.0)GO TO 996
HLLOC(LOC)=ANS
GO TO 131
C**AM APLB10 #5 MSL 2-FEB-79
111 IF(MODE.NE.0)GO TO 116
ABSANS=ABS(ANS)
I=2
IF(ABSANS.GE.100000000.0.OR.ABSANS.LT.0.00100)I=1
GO TO(112,114),I
112 WRITE(IDLG,113)ANS
113 FORMAT(1X,1PE)
GO TO 116
114 WRITE(IDLG,115)ANS
115 FORMAT(1X,F15.5)
116 LOC=INCLRS('ANSWER ',2,0,1,1)
C**END CALC @ 131 - 3
IF(LOC.LE.0)GO TO 996
HLLOC(LOC)=ANS
131 RETURN
GO TO 131
END
SUBROUTINE EVAL(IOP,C,ANS)
GO TO (40,2,3,4,5,6,40,8,9,10,11,12,13,14,15,16,17,18,19,20,
#21,22,23,24),IOP
2 ANS=ANS+C ; GO TO 40
3 ANS=C-ANS ; GO TO 40
4 ANS=C/ANS ; GO TO 40
5 ANS=C*ANS ; GO TO 40
6 ANS=C**ANS ; GO TO 40
8 ANS=-ANS ; GO TO 40
9 ANS=ATAN(ANS) ; GO TO 40
10 ANS=TANH(ANS) ; GO TO 40
11 ANS=COSH(ANS) ; GO TO 40
12 ANS=SINH(ANS) ; GO TO 40
13 ANS=COS(ANS) ; GO TO 40
14 ANS=SIN(ANS) ; GO TO 40
15 ANS=SQRT(ANS) ; GO TO 40
16 ANS=ALOG10(ANS) ; GO TO 40
17 ANS=ALOG(ANS) ; GO TO 40
18 ANS=EXP(ANS) ; GO TO 40
19 ANS=ACOS(ANS) ; GO TO 40
20 ANS=ASIN(ANS) ; GO TO 40
21 ANS=ABS(ANS) ; GO TO 40
22 ANS=INT(ANS) ; GO TO 40
23 ANS=RAN(0) ; GO TO 40
24 CALL SETRAN(INT(ANS)) ; ANS=0 ; GO TO 40
40 RETURN
END
C NSTORE
C ======
C
C A SIMPLIFIED NAMED STORAGE(*) PACKAGE FOR THE PDP-10
C ----------------------------------------------------
C
C WRITTEN BY RUSSELL R. BARR III, WESTERN MICHIGAN UNIVERSITY
C COMPUTER CENTER, DATE: 9-OCT-75.
C (*) PORTIONS OF THIS PACKAGE ARE BASED ON "NAMED STORAGE-360",
C WRITTEN BY STANLEY COHEN OF ARGONNE NATIONAL LABORATORIES.
C
C PURPOSE
C -------
C TO PROVIDE A METHOD OF STORING AND RETRIEVING (IN CORE) DATA GROUPS
C DURING THE COURSE OF A PROGRAM RUN IN A MANNER WHICH A USER MAY ASSIGN
C MNEMONIC LABELS RATHER THAN ABSOLUTE OR RELATIVE ADDRESSES.
C FURTHER, DECRIPTIVE DATA IS STORED IN A MANNER WHICH IS TRANSPARENT
C TO THE USER.
C
C ROUTINES
C --------
C
C SUBROUTINE SETSTR - 'SET UP STORAGE'
C FUNCTION LOCNAM - 'LOCATE NAMED OBJECT'
C FUNCTION INCLRS - 'I NOT CLEAR, RESERVE'
C FUNCTION IFREE - 'I FREE SPACE'
C SUBROUTINE SDUMP - 'FORMATTED STORAGE DUMP'
C
C FORM OF DATA "CHUNKS"
C --------------------
C
C
C EVEN NUMBERED ******** \
C WORDS------------------>* NWDS * \ ;SIZE OF ("CHUNK"-1)
C ODD NUMBERED *************** \
C WORDS----------->* ANAME * \ ;ANY NON-ZERO 72BIT CONFIG.
C *************** \
C * KIND * KLAS * \ ;SEE NOTE (1)
C *************** \
C * NROW * NCOL * \
C *************** \
C LOCA OR LOCI---->* * \
C (AS APPROP. TO * DATA WORDS * >NWDS(# OF S.P. WORDS NOT
C DATA TYPE) * * / INCLUDING SECOND NWDS)
C *************** /
C * NWDS *
C ********
C
C FLOW CHARTS
C -----------
C
C ********************************************
C * USER ROUTINES *
C ********************************************
C : : : : :
C ********** ********** : : *********
C * SETSTR * * INCLRS * : : * SDUMP *
C ********** ********** : : *********
C : : :
C ********* :
C * IFREE * :
C ********* :
C : :
C **********
C * LOCNAM *
C **********
C
C
C NOTE (1) KIND = 1 - INTEGER*4
C 2 - REAL*4
C 3 - REAL*8
C
C KLAS = 0 - SCALAR
C 1 - VECTOR
C 2 - MATRIX
C*ID*SETSTR
SUBROUTINE SETSTR(NWDS)
C SETUP STORAGE
C
C NWDS IS THE NUMBER OF SINGLE PRECISION WORDS ALLOWED IN THE
C COMMON - "ALLOCS" IN THE MAIN PROGRAM.
C
DOUBLE PRECISION ANAME,ALLOC
DIMENSION ILLOC(1)
COMMON/ALLOCS/INIT,NEXT,LAST,ALLOC(1)
EQUIVALENCE(ILLOC,ALLOC)
C
INIT=2
NEXT=2
LAST=(NWDS-1).OR.1
NWDSP=LAST-INIT
ILLOC(INIT)=NWDSP
ILLOC(LAST)=NWDSP
RETURN
END
C** AM#99.24.1-4 RRB/12-JAN-79(MOVED ROUTINE "LOCNAM" TO FOLLOW "IFREE")
C*ID*INCLRS
FUNCTION INCLRS(ANAME,KIND,KLAS,NROW,NCOL)
C
C MAKE NEW OBJECT(DELETE OBJECT OF SAME NAME FIRST)
C
C FUNC. RETURN VALUES: >0 LOC OF DATA
C =0 NOT ENOUGH SPACE
C <0 DEFECTIVE STORAGE
C
DOUBLE PRECISION ANAME,ALLOC
DIMENSION ILLOC(1)
COMMON/ALLOCS/INIT,NEXT,LAST,ALLOC(1)
EQUIVALENCE (ILLOC,ALLOC)
C
IDP=2
IF(KIND.LT.3)IDP=1
NWDSP=(NROW*NCOL*IDP+1).OR.1
C EXIST?
LOC=IFREE(ANAME)
IF(LOC.LT.0)GO TO 9001
NLEFT=ILLOC(NEXT)
110 IF(NLEFT.LT.NWDSP+7)GO TO 9002
C CREATE AREA REQUESTED
NWDSP6=NWDSP+6
ILLOC(NEXT)=NWDSP6
ILLOC(NEXT+NWDSP6)=NWDSP6
LOCNA=NEXT/2+1
ALLOC(LOCNA)=ANAME
ILLOC(NEXT+3)=KIND
ILLOC(NEXT+4)=KLAS
ILLOC(NEXT+5)=NROW
ILLOC(NEXT+6)=NCOL
INCLRS=NEXT+7
IF(IDP.EQ.2)INCLRS=LOCNA+3
C CLEAN UP THE FREE CHUNK
NEXT=NEXT+NWDSP+7
NLEFT=LAST-NEXT
ILLOC(NEXT)=NLEFT
ILLOC(LAST)=NLEFT
190 RETURN
C DEFECTIVE STORAGE
9001 INCLRS=-1
GO TO 190
C NOT ENOUGH SPACE
9002 INCLRS=0
GO TO 190
END
C*ID*IFREE
FUNCTION IFREE(ANAME)
C
C DELETE NAMED OBJECT AND RESTORE SPACE TO POOL
C
C FUNC. RETURN VALUES: >=0 TOTAL FREE SPACE
C (LAST-NEXT)
C <0 DEFECTIVE STORAGE
C
C IF(ANAME=0)RETURN FREE SPACE SIZE ONLY
DOUBLE PRECISION ANAME,ALLOC
DIMENSION ILLOC(1)
COMMON/ALLOCS/INIT,NEXT,LAST,ALLOC(1)
EQUIVALENCE (ILLOC,ALLOC)
C
IF(ANAME.EQ.0.D0)GO TO 200
LOC=LOCNAM(ANAME,KIND,KLAS,NROW,NCOL)
IF(LOC)9001,200,100
C EXISTS
100 IF(KIND.LE.2)LOC=LOC-7
IF(KIND.GE.3)LOC=LOC*2-8
C DOWN SHIFT
NWDS=ILLOC(LOC)
C TOP OF LIST?
IF(NEXT.EQ.LOC+NWDS+1)GO TO 190
DO 110 I=LOC,NEXT-2-NWDS
110 ILLOC(I)=ILLOC(I+NWDS+1)
190 NEXT=NEXT-NWDS-1
IFREE=LAST-NEXT
ILLOC(NEXT)=IFREE
ILLOC(LAST)=IFREE
NEXTA=(NEXT+2)/2
ALLOC(NEXTA)=0
RETURN
200 IFREE=LAST-NEXT
201 RETURN
C DEFECTIVE STORAGE
9001 IFREE=-1
GO TO 201
END
C** AM#99.24.1-4 RRB/12-JAN-79(MOVE ROUTINE "LOCNAM" FROM BEFORE "INCLRS")
C*ID*LOCNAM
FUNCTION LOCNAM(ANAME,KIND,KLAS,NROW,NCOL)
C
C FIND NAMED OBJECT, RETURN ITS PARAMETERS AND LOCATION
C
C FUNC. RETURN VALUES: >0 LOC OF DATA
C =0 NOT FOUND
C <0 DEFECTIVE STORAGE
C
DOUBLE PRECISION ANAME,ALLOC
DIMENSION ILLOC(1)
COMMON/ALLOCS/INIT,NEXT,LAST,ALLOC(1)
EQUIVALENCE (ILLOC,ALLOC)
C
I=INIT
LOCNAM=0
C STORAGE EMPTY?
IF(INIT.EQ.NEXT)GO TO 190
100 NWDS=ILLOC(I)
IF(NWDS.LE.0)GO TO 9001
IF(ILLOC(I+NWDS).NE.NWDS)GO TO 9001
LOCNA=I/2+1
IF(ANAME.NE.ALLOC(LOCNA))GO TO 200
KIND=ILLOC(I+3)
KLAS=ILLOC(I+4)
NROW=ILLOC(I+5)
NCOL=ILLOC(I+6)
IF(KIND.LE.2)LOCNAM=I+7
IF(KIND.GE.3)LOCNAM=I/2+4
190 RETURN
C KEEP SEARCHING
200 I=I+NWDS+1
IF(I.LT.NEXT)GO TO 100
C CAN'T FIND IT
GO TO 190
C DEFECTIVE STORAGE
9001 LOCNAM=-1
GO TO 190
END
C*ID*SDUMP
SUBROUTINE SDUMP(IERR)
C
C FORMATED DUMP OF STORAGE
C
C IERR RETURNED AS: =0 NO ERROR
C >0 DEFECTIVE STORAGE AT IERR
C
DOUBLE PRECISION ANAME,ALLOC
DIMENSION ILLOC(1),HLLOC(1)
COMMON/ALLOCS/INIT,NEXT,LAST,ALLOC(1)
EQUIVALENCE (ALLOC,HLLOC,ILLOC)
C
IERR=0
IF(INIT.EQ.NEXT)GO TO 300
I=INIT
100 NWDS=ILLOC(I)
IF(NWDS.LE.0)GO TO 9001
IF(ILLOC(I+NWDS).NE.NWDS)GO TO 9001
KIND=ILLOC(I+3)
KLAS=ILLOC(I+4)
NROW=ILLOC(I+5)
NCOL=ILLOC(I+6)
LOCNA=I/2+1
IF(KIND.GE.3)GO TO 140
LOCDAT=I+6
IF(KIND.NE.1)GO TO 120
TYPE 102,ALLOC(LOCNA),(ILLOC(LOCDAT+J),J=1,NROW*NCOL)
102 FORMAT(1X,A10,1X,3I15,/,(12X,3I15))
GO TO 200
120 TYPE 122,ALLOC(LOCNA),(HLLOC(LOCDAT+J),J=1,NROW*NCOL)
122 FORMAT(1X,A10,1X,3F,/(12X,3F))
GO TO 200
140 LOCDAT=I/2+3
TYPE 142,ALLOC(LOCNA),(ALLOC(LOCDAT+J),J=1,NROW*NCOL)
142 FORMAT(1X,A10,1X,2D25.15,/,(12X,2D25.15))
200 I=I+NWDS+1
IF(I.LT.NEXT)GO TO 100
RETURN
300 TYPE 302
302 FORMAT(' STORAGE EMPTY')
RETURN
9001 TYPE 9002,I
9002 FORMAT(' ERROR IN STORAGE AT LOC ',I5)
IERR=I
RETURN
END
SUBROUTINE DSKSRT(UNITI,UNITO,MODE,SCRTCH,ISIZE,RECSIZ,KEYPOS,
+ KEYSIZ,KEYORD,NKEY,IERR)
C
C DSKSRT IS A FORTRAN SUBROUTINE TO SORT ASCII OR
C BINARY DISK FILES INTO ASCENDING OR DESCENDING ORDER
C
C ARGUMENTS:
C UNITI - UNIT # OF OPEN INPUT CHANNEL
C IF UNITI = 0, INPUT RECORDS ARE READ FROM
C RECBUF COMMON VIA SRTIN ENTRY POINT
C UNITO - UNIT # OF OPEN OUTPUT CHANNEL
C IF UNITO = 0, OUTPUT RECORDS ARE WRITTEN TO
C RECBUF COMMON VIA SRTOUT ENTRY POINT
C MODE - MODE OF INPUT/OUTPUT FILES(RECORDS)
C = 1 ASCII (CHARACTER MODE)
C = 2 BINARY OR IMAGE (WORD MODE)
C SCRTCH - SCRATCH VECTOR FOR INTERNAL WORK SPACE
C ISIZE - SIZE IN WORDS OF SCRTCH
C > 0 DO NOT ALLOCATE, USE SCRTCH
C = 0 ALLOCATE AS MUCH CORE AS NEEDED
C < 0 ALLOCATE UP TO -ISIZE WORDS OF CORE
C RECSIZ - NUMBER OF CHARACTERS(WORDS) PER RECORD
C KEYPOS - VECTOR OF KEY STARTING CHARACTER(WORD) POSITIONS
C KEYSIZ - VECTOR OF KEY SIZES, IN CHARACTERS(WORDS)
C KEYORD - VECTOR OF SORT ORDER FLAGS
C = 0 ASCENDING ORDER FOR KEY
C # 0 DESCENDING ORDER FOR KEY
C NKEY - NUMBER OF KEYS (KEYS LISTED MAJOR-TO-MINOR)
C IERR - ERROR RETURN
C < 0 ERROR, SORT NOT COMPLETE
C >,= 0 NUMBER OF RECORDS SORTED
C
C RECBUF - NAMED COMMON AREA
C USED IF EITHER UNITI OR UNITO = 0
C MUST BE LARGE ENOUGH TO CONTAIN RECSIZE
C CHARACTERS(MODE=1) OR WORDS(MODE=2)
C
C ENTRY POINTS:
C
C NOTE: NO FILES SHOULD BE OPENED IN THE CALLING PROGRAM
C WHILE INPUT AND OUTPUT PROCEDURES ARE IN PROGRESS
C
C ENTRY SRTIN(IFLAG)
C
C IFLAG VALUES:
C = 0 NEXT RECORD IS IN RECBUF
C # 0 EOF - TERMINATE INPUT PROCEDURE
C IF UNITI = 0 AND UNITO NOT = 0
C IFLAG WILL BE RETURNED WITH FINAL RECORD COUNT
C
C ENTRY SRTOUT(OFLAG)
C
C OFLAG VALUES RETURNED:
C = 0 NEXT RECORD RETURNED IN RECBUF
C > 0 SORT FINISHED, OFLAG = COUNT OF RECORDS RETURNED
C -1 EMPTY INPUT FILE
C
C NOTE: SRTOUT SHOULD BE CALLED UNTIL OFLAG NOT = 0. IF SORT MUST
C BE PREMATURELY TERMINATED, CALL SRTOUT WITH OFLAG NOT = 0. THIS
C WILL RELEASE ALL SORT CHANNELS AND DELETE TEMP FILES.
C
IMPLICIT INTEGER(A-Z)
PARAMETER FMTLIM=100, KEYLIM=100, CHNLIM=13
COMMON/RECBUF/RECORD(1)
DOUBLE PRECISION SCRFIL(0/CHNLIM),MRGFIL
DIMENSION SCRTCH(1),KEYPOS(1),KEYSIZ(1),KEYORD(1),
+ FRMT(FMTLIM),ISORT(KEYLIM),KSORT(KEYLIM),
+ EOF(CHNLIM),MRGPT(CHNLIM),CHANNL(0/CHNLIM),
+ IDESC(4),NUMSA5(3),NUMSA1(11)
EQUIVALENCE(SCRFIL(0),MRGFIL),(CHANNL(0),MRGCHN)
C
DATA BUFCNT/4/
DATA PAGE,MAXCOR/512,10240/
DATA IDESC/'R','5',',','R'/
DATA SCRDEV,AFILE,AEXT/'DSK','FSRT','.TMP'/
DATA BIGNUM/"377777777777/
C
C CHECK SOME PARAMETERS, KEYS CHECKED LATER
C
IERR=0
IF(UNITI.EQ.0)GO TO 20
CALL CHKCHN(UNITI,J)
IF(J.NE.0)GO TO 9110 !ERROR-ILLEGAL INPUT UNIT
20 IF(UNITO.EQ.0)GO TO 30
CALL CHKCHN(UNITO,J)
IF(J.NE.0)GO TO 9110 !ERROR-ILLEGAL OUTPUT UNIT
30 IF(MODE.LT.1.OR.MODE.GT.2)GO TO 9120 !ERROR-ILLEGAL MODE
IF(RECSIZ.LE.0)GO TO 9130 !ERROR-ILLEGAL RECORD SIZE
C
C DETERMINE APPROXIMATE MAXIMUM OF FREE DSK CHANNELS
C
UNIT=0
MAXCHN=CHNLIM
40 UNIT=UNIT+1
CALL CHKCHN(UNIT,J)
IF(J.LT.0)GO TO 45
IF(J.EQ.0)MAXCHN=MAXCHN-1
GO TO 40
45 IF(MAXCHN.LT.2)GO TO 9190 !ERROR-TOO FEW CHANNELS
C
C GENERATE TEMP FILE NAMES, INITIALZE TEMP FILE FLAGS
C
DO 90 I=0,MAXCHN
CHANNL(I)=0
N2=I-((I/10)*10)
N1=(I-N2)/10
ENCODE(10,80,SCRFIL(I))AFILE,N1,N2,AEXT
80 FORMAT(A4,2I1,A4)
90 CONTINUE
C
C ******************************
C * CORE ALLOCATION *
C ******************************
C
BUFWRD=(MAXCHN+1)*(BUFCNT*(128+3)+3)
BUFSIZ=((BUFWRD+PAGE-1)/PAGE)*PAGE
ICORE=ISIZE
IF(ISIZE.LT.0)ICORE=-ISIZE+BUFSIZ
IREL=1
IF(ISIZE.LT.0)GO TO 130
IF(ISIZE.GT.0)GO TO 200
110 ICORE=MAXCOR+BUFSIZ
CALL ALLCOR(ICORE,JERR,IREL,SCRTCH)
IF(JERR.GE.0)GO TO 150
120 ICORE=ICORE-PAGE
130 CALL ALLCOR(ICORE,JERR,IREL,SCRTCH)
IF(JERR.LT.0)GO TO 120
C
C BUFFER AREA MUST BE UNALLOCATED
C
150 ICORE=ICORE-BUFSIZ
CALL ALLCOR(ICORE,JERR,IREL,SCRTCH)
C
C ******************************
C * SORT KEY VALIDATION *
C ******************************
C
200 DO 210 I=1,KEYLIM
ISORT(I)=0
210 KSORT(I)=0
IF(NKEY.LT.1)GO TO 9140 !ERROR-KEY SPECIFICATION
C
C CHECK THAT ALL KEYS ARE IN RECORD BOUNDS
C
DO 220 I=1,NKEY
IF(KEYPOS(I).LE.0.OR.KEYPOS(I).GT.RECSIZ)
+ GO TO 9140 !ERROR-KEY SPECIFICATION
IF(KEYSIZ(I).LE.0.OR.KEYPOS(I)+KEYSIZ(I)-1.GT.RECSIZ)
+ GO TO 9140 !ERROR-KEY SPECIFICATION
220 CONTINUE
IF(NKEY.EQ.1)GO TO 250
C
C CHECK FOR ILLEGAL KEY OVERLAP
C
DO 240 I=1,NKEY-1
IMIN=KEYPOS(I)
IMAX=IMIN+KEYSIZ(I)-1
DO 240 J=I+1,NKEY
JMIN=KEYPOS(J)
JMAX=JMIN+KEYSIZ(J)-1
IF(JMIN.GE.IMIN.AND.JMIN.LE.IMAX)
+ GO TO 9140 !ERROR-KEY SPECIFICATION
IF(JMAX.GE.IMIN.AND.JMAX.LE.IMAX)
+ GO TO 9140 !ERROR-KEY SPECIFICATION
240 CONTINUE
C
250 IF(MODE.EQ.2)GO TO 405
C
C ******************************
C * FORMAT GENERATION *
C ******************************
C
300 DO 305 I=1,FMTLIM
305 FRMT(I)=0
FRMT(1)='('
BYTLIM=FMTLIM*5
IBYTE=1
SRTSIZ=0
KEYNUM=0
MINOLD=0
MINNEW=BIGNUM
C
C FIND START OF NEXT KEY (LEFT TO RIGHT)
C
310 INDEX=0
DO 320 I=1,NKEY
MINTMP=KEYPOS(I)
IF(MINTMP.LE.MINOLD.OR.MINTMP.GT.MINNEW)GO TO 320
MINNEW=MINTMP
INDEX=I
320 CONTINUE
IF(INDEX.EQ.0)MINNEW=RECSIZ+1
C
C PASS1 - GET FILLER FORMAT
C CHARACTERS BETWEEN LAST KEY AND CURRENT KEY
C PASS2 - GET KEY FORMAT
C
IPASS=1
ICHARS=MINNEW-MINOLD-1
IF(ICHARS.EQ.0)GO TO 385
330 IWORDS=ICHARS/5
IREM=ICHARS-(IWORDS*5)
IF(IPASS.EQ.2)ISORT(INDEX)=SRTSIZ+1
SRTSIZ=SRTSIZ+IWORDS
IF(IREM.GT.0)SRTSIZ=SRTSIZ+1
ENCODE(11,340,NUMSA5)IWORDS,IREM
340 FORMAT(I10,I1)
IF(IWORDS.EQ.0)GO TO 365
DECODE(11,350,NUMSA5)NUMSA1
350 FORMAT(11A1)
C
C FORMAT FOR FULL WORD PORTION OF STRING (#R5)
C
IF(IWORDS.EQ.1)GO TO 365
IBEGIN=9
IF(IWORDS.GT.99)IBEGIN=1
ZFLAG=0
DO 360 I=IBEGIN,10
JCHR=NUMSA1(I)
IF((JCHR.EQ.'0'.OR.JCHR.EQ.' ').AND.ZFLAG.EQ.0)GO TO 360
ZFLAG=1
IBYTE=IBYTE+1
IF(IBYTE.GT.BYTLIM)GO TO 9160 !ERROR-FORMAT
CALL PUTCHR(FRMT,IBYTE,JCHR)
360 CONTINUE
C
365 IBEGIN=1
LIM=4
IF(IWORDS.EQ.0)IBEGIN=4
IF(IREM.EQ.0)LIM=2
IF(IBEGIN.GT.LIM)GO TO 375
DO 370 I=IBEGIN,LIM
J=I
IBYTE=IBYTE+1
IF(IBYTE.GT.BYTLIM)GO TO 9160 !ERROR-FORMAT
370 CALL PUTCHR(FRMT,IBYTE,IDESC(J))
375 IF(IREM.EQ.0)GO TO 380
C
C FORMAT OF PARTIAL WORD PORTION (R#)
C
IBYTE=IBYTE+1
IF(IBYTE.GT.BYTLIM)GO TO 9160 !ERROR-FORMAT
CALL PUTCHR(FRMT,IBYTE,NUMSA5(3))
380 IBYTE=IBYTE+1
IF(IBYTE.GT.BYTLIM)GO TO 9160 !ERROR-FORMAT
CALL PUTCHR(FRMT,IBYTE,',')
385 IF(INDEX.EQ.0)GO TO 400
IPASS=IPASS+1
IF(IPASS.GT.2)GO TO 390
ICHARS=KEYSIZ(INDEX)
GO TO 330
390 MINOLD=MINNEW+KEYSIZ(INDEX)-1
MINNEW=BIGNUM
GO TO 310
400 CALL PUTCHR(FRMT,IBYTE,')') !END OF FORMAT, CLOSE WITH )
C
C COUNT KEYS AND SETUP TABLE OF KEY INDEXES RELATIVE TO
C START OF EXPANDED WORD-ALIGNED RECORD
C
405 KEYS=0
IF(MODE.EQ.2)SRTSIZ=RECSIZ
DO 410 I=1,NKEY
IF(MODE.EQ.1)KWORD=(KEYSIZ(I)+4)/5
IF(MODE.EQ.2)KWORD=KEYSIZ(I)
DO 410 J=0,KWORD-1
KEYS=KEYS+1
IF(KEYS.GT.KEYLIM)GO TO 9150 !ERROR-TOO MANY KEYS
IF(MODE.EQ.1)KSORT(KEYS)=ISORT(I)+J
IF(MODE.EQ.2)KSORT(KEYS)=KEYPOS(I)+J
IF(KEYORD(I).NE.0)KSORT(KEYS)=-KSORT(KEYS)
410 CONTINUE
DO 420 I=1,KEYS
ISORT(I)=KSORT(I)
IF(ISORT(I).LT.0)ISORT(I)=-KSORT(I)
420 CONTINUE
C
C ******************************
C * SORT / MERGE *
C ******************************
C
INTSRT=0
CHNCNT=0
INPEOF=0
OUTYPE=0
IFLAG1=0
OFLAG1=0
KNTIN=0
KNTOUT=0
C
C SPLIT UP SCRATCH AREA INTO DATA AND WORK ARRAYS
C
NCOLS=SRTSIZ
NROWS=ICORE/(NCOLS+1)
430 JCORE=NCOLS*NROWS+NCOLS+NROWS
IF(JCORE.LE.ICORE)GO TO 440
NROWS=NROWS-1
GO TO 430
440 IF(NROWS.LT.MAXCHN-1)GO TO 9170 !ERROR-NO ROOM FOR MERGE
C
C CALCULATE OFFSETS INTO SCRATCH AREA
C
DO 441 I=1,MAXCHN
441 MRGPT(I)=IREL+NCOLS*(I-1)
INDXR=IREL
INDXC=IREL+NROWS
INDXS=INDXC+NCOLS
IEND=INDXS+NROWS*NCOLS-1
C
C GET NEXT TEMP FILE CHANNEL (UNIT #) IF AVAILABLE
C
444 CALL CHKCHN(0,MRGCHN)
IF(MRGCHN.LE.0)GO TO 9190 !ERROR-NOT ENOUGH CHANNELS
OPEN(UNIT=MRGCHN,FILE=MRGFIL,DEVICE=SCRDEV,
+ ACCESS='SEQOUT',MODE='IMAGE',BUFFER COUNT=BUFCNT)
C
450 IF(CHNCNT.GE.MAXCHN)GO TO 520 !MERGE
CALL CHKCHN(0,CURCHN)
IF(CHNCNT.LT.2.AND.CURCHN.LE.0)GO TO 9190 !ERROR-TOO FEW CHANNELS
IF(CURCHN.LE.0)GO TO 520 !MERGE
C
C READ INPUT FILE INTO SCRATCH AREA
C
460 CHNCNT=CHNCNT+1
CHANNL(CHNCNT)=CURCHN
OPEN(UNIT=CHANNL(CHNCNT),FILE=SCRFIL(CHNCNT),DEVICE=SCRDEV,
+ ACCESS='SEQOUT',MODE='IMAGE',BUFFER COUNT=BUFCNT)
KNT=0
461 ISTART=INDXS+KNT
IF(UNITI.NE.0)GO TO 465
RETURN
C
ENTRY SRTIN(IFLAG)
C
IFLAG1=IFLAG
IF(IFLAG1.NE.0)GO TO 500
IF(MODE.EQ.2)GO TO 462
DECODE(RECSIZ,FRMT,RECORD)(SCRTCH(J),J=ISTART,IEND,NROWS)
GO TO 467
462 JJ=0
DO 463 J=ISTART,IEND,NROWS
JJ=JJ+1
463 SCRTCH(J)=RECORD(JJ)
GO TO 467
465 IF(MODE.EQ.1)
+ READ(UNITI,FRMT,END=500)(SCRTCH(J),J=ISTART,IEND,NROWS)
IF(MODE.EQ.2)
+ READ(UNITI,END=500)(SCRTCH(J),J=ISTART,IEND,NROWS)
C
C COMPLIMENT DESCENDING KEY WORDS
C
467 DO 470 K=1,KEYS
IF(KSORT(K).GE.0)GO TO 470
J=ISTART+((-KSORT(K)-1)*NROWS)
SCRTCH(J)=.NOT.SCRTCH(J)
470 CONTINUE
KNT=KNT+1
IF(KNT.LT.NROWS)GO TO 461
C
C INTERNAL SORT
C
500 IF(KNT.LT.NROWS)INPEOF=1
IF(KNT.EQ.0)CHNCNT=CHNCNT-1
IF(KNT.EQ.0)GO TO 520
INTSRT=INTSRT+1
KNTIN=KNTIN+KNT
CALL SSORT(NCOLS,KNT,NCOLS,NROWS,SCRTCH(INDXS),ISORT,
+ KEYS,SCRTCH(INDXR),SCRTCH(INDXC))
IF(INTSRT.EQ.1.AND.INPEOF.EQ.1)GO TO 515 !NO MERGE NEEDED
C
C OUTPUT TEMP FILE
C
DO 510 I=0,KNT-1
ISTART=INDXS+I
510 WRITE(CURCHN)(SCRTCH(J),J=ISTART,IEND,NROWS)
IF(INPEOF.EQ.0)GO TO 450
C
C MERGE TEMP FILES INTO OUTPUT FILE OR NEW TEMP FILE
C
515 IF(UNITO.NE.0)GO TO 520
RETURN
C
ENTRY SRTOUT(OFLAG)
C
C OUTYPE = 0 ON FIRST PASS, FALL THRU COMPUTED GOTO
C AFTER FIRST PASS:
C = 1 IF MERGE WAS REQUIRED
C = 2 IF NO MERGE REQUIRED, ONLY ONE INTERNAL SORT
C
OFLAG1=OFLAG
GO TO (640,850) OUTYPE
C
520 IF(KNTIN.EQ.0)GO TO 9000
EOFCNT=0
IF(INTSRT.EQ.1.AND.INPEOF.EQ.1)GO TO 800
OUTYPE=1
C
C INITIALIZE TEMP FILE BUFFERS WITH FIRST RECORD
C
DO 550 I=1,CHNCNT
CLOSE(UNIT=CHANNL(I))
OPEN(UNIT=CHANNL(I),FILE=SCRFIL(I),DEVICE=SCRDEV,
+ ACCESS='SEQIN',MODE='IMAGE',BUFFER COUNT=BUFCNT)
EOF(I)=0
READ(CHANNL(I))(SCRTCH(J),J=MRGPT(I),MRGPT(I)+NCOLS-1)
550 CONTINUE
C
555 IF(OFLAG1.NE.0)GO TO 9000
IF(EOFCNT.EQ.CHNCNT)GO TO 700
C
C LOCATE NEXT RECORD FOR OUTPUT
C EOF(I), I=1,CHNCNT
C -1 EOF ON CHANNEL
C 0 RECORD NOT ELIMINATED AS NEXT FOR OUTPUT
C 1 RECORD ELIMINATED ON BASIS OF KEY VALUE
C
DO 590 IKY=1,KEYS
SELCNT=0
DESEL=1
MINKEY=BIGNUM
DO 580 ICH=1,CHNCNT
IF(EOF(ICH).NE.0)GO TO 580
C
C CHECK FOR NEW MIN VALUE OF KEY
C
CURKEY=SCRTCH(MRGPT(ICH)+ISORT(IKY)-1)
IF(CURKEY.LT.MINKEY)GO TO 560
IF(CURKEY.EQ.MINKEY)GO TO 570
EOF(ICH)=1
GO TO 580
560 IF(ICH.EQ.1)GO TO 570
DO 565 I=DESEL,ICH-1
565 IF(EOF(I).EQ.0)EOF(I)=1
DESEL=ICH
SELCNT=0
570 SELCNT=SELCNT+1
SELCHN=ICH
MINKEY=CURKEY
580 CONTINUE
IF(SELCNT.LT.1)GO TO 9180 !ERROR-CANNOT FIND NEXT RECORD
IF(SELCNT.EQ.1)GO TO (610,620)INPEOF+1
590 CONTINUE
GO TO (610,620)INPEOF+1
C
C OUTPUT SELECTED RECORD TO TEMP FILE
C
610 WRITE(MRGCHN)(SCRTCH(I),I=MRGPT(SELCHN),MRGPT(SELCHN)+NCOLS-1)
GO TO 640
C
C OUTPUT SELECTED RECORD TO OUTPUT FILE
C COMPLIMENT DESCENDING KEY WORDS FIRST
C
620 KNTOUT=KNTOUT+1
DO 625 K=1,KEYS
IF(KSORT(K).GE.0)GO TO 625
J=MRGPT(SELCHN)-KSORT(K)-1
SCRTCH(J)=.NOT.SCRTCH(J)
625 CONTINUE
JSTART=MRGPT(SELCHN)
JEND=JSTART+NCOLS-1
IF(UNITO.NE.0)GO TO 635
IF(MODE.EQ.2)GO TO 630
ENCODE(RECSIZ,FRMT,RECORD)(SCRTCH(I),I=JSTART,JEND)
GO TO 634
630 J=0
DO 632 I=JSTART,JEND
J=J+1
632 RECORD(J)=SCRTCH(I)
634 OFLAG1=0
RETURN
635 IF(MODE.EQ.1)WRITE(UNITO,FRMT)(SCRTCH(I),I=JSTART,JEND)
IF(MODE.EQ.2)WRITE(UNITO)(SCRTCH(I),I=JSTART,JEND)
C
C REFILL BUFFER JUST WRITTEN
C
640 READ(CHANNL(SELCHN),END=650)
+ (SCRTCH(I),I=MRGPT(SELCHN),MRGPT(SELCHN)+NCOLS-1)
GO TO 660
650 EOF(SELCHN)=-1
EOFCNT=EOFCNT+1
660 DO 670 I=1,CHNCNT
IF(EOF(I).GT.0)EOF(I)=0
670 CONTINUE
GO TO 555
C
C DONE MERGE PHASE, DELETE TEMP FILES
C
700 IF(INPEOF.EQ.1)GO TO 9000
DO 710 I=1,CHNCNT
CLOSE(UNIT=CHANNL(I),DISPOSE='DELETE')
710 CHANNL(I)=0
CLOSE(UNIT=MRGCHN,FILE=SCRFIL(1))
CHNCNT=1
CHANNL(1)=MRGCHN
MRGCHN=0
OPEN(UNIT=CHANNL(1),FILE=SCRFIL(1),DEVICE=SCRDEV,
+ ACCESS='APPEND',MODE='IMAGE',BUFFER COUNT=BUFCNT)
GO TO 444
C
C WRITE OUTPUT FILE IF NO MERGE NEEDED
C
800 OUTYPE=2
801 ISTART=INDXS+KNTOUT
C
C COMPLIMENT DESCENDING KEY WORDS
C
DO 810 K=1,KEYS
IF(KSORT(K).GE.0)GO TO 810
J=ISTART+((-KSORT(K)-1)*NROWS)
SCRTCH(J)=.NOT.SCRTCH(J)
810 CONTINUE
IF(UNITO.NE.0)GO TO 840
IF(MODE.EQ.2)GO TO 820
ENCODE(RECSIZ,FRMT,RECORD)(SCRTCH(J),J=ISTART,IEND,NROWS)
GO TO 835
820 JJ=0
DO 830 J=ISTART,IEND,NROWS
JJ=JJ+1
830 RECORD(JJ)=SCRTCH(J)
835 OFLAG=0
RETURN
840 IF(MODE.EQ.1)WRITE(UNITO,FRMT)(SCRTCH(J),J=ISTART,IEND,NROWS)
IF(MODE.EQ.2)WRITE(UNITO)(SCRTCH(J),J=ISTART,IEND,NROWS)
850 KNTOUT=KNTOUT+1
IF(KNTOUT.LT.KNTIN)GO TO 801
C
9000 IERR=KNTOUT
IFLAG=KNTOUT
OFLAG=KNTOUT
IF(OFLAG.EQ.0)OFLAG=-1
GO TO 9900
C
C ERROR RETURNS
C
C ILLEGAL UNIT NUMBER, INPUT OR OUTPUT
9110 IERR=-1
GO TO 9900
C ILLEGAL MODE
9120 IERR=-2
GO TO 9900
C ILLEGAL RECORD SIZE PARAMETER (RECSIZ)
9130 IERR=-3
GO TO 9900
C KEY SPECIFICATION ERROR
9140 IERR=-4
GO TO 9900
C TOO MANY KEYS
9150 IERR=-5
GO TO 9900
C FORMAT ROOM EXCEEDED
9160 IERR=-6
GO TO 9900
C NO ROOM FOR INTERNAL SORT
9170 IERR=-7
GO TO 9900
C INTERNAL ERROR - MERGE
9180 IERR=-8
GO TO 9900
C NOT ENOUGH CHANNELS AVAILABLE
9190 IERR=-9
C
C DELETE ALL OPEN TEMP FILES
C
9900 DO 9990 I=0,MAXCHN
IF(CHANNL(I).EQ.0)GO TO 9990
CLOSE(UNIT=CHANNL(I),DISPOSE='DELETE')
CHANNL(I)=0
9990 CONTINUE
C
9999 IF(ISIZE.LE.0)CALL ALLCOR(0,JERR,IREL,SCRTCH)
RETURN
END