aboutsummaryrefslogtreecommitdiff
path: root/noao/artdata/mkheader.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/artdata/mkheader.x')
-rw-r--r--noao/artdata/mkheader.x229
1 files changed, 229 insertions, 0 deletions
diff --git a/noao/artdata/mkheader.x b/noao/artdata/mkheader.x
new file mode 100644
index 00000000..aeee042a
--- /dev/null
+++ b/noao/artdata/mkheader.x
@@ -0,0 +1,229 @@
+include <error.h>
+include <imhdr.h>
+include <imio.h>
+include <ctype.h>
+
+define LEN_COMMENT 70 # Maximum comment length
+define IDB_RECLEN 80 # Length of FITS record (card)
+define COMMENT "COMMENT" # Comment key
+define IS_FITS (IS_DIGIT($1)||IS_UPPER($1)||($1=='-')||($1=='_'))
+
+# MKH_HEADER -- Append or substitute new image header from an image or file.
+# Only the legal FITS cards (ignoring leading whitespace) will be copied
+# from a file.
+
+procedure mkh_header (im, fname, append, verbose)
+
+pointer im # IMIO pointer
+char fname[ARB] # Image or data file name
+bool append # Append to existing header?
+bool verbose # Verbose?
+
+int i, j, curlen, buflen, max_lenuserarea
+pointer ua, fd, out
+pointer sp, str
+
+int open(), getline(), nowhite(), strlen(), stropen()
+pointer immap()
+errchk open, stropen
+
+begin
+ if (nowhite (fname, fname, SZ_FNAME) == 0)
+ return
+
+ # Open the user area string for appending. 'buflen' is the malloc-ed
+ # buffer length in struct units; IMU is the struct offset to the user
+ # area, i.e., the size of that part of the image descriptor preceding
+ # the user area. If the buffer fills we must allow one extra char for
+ # the EOS delimiter; since storage for the image descriptor was
+ # allocated in struct units the storage allocator will not have
+ # allocated space for the extra EOS char.
+
+ ua = IM_USERAREA(im)
+ if (!append)
+ Memc[ua] = EOS
+ curlen = strlen (Memc[ua])
+ buflen = LEN_IMDES + IM_LENHDRMEM(im)
+ max_lenuserarea = (buflen - IMU) * SZ_STRUCT - 1
+
+ # Append from an image header.
+ ifnoerr (fd = immap (fname, READ_ONLY, 0)) {
+ iferr {
+ i = strlen (Memc[IM_USERAREA(fd)]) + strlen (Memc[ua])
+ call strcat (Memc[IM_USERAREA(fd)], Memc[ua], max_lenuserarea)
+ if (i > max_lenuserarea)
+ call error (1, "Possibly failed to add all the keywords")
+ } then {
+ call erract (EA_WARN)
+
+ # Check for truncated card.
+ for (i=ua+max_lenuserarea-1; i > ua; i=i-1) {
+ if (Memc[i] == '\n') {
+ Memc[i+1] = EOS
+ break
+ }
+ }
+ }
+ call imunmap (fd)
+
+ # Append from a text file.
+ } else {
+ fd = open (fname, READ_ONLY, TEXT_FILE)
+ out = stropen (Memc[ua+curlen], max_lenuserarea - curlen, APPEND)
+
+ call smark (sp)
+ call salloc (str, SZ_LINE, TY_CHAR)
+
+ iferr {
+ while (getline (fd, Memc[str]) != EOF) {
+ for (i=str; IS_WHITE(Memc[i]); i=i+1)
+ ;
+ for (j=i; IS_FITS(Memc[j]); j=j+1)
+ ;
+ for (; j<i+8 && Memc[j]==' '; j=j+1)
+ ;
+ if (j<i+8 && (Memc[j] != EOS || Memc[j] != '\n'))
+ next
+ if (Memc[j] == '=' && Memc[j+1] != ' ')
+ next
+ for (; j<i+IDB_RECLEN && Memc[j] != EOS; j=j+1)
+ ;
+ if (Memc[j-1] == '\n')
+ Memc[j-1] = EOS
+ if (j == i + IDB_RECLEN || Memc[j] == '\n')
+ Memc[j] = EOS
+ if (strlen (Memc[ua]) + IDB_RECLEN >= max_lenuserarea)
+ call error (1,
+ "Possibly failed to add all the keywords")
+ call fprintf (out, "%s%*t\n")
+ call pargstr (Memc[i])
+ call pargi (IDB_RECLEN+1)
+ }
+ } then {
+ call erract (EA_WARN)
+
+ # Check for truncated card.
+ call close (out)
+ for (i=ua+max_lenuserarea-1; i > ua; i=i-1) {
+ if (Memc[i] == '\n') {
+ Memc[i+1] = EOS
+ break
+ }
+ }
+ }
+ call close (out)
+ call close (fd)
+ call sfree (sp)
+ }
+ if (verbose) {
+ if (append) {
+ call printf ("%s: Image header from %s appended\n")
+ call pargstr (IM_HDRFILE(im))
+ call pargstr (fname)
+ } else {
+ call printf ("%s: Image header from %s substituted\n")
+ call pargstr (IM_HDRFILE(im))
+ call pargstr (fname)
+ }
+ }
+end
+
+
+# MKH_COMMENT -- Add comment to header.
+# Remove any tab characters.
+
+procedure mkh_comment (im, comment)
+
+pointer im # image descriptor
+char comment[ARB] # comment
+
+begin
+ call imputh (im, COMMENT, comment)
+end
+
+## MKH_COMMENT -- Add comment to header.
+## Remove any tab characters.
+#
+#define MAX_COMMENT 72
+#
+#procedure mkh_comment (im, comment)
+#
+#pointer im # image descriptor
+#char comment[ARB] # comment
+#
+#int i, j, k, stridxs()
+#pointer sp, cmmt
+#
+#begin
+# if (stridxs ("\t", comment) == 0) {
+# call imputh (im, COMMENT, comment)
+# return
+# }
+#
+# call smark (sp)
+# call salloc (cmmt, MAX_COMMENT, TY_CHAR)
+# j = 0
+# for (i=1; comment[i]!=EOS; i=i+1) {
+# if (comment[i] == '\t') {
+# k = min (j + 8 - mod (j, 8), MAX_COMMENT)
+# for (; j < k; j=j+1)
+# Memc[cmmt+j] = ' '
+# } else {
+# Memc[cmmt+j] = comment[i]
+# j = j + 1
+# }
+# if (j == MAX_COMMENT)
+# break
+# }
+# Memc[cmmt+j] = EOS
+# call imputh (im, COMMENT, Memc[cmmt])
+# call sfree (sp)
+#end
+
+
+# MKH_COMMENT1 -- Make comment out of CL parameter.
+
+procedure mkh_comment1 (im, param, type)
+
+pointer im # image descriptor
+char param[ARB] # parameter name
+int type # datatype
+
+bool clgetb()
+int clgeti()
+real clgetr()
+double clgetd()
+pointer sp, comment, str
+
+begin
+ call smark (sp)
+ call salloc (comment, LEN_COMMENT, TY_CHAR)
+
+ switch (type) {
+ case 'b':
+ call sprintf (Memc[comment], LEN_COMMENT, "%9t%s%24t%b")
+ call pargstr (param)
+ call pargb (clgetb (param))
+ case 'i':
+ call sprintf (Memc[comment], LEN_COMMENT, "%9t%s%24t%d")
+ call pargstr (param)
+ call pargi (clgeti (param))
+ case 'r':
+ call sprintf (Memc[comment], LEN_COMMENT, "%9t%s%24t%g")
+ call pargstr (param)
+ call pargr (clgetr (param))
+ case 'd':
+ call sprintf (Memc[comment], LEN_COMMENT, "%9t%s%24t%g")
+ call pargstr (param)
+ call pargd (clgetd (param))
+ case 's':
+ call salloc (str, SZ_FNAME, TY_CHAR)
+ call clgstr (param, Memc[str], SZ_FNAME)
+ call sprintf (Memc[comment], LEN_COMMENT, "%9t%s%24t%s")
+ call pargstr (param)
+ call pargstr (Memc[str])
+ }
+
+ call mkh_comment (im, Memc[comment])
+ call sfree (sp)
+end