ldbl-128ibm-compat: link tst-ldbl-efgcvt against loader too
[glibc.git] / stdio-common / tst-fmemopen2.c
blob2d4a6aa7477fa513d4b34d1b6bff0b31d878cdd3
1 /* fmemopen tests.
2 Copyright (C) 2015-2020 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
20 #include <assert.h>
21 #include <stdio.h>
22 #include <string.h>
23 #include <sys/types.h>
24 #include <stdint.h>
25 #include <errno.h>
27 /* Check fmemopen with user provided buffer open for write. */
28 static int
29 do_test_with_buffer (void)
31 int result = 0;
32 char buf[100];
33 const size_t nbuf = sizeof (buf);
35 FILE *fp = fmemopen (buf, nbuf, "w");
36 if (fp == NULL)
38 printf ("FAIL: fmemopen failed (%s)\n", __FUNCTION__);
39 return 1;
42 /* Default write operation, check if file position is correct after it. */
43 static const char str[] = "hello world";
44 const size_t nstr = sizeof (str) - 1;
45 fputs (str, fp);
46 off_t o = ftello (fp);
47 if (o != nstr)
49 printf ("FAIL: first ftello returned %jd, expected %zu\n",
50 (intmax_t)o, nstr);
51 result = 1;
54 /* Rewind stream and seek tests, the position size should be equal to
55 buffer size provided in open function. */
56 rewind (fp);
57 o = ftello (fp);
58 if (o != 0)
60 printf ("FAIL: second ftello returned %jd, expected 0\n",
61 (intmax_t)o);
62 result = 1;
64 if (fseeko (fp, 0, SEEK_END) != 0)
66 printf ("FAIL: fseeko failed\n");
67 result = 1;
69 o = ftello (fp);
70 if (o != nstr)
72 printf ("FAIL: third ftello returned %jd, expected %zu\n",
73 (intmax_t)o, nstr);
74 result = 1;
77 /* Rewind the stream and recheck by using a shorter string. */
78 rewind (fp);
79 static const char str2[] = "just hello";
80 const size_t nstr2 = sizeof (str2) - 1;
81 assert (nstr2 < nstr);
82 fputs (str2, fp);
83 o = ftello (fp);
84 if (o != nstr2)
86 printf ("FAIL: fourth ftello returned %jd, expected %zu\n",
87 (intmax_t)o, nstr2);
88 result = 1;
90 fclose (fp);
92 /* Again, but now with a larger string. */
93 static const char str3[] = "just hellod";
94 if (strcmp (buf, str3) != 0)
96 printf ("FAIL: final string is \"%s\", expected \"%s\"\n",
97 buf, str3);
98 result = 1;
100 return result;
103 /* Check fmemopen without user provided buffer open for write. */
104 static int
105 do_test_without_buffer (void)
107 int result = 0;
108 const size_t nbuf = 100;
110 FILE *fp = fmemopen (NULL, nbuf, "w");
111 if (fp == NULL)
113 printf ("FAIL: fmemopen failed (%s)\n", __FUNCTION__);
114 return 1;
117 static const char str[] = "hello world";
118 const size_t nstr = sizeof (str) - 1;
120 /* Default write operation, check if file position is correct after it. */
121 fputs (str, fp);
122 off_t o = ftello (fp);
123 if (o != nstr)
125 printf ("FAIL: first ftello returned %jd, expected %zu\n",
126 (intmax_t) o, nstr);
127 result = 1;
129 if (fseeko (fp, 0, SEEK_END) != 0)
131 printf ("FAIL: fseeko failed\n");
132 result = 1;
134 o = ftello (fp);
135 if (o != nstr)
137 printf ("FAIL: second ftello returned %jd, expected %zu\n",
138 (intmax_t) o, nbuf);
139 result = 1;
142 /* Rewind the stream and recheck by using a shorter string. */
143 rewind (fp);
144 static const char str2[] = "just hello";
145 const size_t nstr2 = sizeof (str2) - 1;
146 assert (nstr2 < nstr);
147 fputs (str2, fp);
148 o = ftello (fp);
149 if (o != nstr2)
151 printf ("FAIL: third ftello returned %jd, expected %zu\n",
152 (intmax_t) o, nstr2);
153 result = 1;
155 fclose (fp);
157 return result;
160 /* Check fmemopen with a buffer lenght of zero. */
161 static int
162 do_test_length_zero (void)
164 int result = 0;
165 FILE *fp;
166 #define BUFCONTENTS "testing buffer"
167 char buf[100] = BUFCONTENTS;
168 const size_t nbuf = 0;
169 int r;
171 fp = fmemopen (buf, nbuf, "r");
172 if (fp == NULL)
174 printf ("FAIL: fmemopen failed (%s)\n", __FUNCTION__);
175 return 1;
178 /* Reading any data on a zero-length buffer should return EOF. */
179 if ((r = fgetc (fp)) != EOF)
181 printf ("FAIL: fgetc on a zero-length returned: %d\n", r);
182 result = 1;
184 off_t o = ftello (fp);
185 if (o != 0)
187 printf ("FAIL: first ftello returned %jd, expected 0\n",
188 (intmax_t) o);
189 result = 1;
191 fclose (fp);
193 /* Writing any data shall start at current position and shall not pass
194 current buffer size beyond the size in fmemopen call. */
195 fp = fmemopen (buf, nbuf, "w");
196 if (fp == NULL)
198 printf ("FAIL: second fmemopen failed (%s)\n", __FUNCTION__);
199 return 1;
202 static const char str[] = "hello world";
203 /* Because of buffering, the fputs call itself will not fail. However the
204 final buffer should be not changed because length 0 was passed to the
205 fmemopen call. */
206 fputs (str, fp);
207 r = 0;
208 errno = 0;
209 if (fflush (fp) != EOF)
211 printf ("FAIL: fflush did not return EOF\n");
212 fclose (fp);
213 return 1;
215 if (errno != ENOSPC)
217 printf ("FAIL: errno is %i (expected ENOSPC)\n", errno);
218 fclose (fp);
219 return 1;
222 fclose (fp);
224 if (strcmp (buf, BUFCONTENTS) != 0)
226 printf ("FAIL: strcmp (%s, %s) failed\n", buf, BUFCONTENTS);
227 return 1;
230 /* Different than 'w' mode, 'w+' truncates the buffer. */
231 fp = fmemopen (buf, nbuf, "w+");
232 if (fp == NULL)
234 printf ("FAIL: third fmemopen failed (%s)\n", __FUNCTION__);
235 return 1;
238 fclose (fp);
240 if (strcmp (buf, "") != 0)
242 printf ("FAIL: strcmp (%s, \"\") failed\n", buf);
243 return 1;
246 return result;
249 static int
250 do_test (void)
252 int ret = 0;
254 ret += do_test_with_buffer ();
255 ret += do_test_without_buffer ();
256 ret += do_test_length_zero ();
258 return ret;
261 #define TEST_FUNCTION do_test ()
262 #include "../test-skeleton.c"