#include <unistd.h>

#define SIZE4K  (0x1000)
#define SIZE16K (0x4000)

//#define MORECORE (MORECORE)
#define MORECORE (sbrk)

main() {
    char *brk, *curbrk, *p, *adjust;
    int i, j;

    if((brk = (char *)MORECORE(0)) == (char *)-1) {
        printf("Morecore failed.\n");
        exit(1);
    }
    adjust = (char*)((((long)(char *)brk /SIZE16K)+1) *SIZE16K) ;
    if( (brk = (char *)MORECORE((char *)adjust - (char *)brk)) == (char *)-1 ) {
        printf("Morecore failed.\n");
        exit(1);
    }
        
    if( (curbrk = (char*)MORECORE(SIZE4K)) == (char*)-1 ) {
        printf("Morecore failed.\n");
        exit(1);
    }
    
    p = curbrk;
    printf("First MORECORE(It must be cleared) curbrk=0x%x\n", curbrk);
    for(i = 0; i < SIZE4K; i++ ) {
        if( *p != 0 ) { printf("It is dirty\n"); break; }
        *p++;
    }

    p = curbrk;
    for(i = 0; i < SIZE4K; i++ ) {
        *p = (char)0xff;
        p++;
    }

    if( (curbrk = (char*)MORECORE(SIZE4K)) == (char*)-1 ) {
        printf("Morecore failed.\n");
        exit(1);
    }
    
    p = curbrk;
    printf("Second MORECORE(It also must be cleared) curbrk=0x%x\n", curbrk);
    for(i = 0; i < SIZE4K; i++ ) {
        if( *p != 0 ) { printf("It is dirty\n"); break; }
        *p++;
    }
    p = curbrk;
    for(i = 0; i < SIZE4K; i++ ) {
        *p = (char)0xff;
        p++;
    }


    if( (curbrk = (char*)MORECORE(-SIZE4K)) == (char*)-1 ) {
        printf("Morecore failed.\n");
        exit(1);
    }
    
/*
    printf("Aftere MORECORE(-SIZE4K)\n");
    p = curbrk;
    for(i = 0; i < SIZE4K; i++ ) {
        if( *p != 0 ) { printf("It is dirty\n"); break; }
        p++;
    }
*/

    if( (curbrk = (char*)MORECORE(SIZE4K)) == (char*)-1 ) {
        printf("Morecore failed.\n");
        exit(1);
    }
    
    p = curbrk;
    printf("Third MORECORE curbrk = 0x%x\n", curbrk);
    for(i = 0; i < SIZE4K; i++ ) {
        if( *p != 0 ) { printf("It is dirty\n"); break; }
        p++;
    }

    if( (curbrk = (char*)MORECORE(-SIZE4K)) == (char*)-1 ) {
        printf("Morecore failed.\n");
        exit(1);
    }
    
}
