1 | #define _XOPEN_SOURCE 500 |
2 | #include <stdio.h> |
3 | #include <stdlib.h> |
4 | #include <locale.h> |
5 | #include <wchar.h> |
6 | |
7 | const char write_chars[] = "ABC" ; /* Characters on testfile. */ |
8 | const wint_t unget_wchar = L'A'; /* Ungotten wide character. */ |
9 | |
10 | char *fname; |
11 | |
12 | |
13 | static int do_test (void); |
14 | #define TEST_FUNCTION do_test () |
15 | |
16 | #include "../test-skeleton.c" |
17 | |
18 | |
19 | static int |
20 | do_test (void) |
21 | { |
22 | wint_t wc; |
23 | FILE *fp; |
24 | int fd; |
25 | |
26 | fname = (char *) malloc (size: strlen (test_dir) + sizeof "/bug-ungetwc1.XXXXXX" ); |
27 | if (fname == NULL) |
28 | { |
29 | puts (s: "no memory" ); |
30 | return 1; |
31 | } |
32 | strcpy (stpcpy (fname, test_dir), "/bug-ungetwc1.XXXXXX" ); |
33 | fd = mkstemp (template: fname); |
34 | if (fd == -1) |
35 | { |
36 | printf (format: "cannot open temporary file: %m\n" ); |
37 | return 1; |
38 | } |
39 | add_temp_file (name: fname); |
40 | |
41 | setlocale(LC_ALL, "" ); |
42 | |
43 | /* Output to the file. */ |
44 | if ((fp = fdopen (fd, "w" )) == NULL) |
45 | { |
46 | fprintf (stderr, "Cannot make `%s' file\n" , fname); |
47 | exit (EXIT_FAILURE); |
48 | } |
49 | |
50 | fprintf (fp, "%s" , write_chars); |
51 | fclose (fp); |
52 | |
53 | /* Read from the file. */ |
54 | fp = fopen (fname, "r" ); |
55 | |
56 | size_t i = 0; |
57 | while (!feof (stream: fp)) |
58 | { |
59 | wc = getwc (stream: fp); |
60 | if (i >= sizeof (write_chars)) |
61 | { |
62 | printf (format: "Did not get end-of-file when expected.\n" ); |
63 | return 1; |
64 | } |
65 | else if (wc != (write_chars[i] ? write_chars[i] : WEOF)) |
66 | { |
67 | printf (format: "Unexpected %lu from getwc.\n" , (unsigned long int) wc); |
68 | return 1; |
69 | } |
70 | i++; |
71 | } |
72 | printf (format: "\nThe end-of-file indicator is set.\n" ); |
73 | |
74 | /* Unget a wide character. */ |
75 | ungetwc (wc: unget_wchar, stream: fp); |
76 | printf (format: "< `%lc' is ungotten.\n" , unget_wchar); |
77 | |
78 | /* Check the end-of-file indicator. */ |
79 | if (feof (stream: fp)) |
80 | { |
81 | printf (format: "The end-of-file indicator is still set.\n" ); |
82 | return 1; |
83 | } |
84 | else |
85 | printf (format: "The end-of-file flag is cleared.\n" ); |
86 | |
87 | fflush (stdout); |
88 | fclose (fp); |
89 | |
90 | return 0; |
91 | } |
92 | |