1 // RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
2 
3 // UNSUPPORTED: solaris
4 
5 #include <stdio.h>
6 
7 void print_something() {
8   for (size_t i = 0; i < 10 * BUFSIZ; i++)
9     printf("Hello world %zu\n", i);
10 }
11 
12 void print_one_byte(char *buf) {
13   printf("First byte is %c\n", buf[0]);
14 }
15 
16 void test_setbuf() {
17   char buf[BUFSIZ];
18 
19   setbuf(stdout, NULL);
20 
21   print_something();
22 
23   setbuf(stdout, buf);
24 
25   print_something();
26 
27   print_one_byte(buf);
28 }
29 
30 void test_setbuffer() {
31   char buf[BUFSIZ];
32 
33   setbuffer(stdout, NULL, 0);
34 
35   print_something();
36 
37   // Ensure that interceptor reads correct size
38   // (not BUFSIZ as by default, hence BUFSIZ/2).
39   setbuffer(stdout, buf, BUFSIZ / 2);
40 
41   print_something();
42 
43   print_one_byte(buf);
44 }
45 
46 void test_setlinebuf() {
47   setlinebuf(stdout);
48 
49   print_something();
50 }
51 
52 void test_setvbuf() {
53   char buf[BUFSIZ];
54 
55   setvbuf(stdout, NULL, _IONBF, 0);
56 
57   print_something();
58 
59   setvbuf(stdout, buf, _IOLBF, BUFSIZ);
60 
61   print_something();
62 
63   print_one_byte(buf);
64 
65   setvbuf(stdout, buf, _IOFBF, BUFSIZ);
66 
67   print_something();
68 
69   print_one_byte(buf);
70 }
71 
72 int main(void) {
73   printf("setvbuf\n");
74 
75   test_setbuf();
76   test_setbuffer();
77   test_setlinebuf();
78   test_setvbuf();
79 
80   // CHECK: setvbuf
81 
82   return 0;
83 }
84