#define WORD_SIZE sizeof(int)
#define WORD_MASK (WORD_SIZE - 1)
#define BYTE_COPY_FORWARD *d = *s; s++; d++; c--;
#define WORD_COPY_FORWARD *(int *)d = *(int *)s; s += WORD_SIZE; d += WORD_SIZE; c -= WORD_SIZE;
#define BYTE_COPY_BACKWARD s--; d--; c--; *d = *s;
#define WORD_COPY_BACKWARD s -= WORD_SIZE; d -= WORD_SIZE; c -= WORD_SIZE;*(int *)d = *(int *)s;
void MemoryMove(void *destination, const void *source, size_t count)
{
if (count <= 0 || destination == source) return;
register char *d = (char *)destination;
register const char *s = (char *)source;
register size_t c = count;
if (source > destination) {
while ((int)s & WORD_MASK && c > 0) { BYTE_COPY_FORWARD; }
while (c >= WORD_SIZE) { WORD_COPY_FORWARD; }
while (c > 0) { BYTE_COPY_FORWARD; }
}
else {
s += c;
d += c;
while ((int)s & WORD_MASK && c > 0) { BYTE_COPY_BACKWARD; }
while (c >= WORD_SIZE) { WORD_COPY_BACKWARD; }
while (c > 0) { BYTE_COPY_BACKWARD; }
}
}
I2RlZmluZSBXT1JEX1NJWkUgc2l6ZW9mKGludCkKI2RlZmluZSBXT1JEX01BU0sgKFdPUkRfU0laRSAtIDEpCgojZGVmaW5lIEJZVEVfQ09QWV9GT1JXQVJEICpkID0gKnM7IHMrKzsgZCsrOyBjLS07CiNkZWZpbmUgV09SRF9DT1BZX0ZPUldBUkQgKihpbnQgKilkID0gKihpbnQgKilzOyBzICs9IFdPUkRfU0laRTsgZCArPSBXT1JEX1NJWkU7IGMgLT0gV09SRF9TSVpFOwoKI2RlZmluZSBCWVRFX0NPUFlfQkFDS1dBUkQgcy0tOyBkLS07IGMtLTsgKmQgPSAqczsKI2RlZmluZSBXT1JEX0NPUFlfQkFDS1dBUkQgIHMgLT0gV09SRF9TSVpFOyBkIC09IFdPUkRfU0laRTsgYyAtPSBXT1JEX1NJWkU7KihpbnQgKilkID0gKihpbnQgKilzOwoKCnZvaWQgTWVtb3J5TW92ZSh2b2lkICpkZXN0aW5hdGlvbiwgY29uc3Qgdm9pZCAqc291cmNlLCBzaXplX3QgY291bnQpCnsKCWlmIChjb3VudCA8PSAwIHx8IGRlc3RpbmF0aW9uID09IHNvdXJjZSkgcmV0dXJuOwoKCXJlZ2lzdGVyIGNoYXIgKmQgPSAoY2hhciAqKWRlc3RpbmF0aW9uOwoJcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IChjaGFyICopc291cmNlOwoJcmVnaXN0ZXIgc2l6ZV90IGMgPSBjb3VudDsKCglpZiAoc291cmNlID4gZGVzdGluYXRpb24pIHsKCQl3aGlsZSAoKGludClzICYgV09SRF9NQVNLICYmIGMgPiAwKSB7IEJZVEVfQ09QWV9GT1JXQVJEOyB9CgkJd2hpbGUgKGMgPj0gV09SRF9TSVpFKSB7IFdPUkRfQ09QWV9GT1JXQVJEOyB9CgkJd2hpbGUgKGMgPiAwKSB7IEJZVEVfQ09QWV9GT1JXQVJEOyB9Cgl9CgllbHNlIHsKCQlzICs9IGM7CgkJZCArPSBjOwoJCXdoaWxlICgoaW50KXMgJiBXT1JEX01BU0sgJiYgYyA+IDApIHsgQllURV9DT1BZX0JBQ0tXQVJEOyB9CgkJd2hpbGUgKGMgPj0gV09SRF9TSVpFKSB7IFdPUkRfQ09QWV9CQUNLV0FSRDsgfQoJCXdoaWxlIChjID4gMCkgeyBCWVRFX0NPUFlfQkFDS1dBUkQ7IH0KCX0KCn0=