tst-memstream2.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include <mcheck.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #ifndef CHAR_T
  5. # define CHAR_T char
  6. # define W(o) o
  7. # define OPEN_MEMSTREAM open_memstream
  8. #endif
  9. #define S(s) S1 (s)
  10. #define S1(s) #s
  11. static void
  12. mcheck_abort (enum mcheck_status ev)
  13. {
  14. printf ("mecheck failed with status %d\n", (int) ev);
  15. exit (1);
  16. }
  17. static int
  18. do_test (void)
  19. {
  20. mcheck_pedantic (mcheck_abort);
  21. CHAR_T *buf = (CHAR_T *) 1l;
  22. size_t len = 12345;
  23. FILE *fp = OPEN_MEMSTREAM (&buf, &len);
  24. if (fp == NULL)
  25. {
  26. printf ("%s failed\n", S(OPEN_MEMSTREAM));
  27. return 1;
  28. }
  29. for (int outer = 0; outer < 800; ++outer)
  30. {
  31. for (int inner = 0; inner < 100; ++inner)
  32. if (fputc (W('a') + (outer * 100 + inner) % 26, fp) == EOF)
  33. {
  34. printf ("fputc at %d:%d failed\n", outer, inner);
  35. return 1;
  36. }
  37. if (fflush (fp) != 0)
  38. {
  39. puts ("fflush failed");
  40. return 1;
  41. }
  42. if (len != (outer + 1) * 100)
  43. {
  44. printf ("string in round %d not %d bytest long\n",
  45. outer + 1, (outer + 1) * 100);
  46. return 1;
  47. }
  48. if (buf == (CHAR_T *) 1l)
  49. {
  50. printf ("round %d: buf not updated\n", outer + 1);
  51. return 1;
  52. }
  53. for (int inner = 0; inner < (outer + 1) * 100; ++inner)
  54. if (buf[inner] != W('a') + inner % 26)
  55. {
  56. printf ("round %d: buf[%d] != '%c'\n", outer + 1, inner,
  57. (char) (W('a') + inner % 26));
  58. return 1;
  59. }
  60. }
  61. buf = (CHAR_T *) 1l;
  62. len = 12345;
  63. if (fclose (fp) != 0)
  64. {
  65. puts ("fclose failed");
  66. return 1;
  67. }
  68. if (len != 800 * 100)
  69. {
  70. puts ("string after close not 80000 bytes long");
  71. return 1;
  72. }
  73. if (buf == (CHAR_T *) 1l)
  74. {
  75. puts ("buf not updated");
  76. return 1;
  77. }
  78. for (int inner = 0; inner < 800 * 100; ++inner)
  79. if (buf[inner] != W('a') + inner % 26)
  80. {
  81. printf ("after close: buf[%d] != %c\n", inner,
  82. (char) (W('a') + inner % 26));
  83. return 1;
  84. }
  85. free (buf);
  86. return 0;
  87. }
  88. #define TIMEOUT 100
  89. #define TEST_FUNCTION do_test ()
  90. #include "../test-skeleton.c"