xref: /plan9/sys/src/libc/port/memmove.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
13e12c5d1SDavid du Colombier #include	<u.h>
23e12c5d1SDavid du Colombier #include	<libc.h>
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier void*
memmove(void * a1,void * a2,ulong n)53e12c5d1SDavid du Colombier memmove(void *a1, void *a2, ulong n)
63e12c5d1SDavid du Colombier {
73e12c5d1SDavid du Colombier 	char *s1, *s2;
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier 	if((long)n < 0)
103e12c5d1SDavid du Colombier 		abort();
113e12c5d1SDavid du Colombier 	s1 = a1;
123e12c5d1SDavid du Colombier 	s2 = a2;
13*80ee5cbfSDavid du Colombier 	if((s2 < s1) && (s2+n > s1))
14*80ee5cbfSDavid du Colombier 		goto back;
153e12c5d1SDavid du Colombier 	while(n > 0) {
163e12c5d1SDavid du Colombier 		*s1++ = *s2++;
173e12c5d1SDavid du Colombier 		n--;
183e12c5d1SDavid du Colombier 	}
193e12c5d1SDavid du Colombier 	return a1;
203e12c5d1SDavid du Colombier 
213e12c5d1SDavid du Colombier back:
22*80ee5cbfSDavid du Colombier 	s1 += n;
23*80ee5cbfSDavid du Colombier 	s2 += n;
243e12c5d1SDavid du Colombier 	while(n > 0) {
253e12c5d1SDavid du Colombier 		*--s1 = *--s2;
263e12c5d1SDavid du Colombier 		n--;
273e12c5d1SDavid du Colombier 	}
283e12c5d1SDavid du Colombier 	return a1;
293e12c5d1SDavid du Colombier }
303e12c5d1SDavid du Colombier 
313e12c5d1SDavid du Colombier void*
memcpy(void * a1,void * a2,ulong n)323e12c5d1SDavid du Colombier memcpy(void *a1, void *a2, ulong n)
333e12c5d1SDavid du Colombier {
343e12c5d1SDavid du Colombier 	return memmove(a1, a2, n);
353e12c5d1SDavid du Colombier }
36