diff options
author | yasuoka <> | 2025-05-25 05:35:13 +0000 |
---|---|---|
committer | yasuoka <> | 2025-05-25 05:35:13 +0000 |
commit | 8b4626f0b3c47fb4ea0aa9adc84cb658c244ec2b (patch) | |
tree | 52670b9a0dadb80034bdbce4d2ad4a00371692a6 /src | |
parent | 361b515d590f3c2f44c93914f1107b897a05aa3e (diff) | |
download | openbsd-8b4626f0b3c47fb4ea0aa9adc84cb658c244ec2b.tar.gz openbsd-8b4626f0b3c47fb4ea0aa9adc84cb658c244ec2b.tar.bz2 openbsd-8b4626f0b3c47fb4ea0aa9adc84cb658c244ec2b.zip |
Add test whether fflush() complies POSIX for the handling of
pushed-back wchar_t chars.
Diffstat (limited to 'src')
-rw-r--r-- | src/regress/lib/libc/stdio/test_fflush.c | 83 |
1 files changed, 82 insertions, 1 deletions
diff --git a/src/regress/lib/libc/stdio/test_fflush.c b/src/regress/lib/libc/stdio/test_fflush.c index fe1772bdfc..76f2d88aba 100644 --- a/src/regress/lib/libc/stdio/test_fflush.c +++ b/src/regress/lib/libc/stdio/test_fflush.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: test_fflush.c,v 1.1 2025/05/24 11:07:21 yasuoka Exp $ */ | 1 | /* $OpenBSD: test_fflush.c,v 1.2 2025/05/25 05:35:13 yasuoka Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright (c) 2025 YASUOKA Masahiko <yasuoka@yasuoka.net> | 4 | * Copyright (c) 2025 YASUOKA Masahiko <yasuoka@yasuoka.net> |
@@ -17,10 +17,12 @@ | |||
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <assert.h> | 19 | #include <assert.h> |
20 | #include <locale.h> | ||
20 | #include <stdio.h> | 21 | #include <stdio.h> |
21 | #include <stdlib.h> | 22 | #include <stdlib.h> |
22 | #include <string.h> | 23 | #include <string.h> |
23 | #include <unistd.h> | 24 | #include <unistd.h> |
25 | #include <wchar.h> | ||
24 | 26 | ||
25 | /* we use assert() */ | 27 | /* we use assert() */ |
26 | #undef NDEBUG | 28 | #undef NDEBUG |
@@ -34,6 +36,8 @@ void test_fflush_read1(void); | |||
34 | void test_fflush_read2(void); | 36 | void test_fflush_read2(void); |
35 | void test_fflush_read3(void); | 37 | void test_fflush_read3(void); |
36 | void test_fflush_read4(void); | 38 | void test_fflush_read4(void); |
39 | void setupw(void); | ||
40 | void test_fflush_read5(void); | ||
37 | 41 | ||
38 | void | 42 | void |
39 | setup(void) | 43 | setup(void) |
@@ -212,14 +216,91 @@ test_fflush_read4(void) | |||
212 | assert(r == 0); | 216 | assert(r == 0); |
213 | } | 217 | } |
214 | 218 | ||
219 | void | ||
220 | setupw(void) | ||
221 | { | ||
222 | FILE *fp; | ||
223 | |||
224 | /* common setup */ | ||
225 | unlink(TMPFILENAME); | ||
226 | fp = fopen(TMPFILENAME, "w+"); | ||
227 | assert(fp != NULL); | ||
228 | /* Konnitiwa Sekai(in Kanji) */ | ||
229 | fputws(L"\u3053\u3093\u306b\u3061\u308f \u4e16\u754c\n", fp); | ||
230 | fclose(fp); | ||
231 | } | ||
232 | |||
233 | /* fflush work with reading file and seekable + ungetwc */ | ||
234 | void | ||
235 | test_fflush_read5(void) | ||
236 | { | ||
237 | int r; | ||
238 | wchar_t buf[80]; | ||
239 | FILE *fp; | ||
240 | |||
241 | setupw(); | ||
242 | |||
243 | fp = fopen(TMPFILENAME, "r"); | ||
244 | |||
245 | assert(fp != NULL); | ||
246 | assert(fgetwc(fp) == L'\u3053'); /* Ko */ | ||
247 | assert(fgetwc(fp) == L'\u3093'); /* N */ | ||
248 | assert(fgetwc(fp) == L'\u306b'); /* Ni */ | ||
249 | assert(fgetwc(fp) == L'\u3061'); /* Ti */ | ||
250 | assert(fgetwc(fp) == L'\u308f'); /* Wa */ | ||
251 | |||
252 | /* push 263A(smile) back */ | ||
253 | assert(ungetwc(L'\u263a', fp)); | ||
254 | |||
255 | /* we support 1 push back wchar_t */ | ||
256 | assert(fgetwc(fp) == L'\u263a'); | ||
257 | |||
258 | /* can read reset of that */ | ||
259 | fgetws(buf, sizeof(buf), fp); | ||
260 | assert(wcscmp(buf, L" \u4e16\u754c\n") == 0); | ||
261 | |||
262 | r = fclose(fp); | ||
263 | assert(r == 0); | ||
264 | |||
265 | /* do the same thing + fflush */ | ||
266 | fp = fopen(TMPFILENAME, "r"); | ||
267 | |||
268 | assert(fp != NULL); | ||
269 | assert(fgetwc(fp) == L'\u3053'); /* Ko */ | ||
270 | assert(fgetwc(fp) == L'\u3093'); /* N */ | ||
271 | assert(fgetwc(fp) == L'\u306b'); /* Ni */ | ||
272 | assert(fgetwc(fp) == L'\u3061'); /* Ti */ | ||
273 | assert(fgetwc(fp) == L'\u308f'); /* Wa */ | ||
274 | |||
275 | /* push 263A(smile) back */ | ||
276 | assert(ungetwc(L'\u263a', fp)); | ||
277 | |||
278 | /* we support 1 push back wchar_t */ | ||
279 | assert(fgetwc(fp) == L'\u263a'); | ||
280 | |||
281 | /* then fflush */ | ||
282 | r = fflush(fp); | ||
283 | assert(r == 0); | ||
284 | |||
285 | /* fllush() clears the all pushed back chars */ | ||
286 | |||
287 | /* can read rest of that */ | ||
288 | fgetws(buf, sizeof(buf), fp); | ||
289 | assert(wcscmp(buf, L" \u4e16\u754c\n") == 0); | ||
290 | r = fclose(fp); | ||
291 | assert(r == 0); | ||
292 | } | ||
215 | int | 293 | int |
216 | main(int argc, char *argv[]) | 294 | main(int argc, char *argv[]) |
217 | { | 295 | { |
296 | setlocale(LC_ALL, "C.UTF-8"); | ||
297 | |||
218 | test_fflush_read0(); | 298 | test_fflush_read0(); |
219 | test_fflush_read1(); | 299 | test_fflush_read1(); |
220 | test_fflush_read2(); | 300 | test_fflush_read2(); |
221 | test_fflush_read3(); | 301 | test_fflush_read3(); |
222 | test_fflush_read4(); | 302 | test_fflush_read4(); |
303 | test_fflush_read5(); | ||
223 | 304 | ||
224 | exit(0); | 305 | exit(0); |
225 | } | 306 | } |