#include #include #include #include jmp_buf exception_handler; // Praktische Makros für die Speicherreservierung #define GC_NEW_ARRAY(type, dim) \ (type *)GC_MALLOC((dim) * sizeof(type)) #define GC_NEW_ATOMIC_ARRAY(type, dim) \ (type *)GC_MALLOC_ATOMIC((dim) * sizeof(type)) #define GC_RESIZE_ARRAY(array, type, dim) \ (array) = (type *)GC_REALLOC((array), (dim) * sizeof(type)) // "Idiotensichere" Stringverkettung char *gc_strcat(char *dest, char *src) { if (dest) GC_RESIZE_ARRAY(dest, char, strlen(dest) + strlen(src) + 1); else dest = GC_NEW_ATOMIC_ARRAY(char, strlen(src) + 1); if (!dest) longjmp(exception_handler, 1); return strcat(dest, src); } // Testprogramm int main(void) { // Exception handler installieren if (setjmp(exception_handler)) { fputs("Out of memory!\n", stderr); return 1; } // Standardeingabe zeilenweise auslesen und verketten char *buf = NULL; char line[1024]; while (!feof(stdin)) { if (fgets(line, 1023, stdin)) buf = gc_strcat(buf, line); } // Alles wieder ausgeben puts(buf); // Um das Freigeben des Speichers brauchen wir uns nicht // weiter zu kümmern. return 0; }