#include extern void bcopy(void *src, void *dst, unsigned long cnt); #define LEN 40 /* keep this below 255 */ void shake (unsigned char *arry) { int i; /* copy down - even aligned */ bcopy (&arry[2], &arry[0], LEN - 2); printf("down - even-even\n"); for (i = 0; i < 16; i++) printf("%3d ", arry[i]); printf("\n"); /* copy up - even aligned */ printf("up - even-even\n"); bcopy (&arry[0], &arry[4], LEN - 4); for (i = 0; i < 16; i++) printf("%3d ", arry[i]); printf("\n"); /* copy down - odd-even aligned */ printf("down - even-odd\n"); bcopy (&arry[8], &arry[1], LEN - 8); for (i = 0; i < 16; i++) printf("%3d ", arry[i]); printf("\n"); /* copy up - odd-even aligned */ printf("up - even-odd\n"); bcopy (&arry[0], &arry[1], LEN - 1); for (i = 0; i < 16; i++) printf("%3d ", arry[i]); printf("\n"); /* copy down - odd-odd aligned */ printf("down - odd-odd\n"); bcopy (&arry[7], &arry[1], LEN - 7); for (i = 0; i < 16; i++) printf("%3d ", arry[i]); printf("\n"); /* copy up - odd-odd aligned */ printf("up - odd-odd\n"); bcopy (&arry[1], &arry[3], LEN - 3); for (i = 0; i < 16; i++) printf("%3d ", arry[i]); printf("\n"); } int main(int argc, char **argv) { unsigned char bigo[0x20000]; unsigned char ahull[LEN + 4], *arry; unsigned char bhull[LEN + 4], *brry; long i; int k; for (i = 0; i < 0x20000; i++) { bigo[i] = i & 0xff; } /* shift bigo four positions up leaving the last */ bcopy(&bigo[0], &bigo[4], (0x20000 - 5)); for (i = 4 + 254 ; i < 0x20000 - 5; i += 0x100) { if (bigo[i] != 254 || bigo[i + 1] != 255) { fprintf(stderr, "discrepancy on position %ld - got %u %u\n", i, bigo[i], bigo[i + 1]); } } printf("the last one is %u\n", bigo[0x20000 - 1]); ahull[0] = ahull[1] = ahull[LEN + 2] = ahull[LEN + 3] = 0xff; bhull[0] = bhull[1] = bhull[LEN + 2] = bhull[LEN + 3] = 0xff; arry = &ahull[2]; brry = &bhull[2]; for (i = 0; i < LEN; i++) { arry[i] = i & 0xff; } /* test copying between disjoint regions */ bcopy(&arry[0], &brry[0], LEN); for (i = 0; i < 16; i++) printf("%3d ", brry[i]); printf("\n"); bcopy(&arry[1], &brry[1], LEN - 1); for (i = 0; i < 16; i++) printf("%3d ", brry[i]); printf("\n"); bcopy(&arry[2], &brry[2], LEN - 2); for (i = 0; i < 16; i++) printf("%3d ", brry[i]); printf("\n"); bcopy(&arry[3], &brry[3], LEN - 3); for (i = 0; i < 16; i++) printf("%3d ", brry[i]); printf("\n"); for (k = 4; k < LEN; k++) bcopy(&arry[k], &brry[k], LEN - k); for (i = LEN-16 ; i < LEN; i++) printf("%3d ", brry[i]); printf("\n"); for (i = 0; i < 16; i++) printf("%3d ", brry[i]); printf("\n"); printf("*** %3d %3d %3d %3d ***\n", ahull[0], ahull[1], ahull[LEN + 2], ahull[LEN + 3]); /* and now with an overlap */ shake(&arry[0]); printf("*** %3d %3d %3d %3d ***\n", ahull[0], ahull[1], ahull[LEN + 2], ahull[LEN + 3]); return 0; }