aboutsummaryrefslogtreecommitdiff
path: root/noao/imred/vtel/readsubswath.x
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /noao/imred/vtel/readsubswath.x
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'noao/imred/vtel/readsubswath.x')
-rw-r--r--noao/imred/vtel/readsubswath.x91
1 files changed, 91 insertions, 0 deletions
diff --git a/noao/imred/vtel/readsubswath.x b/noao/imred/vtel/readsubswath.x
new file mode 100644
index 00000000..9c15bb44
--- /dev/null
+++ b/noao/imred/vtel/readsubswath.x
@@ -0,0 +1,91 @@
+include <mach.h>
+include <fset.h>
+include "vt.h"
+
+define SZ_VTRECFD 5120 # length, in chars, of full disk recs
+
+# READSUBSWATH -- Read data from file whose logical unit is inputfd.
+# Swap the bytes in each data word.
+
+procedure readsubswath (inputfd, selfbuf, databuf, buflength, bp)
+
+int inputfd # input file discriptor
+int buflength # length of data buffer
+bool selfbuf # self buffering flag
+short databuf[buflength] # data buffer
+pointer bp # buffer pointer structure pointer
+
+int num, bleft, last_recsize
+int read()
+errchk read
+
+begin
+ # If we are doing our own buffering, keep track of the number
+ # of records in each file, else let mtio do it.
+
+ last_recsize = 0
+ if (selfbuf) { # do our own buffering
+
+ # If there is enough data still in the buffer, just copy data
+ # to the output buffer and move the pointer, otherwise, read
+ # the next tape record.
+
+ if ((VT_BUFBOT(bp) - VT_BP(bp)) >= buflength) {
+ # Copy the data into the data buffer, move the pointer.
+ call amovs (Mems[VT_BP(bp)], databuf, buflength)
+ VT_BP(bp) = VT_BP(bp) + buflength
+
+ } else {
+ # Copy leftover data from the bottom of the input buffer
+ # into the top of the input buffer, reset the flags.
+
+ bleft = VT_BUFBOT(bp) - VT_BP(bp)
+ call amovs (Mems[VT_BP(bp)], Mems[VT_BUFP(bp)], bleft)
+ VT_BP(bp) = VT_BUFP(bp) + bleft
+
+ # Read in another tape record.
+ # Check the number of chars read. If this number is EOF or
+ # too short, error. If it is too long, truncate to correct
+ # length. This is done because some data tapes are written
+ # in a weird way and have some noise chars tacked on the end
+ # of each tape record.
+
+ iferr (num = read (inputfd, Mems[VT_BP(bp)],
+ 10000*SZB_SHORT/SZB_CHAR)) {
+ call fseti (inputfd, F_VALIDATE,
+ SZ_VTRECFD*SZB_SHORT/SZB_CHAR)
+ call printf ("Error reading subswath.\n")
+ num = read (inputfd, Mems[VT_BP(bp)],
+ SZ_VTRECFD*SZB_SHORT/SZB_CHAR)
+ }
+ if (num == EOF)
+ call error (0, "EOF encountered on tape read")
+ else if (num < SZ_VTRECFD*SZB_SHORT/SZB_CHAR)
+ call error (0, "error on tape read, record too short")
+ else if (num >= SZ_VTRECFD*SZB_SHORT/SZB_CHAR &&
+ num < (SZ_VTRECFD+300)*SZB_SHORT/SZB_CHAR)
+ num = SZ_VTRECFD*SZB_SHORT/SZB_CHAR
+ else
+ call error (0, "error on tape read, record too long")
+
+ # Update the pointers, move data into the data buffer.
+ VT_BUFBOT(bp) = VT_BP(bp) + num
+ call amovs (Mems[VT_BP(bp)], databuf, buflength)
+ VT_BP(bp) = VT_BP(bp) + buflength
+ }
+ } else { # Let the mtio do the buffering.
+ iferr (num = read (inputfd, databuf,
+ buflength*SZB_SHORT/SZB_CHAR)) {
+ call fseti (inputfd, F_VALIDATE,
+ last_recsize*SZB_SHORT/SZB_CHAR)
+ call printf ("Error on tape read.\n")
+ num = read (inputfd, databuf, buflength*SZB_SHORT/SZB_CHAR)
+ }
+ last_recsize = num
+ if (num < buflength*SZB_SHORT/SZB_CHAR)
+ call error (0, "eof encountered when reading subswath")
+ }
+
+ if (BYTE_SWAP2 == YES)
+ call bswap2 (databuf, 1, databuf, 1, buflength * SZB_SHORT)
+end