aboutsummaryrefslogtreecommitdiff
path: root/vendor/x11iraf/ximtool/util.c
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 /vendor/x11iraf/ximtool/util.c
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'vendor/x11iraf/ximtool/util.c')
-rw-r--r--vendor/x11iraf/ximtool/util.c251
1 files changed, 251 insertions, 0 deletions
diff --git a/vendor/x11iraf/ximtool/util.c b/vendor/x11iraf/ximtool/util.c
new file mode 100644
index 00000000..2ac6331b
--- /dev/null
+++ b/vendor/x11iraf/ximtool/util.c
@@ -0,0 +1,251 @@
+/*
+ * UTIL.C -- Utility routines for the package.
+ *
+ * bswap2 (a, b, nbytes)
+ * bswap4 (a, aoff, b, boff, nbytes)
+ * bswap8 (a, aoff, b, boff, nbytes)
+ * flip (buffer, nx, ny)
+ * is_swapped ()
+ * min_max (a, npts, bitpix, min, max)
+ * strpak (in, out, len)
+ *
+ *
+ */
+
+
+#include <stdio.h>
+#ifdef ULTRIX
+#include <sys/types.h>
+#endif
+#include <unistd.h>
+
+#ifndef AIXV3
+#ifndef OSF1
+typedef unsigned char uchar;
+#endif
+#endif
+
+
+
+/* BSWAP2 - Move bytes from array "a" to array "b", swapping successive
+ * pairs of bytes. The two arrays may be the same but may not be offset
+ * and overlapping.
+ */
+bswap2 (a, b, nbytes)
+char *a, *b; /* input array */
+int nbytes; /* number of bytes to swap */
+{
+ register char *ip=a, *op=b, *otop;
+ register unsigned temp;
+
+ /* Swap successive pairs of bytes.
+ */
+ for (otop = op + (nbytes & ~1); op < otop; ) {
+ temp = *ip++;
+ *op++ = *ip++;
+ *op++ = temp;
+ }
+
+ /* If there is an odd byte left, move it to the output array.
+ */
+ if (nbytes & 1)
+ *op = *ip;
+}
+
+
+/* BSWAP4 - Move bytes from array "a" to array "b", swapping the four bytes
+ * in each successive 4 byte group, i.e., 12345678 becomes 43218765.
+ * The input and output arrays may be the same but may not partially overlap.
+ */
+bswap4 (a, aoff, b, boff, nbytes)
+char *a; /* input array */
+int aoff; /* first byte in input array */
+char *b; /* output array */
+int boff; /* first byte in output array */
+int nbytes; /* number of bytes to swap */
+{
+ register char *ip, *op, *tp;
+ register int n;
+ static char temp[4];
+
+ tp = temp;
+ ip = (char *)a + aoff - 1;
+ op = (char *)b + boff - 1;
+
+ /* Swap successive four byte groups.
+ */
+ for (n = nbytes >> 2; --n >= 0; ) {
+ *tp++ = *ip++;
+ *tp++ = *ip++;
+ *tp++ = *ip++;
+ *tp++ = *ip++;
+ *op++ = *--tp;
+ *op++ = *--tp;
+ *op++ = *--tp;
+ *op++ = *--tp;
+ }
+
+ /* If there are any odd bytes left, move them to the output array.
+ * Do not bother to swap as it is unclear how to swap a partial
+ * group, and really incorrect if the data is not modulus 4.
+ */
+ for (n = nbytes & 03; --n >= 0; )
+ *op++ = *ip++;
+}
+
+
+/* BSWAP8 - Move bytes from array "a" to array "b", swapping the eight bytes
+ * in each successive 8 byte group, i.e., 12345678 becomes 87654321.
+ * The input and output arrays may be the same but may not partially overlap.
+ */
+bswap8 (a, aoff, b, boff, nbytes)
+char *a; /* input array */
+int aoff; /* first byte in input array */
+char *b; /* output array */
+int boff; /* first byte in output array */
+int nbytes; /* number of bytes to swap */
+{
+ register char *ip, *op, *tp;
+ register int n;
+ static char temp[8];
+
+ tp = temp;
+ ip = (char *)a + aoff - 1;
+ op = (char *)b + boff - 1;
+
+ /* Swap successive eight byte groups.
+ */
+ for (n = nbytes >> 3; --n >= 0; ) {
+ *tp++ = *ip++;
+ *tp++ = *ip++;
+ *tp++ = *ip++;
+ *tp++ = *ip++;
+ *tp++ = *ip++;
+ *tp++ = *ip++;
+ *tp++ = *ip++;
+ *tp++ = *ip++;
+ *op++ = *--tp;
+ *op++ = *--tp;
+ *op++ = *--tp;
+ *op++ = *--tp;
+ *op++ = *--tp;
+ *op++ = *--tp;
+ *op++ = *--tp;
+ *op++ = *--tp;
+ }
+
+ /* If there are any odd bytes left, move them to the output array.
+ * Do not bother to swap as it is unclear how to swap a partial
+ * group, and really incorrect if the data is not modulus 8.
+ */
+ for (n = nbytes & 03; --n >= 0; )
+ *op++ = *ip++;
+}
+
+
+/* IS_SWAPPED -- See if this is a byte-swapped (relative to Sun) machine.
+ */
+
+is_swapped ()
+{
+ union {
+ char ch[4];
+ int i;
+ } u;
+
+ u.i = 1;
+ return ((int) u.ch[0]);
+}
+
+
+/* MIN_MAX -- Get the min and max values of an array.
+ */
+
+min_max (a, npts, bitpix, min, max)
+char *a;
+int npts;
+int bitpix;
+float *min, *max;
+{
+ register int i;
+
+ *min = 32768.0, *max = -32768.0;
+
+ if (bitpix == 8) {
+ char *buf = (char *)a;
+ for (i=0; i < npts; i++) {
+ if (buf[i] < *min) *min = buf[i];
+ if (buf[i] > *max) *max = buf[i];
+ }
+ } else if (bitpix == 16) {
+ short *buf = (short *)a;
+ for (i=0; i < npts; i++) {
+ if (buf[i] < *min) *min = buf[i];
+ if (buf[i] > *max) *max = buf[i];
+ }
+ } else if (bitpix == 32) {
+ int *buf = (int *)a;
+ for (i=0; i < npts; i++) {
+ if (buf[i] < *min) *min = buf[i];
+ if (buf[i] > *max) *max = buf[i];
+ }
+ } else if (bitpix == -32) {
+ float *buf = (float *)a;
+ for (i=0; i < npts; i++) {
+ if (buf[i] < *min) *min = buf[i];
+ if (buf[i] > *max) *max = buf[i];
+ }
+ } else if (bitpix == -64) {
+ double *buf = (double *)a;
+ for (i=0; i < npts; i++) {
+ if (buf[i] < *min) *min = buf[i];
+ if (buf[i] > *max) *max = buf[i];
+ }
+ }
+}
+
+
+/* STRPAK -- Convert ASCII string from SPP char per short to C char per byte
+ */
+
+strpak (in, out, len)
+char *in, *out;
+int len;
+{
+ int i, j;
+
+ /* adaptive byte selection (whichever byte order) chars alternate
+ * with \0
+ */
+ if ( in[0] == '\0' )
+ j = 1;
+ else
+ j = 0;
+ for ( i = 0; i < len; i++, j += 2 )
+ out[i] = in[j];
+ out[i] = '\0';
+}
+
+
+/* FLIP -- Reverse order of lines in image. We do this as a separate step
+ * rather than when reading so the sampling grid for zscale is the same as
+ * for DISPLAY, even though the pixels are stored "flipped" in the pixfile.
+ */
+flip (buffer, nx, ny)
+uchar *buffer;
+int nx, ny;
+{
+ int i;
+ register int j, v;
+ register uchar *buff1, *buff2;
+
+ for (i = 0; i < ny / 2; i++) {
+ buff1 = &buffer[i*nx];
+ buff2 = &buffer[(ny-1-i)*nx];
+ for (j = 0; j < nx; j++) {
+ v = *buff1;
+ *(buff1++) = *buff2;
+ *(buff2++) = v;
+ }
+ }
+}