aboutsummaryrefslogtreecommitdiff
path: root/noao/mtlocal/cyber/t_rdumpf.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /noao/mtlocal/cyber/t_rdumpf.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'noao/mtlocal/cyber/t_rdumpf.x')
-rw-r--r--noao/mtlocal/cyber/t_rdumpf.x162
1 files changed, 162 insertions, 0 deletions
diff --git a/noao/mtlocal/cyber/t_rdumpf.x b/noao/mtlocal/cyber/t_rdumpf.x
new file mode 100644
index 00000000..9d780b9e
--- /dev/null
+++ b/noao/mtlocal/cyber/t_rdumpf.x
@@ -0,0 +1,162 @@
+include <mach.h>
+include <error.h>
+include <fset.h>
+include "cyber.h"
+
+# T_RDUMPF-- The main procedure for the DUMPF reader. Permanent files
+# containing IPPS rasters are read in dumpf format and optionally
+# converted to IRAF images. Each permanent file is a seperate tape file;
+# the IPPS rasters are sequentially stored in the permanent file, seperated
+# by "zero length PRU's". The first 48 words of each permanent file
+# contain the Cyber permanent file table, catalog and file header information
+# for the file. This information is listed with task LDUMPF. For each
+# file in file_list, the file is opened. Then for each raster in the file,
+# READ_HEADER must be called, followed by either READ_IMAGE or SKIP_IMAGE.
+
+procedure t_rdumpf()
+
+pointer sp, dt, dummy
+bool make_image, print_header, bad_header
+char dumpf_file[SZ_FNAME], iraf_file[SZ_FNAME], file_list[SZ_LINE]
+char out_fname[SZ_FNAME], raster_list[SZ_LINE], in_fname[SZ_FNAME]
+int fd, file_number, ras_number, current_ras
+int stat, nfile, nras
+int rasters[3, MAX_RANGES], files[3, MAX_RANGES], data_type
+
+bool clgetb()
+char clgetc()
+int get_data_type(), strlen(), mtfile()
+int get_cyber_words()
+int get_cyber_words_init(), read_dumpf_init(), position_dumpf()
+int mtopen(), decode_ranges(), get_next_number(), cy_read_header()
+
+begin
+ call fseti (STDOUT, F_FLUSHNL, YES)
+
+ # Allocate space for program data structure and buffers
+ call smark (sp)
+ call salloc (dt, LEN_DT, TY_STRUCT)
+ call salloc (dummy, NINT_CYBER_WRD * LEN_PFT, TY_INT)
+
+ # Get paramters from cl
+ call clgstr ("dumpf_file", dumpf_file, SZ_FNAME)
+ if (mtfile (dumpf_file) == YES)
+ call clgstr ("file_list", file_list, SZ_LINE)
+ else
+ call strcpy ("1", file_list, SZ_LINE)
+ if (decode_ranges (file_list, files, MAX_RANGES, nfile) == ERR)
+ call error (0, "Illegal file list")
+
+ call clgstr ("raster_list", raster_list, SZ_LINE)
+ if (decode_ranges (raster_list, rasters, MAX_RANGES, nras) == ERR)
+ call error (1, "Illegal raster list")
+
+ print_header = clgetb ("print_header")
+ 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
+ }
+
+ # Expand file_list and open dumpf_file
+ file_number = 0
+ while (get_next_number (files, file_number) != EOF) {
+
+ # Get the file name and open file.
+ if (mtfile (dumpf_file) == YES)
+ call mtfname (dumpf_file, file_number + 1, in_fname, SZ_FNAME)
+ else
+ call strcpy (dumpf_file, in_fname, SZ_FNAME)
+ fd = mtopen (in_fname, READ_ONLY, SZ_TAPE_BUFFER)
+
+ # Position to first IPPS raster in file, skipping Cyber PFT etc.
+ stat = get_cyber_words_init()
+ stat = read_dumpf_init()
+
+ if (get_cyber_words (fd, Memi[dummy], LEN_PFT) == EOF) {
+ call printf ("DUMPF Tape at EOF\n")
+ call close (fd)
+ call sfree (sp)
+ return
+ }
+
+
+ ras_number = 0
+ current_ras = 1
+ while (get_next_number (rasters, ras_number) != EOF) {
+ # Position to first record of ras_number
+ if (current_ras != ras_number) {
+ iferr (stat = position_dumpf (fd, current_ras, ras_number,
+ dt))
+ call erract (EA_FATAL)
+ if (stat == EOF)
+ break
+ }
+
+ bad_header = false
+ iferr {
+ stat = cy_read_header (fd, dt)
+ } then {
+ # Error reading header; will attempt to skip raster
+ bad_header = true
+ call erract (EA_WARN)
+ }
+
+ if (stat == EOF) {
+ call printf ("DUMPF Tape at End of File%d\n\n")
+ call pargi (file_number)
+ break
+ }
+
+ if (print_header)
+ call cy_list_header (dt, file_number, ras_number)
+
+ if (make_image && ! bad_header) {
+ call strcpy (iraf_file, out_fname, SZ_FNAME)
+ if (nras > 1 || nfile > 1) {
+ call sprintf (out_fname[strlen(out_fname)+1], SZ_FNAME,
+ "%d.%03d")
+ call pargi (file_number)
+ call pargi (ras_number)
+ }
+ iferr (call read_ipps_rows (fd, out_fname, data_type, dt))
+ call erract (EA_FATAL)
+ } else
+ iferr (call cy_skip_image (fd, dt))
+ call erract (EA_FATAL)
+
+ current_ras = current_ras + 1
+ }
+ call close (fd)
+ }
+ call sfree (sp)
+ return
+end
+
+
+# POSITION_DUMPF -- 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_dumpf (rd, current_ras, ras_number, dt)
+
+int rd, current_ras, ras_number
+pointer dt
+int nras_skip, i
+int cy_read_header()
+errchk cy_skip_image
+
+begin
+ nras_skip = ras_number - current_ras
+ for (i=1; i <= nras_skip; i=i+1) {
+ if (cy_read_header (rd, dt) == EOF) {
+ call printf ("Cannot position DUMPF tape beyond EOF\n")
+ return (EOF)
+ }
+ call cy_skip_image (rd, dt)
+ current_ras = current_ras + 1
+ }
+ return (OK)
+end