1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
/**
* SGIUTIL.C -- Shared utility procedures for the SGI translators.
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define import_spp
#define import_error
#include <iraf.h>
/**
* 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.
*/
void
bswap2 (
unsigned char *a, /* input array */
unsigned char *b, /* output array */
int nbytes /* number of bytes to swap */
)
{
register unsigned char *ip, *op, *otop;
register unsigned int temp;
ip = a;
op = b;
otop = op + (nbytes & ~1);
/* Swap successive pairs of bytes.
*/
while (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.
*/
void
bswap4 (
unsigned char *a, /* input array */
unsigned char *b, /* output array */
int nbytes /* number of bytes to swap */
)
{
register int n;
register unsigned char *ip, *op, *tp;
static unsigned char temp[4];
tp = temp;
ip = (unsigned char *)a;
op = (unsigned char *)b;
/* 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++;
}
/**
* ISSWAPPED -- Test whether we are running on a byte-swapped machine.
*/
int
isSwapped (void)
{
union {
short tswap;
char b[2];
} test;
test.tswap = 1;
return ((int) test.b[0]);
}
/**
* GET_IARG -- Get an integer argument, whether appended directly to flag
* or separated by a whitespace character; if error, report and assign
* default.
*/
int
get_iarg (
char argp,
char **argv,
int argno,
int def_val
)
{
int temp_val;
if (argp == (char) 0) {
if (argv[argno+1] == NULL) {
fprintf (stderr, "missing arg to switch `%c';", argp);
fprintf (stderr, " reset to %d\n", def_val);
temp_val = def_val;
} else
temp_val = atoi (argv[++argno]);
} else
temp_val = atoi (argv[argno]+2);
return (temp_val);
}
|