#define fatal(msg) fatal3(msg, /*"*/__FI ## LE__/*"*/, /*"*/__LI ## NE__/*"*/) 
#define new(p) if (((p)=malloc(sizeof(*(p))))); else fatal3("out of memory", /*"*/__FI ## LE__/*"*/, /*"*/__LI ## NE__/*"*/) 
#define dispose(p) if (!(p)) ; else (free(p), (p) = (void*)0) 
#define heapmax(p) 9999999 
#define newstring(s) heap_newstring(s, -1, /*"*/__FI ## LE__/*"*/, /*"*/__LI ## NE__/*"*/) 
#define newnstring(s,n) heap_newstring(s, n, /*"*/__FI ## LE__/*"*/, /*"*/__LI ## NE__/*"*/) 
#define newarray(p,n) if (((p)=malloc((n)*sizeof(*(p))))); else fatal3("out of memory", /*"*/__FI ## LE__/*"*/, /*"*/__LI ## NE__/*"*/) 
#define renewarray(p,n) if (((p)=realloc(p,(n)*sizeof(*(p))))); else fatal3("out of memory", /*"*/__FI ## LE__/*"*/, /*"*/__LI ## NE__/*"*/) 
 void fatal3(const char *s, const char *file, const int line);
 char * heap_newstring(const char *s, int n, const char *file, int line);
