summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoryasuoka <>2025-05-25 05:35:13 +0000
committeryasuoka <>2025-05-25 05:35:13 +0000
commit8b4626f0b3c47fb4ea0aa9adc84cb658c244ec2b (patch)
tree52670b9a0dadb80034bdbce4d2ad4a00371692a6 /src
parent361b515d590f3c2f44c93914f1107b897a05aa3e (diff)
downloadopenbsd-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.c83
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);
34void test_fflush_read2(void); 36void test_fflush_read2(void);
35void test_fflush_read3(void); 37void test_fflush_read3(void);
36void test_fflush_read4(void); 38void test_fflush_read4(void);
39void setupw(void);
40void test_fflush_read5(void);
37 41
38void 42void
39setup(void) 43setup(void)
@@ -212,14 +216,91 @@ test_fflush_read4(void)
212 assert(r == 0); 216 assert(r == 0);
213} 217}
214 218
219void
220setupw(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 */
234void
235test_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}
215int 293int
216main(int argc, char *argv[]) 294main(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}