#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/mman.h>

void checkmem(char* ptr, int n, int d)
{ int i, c = 0;
  for( i = 0; i < n; i++, ptr +=d){
     if ( *ptr ) c = i;
     if ( isprint(*ptr) ) putchar( *ptr );
     else   if ( *ptr ) putchar( '.' );
     }
  printf("\nindex=%d", c);
}

int main( int argc, char*argv[] )
{
int n;
char *ptr;
struct rlimit r;
n = atoi( argv[1] );
getrlimit( RLIMIT_STACK, &r );
printf("\nstack:%8lu:", r.rlim_cur);
checkmem( (char*) &argc, n , -1);
getrlimit( RLIMIT_AS, &r );
printf("\nheap:%8lu:", r.rlim_cur);
checkmem( (char*) malloc( n ), n , +1);
printf("\nmmap:");
ptr = mmap(NULL, n, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
checkmem( ptr, n , +1);
printf("\n");
return 0;
}

