1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
|
SUBROUTINE TABLE5 (*,IN,OUT,TRL,IBUF,WRT,LFN,FN)
C
C THIS ROUTINE IS CALLED ONLY BY OUTPT5 TO COPY A TABLE FILE IN 'IN'
C TO AN OUPUT FILE 'OUT', BY FORTRAN WRITE, FORMATTED OR UNFORMATTED
C
C IN,OUT = INPUT AND OUTPUT FILE, INTEGERS
C TRL = TRAILER OF INPUT FILE, INTEGERS
C P4 = 0, OUTPUT FILE IS TO BE WRITTEN UNFORMATTED, BINARY, INT.
C = 1, OUTPUT FILE IS TO BE WRITTEN FORMATTED, INTEGER
C TI = ARRAY TO OVERRIDE DATA TYPE OUTPUT. INTEGERS
C SEE RULES BELOW.
C Z,IBUF = OPEN CORE AND GINO BUFFER POINTER, INTEGER
C WRT,LFN= ARE COMMUNICATION FLAGS BETWEEN TABLE5 AND OUTPT5
C FN = ARRAY FOR INPUT FILE NAME
C
C THE FOLLOWING CONVENTIONS ARE USED FOR FORMATTED TAPE -
C
C A '/'+A4 FORMAT FOR BCD WORD ( 5 BYTES)
C AN 'I'+I9 FORMAT FOR INTEGER (10 BYTES)
C A 'R'+E14.7 FORMAT FOR S.P. REAL NUMBER. (15 BYTES)
C A 'D'+D14.7 FORMAT FOR D.P. REAL NUMBER. (15 BYTES)
C A 'X'+4 BLANKS IS A FILLER, AT END OF A LINE ( 5 BYTES)
C
C EACH RECORD IS PRECEEDED BY L5 (IN I10 FORMAT) WHERE L5 IS THE
C TOTAL NO. OF CHARACTERS OF THIS CURRENT RECORD DIVIDED BY 5.
C
C EACH RECORD IS WRITTEN IN MULTIPLE LINES OF 130 CHARACTERS EACH.
C (131 CHARACTERS TO BE EXACTLY - 130 PLUS A BLANK)
C
C ONE OR TWO FILLERS MAY ATTACH TO THE END OF A LINE TO MAKE UP
C 130 CHARACTERS. THAT IS, INTEGER AND S.P.REAL NUMBER AT THE END
C OF A LINE WILL NOT BE SPLITTED BETWEEN TWO LINES
C
C IF A ZERO IS PRECEEDED BY A F.P. REAL NUMBER, IT WILL BE WRITTEN
C OUT AS A REAL ZERO (0.0), INTEGER ZERO (0) OTHERWISE.
C
C DUE TO THE FACTS THAT FLOATING POINT ZEROS ARE ALWAYS TREATED AS
C INTEGERS, DOUBLE PRECISION CAN NOT BE DETECTED, AND OCCATIONALLY
C AUTOMATIC DATA TYPE CHECKING MAY ERR, THE USER CAN OVERRIDE THE
C OUTPUT DATA FORMAT BY DEFINING TI ARRAYS WITH THE FOLLOWING
C RULES -
C
C EACH TI PARAMETER MUST HOLD 9 DIGITS, FROM LEFT TO RIGHT.
C ZEROS-FILLED IF NECCESSARY.
C TOTALLY THERE ARE 10 TI PARAMETERS. THEREFORE, THERE ARE
C UP TO 90 CONTINUOUS DIGITS CAN BE USED.
C (DEFAULT IS 90 ZEROS)
C EACH DIGIT HOLDS VALUE FROM 0 THROUGH 9, VALUE
C 0 MEANS DATA TYPE WILL BE SET AUTOMATICALLY BY TABLE5
C 1 MEANS DATA TYPE IS INTEGER
C 2 MEANS DATA TYPE IS REAL, SINGLE PRECISION
C 3 MEANS DATA TYPE IS BCD WORD (4 BYTES PER WORD)
C 4 MEANS DATA TYPE IS REAL, DOUGLE PRECISION
C 5-9 HAS SPECIAL MEANING. IT MEANS THERE ARE (5-9) VALUES
C OF DATA TYPE DEFINED BY THE NEXT VALUE FOLLOWING.
C EACH DIGIT IN TI, EXCEPT 5 THRU 9, DEFINES THE CORRESPODING
C DATA TYPE IN THE TABLE BLOCK DATA, STARTING FROM THE
C FIRST DATA WORD AND CONTINUE TO THE LAST.
C IF TI(1) IS NEGATIVE, INTERMEDIATE STEPS IN FORMAT GENERATION
C ARE PRINTED OUT.
C E.G.
C TABLE- 3 4 3.4 5.0E-3 TESTING .6D+7 9 G 3.2 8 0. 0 4
C 12 13 14 15 28 61 88 14 44 .7D+7
C TI - TI(1) =-112233413, TI(2) = 212516140 OR
C TI(1) = 604000025, TI(2) = 060400000 (7TH AND 24 WORDS ARE
C D.P. AND 12TH WORD IS REAL)
C NOTE - 2 BCD WORDS IN 'TESTING',
C ALL OTHERS ARE 1 COMPUTER WORD PER DATA ENTRY
C TI(2), THE LAST TI USED HERE, MUST FILL UP WITH ZEROS TO
C MAKE UP A 9-DIGIT WORD.
C
C TO READ THE OUTPUT FILE, USE TABLE-V SUBROUTINE AS REFERENCE
C
C NOTE - THE FORMATTED OUTPUT FILE CAN BE VIEWED AND/OR EDITTED BY
C THE SYSTEM EDITOR
C
C WRITTEN BY G.CHAN/UNISYS, 1989
C
C $MIXED_FORMATS
C
IMPLICIT INTEGER (A-Z)
LOGICAL DEBUG,TION,DP
INTEGER TRL(7),NAME(2),SUB(2),FN(3,1)
REAL TEMP(2),RZ(1)
DOUBLE PRECISION DTEMP
CHARACTER*10 FMT(30),FMTI,FMTR,FMTD,FMTB,FMTX,LPREN,RPREN,
1 LPRI10
CHARACTER UFM*23,UWM*25,UIM*29
COMMON /XMSSG / UFM,UWM,UIM
COMMON /SYSTEM/ SYSBUF,NOUT
COMMON /BLANK / DUMMY(4),P4,TI(1)
COMMON /ZZZZZZ/ Z(1)
CWKBI 7/94
COMMON /MACHIN/ MACH
EQUIVALENCE (Z(1),RZ(1)) , (DTEMP,TEMP(1))
DATA SUB / 4HTABL,4HE5 /, DEBUG / .FALSE. /
DATA FMTI, FMTR / '1HI,I9,' , '1HR,E14.7,' /
DATA FMTB, FMTD / '1H/,A4,' , '1HD,D14.7,' /
DATA FMTX, LPRI10 / '1HX,4X,' , '(I10,' /
DATA LPREN, RPREN, DEL / '(', '1X)', 4H),.) /
DATA END, TBLE / 4H*END, 4HTBLE /
C
DEBUG = .FALSE.
IF (TI(1) .LT. 0) DEBUG =.TRUE.
TI(1) = IABS(TI(1))
TION = .FALSE.
DO 10 L = 1,10
IF (TI(L) .NE. 0) TION=.TRUE.
10 CONTINUE
IF (DEBUG) CALL PAGE1
IF (DEBUG) WRITE (NOUT,20)
20 FORMAT (///5X,'*** IN TABLE5/OUTPUT5 ***')
KORE = IBUF - 2
C
C OPEN INPUT FILE, AND READ FILE NAME IN THE FILE HEADER RECORD
C WRITE ONE HEADER RECORD, IN OUTPT5 MATRIX HEADER FORMAT, TO
C OUTPUT TAPE
C
CALL OPEN (*810,IN,Z(IBUF),0)
CALL READ (*820,*830,IN,NAME,2,1,KK)
IF (DEBUG) WRITE (NOUT,30) NAME
30 FORMAT (/5X,'PROCESSING...',2A4,/)
I = 0
J = 1
TRL(7) = 0
IF (P4 .EQ. 0) WRITE (OUT ) I,J,J,DTEMP,(TRL(K),K=2,7),NAME
IF (P4 .EQ. 1) WRITE (OUT,40) I,J,J,DTEMP,(TRL(K),K=2,7),NAME
40 FORMAT (3I8,/,D26.17,6I8,2A4)
C
50 IF (P4 .EQ. 1) GO TO 100
C
C UNFORMATED WRITE
C
J = 2
60 CALL READ (*700,*70,IN,Z(J),KORE,1,KK)
J = 0
GO TO 840
70 IF (J .EQ. 1) GO TO 80
J = 1
Z(1) = KK
80 CALL WRITE (OUT,Z(1),KK,1)
GO TO 60
C
C FORMATTED WRITE
C
100 J = 2
CALL READ (*700,*110,IN,Z(J),KORE,1,KK)
J = 0
GO TO 840
C
C SET UP USER DIRECTED TI TABLE IN Z(KK2) THRU Z(KK3)
C
110 IF (DEBUG) WRITE (NOUT,120) (TI(J),J=1,10)
120 FORMAT (//5X,'TI PARAMETERS =',/4X,10(1X,I9))
KK1 = KK + 2
KK2 = KK1 + KK
KK3 = KK2 + KK
J = KORE - KK3 - 9
IF (J .LT. 0) GO TO 840
DO 140 K = KK1,KK3
140 Z(K) = 0
IF (.NOT.TION) GO TO 260
K = KK1 - 9
LL = 0
L = -1
150 IF (L .GE. 0) GO TO 170
L = 8
LL = LL + 1
K = K + 9
IF (K.GE.KK2 .OR. LL.GT.10) GO TO 200
TIL= TI(LL)
IF (TIL .GT. 0) GO TO 170
L = -1
GO TO 150
170 TIL10 = TIL/10
Z(K+L)= TIL - TIL10*10
TIL = TIL10
L = L - 1
GO TO 150
C
200 K = KK2 - 1
IF (DEBUG) WRITE (NOUT,210) (Z(J),J=KK1,K)
210 FORMAT (//5X,'DIGITIZED TI PARAMTERS =',/,(3X,25I3))
I = KK2
DO 240 J = KK1,K
JZ = Z(J)
IF (JZ .LE. 4) GO TO 230
JI = JZ + I - 1
JJ = Z(J+1)
IF (JJ .GT. 4) GO TO 860
DO 220 L = I,JI
220 Z(L) = JJ
I = JI + 1
Z(J+1) = -1
GO TO 240
230 IF (JZ .EQ. -1) GO TO 240
Z(I) = JZ
I = I + 1
240 CONTINUE
I = KK3 - 1
IF (DEBUG) WRITE (NOUT,250) (Z(J),J=KK2,I)
250 FORMAT (//,5X,'DECODED TI PARAMETERS =',/,(3X,25I3))
C
C COUNT HOW MANY 5-BYTE WORDS TO BE GENERATED, FILLERS INCLUDED
C
260 KK2 = KK2 - 1
K = KK1
PJJ = 1
L5 = 10
C
IF (DEBUG) CALL PAGE1
DO 400 I = 1,KK
K = K + 1
PJJ = JJ
IF (TION) GO TO 290
280 JJ = NUMTYP(Z(I+1)) + 1
GO TO 300
290 JJ = Z(KK2+I) + 1
IF (JJ .EQ. 1) GO TO 280
300 GO TO (310,320,340,380,340), JJ
C 0, I, R, B, D
C
C ZERO
C
310 JJ = 3
IF (PJJ.EQ.3 .OR. PJJ.EQ.5) GO TO 340
JJ = 2
C
C INTEGER
C
320 IF (MOD(L5,130) .LE. 120) GO TO 330
Z(K)= 6
K = K + 1
L5 = L5 + 5
330 Z(K)= JJ
L5 = L5 + 10
GO TO 400
C
C REAL, S.P. OR D.P.
C
340 J = MOD(L5,130)
IF (J-120) 370,350,360
350 L5 = L5 + 5
Z(K)= 6
K = K + 1
360 L5 = L5 + 5
Z(K)= 6
K = K + 1
370 Z(K)= JJ
L5 = L5 + 15
GO TO 400
C
C BCD
C
380 Z(K)= JJ
L5 = L5 + 5
C
400 CONTINUE
C
C NOW WE FORM THE FORMAT
C
DP = .FALSE.
KK = K
Z(1) = (L5-10)/5
FMT(1) = LPRI10
C
L5 = 10
L = 1
I = 1
IB = 1
K = KK1
500 IF (L5 .LT. 130) GO TO 540
L = L + 1
FMT(L) = RPREN
IF (.NOT.DEBUG) GO TO 520
CALL PAGE2 (-5)
WRITE (NOUT,510) (FMT(J),J=1,L)
510 FORMAT (/,' DYNAMICALLY GENERATED FORMAT =',/,(1X,7A10))
CWKBD 7/94 520 WRITE (OUT,FMT,ERR=530) (RZ(J),J=IB,I)
CWKBNB 7/94
520 IF ( MACH .NE. 5 .AND. MACH .NE. 2 ) GO TO 525
WRITE (OUT,FMT,ERR=530) (RZ(J),J=IB,I)
GO TO 530
525 ISAVE = NOUT
NOUT = OUT
CALL FORWRT ( FMT, RZ(IB), I-IB+1)
NOUT = ISAVE
CWKBNE 7/94
530 IB = I + 1
L5 = 0
L = 1
FMT(1) = LPREN
C
540 K = K + 1
IF (K .GT. KK) GO TO 650
I = I + 1
L = L + 1
J = Z(K)
GO TO (600,600,610,620,630,640), J
C 0, I, R, B, D, FL
600 FMT(L) = FMTI
L5 = L5 + 10
GO TO 500
C
C S.P. REAL NUMBERS
C
610 FMT(L) = FMTR
L5 = L5 + 15
GO TO 500
C
620 FMT(L) = FMTB
L5 = L5 + 5
GO TO 500
C
C D.P. NUMBERS
C
630 FMT(L) = FMTD
L5 = L5 + 15
TEMP(1)= RZ(L )
TEMP(2)= RZ(L+1)
Z(L ) = SNGL(DTEMP)
Z(L+1) = DEL
DP =.TRUE.
GO TO 500
C
C FILLER
C
640 FMT(L) = FMTX
L5 = L5 + 5
I = I - 1
GO TO 500
C
650 L = L + 1
FMT(L) = RPREN
IF (.NOT.DEBUG) GO TO 660
CALL PAGE2 (-5)
WRITE (NOUT,510) (FMT(J),J=1,L)
C
C REMOVED SECOND HALVES OF ALL D.P. NUMBERS IF THEY ARE PRESENT
C THEN WRITE THE ARRAY OUT WITH THE GENERATED FORMAT
C
660 IF (.NOT.DP) GO TO 680
K = IB - 1
DO 670 J = IB,I
IF (Z(J) .EQ. DEL) GO TO 670
K = K + 1
Z(K)= Z(J)
670 CONTINUE
I = K
CWKBD 7/94 680 WRITE (OUT,FMT,ERR=690) (RZ(J),J=IB,I)
CWKBNB 7/94
680 IF ( MACH .NE. 2 .AND. MACH .NE. 5 ) GO TO 685
WRITE (OUT,FMT,ERR=690) (RZ(J),J=IB,I)
GO TO 690
685 ISAVE = NOUT
NOUT = OUT
CALL FORWRT ( FMT, RZ(IB), I-IB+1)
NOUT = ISAVE
CWKBNE 7/94
C
C RETURN TO PROCESS ANOTHER RECORD ON INPUT FILE
C
690 DEBUG = .FALSE.
GO TO 50
C
C ALL DONE. SET WRT FLAG, UPDATE LFN AND FN, AND CLOSE INPUT FILE
C AND ECHO USER MESSAGES
C
700 WRT = 1
IF (LFN .LT. 0) LFN = 0
LFN = LFN + 1
FN(1,LFN) = NAME(1)
FN(2,LFN) = NAME(2)
FN(3,LFN) = TBLE
CALL CLOSE (IN,1)
IF (P4 .EQ. 1) GO TO 730
CALL PAGE2 (-7)
WRITE (OUT) I,END
WRITE (NOUT,710) UIM,NAME
710 FORMAT (A29,' FROM OUTPUT5 MODULE, SUCCESSFUL TABLE-DATA ',
1 'TRANSFERED FROM INPUT FILE ',2A4,' TO OUTPUT TAPE', //5X,
2 'A HEADER RECORD WAS FIRST WRITTEN, THEN FOLLOWED BY')
WRITE (NOUT,720)
720 FORMAT (5X,'FORTRAN UNFORMATTED (BINARY) WRITE')
GO TO 950
730 I = 1
WRITE (OUT,740) I,END
740 FORMAT (1X,I9,1X,A4)
CALL PAGE2 (-13)
WRITE (NOUT,710) UIM,NAME
WRITE (NOUT,750)
750 FORMAT (5X,'FORTRAN FORMATTED WRITE, 130 CHARACTERS PER LINE -',
1 /10X,'(''/'',A4 FOR BCD WORD ( 5 BYTES)',
2 /11X,'''I'',I9 FOR INTEGER (10 BYTES)',
3 /11X,'''R'',E14.7 FOR S.P. REAL (15 BYTES)',
4 /11X,'''D'',D14.7 FOR D.P. NUMBER (15 BYTES)',
5 /11X,'''X '', FOR FILLER ( 5 BYTES)')
GO TO 950
C
C ERROR
C
810 J = 1
GO TO 850
820 J = 2
GO TO 850
830 J = 3
GO TO 850
840 IN= J
J = 8
850 CALL MESAGE (J,IN,SUB)
GO TO 880
860 WRITE (NOUT,870) UWM,JI,JJ
870 FORMAT (A25,', OUTPTT5 MODULE PARAMETER ERROR. WRONG INDEX ',
1 'VALUES',2I3)
880 CALL FNAME (IN,NAME)
WRITE (NOUT,890) NAME
890 FORMAT (/5X,'TABLE DATA BLOCK ',2A4,' WAS NOT COPIED TO OUTPUT',
1 ' TAPE')
900 CALL FWDREC (*950,IN)
GO TO 900
C
950 RETURN 1
END
|