- size_t available = freadahead (stdin);
- ASSERT (available != 0);
- ASSERT (available <= strlen (expected));
- ASSERT (memcmp (freadptr (stdin), expected, available) == 0);
+ size_t available1;
+ size_t available2;
+ size_t available3;
+
+ /* Test normal behaviour. */
+ {
+ const char *ptr = freadptr (stdin, &available1);
+
+ ASSERT (ptr != NULL);
+ ASSERT (available1 != 0);
+ ASSERT (available1 <= strlen (expected));
+ ASSERT (memcmp (ptr, expected, available1) == 0);
+ }
+
+ /* Test behaviour after normal ungetc. */
+ ungetc (fgetc (stdin), stdin);
+ {
+ const char *ptr = freadptr (stdin, &available2);
+
+ if (ptr != NULL)
+ {
+ ASSERT (available2 == available1);
+ ASSERT (memcmp (ptr, expected, available2) == 0);
+ }
+ }
+
+ /* Test behaviour after arbitrary ungetc. */
+ fgetc (stdin);
+ ungetc ('@', stdin);
+ {
+ const char *ptr = freadptr (stdin, &available3);
+
+ if (ptr != NULL)
+ {
+ ASSERT (available3 == 1 || available3 == available1);
+ ASSERT (ptr[0] == '@');
+ if (available3 > 1)
+ {
+ ASSERT (memcmp (ptr + 1, expected + 1, available3 - 1) == 0);
+ }
+ }
+ }