#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.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, l, x;
  char *src, *dst;
  size_t len;
  int shmid;
  char* shmaddr;
  int fd;

/*
  shmid = shmget(1, 16384, IPC_CREAT|SHM_R|SHM_W);
  shmaddr = (char*) shmat(shmid, NULL, SHM_RND);
*/
  fd = open("data", O_RDONLY);

  dst = (char*) buffer;

  for (k=0; k<10000; k+=1)
   for (l=0; l<10; l++)
    for (i=0; i<8; i++)
      for (j=0; j<8; j++) {

  shmaddr = (char*) mmap(NULL, 16384*2, PROT_READ, MAP_SHARED, fd, 0);
  if (shmaddr == NULL) perror("zero address");

	src = (char*) shmaddr + 16384 - k - i;
	dst = (char*) buffer + j;
	len  = k+l;

//	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;
		}
	}

  munmap(shmaddr, 16384*2);

      } // for (j=0 ...
}
