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 /vendor/x11iraf/cdl/cdliraf.c | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'vendor/x11iraf/cdl/cdliraf.c')
-rw-r--r-- | vendor/x11iraf/cdl/cdliraf.c | 848 |
1 files changed, 848 insertions, 0 deletions
diff --git a/vendor/x11iraf/cdl/cdliraf.c b/vendor/x11iraf/cdl/cdliraf.c new file mode 100644 index 00000000..87c28e57 --- /dev/null +++ b/vendor/x11iraf/cdl/cdliraf.c @@ -0,0 +1,848 @@ +#include <stdio.h> +#ifdef linux +/*#include <gnu/types.h>*/ +#include <sys/types.h> +#endif +#ifdef ULTRIX +#include <sys/types.h> +#endif +#include <unistd.h> +#define CDL_LIBRARY_SOURCE +#include "cdl.h" + + +/* + * CDLIRAF.C -- Routines to read IRAF OIF images. + * + * cdl_displayIRAF (cdl, fname, band, frame, fbconfig, zscale) + * cdl_isIRAF (fname) + * cdl_readIRAF (fname, band, &pix, &nx, &ny, &bitpix, title); + */ + + +#define VERSION_1 1 +#define VERSION_2 2 + +/* Image header parmeters. */ +#define SZ_V1PIXFILE 79 +#define SZ_V1TITLE 79 +#define SZ_V1HDR 2048 + +/* Offsets into header (in sizeof(int) units) for various parameters */ +#define IM_V1PIXTYPE 4 /* datatype of the pixels */ +#define IM_V1NDIM 5 /* number of dimensions */ +#define IM_V1LEN 6 /* image dimensions */ +#define IM_V1PHYSLEN 13 /* physical length (as stored) */ +#define IM_V1PIXOFF 22 /* offset of the pixels */ +#define IM_V1PIXFILE 103 /* name of pixel storage file */ +#define IM_V1TITLE 183 /* title of image */ + +/* Image header parmeters. */ +#define SZ_V2PIXFILE 255 +#define SZ_V2TITLE 383 +#define SZ_V2HDR 1024 + +/* Offsets into header (in sizeof(int) units) for various parameters */ +#define IM_V2PIXTYPE 10 /* datatype of the pixels */ +#define IM_V2SWAPPED 14 /* number of dimensions */ +#define IM_V2NDIM 18 /* number of dimensions */ +#define IM_V2LEN 22 /* image dimensions */ +#define IM_V2PHYSLEN 50 /* physical length (as stored) */ +#define IM_V2PIXOFF 86 /* offset of the pixels */ +#define IM_V2PIXFILE 126 /* name of pixel storage file */ +#define IM_V2TITLE 638 /* title of image */ + +/* IRAF dataype codes */ +#define TY_CHAR 2 +#define TY_SHORT 3 +#define TY_INT 4 +#define TY_LONG 5 +#define TY_REAL 6 +#define TY_DOUBLE 7 +#define TY_USHORT 11 +#define TY_UCHAR 12 + +#ifdef __STDC__ +#include <stddef.h> +#include <stdlib.h> +#endif + +#undef max +#define max(a,b) ((a) > (b) ? (a) : (b)) +#undef min +#define min(a,b) ((a) < (b) ? (a) : (b)) + +extern int cdl_debug; + + +#ifdef ANSI_FUNC + +static char *cdl_getIRAFPixels(char *fname, int band, uchar **image, int *nx, int *ny, int *bitpix, char *title); +static int cdl_readImageHdr(char *fname, int *version, int *px, int *py, int *nx, int *ny, int *nbands, int *ptype, int *offset, int *swapped, char *pfile, char *title); +static int cdl_getVersion(FILE *fd); +static void cdl_getPixfile(char *fname, char *pfile); +static int cdl_setBitpix(int ptype, int *pix_size, int *bitpix); +static void cdl_swapPixels(int swapped, int nx, int ny, int ptype, uchar **image); +static void cdl_strpak(char *in, char *out, int len); +static void bswap2(char *a, char *b, int nbytes); +static void bswap4(char *a, int aoff, char *b, int boff, int nbytes); +static void bswap8(char *a, int aoff, char *b, int boff, int nbytes); +static int is_swapped_machine(void); + +#else + +static char *cdl_getIRAFPixels(); +static void cdl_getPixfile(), cdl_strpak(); +static void bswap2(), bswap4(), bswap8(); +static void cdl_swapPixels (); +static int cdl_readImageHdr(), cdl_setBitpix(); +static int cdl_getVersion(); +static int is_swapped_machine(); + +#endif + + + +/* CDL_DISPLAYIRAF -- Display an IRAF OIF format image to the given frame, + * optionally doing a Zscale transform of the image pixels. + */ + +#ifdef ANSI_FUNC + +int +cdl_displayIRAF ( + CDLPtr cdl, /* package ptr */ + char *fname, /* image name */ + int band, /* image band if 3-d */ + int frame, /* display frame */ + int fbconfig, /* frame buffer config */ + int zscale /* do zscale of image? */ +) +#else + +int +cdl_displayIRAF (cdl, fname, band, frame, fbconfig, zscale) +CDLPtr cdl; /* package ptr */ +char *fname; /* image name */ +int band; /* image band if 3-d */ +int frame; /* display frame */ +int fbconfig; /* frame buffer config */ +int zscale; /* do zscale of image? */ +#endif +{ + char title[128]; + int status, nx, ny, bitpix; + uchar *pix = NULL; + float z1 = 0.0, z2 = 0.0; + + + /* See if this is a valid IRAF file. */ + if (!cdl_isIRAF (fname)) { + fprintf (stderr, "%s: not a valid IRAF file or doesn't exist.\n", + fname); + return (ERR); + } + + /* Get the raw IRAF image pixels. */ + if (cdl_readIRAF (fname, band, &pix, &nx, &ny, &bitpix, title)) + return (ERR); + + if (cdl_debug) { + printf("[cdl_displayIRAF] '%s[%d] frame=%d zscale=%d\n", + fname, band, frame, zscale); + printf("[cdl_displayIRAF] %dx%d bitpix=%d pixels z1=%g z2=%g\n", + nx, ny, bitpix, z1, z2); + } + + (void) cdl_setTitle (cdl, title); + (void) cdl_setName (cdl, fname); + status = cdl_displayPix (cdl, pix, nx, ny, bitpix, frame, fbconfig, + zscale); + free ((char *) pix); + return (status); +} + + +/* CDL_ISIRAF -- Test a file to see if it is a IRAF file. We check for both + * V1 and V2 header magic numbers and return the appropriate version if found. + */ + +#ifdef ANSI_FUNC + +int +cdl_isIRAF ( + char *fname /* input filename */ +) +#else + +int +cdl_isIRAF (fname) +char *fname; /* input filename */ +#endif +{ + register FILE *fp; + int value = 0; + char magic[24]; + + if ((fp = fopen (fname, "r"))) { + fread (magic, sizeof (char), 12, fp); + fclose (fp); + + /* See if this is a valid OIF header file. */ + if (strncmp(magic, "imhv2", 5) == 0) + value = 2; + else { + cdl_strpak (magic, magic, 5); + if (strncmp(magic, "imhdr", 5) == 0) + value = 1; + } + } + + return value; +} + + +/* CDL_READIRAF -- Read the pixels from an IRAF OIF format image, returning + * the pixel array, dimensions, and image type. + */ + +#ifdef ANSI_FUNC + +int +cdl_readIRAF ( + char *fname, /* image name */ + int band, /* image band if 3-d */ + uchar **pix, /* pixel array (output) */ + int *nx, + int *ny, /* dimensions (output) */ + int *bitpix, /* pixel size (output) */ + char *title /* image title */ +) +#else + +int +cdl_readIRAF (fname, band, pix, nx, ny, bitpix, title) +char *fname; /* image name */ +int band; /* image band if 3-d */ +uchar **pix; /* pixel array (output) */ +int *nx, *ny; /* dimensions (output) */ +int *bitpix; /* pixel size (output) */ +char *title; /* image title */ +#endif +{ + char *errstr; + char *cdl_getIRAFPixels(); + + /* See if this is a valid IRAF file. */ + if (!cdl_isIRAF (fname)) { + fprintf (stderr, "%s: not a valid IRAF file or doesn't exist.\n", + fname); + return (ERR); + } + + if ((errstr=cdl_getIRAFPixels(fname,band,pix,nx,ny,bitpix,title))) { + fprintf (stderr, "%s\n", errstr); + return (ERR); + } + + if (cdl_debug) + printf ("[cdl_readIRAF] '%s[%d]' nx=%d ny=%d bitpix=%d\n", + fname, band, *nx, *ny, *bitpix); + + return (OK); +} + + + +/* ------------------ + * Private routines. + * ------------------*/ + +/* CDL_GETIRAFPIXELS -- Given an IRAF filename return a pointer to the pixel + * array and the image dimensions. + */ + +#ifdef ANSI_FUNC + +static char * +cdl_getIRAFPixels ( + char *fname, /* input filename */ + int band, /* image band */ + uchar **image, /* output pixels */ + int *nx, + int *ny, /* dimensions */ + int *bitpix, /* pixel size */ + char *title /* image title */ +) +#else + +static char * +cdl_getIRAFPixels (fname, band, image, nx, ny, bitpix, title) +char *fname; /* input filename */ +int band; /* image band */ +uchar **image; /* output pixels */ +int *nx, *ny; /* dimensions */ +int *bitpix; /* pixel size */ +char *title; /* image title */ +#endif +{ + register int i; + int npix, px, py, nbands, pix_size, version, swapped = 0; + FILE *pf; + char *line, pixfile[256]; + int ptype, offset; + + + /* Read the image header params */ + if (cdl_readImageHdr (fname, &version, &px, &py, nx, ny, &nbands, + &ptype, &offset, &swapped, pixfile, title) == ERR) + return "error reading image header"; + + /* Do some simple error checking. */ + if (band > nbands) + return "Invalid band request."; + if (access (pixfile, R_OK) != 0) + return "Cannot access pixel file"; + + /* Open the pixel file and seek to the beginning of the data. */ + if ((pf = fopen (pixfile, "r")) == NULL) + return "Cannot open pixel file."; + + npix = (*nx) * (*ny); + if (cdl_setBitpix (ptype, &pix_size, bitpix) == ERR) { + fclose (pf); + return "Invalid pixel type in image"; + } + + /* Now suck up the pixels. */ + *image = (uchar *) malloc (npix * pix_size); + offset += (band - 1) * (px * py) * pix_size; + lseek (fileno(pf), (off_t)offset, SEEK_SET); + + if (*nx == px) + fread ((void *)*image, pix_size, npix, pf); + else { + line = (char *) malloc (px * pix_size); + for (i=0; i < (*ny); i++) { + fread (line, pix_size, px, pf); + bcopy (line, &((*image)[i*(*nx)*pix_size]), (*nx)*pix_size); + } + free ((char *)line); + } + + /* See if we need to swap the bytes. */ + if (version == 2) + cdl_swapPixels (swapped, *nx, *ny, ptype, image); + + fclose (pf); + return NULL; +} + + +/* CDL_READIMAGEHDR -- Read the image header information. + */ + +#ifdef ANSI_FUNC + +static int +cdl_readImageHdr ( + char *fname, /* image name */ + int *version, /* OIF version number */ + int *px, + int *py, /* physical storage dims */ + int *nx, + int *ny, + int *nbands, /* image dims */ + int *ptype, /* pixel type */ + int *offset, /* offset to pixels */ + int *swapped, /* byte-swapped pixels */ + char *pfile, /* pixfile pathname */ + char *title /* image title */ +) +#else + +static int +cdl_readImageHdr (fname, version, px, py, nx, ny, nbands, ptype, offset, + swapped, pfile, title) +char *fname; /* image name */ +int *version; /* OIF version number */ +int *px, *py; /* physical storage dims */ +int *nx, *ny, *nbands; /* image dims */ +int *ptype; /* pixel type */ +int *offset; /* offset to pixels */ +int *swapped; /* byte-swapped pixels */ +char *pfile; /* pixfile pathname */ +char *title; /* image title */ +#endif +{ + FILE *hdr; + + if ((hdr = fopen (fname, "r")) == NULL) + return (ERR); + + *version = cdl_getVersion (hdr); + if (*version == VERSION_1) { + int header_v1[SZ_V1HDR]; + char pixfile_v1[SZ_V1PIXFILE]; + + /* Read in the image header. */ + fread ((void *)header_v1, sizeof (char), SZ_V1HDR, hdr); + + /* Get the interesting stuff. */ + *px = header_v1[IM_V1PHYSLEN]; + *py = header_v1[IM_V1PHYSLEN+1]; + *nx = header_v1[IM_V1LEN]; + *ny = header_v1[IM_V1LEN+1]; + *ptype = header_v1[IM_V1PIXTYPE]; + *offset = (header_v1[IM_V1PIXOFF] - 1) * sizeof(short); + *nbands = header_v1[IM_V1LEN+2]; + *swapped = 0; + + /* Find the pixfile and see if it exists. */ + cdl_strpak ((char *)&header_v1[IM_V1PIXFILE], pixfile_v1, + SZ_V1PIXFILE); + cdl_getPixfile (fname, pixfile_v1); + (void) strcpy (pfile, pixfile_v1); + + /* Find the image title string */ + if (title == (char *)NULL) + title = (char *) malloc (SZ_V1TITLE+1); + cdl_strpak ((char *)&header_v1[IM_V1TITLE], title, SZ_V1TITLE); + + } else if (*version == VERSION_2) { + char header_v2[SZ_V2HDR], *tp; + char pixfile_v2[SZ_V2PIXFILE]; + + /* Read in the image header. */ + fread (header_v2, sizeof (char), SZ_V2HDR, hdr); + + /* Get the interesting stuff. */ + + if (is_swapped_machine()) + bswap4 (&header_v2[IM_V2SWAPPED], 1, (char *)swapped, + 1, sizeof(int)); + else + bcopy ((char *)&header_v2[IM_V2SWAPPED], (char *)swapped, + sizeof(int)); + + if (is_swapped_machine()) { + bswap4 (&header_v2[IM_V2PHYSLEN], 1, (char *)px, 1, + sizeof(int)); + bswap4 (&header_v2[IM_V2PHYSLEN+sizeof(int)], 1, + (char *)py, 1, sizeof(int)); + bswap4 (&header_v2[IM_V2LEN], 1, (char *)nx, 1, + sizeof(int)); + bswap4 (&header_v2[IM_V2LEN+sizeof(int)], 1, (char *)ny, + 1, sizeof(int)); + bswap4 (&header_v2[IM_V2PIXTYPE], 1, (char *)ptype, 1, + sizeof(int)); + bswap4 (&header_v2[IM_V2PIXOFF], 1, (char *)offset, 1, + sizeof(int)); + bswap4 (&header_v2[IM_V2LEN+(2*sizeof(int))], 1, + (char *)nbands, 1, sizeof(int)); + } else { + bcopy ((char *)&header_v2[IM_V2PHYSLEN], px, sizeof(int)); + bcopy ((char *)&header_v2[IM_V2PHYSLEN+sizeof(int)], py, + sizeof(int)); + bcopy ((char *)&header_v2[IM_V2LEN], nx, sizeof(int)); + bcopy ((char *)&header_v2[IM_V2LEN+sizeof(int)], ny, + sizeof(int)); + bcopy ((char *)&header_v2[IM_V2PIXTYPE], ptype, sizeof(int)); + bcopy ((char *)&header_v2[IM_V2PIXOFF], offset, sizeof(int)); + bcopy ((char *)&header_v2[IM_V2LEN+(2*sizeof(int))], nbands, + sizeof(int)); + } + *offset = (*offset - 1) * sizeof(short); + + /* Find the pixfile and see if it exists. */ + bcopy ((char *)&header_v2[IM_V2PIXFILE], pixfile_v2, SZ_V2PIXFILE); + cdl_getPixfile (fname, pixfile_v2); + (void) strcpy (pfile, pixfile_v2); + + /* Find the image title string */ + tp = (char *)&header_v2[IM_V2TITLE]; + if (title == (char *)NULL) + title = (char *) malloc (SZ_V2TITLE+1); + strcpy (title, (char *)tp); + } + + if (cdl_debug) { + printf("[cdl_readImageHdr] px,py=%d,%d nx,ny,nb=%d,%d,%d\n\t", + *px, *py, *nx, *ny, *nbands); + printf("ptype=%d offset=%d swap=%d pixfile='%s' title='%s'\n", + *ptype, *offset, swapped, pfile, title); + } + + fclose (hdr); /* we're done with the header */ + return (OK); +} + + +/* CDL_GETVERSION -- Return image header version. + */ + +#ifdef ANSI_FUNC + +static int +cdl_getVersion ( + FILE *fd /* input filename */ +) +#else + +static int +cdl_getVersion (fd) +FILE *fd; /* input filename */ +#endif +{ + int value = 0; + char magic[24]; + + rewind (fd); + fread (magic, sizeof (char), 12, fd); + rewind (fd); + + /* See if this is a valid OIF header file. */ + if (strncmp(magic, "imhv2", 5) == 0) + value = 2; + else { + cdl_strpak (magic, magic, 5); + if (strncmp(magic, "imhdr", 5) == 0) + value = 1; + } + return value; +} + + +/* CDL_GETPIXFILE -- Get the pixelfile pathname. + */ + +#ifdef ANSI_FUNC + +static void +cdl_getPixfile (char *fname, char *pfile) +#else + +static void +cdl_getPixfile (fname, pfile) +char *fname; +char *pfile; +#endif +{ + char temp[SZ_V1PIXFILE], *ip; + int len; + char *index(); + + if (strncmp (pfile, "HDR$", 4) == 0) { + /* Handle the special case of a HDR$ pixfile path, prepend the + * current working directory name to the pixfile. + */ + ip = pfile + 4; + (void) strncpy (temp, ip, SZ_V1PIXFILE); + (void) strncpy (pfile, fname, SZ_V1PIXFILE); + + /* Find the end of the pathname. */ + len = strlen (pfile); + while ( (len > 0) && (pfile[len-1] != '/') ) + len--; + + /* Add the image name. */ + pfile[len] = '\0'; + (void) strncat (pfile, temp, SZ_V1PIXFILE); + + } else if (index (pfile, '!') != NULL) { + /* Strip out the leading node! prefix from the pixfile path. */ + for (ip = pfile; *ip != '!' ; ) + ip++; + (void) strcpy (pfile, ++ip); + } +} + + +/* CDL_SETBITPIX -- Set the number of pixels for a given pixel type. + */ + +#ifdef ANSI_FUNC + +static int +cdl_setBitpix (int ptype, int *pix_size, int *bitpix) +#else + +static int +cdl_setBitpix (ptype, pix_size, bitpix) +int ptype; +int *pix_size; +int *bitpix; +#endif +{ + switch (ptype) { + case TY_USHORT: + case TY_SHORT: + *pix_size = sizeof (short); + *bitpix = 16; + break; + case TY_INT: + *pix_size = sizeof (int); + *bitpix = 32; + break; + case TY_LONG: + *pix_size = sizeof (long); + *bitpix = 32; + break; + case TY_REAL: + *pix_size = sizeof (float); + *bitpix = -32; + break; + case TY_DOUBLE: + *pix_size = sizeof (double); + *bitpix = -64; + break; + default: + return (ERR); + } + return (OK); +} + + +/* CDL_SWAPPIXELS -- Byte swap pixels if necessary. + */ + +#ifdef ANSI_FUNC + +static void +cdl_swapPixels (int swapped, int nx, int ny, int ptype, uchar **image) +#else + +static void +cdl_swapPixels (swapped, nx, ny, ptype, image) +int swapped; +int nx, ny; +int ptype; +uchar **image; +#endif +{ + if ((swapped != is_swapped_machine())) { + switch (ptype) { + case TY_USHORT: + case TY_SHORT: + bswap2 ((char *)*image, (char *)*image, + nx * ny * sizeof(short)); + break; + case TY_INT: + case TY_LONG: + bswap4 ((char *)*image, 1, (char *)*image, 1, + nx * ny * sizeof(int)); + break; + case TY_REAL: + bswap4 ((char *)*image, 1, (char *)*image, 1, + nx * ny * sizeof(float)); + break; + case TY_DOUBLE: + bswap8 ((char *)*image, 1, (char *)*image, 1, + nx * ny * sizeof(double)); + break; + } + } +} + + +/* CDL_STRPAK -- Convert ASCII string from SPP char per short to C char + * per byte. + */ + +#ifdef ANSI_FUNC + +static void +cdl_strpak (char *in, char *out, int len) +#else + +static void +cdl_strpak (in, out, len) +char *in, *out; +int len; +#endif +{ + int i, j; + + /* Adaptive byte selection (whichever byte order) chars alternate + * with \0. + */ + j = (in[0] == '\0' ? 1 : 0); + + for (i = 0; i < len; i++, j += 2) + out[i] = in[j]; + out[i] = '\0'; +} + + +/* 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. + */ + +#ifdef ANSI_FUNC + +static void +bswap2 ( + char *a, + char *b, /* input array */ + int nbytes /* number of bytes to swap */ +) +#else + +static void +bswap2 (a, b, nbytes) +char *a, *b; /* input array */ +int nbytes; /* number of bytes to swap */ +#endif +{ + 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. + */ + +#ifdef ANSI_FUNC + +static void +bswap4 ( + 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 */ +) +#else + +static void +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 */ +#endif +{ + 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. + */ +#ifdef ANSI_FUNC + +static void +bswap8 ( + 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 */ +) +#else + +static void +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 */ +#endif +{ + 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++; +} + + +#ifdef ANSI_FUNC + +static int +is_swapped_machine (void) +#else + +static int +is_swapped_machine () +#endif +{ + union { char ch[4]; int i; } u; + u.i = 1; + return (u.ch[0]); +} |