]>
Commit | Line | Data |
---|---|---|
0ecb606c JJ |
1 | #include <stdio.h> |
2 | #include <string.h> | |
3 | ||
4 | ||
5 | static int | |
6 | do_test (void) | |
7 | { | |
8 | size_t size; | |
9 | char *buf; | |
10 | FILE *fp = open_memstream (&buf, &size); | |
11 | if (fp == NULL) | |
12 | { | |
13 | puts ("open_memstream failed"); | |
14 | return 1; | |
15 | } | |
16 | ||
17 | off64_t off = ftello64 (fp); | |
18 | if (off != 0) | |
19 | { | |
20 | puts ("initial position wrong"); | |
21 | return 1; | |
22 | } | |
23 | ||
24 | if (fseek (fp, 32768, SEEK_SET) != 0) | |
25 | { | |
26 | puts ("fseek failed"); | |
27 | return 1; | |
28 | } | |
29 | ||
30 | if (fputs ("foo", fp) == EOF) | |
31 | { | |
32 | puts ("fputs failed"); | |
33 | return 1; | |
34 | } | |
35 | ||
36 | if (fclose (fp) == EOF) | |
37 | { | |
38 | puts ("fclose failed"); | |
39 | return 1; | |
40 | } | |
41 | ||
42 | if (size != 32768 + 3) | |
43 | { | |
44 | printf ("expected size %d, got %zu\n", 32768 + 3, size); | |
45 | return 1; | |
46 | } | |
47 | ||
48 | for (int i = 0; i < 32768; ++i) | |
49 | if (buf[i] != '\0') | |
50 | { | |
51 | printf ("byte at offset %d is %#hhx\n", i, buf[i]); | |
52 | return 1; | |
53 | } | |
54 | ||
55 | if (memcmp (buf + 32768, "foo", 3) != 0) | |
56 | { | |
57 | puts ("written string incorrect"); | |
58 | return 1; | |
59 | } | |
60 | ||
61 | /* Mark the buffer. */ | |
62 | memset (buf, 'A', size); | |
63 | free (buf); | |
64 | ||
65 | /* Try again, this time with write mode enabled before the seek. */ | |
66 | fp = open_memstream (&buf, &size); | |
67 | if (fp == NULL) | |
68 | { | |
69 | puts ("2nd open_memstream failed"); | |
70 | return 1; | |
71 | } | |
72 | ||
73 | off = ftello64 (fp); | |
74 | if (off != 0) | |
75 | { | |
76 | puts ("2nd initial position wrong"); | |
77 | return 1; | |
78 | } | |
79 | ||
80 | if (fputs ("bar", fp) == EOF) | |
81 | { | |
82 | puts ("2nd fputs failed"); | |
83 | return 1; | |
84 | } | |
85 | ||
86 | if (fseek (fp, 32768, SEEK_SET) != 0) | |
87 | { | |
88 | puts ("2nd fseek failed"); | |
89 | return 1; | |
90 | } | |
91 | ||
92 | if (fputs ("foo", fp) == EOF) | |
93 | { | |
94 | puts ("3rd fputs failed"); | |
95 | return 1; | |
96 | } | |
97 | ||
98 | if (fclose (fp) == EOF) | |
99 | { | |
100 | puts ("2nd fclose failed"); | |
101 | return 1; | |
102 | } | |
103 | ||
104 | if (size != 32768 + 3) | |
105 | { | |
106 | printf ("2nd expected size %d, got %zu\n", 32768 + 3, size); | |
107 | return 1; | |
108 | } | |
109 | ||
110 | if (memcmp (buf, "bar", 3) != 0) | |
111 | { | |
112 | puts ("initial string incorrect in 2nd try"); | |
113 | return 1; | |
114 | } | |
115 | ||
116 | for (int i = 3; i < 32768; ++i) | |
117 | if (buf[i] != '\0') | |
118 | { | |
119 | printf ("byte at offset %d is %#hhx in 2nd try\n", i, buf[i]); | |
120 | return 1; | |
121 | } | |
122 | ||
123 | if (memcmp (buf + 32768, "foo", 3) != 0) | |
124 | { | |
125 | puts ("written string incorrect in 2nd try"); | |
126 | return 1; | |
127 | } | |
128 | ||
129 | return 0; | |
130 | } | |
131 | ||
132 | #define TEST_FUNCTION do_test () | |
133 | #include "../test-skeleton.c" |