diff options
author | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
---|---|---|
committer | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
commit | 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch) | |
tree | 4464880c571602d54f6ae114729bf62a89518057 /sys/imfort/imrdhdr.x | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'sys/imfort/imrdhdr.x')
-rw-r--r-- | sys/imfort/imrdhdr.x | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/sys/imfort/imrdhdr.x b/sys/imfort/imrdhdr.x new file mode 100644 index 00000000..74597811 --- /dev/null +++ b/sys/imfort/imrdhdr.x @@ -0,0 +1,200 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <mach.h> +include <imhdr.h> +include "imfort.h" +include "imhv1.h" +include "imhv2.h" +include "oif.h" + + +# IMRDHDR -- Read the image header. Either the main image header or the +# pixel file header can be read. + +int procedure imrdhdr (fp, im, uchars, htype) + +pointer fp #I header file descriptor +pointer im #I image descriptor +int uchars #I maxchars of user area data to read +int htype #I TY_IMHDR or TY_PIXHDR + +pointer sp, v1 +char immagic[SZ_IMMAGIC] +int sulen_userarea, hdrlen, nchars, status + +bool streq() +int i_miirdc(), i_miirdi(), i_miirdl(), i_miirdr() +int btoi(), bfrseq(), bfseek() + +define readerr_ 91 + +begin + # Determine the file type. + if (bfseek (fp, BOFL) == ERR) + return (ERR) + if (bfrseq (fp, immagic, SZ_IMMAGIC) != SZ_IMMAGIC) + return (ERR) + + if (htype == TY_PIXHDR && streq (immagic, V1_PMAGIC)) { + # V1 Pixel file header. + return (OK) + + } else if (htype == TY_IMHDR && streq (immagic, V1_MAGIC)) { + # Old V1 image header. + + call smark (sp) + call salloc (v1, LEN_V1IMHDR, TY_STRUCT) + + if (bfseek (fp, BOFL) == ERR) { + call sfree (sp) + return (ERR) + } + nchars = LEN_V1IMHDR * SZ_MII_INT + if (bfrseq (fp, IM_V1MAGIC(v1), nchars) != nchars) { + call sfree (sp) + return (ERR) + } + + # Initialize the output image header. + call strcpy (IMH_MAGICSTR, IM_MAGIC(im), SZ_IMMAGIC) + IM_HDRVER(im) = V1_VERSION + + # The following is the length of the user area in SU. + sulen_userarea = IM_V1HDRLEN(v1) - LEN_V1IMHDR + IM_HDRLEN(im) = LEN_IMHDR + sulen_userarea + + IM_SWAP(im) = NO + IM_SWAPPED(im) = -1 + IM_PIXTYPE(im) = IM_V1PIXTYPE(v1) + + IM_NDIM(im) = IM_V1NDIM(v1) + call amovl (IM_V1LEN(v1,1), IM_LEN(im,1), IM_MAXDIM) + call amovl (IM_V1PHYSLEN(v1,1), IM_PHYSLEN(im,1), IM_MAXDIM) + + IM_SSMTYPE(im) = IM_V1SSMTYPE(v1) + IM_LUTOFF(im) = IM_V1LUTOFF(v1) + IM_PIXOFF(im) = IM_V1PIXOFF(v1) + IM_HGMOFF(im) = IM_V1HGMOFF(v1) + IM_CTIME(im) = IM_V1CTIME(v1) + IM_MTIME(im) = IM_V1MTIME(v1) + IM_LIMTIME(im) = IM_V1LIMTIME(v1) + IM_MAX(im) = IM_V1MAX(v1) + IM_MIN(im) = IM_V1MIN(v1) + + call strcpy (IM_V1PIXFILE(v1), IM_PIXFILE(im), SZ_IMPIXFILE) + call strcpy (IM_V1HDRFILE(v1), IM_HDRFILE(im), SZ_IMHDRFILE) + call strcpy (IM_V1TITLE(v1), IM_TITLE(im), SZ_IMTITLE) + call strcpy (IM_V1HISTORY(v1), IM_HISTORY(im), SZ_IMHIST) + + # Read and output the user area. + if (uchars > 0) { + nchars = min (uchars, sulen_userarea * SZ_MII_INT) + if (bfrseq (fp, Memc[IM_USERAREA(im)], nchars) <= 0) + return (ERR) + } + + call sfree (sp) + return (OK) + } + + # Check for a new format header. + if (bfseek (fp, BOFL) == ERR) + return (ERR) + if (i_miirdc (fp, immagic, SZ_IMMAGIC) < 0) + return (ERR) + + if (htype == TY_PIXHDR && streq (immagic, V2_PMAGIC)) { + # V2 Pixel file header. + return (OK) + + } else if (htype == TY_IMHDR && streq (immagic, V2_MAGIC)) { + # Newer V2 image header. + status = ERR + + # Initialize the output image header. + call strcpy (IMH_MAGICSTR, IM_MAGIC(im), SZ_IMMAGIC) + IM_HDRVER(im) = V2_VERSION + + # "sulen_userarea" is the length of the user area in SU. + if (i_miirdi (fp, hdrlen, 1) != 1) + goto readerr_ + sulen_userarea = hdrlen - LEN_V2IMHDR + IM_HDRLEN(im) = LEN_IMHDR + sulen_userarea + + if (i_miirdi (fp, IM_PIXTYPE(im), 1) != 1) + goto readerr_ + + # Determine whether to byte swap the pixels. + if (i_miirdi (fp, IM_SWAPPED(im), 1) != 1) + goto readerr_ + + IM_SWAP(im) = NO + switch (IM_PIXTYPE(im)) { + case TY_SHORT, TY_USHORT: + IM_SWAP(im) = btoi (IM_SWAPPED(im) != BYTE_SWAP2) + case TY_INT, TY_LONG: + IM_SWAP(im) = btoi (IM_SWAPPED(im) != BYTE_SWAP4) + case TY_REAL: + if (IEEE_USED == YES) + IM_SWAP(im) = btoi (IM_SWAPPED(im) != IEEE_SWAP4) + case TY_DOUBLE: + if (IEEE_USED == YES) + IM_SWAP(im) = btoi (IM_SWAPPED(im) != IEEE_SWAP8) + } + + # Read the fixed-format fields of the header. + if (i_miirdi (fp, IM_NDIM(im), 1) < 0) + goto readerr_ + if (i_miirdi (fp, IM_LEN(im,1), IM_MAXDIM) < 0) + goto readerr_ + if (i_miirdl (fp, IM_PHYSLEN(im,1), IM_MAXDIM) < 0) + goto readerr_ + if (i_miirdl (fp, IM_SSMTYPE(im), 1) < 0) + goto readerr_ + if (i_miirdl (fp, IM_LUTOFF(im), 1) < 0) + goto readerr_ + if (i_miirdl (fp, IM_PIXOFF(im), 1) < 0) + goto readerr_ + if (i_miirdl (fp, IM_HGMOFF(im), 1) < 0) + goto readerr_ + if (i_miirdl (fp, IM_BLIST(im), 1) < 0) + goto readerr_ + if (i_miirdl (fp, IM_SZBLIST(im), 1) < 0) + goto readerr_ + if (i_miirdl (fp, IM_NBPIX(im), 1) < 0) + goto readerr_ + if (i_miirdl (fp, IM_CTIME(im), 1) < 0) + goto readerr_ + if (i_miirdl (fp, IM_MTIME(im), 1) < 0) + goto readerr_ + if (i_miirdl (fp, IM_LIMTIME(im), 1) < 0) + goto readerr_ + + if (i_miirdr (fp, IM_MAX(im), 1) < 0) + goto readerr_ + if (i_miirdr (fp, IM_MIN(im), 1) < 0) + goto readerr_ + + if (i_miirdc (fp, IM_PIXFILE(im), SZ_V2IMPIXFILE) < 0) + goto readerr_ + if (i_miirdc (fp, IM_HDRFILE(im), SZ_V2IMHDRFILE) < 0) + goto readerr_ + if (i_miirdc (fp, IM_TITLE(im), SZ_V2IMTITLE) < 0) + goto readerr_ + if (i_miirdc (fp, IM_HISTORY(im), SZ_V2IMHIST) < 0) + goto readerr_ + + # Read the variable-length user area. + if (uchars > 0) { + nchars = min (uchars, sulen_userarea * SZ_MII_INT) + if (i_miirdc (fp, Memc[IM_USERAREA(im)], nchars) < 0) + goto readerr_ + } + + status = OK +readerr_ + return (status) + } + + return (ERR) +end |