1 | /* Test program for fsetpos on a wide character stream. */ |
---|---|
2 | |
3 | #include <assert.h> |
4 | #include <stdio.h> |
5 | #include <wchar.h> |
6 | |
7 | #include <support/xunistd.h> |
8 | |
9 | static void do_prepare (void); |
10 | #define PREPARE(argc, argv) do_prepare () |
11 | static int do_test (void); |
12 | #define TEST_FUNCTION do_test () |
13 | #include <test-skeleton.c> |
14 | |
15 | static const char pattern[] = "12345"; |
16 | static char *temp_file; |
17 | |
18 | static void |
19 | do_prepare (void) |
20 | { |
21 | int fd = create_temp_file (base: "bug-wsetpos.", filename: &temp_file); |
22 | if (fd == -1) |
23 | { |
24 | printf (format: "cannot create temporary file: %m\n"); |
25 | exit (1); |
26 | } |
27 | xwrite (fd, pattern, sizeof (pattern)); |
28 | close (fd: fd); |
29 | } |
30 | |
31 | static int |
32 | do_test (void) |
33 | { |
34 | FILE *fp = fopen (temp_file, "r"); |
35 | fpos_t pos; |
36 | wchar_t c; |
37 | |
38 | if (fp == NULL) |
39 | { |
40 | printf (format: "fdopen: %m\n"); |
41 | return 1; |
42 | } |
43 | |
44 | c = fgetwc (stream: fp); assert (c == L'1'); |
45 | c = fgetwc (stream: fp); assert (c == L'2'); |
46 | |
47 | if (fgetpos (fp, &pos) == EOF) |
48 | { |
49 | printf (format: "fgetpos: %m\n"); |
50 | return 1; |
51 | } |
52 | |
53 | rewind (fp); |
54 | if (ferror (stream: fp)) |
55 | { |
56 | printf (format: "rewind: %m\n"); |
57 | return 1; |
58 | } |
59 | |
60 | c = fgetwc (stream: fp); assert (c == L'1'); |
61 | |
62 | if (fsetpos (fp, &pos) == EOF) |
63 | { |
64 | printf (format: "fsetpos: %m\n"); |
65 | return 1; |
66 | } |
67 | |
68 | c = fgetwc (stream: fp); |
69 | if (c != L'3') |
70 | { |
71 | puts (s: "fsetpos failed"); |
72 | return 1; |
73 | } |
74 | |
75 | puts (s: "Test succeeded."); |
76 | return 0; |
77 | } |
78 |