#include #include #include #include #define mstring(x) (x)->string #define minit(x) { (x)->string = NULL; (x)->string_len=0; } #define mfree(x) { if((x)->string) { free((x)->string); (x)->string=NULL; } (x)->string_len=0; } typedef struct { char *string; int string_len; } mpointer; int mprintf (mpointer * p, const char *format, ...) { va_list arg; char *tmp; int done; p->string_len += strlen(format); /*printf("Changing size to %i\n", p->string_len);*/ p->string=realloc(p->string, (p->string_len * sizeof(char))); tmp=p->string; while(tmp[0]) tmp++; va_start (arg, format); done = vsprintf (tmp, format, arg); va_end (arg); return done; } int main(int argc, char **argv) { mpointer test; minit(&test); mprintf(&test, "Hello world\n"); mprintf(&test, "This is a funny test\n"); mprintf(&test, "Of an self reallocating function\n"); /*mprintf(&test, "that shud work with %s\n", "variables");*/ printf("This is test (%i): \n\"%s\"\n", strlen(test.string), test.string); mfree(&test); exit(0); }