|
|
1.1 root 1: .TI F77/TP_EX2.F "Sep. 15, 1984"
2:
3: .nf
4: .po 0
5: c sample program to illustrate reading blocked tape
6: c
7: c this reads a blocked tape (80 char/record, 40 rec/block).
8: c it reads col 1-5 and 6-10 as integer fields into
9: c ix1 and ix2 and prints them out.
10: c
11:
12: integer tlu
13: character*80 rec
14: logical eof
15:
16: nmrecs = 0
17:
18: tlu = 1
19: call tpopen( tlu, .false., .false. )
20:
21: 10 call getrec( tlu, rec, eof )
22: if( eof ) go to 900
23: nmrecs = nmrecs + 1
24:
25: read ( rec, 8100 ) ix1, ix2
26: 8100 format( 2i5 )
27:
28: print 8110, ix1, ix2
29: 8110 format( 1x,2i5 )
30: go to 10
31:
32: 900 continue
33: end
34: c ---------------------- getrec() -------------------------------
35: subroutine getrec( tlu, record, eof )
36: integer tlu
37: character record*(*)
38: logical eof
39:
40: c getrec() returns in the character variable
41: c 'record' the next record from the tape,
42: c deblocking the tape as needed.
43: c parameters:
44: c tlu - the "tape logical unit" as described in
45: c "man 3f topen". getrec() assumes topen()
46: c was called by the calling program.
47: c record - buffer in which the record is returned
48: c eof - set to .true. after all records read.
49: c
50: c The characters/record and records/block are set
51: c up in the following parameter statement:
52:
53: parameter (mxrecs=40, mxbyts=80, mxbufl=mxrecs*mxbyts)
54: character bufrcs(mxrecs)*mxbyts, bufall*(mxbufl)
55: equivalence (bufrcs(1),bufall)
56:
57: integer recno, recsrd, tread
58: data recno/mxrecs/, recsrd/mxrecs/
59:
60: if(len(record) .lt. mxbyts)
61: 1 call tperr("record() arg to getrec() too short:", len(record))
62:
63: recno = recno+1
64: if(recno.gt.recsrd) then
65: nbytes = tread(tlu, bufall)
66: if(nbytes .eq. 0 ) then
67: eof = .true.
68: return
69: else if(nbytes.lt.0) then
70: call perror("getrec:")
71: call tperr("tread() error:", nbytes)
72: else if(nbytes.gt.mxbufl) then
73: call tperr("block too long:", nbytes)
74: else
75: recsrd = nbytes / mxbyts
76: if( nbytes.ne. recsrd*mxbyts)
77: 1 call tperr("invalid block length:", nbytes)
78: recno = 1
79: endif
80: endif
81:
82: record = bufrcs(recno)
83: eof = .false.
84: return
85: end
86: c -------------------------- tperr -------------------------------
87: subroutine tperr( string, value )
88: character string*(*)
89: integer value
90:
91: write( 0, 8000 ) string, value
92: 8000 format("tape I/O error: ",a,i6)
93: call exit(1)
94: end
95: c -------------------------- tpopen -------------------------------
96: subroutine tpopen( tlu, label, rew )
97: integer tlu
98: logical label, rew
99:
100: c open tape logical unit 'tlu' to device named in
101: c environment variable 'tape1'.
102: c 'label' is an input parameter which is .true. for
103: c labeled tapes.
104: c if 'rew' is .true., tape is rewound by tpopen().
105:
106: character tpdev*50
107: integer retcde, topen, trewin
108:
109: call getenv( 'tape1', tpdev )
110: if(tpdev .eq. ' ') call tperr("tape1 = ' '", 0 )
111:
112: retcde = topen(tlu, tpdev(:lnblnk(tpdev)), label )
113: if(retcde .ne. 0) then
114: call perror("tpopen")
115: call tperr("topen() failed, error:", retcde)
116: endif
117:
118: if(rew) then
119: retcde = trewin( tlu )
120: if(retcde .ne. 0) then
121: call perror("tpopen")
122: call tperr("trewin() failed, error:", retcde)
123: endif
124: endif
125:
126: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.