|  | #include <mcheck.h> | 
|  | #include <stdio.h> | 
|  |  | 
|  |  | 
|  | #ifndef CHAR_T | 
|  | # define CHAR_T char | 
|  | # define W(o) o | 
|  | # define OPEN_MEMSTREAM open_memstream | 
|  | #endif | 
|  |  | 
|  | #define S(s) S1 (s) | 
|  | #define S1(s) #s | 
|  |  | 
|  |  | 
|  | static void | 
|  | mcheck_abort (enum mcheck_status ev) | 
|  | { | 
|  | printf ("mecheck failed with status %d\n", (int) ev); | 
|  | exit (1); | 
|  | } | 
|  |  | 
|  |  | 
|  | static int | 
|  | do_test (void) | 
|  | { | 
|  | mcheck_pedantic (mcheck_abort); | 
|  |  | 
|  | CHAR_T *buf = (CHAR_T *) 1l; | 
|  | size_t len = 12345; | 
|  | FILE *fp = OPEN_MEMSTREAM (&buf, &len); | 
|  | if (fp == NULL) | 
|  | { | 
|  | printf ("%s failed\n", S(OPEN_MEMSTREAM)); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | for (int outer = 0; outer < 800; ++outer) | 
|  | { | 
|  | for (int inner = 0; inner < 100; ++inner) | 
|  | if (fputc (W('a') + (outer * 100 + inner) % 26, fp) == EOF) | 
|  | { | 
|  | printf ("fputc at %d:%d failed\n", outer, inner); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | if (fflush (fp) != 0) | 
|  | { | 
|  | puts ("fflush failed"); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | if (len != (outer + 1) * 100) | 
|  | { | 
|  | printf ("string in round %d not %d bytest long\n", | 
|  | outer + 1, (outer + 1) * 100); | 
|  | return 1; | 
|  | } | 
|  | if (buf == (CHAR_T *) 1l) | 
|  | { | 
|  | printf ("round %d: buf not updated\n", outer + 1); | 
|  | return 1; | 
|  | } | 
|  | for (int inner = 0; inner < (outer + 1) * 100; ++inner) | 
|  | if (buf[inner] != W('a') + inner % 26) | 
|  | { | 
|  | printf ("round %d: buf[%d] != '%c'\n", outer + 1, inner, | 
|  | (char) (W('a') + inner % 26)); | 
|  | return 1; | 
|  | } | 
|  | } | 
|  |  | 
|  | buf = (CHAR_T *) 1l; | 
|  | len = 12345; | 
|  | if (fclose (fp) != 0) | 
|  | { | 
|  | puts ("fclose failed"); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | if (len != 800 * 100) | 
|  | { | 
|  | puts ("string after close not 80000 bytes long"); | 
|  | return 1; | 
|  | } | 
|  | if (buf == (CHAR_T *) 1l) | 
|  | { | 
|  | puts ("buf not updated"); | 
|  | return 1; | 
|  | } | 
|  | for (int inner = 0; inner < 800 * 100; ++inner) | 
|  | if (buf[inner] != W('a') + inner % 26) | 
|  | { | 
|  | printf ("after close: buf[%d] != %c\n", inner, | 
|  | (char) (W('a') + inner % 26)); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | free (buf); | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | #define TIMEOUT 100 | 
|  | #define TEST_FUNCTION do_test () | 
|  | #include "../test-skeleton.c" |