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/plio/plsave.x | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'sys/plio/plsave.x')
-rw-r--r-- | sys/plio/plsave.x | 86 |
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 |