aboutsummaryrefslogtreecommitdiff
path: root/noao/mtlocal/camera/t_rcamera.x
blob: ccf235e5c493115f3c0678a0fc19e695c4b3421e (plain) (blame)
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
include <error.h>
include <fset.h>

# T_RCAMERA -- Read CAMERA format data.  Further documentation given
# in rcamera.hlp

define	MAX_RANGES	100

procedure t_rcamera()

char	infile[SZ_FNAME]		# input file name list
char	outfile[SZ_FNAME]		# output image name list
char	file_list[SZ_LINE]		# input file number list
char	image_list[SZ_LINE]		# output image number list
int	offset				# output file number offset

char	in_fname[SZ_FNAME], out_fname[SZ_FNAME]
int	range[MAX_RANGES * 2 + 1], image_ranges[MAX_RANGES * 2 + 1]
int	nimages, nfiles, file_number, stat, lenlist, junk
pointer	list

bool	clgetb()
char	clgetc()
int	fstati(), mtfile(), mtneedfileno(), clgeti(), btoi(), fntlenb()
int	fntgfnb(), cam_read(), decode_ranges(), get_next_number()
int	cam_get_image_type()
pointer	fntopnb()

include	"rcamera.com"

begin
	# Flush the standard output.
	if (fstati (STDOUT, F_REDIR) == NO)
	    call fseti (STDOUT, F_FLUSHNL, YES)

	# Get the parameters.
	call clgstr ("camera_file", infile, SZ_FNAME)
	if (mtfile (infile) == YES) {
	    list = NULL
	    tape = YES
	    if (mtneedfileno (infile) == YES)
	        call clgstr ("file_list", file_list, SZ_LINE)
	    else
	        call strcpy ("1", file_list, SZ_LINE)
	} else {
	    tape = NO
	    list = fntopnb (infile, NO)
	    lenlist = fntlenb (list)
	    call sprintf (file_list, SZ_LINE, "1-%d")
		call pargi (lenlist)
	}

	# Decode the ranges string.
	if (decode_ranges (file_list, range, MAX_RANGES, nfiles) == ERR)
	    call error (1, "Illegal file number list")

	# Set up the output options.
	long_header = btoi (clgetb ("long_header"))
	short_header = btoi (clgetb ("short_header"))
	lsbf = btoi (clgetb ("standard_format"))
	make_image = btoi (clgetb ("make_image"))
	offset = clgeti ("offset")

	# Get the image pixel type.
	if (make_image == YES) {
	    data_type = cam_get_image_type (clgetc ("datatype"))
	    call clgstr ("iraf_file", outfile, SZ_FNAME)
	} else
	    outfile[1] = EOS

	# Get the list of images per file.
	call clgstr ("image_list", image_list, SZ_LINE)
	if (decode_ranges (image_list, image_ranges, MAX_RANGES, nimages)
	    == ERR)
	    call error (1, "Illegal image number list")

	# Read successive CAMERA files, convert and write into a numbered
	# succession of output IRAF files.

	file_number = 0
	while (get_next_number (range, file_number) != EOF) {

	    # Get the input file name.
	    if (tape == NO)
		junk = fntgfnb (list, in_fname, SZ_FNAME)
	    else {
		if (mtneedfileno (infile) == YES)
		    call mtfname (infile, file_number, in_fname, SZ_FNAME)
	        else
	            call strcpy (infile, in_fname, SZ_FNAME)
	    }

	    # Get the output file name.
	    if (nfiles > 1) {
		call sprintf (out_fname[1], SZ_FNAME, "%s%03d")
		    call pargstr (outfile)
		    call pargi (file_number + offset)
	    } else
	        call strcpy (outfile, out_fname, SZ_FNAME)

	    # Convert CAMERA file to the output IRAF file. If EOT is reached
	    # then exit. If an error is detected that is not trapped lower down
	    # in the code terminate execution.

	    iferr (stat = cam_read (in_fname, out_fname, image_ranges,
	    	    nimages))
		call erract (EA_FATAL)
	    if (stat == EOF) 	# EOT found
		break
	}

	if (list != NULL)
	    call fntclsb (list)
end


# CAM_GET_IMAGE_TYPE -- Convert a character to an IRAF image type.

define	NTYPES	7

int procedure cam_get_image_type (c)

char	c			# the input data type

int	i, type_codes[NTYPES]
int	stridx()
string	types "usilrdx"
data	type_codes /TY_USHORT, TY_SHORT, TY_INT, TY_LONG, TY_REAL,
		    TY_DOUBLE, TY_COMPLEX/

begin
	i = stridx (c, types)
	if (i == 0)
	    return (ERR)
	else
	    return (type_codes[stridx (c, types)])
end