aboutsummaryrefslogtreecommitdiff
path: root/sys/imio/imgibf.x
diff options
context:
space:
mode:
Diffstat (limited to 'sys/imio/imgibf.x')
-rw-r--r--sys/imio/imgibf.x65
1 files changed, 65 insertions, 0 deletions
diff --git a/sys/imio/imgibf.x b/sys/imio/imgibf.x
new file mode 100644
index 00000000..9155ae78
--- /dev/null
+++ b/sys/imio/imgibf.x
@@ -0,0 +1,65 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <imhdr.h>
+include <imio.h>
+
+# IMGIBF -- Get an input buffer.
+
+pointer procedure imgibf (im, vs, ve, ndim, dtype)
+
+pointer im
+long vs[ARB], ve[ARB]
+int dtype, ndim
+
+pointer bdes
+int i
+long nget, nchars, totpix
+
+long imcssz()
+errchk imopsf, calloc, realloc, mfree, malloc
+
+begin
+ # If first input transfer, allocate and initialize array of
+ # input buffer descriptors.
+
+ if (IM_IBDES(im) == NULL) {
+ call imopsf (im)
+ call calloc (IM_IBDES(im), LEN_BDES * IM_VNBUFS(im), TY_STRUCT)
+ }
+
+ # Compute pointer to the next input buffer descriptor.
+ # Increment NGET, the count of the number of GETPIX calls.
+
+ nget = IM_NGET(im)
+ bdes = IM_IBDES(im) + mod (nget, IM_VNBUFS(im)) * LEN_BDES
+ IM_NGET(im) = nget + 1
+
+ # Compute the size of the buffer needed. Check buffer
+ # descriptor to see if the old buffer is the right size.
+ # If so, use it, otherwise make a new one.
+
+ nchars = imcssz (im, vs, ve, ndim, dtype, totpix, IM_READ)
+
+ if (nchars < BD_BUFSIZE(bdes))
+ call realloc (BD_BUFPTR(bdes), nchars, TY_CHAR)
+ else if (nchars > BD_BUFSIZE(bdes)) {
+ call mfree (BD_BUFPTR(bdes), TY_CHAR)
+ call malloc (BD_BUFPTR(bdes), nchars, TY_CHAR)
+ }
+
+ # Save section coordinates, datatype in buffer descriptor, and
+ # return buffer pointer to calling program.
+
+ IM_LASTBDES(im) = bdes
+ BD_BUFSIZE(bdes) = nchars
+ BD_DTYPE(bdes) = dtype
+ BD_NPIX(bdes) = totpix
+ BD_NDIM(bdes) = ndim
+
+ do i = 1, ndim {
+ BD_VS(bdes,i) = vs[i]
+ BD_VE(bdes,i) = ve[i]
+ }
+
+ return (BD_BUFPTR(bdes)) # return ptr to CHAR
+end