#include #include #include #include /* * mprintf, a sprintf clone that automaticly mallocs the string * and new content to same string applys after that content. */ int mprintf (char ** p, const char *format, ...) { va_list arg; /* used for the variable lists */ int len = 0; /* will contain lent for current string */ int add_len = 0; /* This mutch more strings are we gonna alloc for */ /*printf("\n\nmprintf(%s);\n", format);*/ /* count old chars */ if(*p) len = strlen(*p); /* * format contains the minimum needed chars that * are gonna be used, so we set that value and try * with that. */ add_len = strlen(format) + 1; /* * Now realloc the memoryspace containing the * string so that the new apending string will * have room. * Also have a check that it succeds. */ /*printf("Changing size to %i\n", len + add_len);*/ if(!(*p=realloc(*p, ((len + add_len) * sizeof(char))))) return(-1); /* Ok, have a try until vsnprintf succeds */ while(1) { /* start filling the newly allocaded area */ va_start (arg, format); int done = vsnprintf ((*p)+len, add_len, format, arg); va_end (arg); /* check if that was enouth */ if(done > -1 && done < add_len) { /*printf("GOOD: done : %i, len: %i\n", done, add_len);*/ /* Ok return happily */ return(done); } /*printf("BAD: done : %i, len: %i\n", done, add_len);*/ /* try increase it a bit. */ add_len = ( done < 0 ? add_len * 2 : done + 1); /*printf("Changing size to %i\n", len + add_len);*/ if(!(*p=realloc(*p, ((len + add_len) * sizeof(char))))) return(-1); } /* will never go here */ return(-1); } int main(int argc, char **argv) { char *test=NULL; char *test2 = "HEJHOPP!\n"; printf("%s", test2); printf("%4s", test2); printf("%-4s", test2); printf("%.4s", test2); exit(0); 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), test); free(test); exit(0); }