aboutsummaryrefslogtreecommitdiff
path: root/noao/mtlocal/cyber/rrcopy/t_rrcopy.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/mtlocal/cyber/rrcopy/t_rrcopy.x
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'noao/mtlocal/cyber/rrcopy/t_rrcopy.x')
-rw-r--r--noao/mtlocal/cyber/rrcopy/t_rrcopy.x147
1 files changed, 147 insertions, 0 deletions
diff --git a/noao/mtlocal/cyber/rrcopy/t_rrcopy.x b/noao/mtlocal/cyber/rrcopy/t_rrcopy.x
new file mode 100644
index 00000000..9bb83885
--- /dev/null
+++ b/noao/mtlocal/cyber/rrcopy/t_rrcopy.x
@@ -0,0 +1,147 @@
+include <mach.h>
+include <imhdr.h>
+include <error.h>
+include "rrcopy.h"
+
+# T_RRCOPY -- The main procedure for the RCOPY reader. The RCOPY reader
+# converts IPPS rasters written in RCOPY format to IRAF images. All IPPS
+# rasters on an RCOPY tape are in a single file. Each raster header must
+# be read before the image can be either skipped or read. T_RRCOPY gets
+# parameters from the cl and decodes the string of rasters to be read. It
+# then calls READ_HEADER for each raster on the tape. The header information
+# is printed if print_header=true. If make_image = true, the image is
+# converted to an IRAF image by READ_IMAGE. Otherwise, the image is skipped
+# with SKIP_IMAGE. T_RRCOPY terminates when the raster list is depleted or
+# the tape is at EOT.
+#
+# Modified 26-JULY-88 to allow for multiple rcopy files on a single tape.
+# This allows for rcopy format data to be archived in multiple files on
+# one tape. The task is still run once per input file. The user is queried
+# (hidden parameter) for the data file to be read. The tape file is actually
+# datafile + 1 because of the ANSI label on each rrcopy tape. (ShJ)
+
+procedure t_rrcopy ()
+
+pointer sp, rp
+bool make_image, print_header, bad_header
+char rcopy_file[SZ_FNAME], iraf_file[SZ_FNAME]
+char out_fname[SZ_FNAME], raster_list[SZ_LINE]
+int rd, ras_number, current_ras, nras, stat, tapefile
+int ranges[3, MAX_RANGES], data_type, init
+
+bool clgetb()
+char clgetc()
+int get_data_type(), position_rcopy(), rc_read_cyber_init(), clgeti()
+int mtopen(), decode_ranges(), get_next_number(), rc_header_read(), strlen()
+int mtfile()
+
+begin
+ # Allocate space on stack for program data structure
+ call smark (sp)
+ call salloc (rp, LEN_RP, TY_STRUCT)
+
+ # Get input filename and open tape drive to second file, skipping label
+ call clgstr ("rcopy_file", rcopy_file, SZ_FNAME)
+ if (mtfile (rcopy_file) == YES) {
+ tapefile = clgeti ("datafile") + 1
+ call mtfname (rcopy_file, tapefile, rcopy_file, SZ_FNAME)
+ }
+ rd = mtopen (rcopy_file, READ_ONLY, SZ_BUFFER)
+ init = rc_read_cyber_init()
+
+ # Get output root filename if it will be needed
+ make_image = clgetb ("make_image")
+ if (make_image) {
+ call clgstr ("iraf_file", iraf_file, SZ_FNAME)
+ data_type = get_data_type (clgetc ("data_type"))
+ if (data_type == ERR)
+ data_type = NOT_SET
+ }
+
+ # Set options
+ print_header = clgetb ("print_header")
+
+ # Expand list of rasters to be read from tape
+ call clgstr ("raster_list", raster_list, SZ_LINE)
+ if (decode_ranges (raster_list, ranges, MAX_RANGES, nras) == ERR)
+ call error (0, "Illegal raster number list")
+
+ ras_number = 0
+ current_ras = 1
+ while (get_next_number (ranges, ras_number) != EOF) {
+ # Position tape to first record of ras_number
+ if (current_ras != ras_number) {
+ iferr (stat = position_rcopy (rd, current_ras, ras_number, rp))
+ call erract (EA_FATAL)
+ if (stat == EOF)
+ break
+ }
+
+ # Assume header is good
+ bad_header = false
+ iferr {
+ stat = rc_header_read (rd, rp)
+ } then {
+ # Error reading header; will attempt to skip raster
+ bad_header = true
+ call erract (EA_WARN)
+ }
+
+ if (stat == EOF) {
+ call printf ("\nRCOPY tape at End of Tape\n")
+ break
+ }
+
+ if (print_header)
+ call rc_list_header (rp, ras_number)
+ call flush (STDOUT)
+
+ if (make_image && ! bad_header) {
+ # Generate output filename
+ call strcpy (iraf_file, out_fname, SZ_FNAME)
+ if (nras > 1) {
+ call sprintf (out_fname[strlen(out_fname)+1], SZ_FNAME,
+ "%03d")
+ call pargi (ras_number)
+ }
+ iferr (call rc_read_image (rd, out_fname, data_type, rp))
+ call erract (EA_FATAL)
+ } else
+ iferr (call rc_skip_image (rd, rp))
+ call erract (EA_FATAL)
+
+ # Increment tape position
+ current_ras = current_ras + 1
+ }
+
+ # Return space allocated for rp, close tape unit
+ call close (rd)
+ call sfree (sp)
+end
+
+
+# POSITION_RCOPY -- Position the tape to the first
+# record of the next raster to be read. Each raster header must
+# be read; each image can then be skipped.
+
+int procedure position_rcopy (rd, current_ras, ras_number, rp)
+
+int rd, current_ras, ras_number
+pointer rp
+int nras_skip, i, stat
+int rc_header_read()
+errchk rc_skip_image
+
+begin
+ nras_skip = ras_number - current_ras
+ for (i=1; i <= nras_skip; i=i+1) {
+ stat = rc_header_read (rd, rp)
+ if (stat == EOF) {
+ call printf ("Cannot position RCOPY tape beyond EOF\n")
+ return (EOF)
+ }
+ call rc_skip_image (rd, rp)
+ current_ras = current_ras + 1
+ }
+ return (OK)
+end