#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/shm.h>

#define MCPYSIZE 2048

extern char *my_strncpy(char *dest, const char *src, size_t n);

int main()
{
  long buffer[MCPYSIZE];

  int i, j, k, x;
  char *src, *dst;
  size_t len;
  int shmid;
  char* shmaddr;


  shmid = shmget(1, 16384, IPC_CREAT|SHM_R|SHM_W);
  shmaddr = (char*) shmat(shmid, NULL, SHM_RND);

  for (i=0; i<16384; i++)
    shmaddr[i] = i;

  dst = (char*) buffer;

  for (k=1; k<1000; k+=1)
    for (i=0; i<8; i++)
      for (j=0; j<8; j++) {

	src = (char*) shmaddr + 16384 - k - i;
	dst = (char*) buffer + j;
	len  = k;

//	printf("dst %p src %p n %4d\n", dst, src, len);
	my_strncpy(dst, src, len);

	for (x=0; x<len; x++) {
		if (src[x] == 0) break;
		if ( dst[x] != src[x] ) {
			unsigned long * l_src = (unsigned long*) ((unsigned long) &src[x] & -8);
			unsigned long * l_dst = (unsigned long*) ((unsigned long) &dst[x] & -8);

			printf("error\t");
			printf("dst %p src %p n %4d\n", dst, src, len);

			printf("%d: %x %x\n", x, dst[x], src[x]);

			printf("%d: %16x %16x\n", x, *l_dst, *l_src);
			exit(0);
//			break;
		}
	}

//	if (strcmp(dst, src, len) != 0)
//	  printf("bug found\n");

      } // for (j=0 ...

  shmdt(shmaddr);
  shmctl(shmid, IPC_RMID, NULL);
}
