aboutsummaryrefslogtreecommitdiff
path: root/unix/boot/bootlib/_bytmov.c
blob: 849d8e5227a372d5495f85218e4bac87ee512dde (plain) (blame)
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
/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
 */

#define	import_spp
#define import_knames
#include <iraf.h>

/* BYTMOV -- Byte move from array "a" to array "b".  The move must be
 * nondestructive, allowing a byte array to be shifted left or right a
 * few bytes, hence comparison of the addresses of the arrays is necessary
 * to determine if they overlap.
 */
void
BYTMOV (
  XCHAR	*a,			/* input byte array			*/
  XINT	*aoff,			/* first byte in A to be moved		*/
  XCHAR	*b,			/* output byte array			*/
  XINT	*boff,			/* first byte in B to be written	*/
  XINT	*nbytes 		/* number of bytes to move		*/
)
{
	register char	*ip, *op;
	register int	n = *nbytes;
	char	*ap, *bp;

	ap = (char *)a + (*aoff - 1);
	bp = (char *)b + (*boff - 1);

	/* If the two arrays are the same return immediately.  If the move is
	 * to the left then copy left to right, else copy right to left.
	 */
	if (ap == bp) {
	    return;
	} else if (bp < ap) {
	    for (ip=ap, op=bp;  --n >= 0;  )
		*op++ = *ip++;
	} else {
	    for (ip = &ap[n], op = &bp[n];  --n >=  0;  )
		*--op = *--ip;
	}
}