aboutsummaryrefslogtreecommitdiff
path: root/sys/mwcs/mwsave.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 /sys/mwcs/mwsave.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'sys/mwcs/mwsave.x')
-rw-r--r--sys/mwcs/mwsave.x90
1 files changed, 90 insertions, 0 deletions
diff --git a/sys/mwcs/mwsave.x b/sys/mwcs/mwsave.x
new file mode 100644
index 00000000..22b92212
--- /dev/null
+++ b/sys/mwcs/mwsave.x
@@ -0,0 +1,90 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <mach.h>
+include "mwcs.h"
+include "mwsv.h"
+
+# MW_SAVE -- Save the contents of a MWCS descriptor, i.e., the MWCS object,
+# in a machine independent binary array. This may be stored in a file or
+# database, passed through a network interface, etc., and later reopened
+# on a descriptor with MW_LOAD or MW_OPEN.
+
+int procedure mw_save (o_mw, bp, buflen)
+
+pointer o_mw #I pointer to MWCS descriptor
+pointer bp #U pointer to save buffer of type char
+int buflen #U allocated length of save buffer
+
+int nchars, olen
+pointer mw, sp, sv, op, oo
+errchk coerce, realloc, mw_newcopy
+pointer coerce(), mw_newcopy()
+int pl_p2li()
+
+begin
+ call smark (sp)
+ call salloc (sv, LEN_SVHDR, TY_STRUCT)
+
+ # We save a new copy of the MWCS, rather than the MWCS itself,
+ # to discard any dead storage and to cause the runtime descriptor
+ # pointers to be set to NULL.
+
+ mw = mw_newcopy (o_mw)
+
+ # Clear runtime fields that cannot be meaningfully saved.
+ MI_WCS(mw) = NULL
+ MI_REFIM(mw) = NULL
+ call aclri (MI_AXNO(mw,1), MAX_DIM)
+ call aclri (MI_AXVAL(mw,1), MAX_DIM)
+ call aclri (MI_PHYSAX(mw,1), MAX_DIM)
+
+ # Compress the main header to save space.
+ call salloc (oo, MI_LEN(mw) * 3 + 32, TY_SHORT)
+ olen = pl_p2li (Memi[mw], 1, Mems[oo], MI_LEN(mw))
+
+ # Determine how much space will be needed.
+ nchars = LEN_SVHDR * SZ_STRUCT + olen * SZ_SHORT +
+ (MI_DBUFUSED(mw) + 1) * SZ_DOUBLE +
+ (MI_SBUFUSED(mw) + SZB_CHAR-1) / SZB_CHAR
+
+ # Get the space.
+ if (nchars > buflen) {
+ call realloc (bp, nchars, TY_CHAR)
+ buflen = nchars
+ }
+
+ # Prepare the save header.
+ call aclri (Memi[sv], LEN_SVHDR)
+
+ SV_MAGIC(sv) = MWSV_MAGIC
+ SV_CWCSLEN(sv) = olen
+ SV_MWSVLEN(sv) = MI_LEN(mw)
+ SV_DBUFLEN(sv) = MI_DBUFUSED(mw)
+ SV_SBUFLEN(sv) = MI_SBUFUSED(mw)
+ SV_MWSVOFF(sv) = LEN_SVHDR * SZ_STRUCT
+ SV_DBUFOFF(sv) = (SV_MWSVOFF(sv) + olen * SZ_SHORT + SZ_DOUBLE-1) /
+ SZ_DOUBLE * SZ_DOUBLE
+ SV_SBUFOFF(sv) = SV_DBUFOFF(sv) + MI_DBUFUSED(mw) * SZ_DOUBLE
+ SV_VERSION(sv) = MWSV_VERSION
+ SV_NWCS(sv) = MI_NWCS(mw)
+ SV_LENWCS(sv) = LEN_WCS
+
+ # Output the save header.
+ op = coerce (bp, TY_CHAR, TY_STRUCT)
+ call miipak32 (Memi[sv], Memi[op], LEN_SVHDR, TY_INT)
+
+ # Store the three segments of the MWCS, i.e., the main descriptor
+ # and the data and string buffers.
+
+ op = coerce (bp + SV_MWSVOFF(sv), TY_CHAR, TY_SHORT)
+ call miipak16 (Mems[oo], Mems[op], olen, TY_SHORT)
+ op = coerce (bp + SV_DBUFOFF(sv), TY_CHAR, TY_DOUBLE)
+ call miipakd (D(mw,1), Memd[op], SV_DBUFLEN(sv), TY_DOUBLE)
+ op = coerce (bp + SV_SBUFOFF(sv), TY_CHAR, TY_CHAR)
+ call miipak8 (S(mw,1), Memc[op], SV_SBUFLEN(sv), TY_CHAR)
+
+ call mw_close (mw)
+ call sfree (sp)
+
+ return (nchars)
+end