aboutsummaryrefslogtreecommitdiff
path: root/sys/plio/plsave.x
diff options
context:
space:
mode:
Diffstat (limited to 'sys/plio/plsave.x')
-rw-r--r--sys/plio/plsave.x86
1 files changed, 86 insertions, 0 deletions
diff --git a/sys/plio/plsave.x b/sys/plio/plsave.x
new file mode 100644
index 00000000..1b0101d3
--- /dev/null
+++ b/sys/plio/plsave.x
@@ -0,0 +1,86 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <plset.h>
+include <plio.h>
+
+# PL_SAVE -- Save a mask in a buffer in a machine independent format. The user
+# supplied buffer will be resized if necessary to hold the full encoded mask.
+# If a NULL buffer pointer is given, a new buffer will be allocated with the
+# pointer value overwriting the NULL (hence NULL must not be passed as a
+# constant in the argument list). The length of the encoded mask in words is
+# returned as the function value; this value will be less than BUFLEN is the
+# user supplied buffer is larger than it needs to be to store the mask, i.e.,
+# the user buffer is not resized or reallocated if it is large enough to store
+# the mask. The existing contents of the buffer will be overwritten. Multiple
+# calls may be made to checkpoint the mask, allowing rollback to an earlier
+# state.
+
+int procedure pl_save (pl, bp, buflen, flags)
+
+pointer pl #I mask descriptor
+pointer bp #U buffer pointer (to short), or NULL
+int buflen #U buffer length, shorts
+int flags #I not used at present
+
+pointer sp, index, ex, op
+int sz_index, n_buflen
+int pl_p2li()
+pointer coerce()
+errchk malloc, realloc, pl_compress
+
+begin
+ call smark (sp)
+ call salloc (ex, LEN_PLEXTERN, TY_STRUCT)
+ call salloc (index, PL_NLP(pl) * 3 + LL_CURHDRLEN, TY_SHORT)
+
+ # Eliminate any wasted space in the mask, and compute the amount
+ # of space needed to store the compressed mask. Compress the index
+ # first to eliminate wasted space; this can make a big difference
+ # for a sparse or empty mask.
+
+ call pl_compress (pl)
+ sz_index = pl_p2li (PL_LP(pl,1), 1, Mems[index], PL_NLP(pl))
+ #n_buflen = (LEN_PLEXTERN * SZ_STRUCT + PL_LLLEN(pl) * SZ_SHORT +
+ n_buflen = (LEN_PLEXTERN * SZ_MII_INT + PL_LLLEN(pl) * SZ_SHORT +
+ sz_index * SZ_SHORT) / SZ_SHORT
+
+ # Allocate or resize the output buffer.
+ if (bp == NULL) {
+ call malloc (bp, n_buflen, TY_SHORT)
+ buflen = n_buflen
+ } else if (n_buflen > buflen) {
+ call realloc (bp, n_buflen, TY_SHORT)
+ buflen = n_buflen
+ }
+
+ # Encode and output the external format header structure.
+ call aclri (Memi[ex], LEN_PLEXTERN)
+
+ PLE_MAGIC(ex) = PL_MAGIC(pl)
+ PLE_NAXES(ex) = PL_NAXES(pl)
+ PLE_LLOP(ex) = PL_LLOP(pl)
+ PLE_LLLEN(ex) = PL_LLLEN(pl)
+ PLE_MAXLINE(ex) = PL_MAXLINE(pl)
+ PLE_MAXVAL(ex) = PL_MAXVAL(pl)
+ PLE_NLP(ex) = PL_NLP(pl)
+ PLE_NLPX(ex) = sz_index
+ PLE_EXLEN(ex) = n_buflen
+
+ op = bp
+ call amovl (PL_AXLEN(pl,1), PLE_AXLEN(ex,1), PL_MAXDIM)
+ call miipak32 (Memi[ex], Memi[coerce(op,TY_SHORT,TY_INT)],
+ LEN_PLEXTERN, TY_STRUCT)
+ #op = op + (LEN_PLEXTERN * SZ_STRUCT) / SZ_SHORT
+ op = op + (LEN_PLEXTERN * SZ_MII_INT) / SZ_SHORT
+
+ # Append the compressed index...
+ call miipak16 (Mems[index], Mems[op], sz_index, TY_SHORT)
+ op = op + sz_index
+
+ # and the line list buffer.
+ call miipak16 (LL(pl,0), Mems[op], PL_LLLEN(pl), TY_SHORT)
+ op = op + PL_LLLEN(pl)
+
+ call sfree (sp)
+ return (op - bp)
+end