#define memory(p,n) (!(p)&&(n) ? malloc((n)) : (p)&&(n) ? realloc((p), (n)) : (free((p)), (void *)0))
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
int logf(const char *format, ...) {
va_list vl;
int r;
va_start(vl, format);
r = vfprintf(stdout, format, vl);
va_end(vl);
fflush(stdout);
return r;
}
int main() {
#define MESSAGE "Hello, world!"
char *p;
logf("Allocating...\n");
p = (char *)memory((void *)0, 1);
logf("Setting %p...\n", (void *)p);
*p = 0;
logf("Re-allocating %p...\n", (void *)p);
p = (char *)memory((void *)p, sizeof(MESSAGE));
logf("Copying \"%s\" to %p...\n", MESSAGE, (void *)p);
memcpy(p, (const void *)MESSAGE, sizeof(MESSAGE));
logf("Trying to display %p...\n", (void *)p);
printf("%s\n", p);
logf("Freeing %p...\n", (void *)p);
p = (char *)memory((void *)p, 0);
logf("Done!\n");
return 0;
}