xref: /plan9/sys/src/ape/lib/ap/gen/memmove.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include <string.h>
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier void*
memmove(void * a1,const void * a2,size_t n)43e12c5d1SDavid du Colombier memmove(void *a1, const void *a2, size_t n)
53e12c5d1SDavid du Colombier {
63e12c5d1SDavid du Colombier 	char *s1, *s2;
7*7dd7cddfSDavid du Colombier 	extern void abort(void);
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier 	if((long)n < 0)
103e12c5d1SDavid du Colombier 		abort();
113e12c5d1SDavid du Colombier 	if(a1 > a2)
123e12c5d1SDavid du Colombier 		goto back;
133e12c5d1SDavid du Colombier 	s1 = a1;
143e12c5d1SDavid du Colombier 	s2 = a2;
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:
223e12c5d1SDavid du Colombier 	s1 = (char*)a1 + n;
233e12c5d1SDavid du Colombier 	s2 = (char*)a2 + 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,const void * a2,size_t n)323e12c5d1SDavid du Colombier memcpy(void *a1, const void *a2, size_t n)
333e12c5d1SDavid du Colombier {
343e12c5d1SDavid du Colombier 	return memmove(a1, a2, n);
353e12c5d1SDavid du Colombier }
36