msvcirt: Implement stdiobuf::sync.
[wine.git] / dlls / msvcirt / tests / msvcirt.c
blob8bc45c1a22e260abb2a4c34037f38c3fee6130bf
1 /*
2 * Copyright 2015 Iván Matellanes
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include <fcntl.h>
20 #include <io.h>
21 #include <stdio.h>
22 #include <windef.h>
23 #include <winbase.h>
24 #include "wine/test.h"
26 typedef void (*vtable_ptr)(void);
27 typedef LONG streamoff;
28 typedef LONG streampos;
29 typedef int filedesc;
30 typedef void* (__cdecl *allocFunction)(LONG);
31 typedef void (__cdecl *freeFunction)(void*);
33 typedef enum {
34 IOSTATE_goodbit = 0x0,
35 IOSTATE_eofbit = 0x1,
36 IOSTATE_failbit = 0x2,
37 IOSTATE_badbit = 0x4
38 } ios_io_state;
40 typedef enum {
41 OPENMODE_in = 0x1,
42 OPENMODE_out = 0x2,
43 OPENMODE_ate = 0x4,
44 OPENMODE_app = 0x8,
45 OPENMODE_trunc = 0x10,
46 OPENMODE_nocreate = 0x20,
47 OPENMODE_noreplace = 0x40,
48 OPENMODE_binary = 0x80
49 } ios_open_mode;
51 typedef enum {
52 SEEKDIR_beg = 0,
53 SEEKDIR_cur = 1,
54 SEEKDIR_end = 2
55 } ios_seek_dir;
57 typedef enum {
58 FLAGS_skipws = 0x1,
59 FLAGS_left = 0x2,
60 FLAGS_right = 0x4,
61 FLAGS_internal = 0x8,
62 FLAGS_dec = 0x10,
63 FLAGS_oct = 0x20,
64 FLAGS_hex = 0x40,
65 FLAGS_showbase = 0x80,
66 FLAGS_showpoint = 0x100,
67 FLAGS_uppercase = 0x200,
68 FLAGS_showpos = 0x400,
69 FLAGS_scientific = 0x800,
70 FLAGS_fixed = 0x1000,
71 FLAGS_unitbuf = 0x2000,
72 FLAGS_stdio = 0x4000
73 } ios_flags;
75 const int filebuf_sh_none = 0x800;
76 const int filebuf_sh_read = 0xa00;
77 const int filebuf_sh_write = 0xc00;
78 const int filebuf_openprot = 420;
79 const int filebuf_binary = _O_BINARY;
80 const int filebuf_text = _O_TEXT;
82 /* class streambuf */
83 typedef struct {
84 const vtable_ptr *vtable;
85 int allocated;
86 int unbuffered;
87 int stored_char;
88 char *base;
89 char *ebuf;
90 char *pbase;
91 char *pptr;
92 char *epptr;
93 char *eback;
94 char *gptr;
95 char *egptr;
96 int do_lock;
97 CRITICAL_SECTION lock;
98 } streambuf;
100 /* class filebuf */
101 typedef struct {
102 streambuf base;
103 filedesc fd;
104 int close;
105 } filebuf;
107 /* class strstreambuf */
108 typedef struct {
109 streambuf base;
110 int dynamic;
111 int increase;
112 int unknown;
113 int constant;
114 allocFunction f_alloc;
115 freeFunction f_free;
116 } strstreambuf;
118 /* class stdiobuf */
119 typedef struct {
120 streambuf base;
121 FILE *file;
122 } stdiobuf;
124 /* class ios */
125 struct _ostream;
126 typedef struct {
127 const vtable_ptr *vtable;
128 streambuf *sb;
129 ios_io_state state;
130 int special[4];
131 int delbuf;
132 struct _ostream *tie;
133 ios_flags flags;
134 int precision;
135 char fill;
136 int width;
137 int do_lock;
138 CRITICAL_SECTION lock;
139 } ios;
141 /* class ostream */
142 typedef struct _ostream {
143 const vtable_ptr *vtable;
144 } ostream;
146 #undef __thiscall
147 #ifdef __i386__
148 #define __thiscall __stdcall
149 #else
150 #define __thiscall __cdecl
151 #endif
153 static void* (__cdecl *p_operator_new)(unsigned int);
154 static void (__cdecl *p_operator_delete)(void*);
156 /* streambuf */
157 static streambuf* (*__thiscall p_streambuf_reserve_ctor)(streambuf*, char*, int);
158 static streambuf* (*__thiscall p_streambuf_ctor)(streambuf*);
159 static void (*__thiscall p_streambuf_dtor)(streambuf*);
160 static int (*__thiscall p_streambuf_allocate)(streambuf*);
161 static void (*__thiscall p_streambuf_clrclock)(streambuf*);
162 static int (*__thiscall p_streambuf_doallocate)(streambuf*);
163 static void (*__thiscall p_streambuf_gbump)(streambuf*, int);
164 static void (*__thiscall p_streambuf_lock)(streambuf*);
165 static int (*__thiscall p_streambuf_pbackfail)(streambuf*, int);
166 static void (*__thiscall p_streambuf_pbump)(streambuf*, int);
167 static int (*__thiscall p_streambuf_sbumpc)(streambuf*);
168 static void (*__thiscall p_streambuf_setb)(streambuf*, char*, char*, int);
169 static void (*__thiscall p_streambuf_setlock)(streambuf*);
170 static streambuf* (*__thiscall p_streambuf_setbuf)(streambuf*, char*, int);
171 static int (*__thiscall p_streambuf_sgetc)(streambuf*);
172 static int (*__thiscall p_streambuf_snextc)(streambuf*);
173 static int (*__thiscall p_streambuf_sputc)(streambuf*, int);
174 static void (*__thiscall p_streambuf_stossc)(streambuf*);
175 static int (*__thiscall p_streambuf_sync)(streambuf*);
176 static void (*__thiscall p_streambuf_unlock)(streambuf*);
177 static int (*__thiscall p_streambuf_xsgetn)(streambuf*, char*, int);
178 static int (*__thiscall p_streambuf_xsputn)(streambuf*, const char*, int);
180 /* filebuf */
181 static filebuf* (*__thiscall p_filebuf_fd_ctor)(filebuf*, int);
182 static filebuf* (*__thiscall p_filebuf_fd_reserve_ctor)(filebuf*, int, char*, int);
183 static filebuf* (*__thiscall p_filebuf_ctor)(filebuf*);
184 static void (*__thiscall p_filebuf_dtor)(filebuf*);
185 static filebuf* (*__thiscall p_filebuf_attach)(filebuf*, filedesc);
186 static filebuf* (*__thiscall p_filebuf_open)(filebuf*, const char*, ios_open_mode, int);
187 static filebuf* (*__thiscall p_filebuf_close)(filebuf*);
188 static int (*__thiscall p_filebuf_setmode)(filebuf*, int);
189 static streambuf* (*__thiscall p_filebuf_setbuf)(filebuf*, char*, int);
190 static int (*__thiscall p_filebuf_sync)(filebuf*);
191 static int (*__thiscall p_filebuf_overflow)(filebuf*, int);
192 static int (*__thiscall p_filebuf_underflow)(filebuf*);
193 static streampos (*__thiscall p_filebuf_seekoff)(filebuf*, streamoff, ios_seek_dir, int);
195 /* strstreambuf */
196 static strstreambuf* (*__thiscall p_strstreambuf_dynamic_ctor)(strstreambuf*, int);
197 static strstreambuf* (*__thiscall p_strstreambuf_funcs_ctor)(strstreambuf*, allocFunction, freeFunction);
198 static strstreambuf* (*__thiscall p_strstreambuf_buffer_ctor)(strstreambuf*, char*, int, char*);
199 static strstreambuf* (*__thiscall p_strstreambuf_ubuffer_ctor)(strstreambuf*, unsigned char*, int, unsigned char*);
200 static strstreambuf* (*__thiscall p_strstreambuf_ctor)(strstreambuf*);
201 static void (*__thiscall p_strstreambuf_dtor)(strstreambuf*);
202 static int (*__thiscall p_strstreambuf_doallocate)(strstreambuf*);
203 static void (*__thiscall p_strstreambuf_freeze)(strstreambuf*, int);
204 static int (*__thiscall p_strstreambuf_overflow)(strstreambuf*, int);
205 static streampos (*__thiscall p_strstreambuf_seekoff)(strstreambuf*, streamoff, ios_seek_dir, int);
206 static streambuf* (*__thiscall p_strstreambuf_setbuf)(strstreambuf*, char*, int);
207 static int (*__thiscall p_strstreambuf_underflow)(strstreambuf*);
209 /* stdiobuf */
210 static stdiobuf* (*__thiscall p_stdiobuf_file_ctor)(stdiobuf*, FILE*);
211 static void (*__thiscall p_stdiobuf_dtor)(stdiobuf*);
212 static int (*__thiscall p_stdiobuf_overflow)(stdiobuf*, int);
213 static int (*__thiscall p_stdiobuf_sync)(stdiobuf*);
214 static int (*__thiscall p_stdiobuf_underflow)(stdiobuf*);
216 /* ios */
217 static ios* (*__thiscall p_ios_copy_ctor)(ios*, const ios*);
218 static ios* (*__thiscall p_ios_ctor)(ios*);
219 static ios* (*__thiscall p_ios_sb_ctor)(ios*, streambuf*);
220 static ios* (*__thiscall p_ios_assign)(ios*, const ios*);
221 static void (*__thiscall p_ios_init)(ios*, streambuf*);
222 static void (*__thiscall p_ios_dtor)(ios*);
223 static void (*__cdecl p_ios_clrlock)(ios*);
224 static void (*__cdecl p_ios_setlock)(ios*);
225 static void (*__cdecl p_ios_lock)(ios*);
226 static void (*__cdecl p_ios_unlock)(ios*);
227 static void (*__cdecl p_ios_lockbuf)(ios*);
228 static void (*__cdecl p_ios_unlockbuf)(ios*);
229 static CRITICAL_SECTION *p_ios_static_lock;
230 static void (*__cdecl p_ios_lockc)(void);
231 static void (*__cdecl p_ios_unlockc)(void);
232 static LONG (*__thiscall p_ios_flags_set)(ios*, LONG);
233 static LONG (*__thiscall p_ios_flags_get)(const ios*);
234 static LONG (*__thiscall p_ios_setf)(ios*, LONG);
235 static LONG (*__thiscall p_ios_setf_mask)(ios*, LONG, LONG);
236 static LONG (*__thiscall p_ios_unsetf)(ios*, LONG);
237 static int (*__thiscall p_ios_good)(const ios*);
238 static int (*__thiscall p_ios_bad)(const ios*);
239 static int (*__thiscall p_ios_eof)(const ios*);
240 static int (*__thiscall p_ios_fail)(const ios*);
241 static void (*__thiscall p_ios_clear)(ios*, int);
242 static LONG *p_ios_maxbit;
243 static LONG (*__cdecl p_ios_bitalloc)(void);
244 static int *p_ios_curindex;
245 static LONG *p_ios_statebuf;
246 static LONG* (*__thiscall p_ios_iword)(const ios*, int);
247 static void** (*__thiscall p_ios_pword)(const ios*, int);
248 static int (*__cdecl p_ios_xalloc)(void);
249 static int *p_ios_fLockcInit;
251 /* Emulate a __thiscall */
252 #ifdef __i386__
254 #include "pshpack1.h"
255 struct thiscall_thunk
257 BYTE pop_eax; /* popl %eax (ret addr) */
258 BYTE pop_edx; /* popl %edx (func) */
259 BYTE pop_ecx; /* popl %ecx (this) */
260 BYTE push_eax; /* pushl %eax */
261 WORD jmp_edx; /* jmp *%edx */
263 #include "poppack.h"
265 static void * (WINAPI *call_thiscall_func1)( void *func, void *this );
266 static void * (WINAPI *call_thiscall_func2)( void *func, void *this, const void *a );
267 static void * (WINAPI *call_thiscall_func3)( void *func, void *this, const void *a, const void *b );
268 static void * (WINAPI *call_thiscall_func4)( void *func, void *this, const void *a, const void *b,
269 const void *c );
270 static void * (WINAPI *call_thiscall_func5)( void *func, void *this, const void *a, const void *b,
271 const void *c, const void *d );
273 static void init_thiscall_thunk(void)
275 struct thiscall_thunk *thunk = VirtualAlloc( NULL, sizeof(*thunk),
276 MEM_COMMIT, PAGE_EXECUTE_READWRITE );
277 thunk->pop_eax = 0x58; /* popl %eax */
278 thunk->pop_edx = 0x5a; /* popl %edx */
279 thunk->pop_ecx = 0x59; /* popl %ecx */
280 thunk->push_eax = 0x50; /* pushl %eax */
281 thunk->jmp_edx = 0xe2ff; /* jmp *%edx */
282 call_thiscall_func1 = (void *)thunk;
283 call_thiscall_func2 = (void *)thunk;
284 call_thiscall_func3 = (void *)thunk;
285 call_thiscall_func4 = (void *)thunk;
286 call_thiscall_func5 = (void *)thunk;
289 #define call_func1(func,_this) call_thiscall_func1(func,_this)
290 #define call_func2(func,_this,a) call_thiscall_func2(func,_this,(const void*)(a))
291 #define call_func3(func,_this,a,b) call_thiscall_func3(func,_this,(const void*)(a),(const void*)(b))
292 #define call_func4(func,_this,a,b,c) call_thiscall_func4(func,_this,(const void*)(a),(const void*)(b), \
293 (const void*)(c))
294 #define call_func5(func,_this,a,b,c,d) call_thiscall_func5(func,_this,(const void*)(a),(const void*)(b), \
295 (const void*)(c), (const void *)(d))
297 #else
299 #define init_thiscall_thunk()
300 #define call_func1(func,_this) func(_this)
301 #define call_func2(func,_this,a) func(_this,a)
302 #define call_func3(func,_this,a,b) func(_this,a,b)
303 #define call_func4(func,_this,a,b,c) func(_this,a,b,c)
304 #define call_func5(func,_this,a,b,c,d) func(_this,a,b,c,d)
306 #endif /* __i386__ */
308 static HMODULE msvcrt, msvcirt;
309 #define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcirt,y)
310 #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0)
311 static BOOL init(void)
313 msvcrt = LoadLibraryA("msvcrt.dll");
314 msvcirt = LoadLibraryA("msvcirt.dll");
315 if(!msvcirt) {
316 win_skip("msvcirt.dll not installed\n");
317 return FALSE;
320 if(sizeof(void*) == 8) { /* 64-bit initialization */
321 p_operator_new = (void*)GetProcAddress(msvcrt, "??2@YAPEAX_K@Z");
322 p_operator_delete = (void*)GetProcAddress(msvcrt, "??3@YAXPEAX@Z");
324 SET(p_streambuf_reserve_ctor, "??0streambuf@@IEAA@PEADH@Z");
325 SET(p_streambuf_ctor, "??0streambuf@@IEAA@XZ");
326 SET(p_streambuf_dtor, "??1streambuf@@UEAA@XZ");
327 SET(p_streambuf_allocate, "?allocate@streambuf@@IEAAHXZ");
328 SET(p_streambuf_clrclock, "?clrlock@streambuf@@QEAAXXZ");
329 SET(p_streambuf_doallocate, "?doallocate@streambuf@@MEAAHXZ");
330 SET(p_streambuf_gbump, "?gbump@streambuf@@IEAAXH@Z");
331 SET(p_streambuf_lock, "?lock@streambuf@@QEAAXXZ");
332 SET(p_streambuf_pbackfail, "?pbackfail@streambuf@@UEAAHH@Z");
333 SET(p_streambuf_pbump, "?pbump@streambuf@@IEAAXH@Z");
334 SET(p_streambuf_sbumpc, "?sbumpc@streambuf@@QEAAHXZ");
335 SET(p_streambuf_setb, "?setb@streambuf@@IEAAXPEAD0H@Z");
336 SET(p_streambuf_setbuf, "?setbuf@streambuf@@UEAAPEAV1@PEADH@Z");
337 SET(p_streambuf_setlock, "?setlock@streambuf@@QEAAXXZ");
338 SET(p_streambuf_sgetc, "?sgetc@streambuf@@QEAAHXZ");
339 SET(p_streambuf_snextc, "?snextc@streambuf@@QEAAHXZ");
340 SET(p_streambuf_sputc, "?sputc@streambuf@@QEAAHH@Z");
341 SET(p_streambuf_stossc, "?stossc@streambuf@@QEAAXXZ");
342 SET(p_streambuf_sync, "?sync@streambuf@@UEAAHXZ");
343 SET(p_streambuf_unlock, "?unlock@streambuf@@QEAAXXZ");
344 SET(p_streambuf_xsgetn, "?xsgetn@streambuf@@UEAAHPEADH@Z");
345 SET(p_streambuf_xsputn, "?xsputn@streambuf@@UEAAHPEBDH@Z");
347 SET(p_filebuf_fd_ctor, "??0filebuf@@QEAA@H@Z");
348 SET(p_filebuf_fd_reserve_ctor, "??0filebuf@@QEAA@HPEADH@Z");
349 SET(p_filebuf_ctor, "??0filebuf@@QEAA@XZ");
350 SET(p_filebuf_dtor, "??1filebuf@@UEAA@XZ");
351 SET(p_filebuf_attach, "?attach@filebuf@@QEAAPEAV1@H@Z");
352 SET(p_filebuf_open, "?open@filebuf@@QEAAPEAV1@PEBDHH@Z");
353 SET(p_filebuf_close, "?close@filebuf@@QEAAPEAV1@XZ");
354 SET(p_filebuf_setmode, "?setmode@filebuf@@QEAAHH@Z");
355 SET(p_filebuf_setbuf, "?setbuf@filebuf@@UEAAPEAVstreambuf@@PEADH@Z");
356 SET(p_filebuf_sync, "?sync@filebuf@@UEAAHXZ");
357 SET(p_filebuf_overflow, "?overflow@filebuf@@UEAAHH@Z");
358 SET(p_filebuf_underflow, "?underflow@filebuf@@UEAAHXZ");
359 SET(p_filebuf_seekoff, "?seekoff@filebuf@@UEAAJJW4seek_dir@ios@@H@Z");
361 SET(p_strstreambuf_dynamic_ctor, "??0strstreambuf@@QEAA@H@Z");
362 SET(p_strstreambuf_funcs_ctor, "??0strstreambuf@@QEAA@P6APEAXJ@ZP6AXPEAX@Z@Z");
363 SET(p_strstreambuf_buffer_ctor, "??0strstreambuf@@QEAA@PEADH0@Z");
364 SET(p_strstreambuf_ubuffer_ctor, "??0strstreambuf@@QEAA@PEAEH0@Z");
365 SET(p_strstreambuf_ctor, "??0strstreambuf@@QEAA@XZ");
366 SET(p_strstreambuf_dtor, "??1strstreambuf@@UEAA@XZ");
367 SET(p_strstreambuf_doallocate, "?doallocate@strstreambuf@@MEAAHXZ");
368 SET(p_strstreambuf_freeze, "?freeze@strstreambuf@@QEAAXH@Z");
369 SET(p_strstreambuf_overflow, "?overflow@strstreambuf@@UEAAHH@Z");
370 SET(p_strstreambuf_seekoff, "?seekoff@strstreambuf@@UEAAJJW4seek_dir@ios@@H@Z");
371 SET(p_strstreambuf_setbuf, "?setbuf@strstreambuf@@UEAAPEAVstreambuf@@PEADH@Z");
372 SET(p_strstreambuf_underflow, "?underflow@strstreambuf@@UEAAHXZ");
374 SET(p_stdiobuf_file_ctor, "??0stdiobuf@@QEAA@PEAU_iobuf@@@Z");
375 SET(p_stdiobuf_dtor, "??1stdiobuf@@UEAA@XZ");
376 SET(p_stdiobuf_overflow, "?overflow@stdiobuf@@UEAAHH@Z");
377 SET(p_stdiobuf_sync, "?sync@stdiobuf@@UEAAHXZ");
378 SET(p_stdiobuf_underflow, "?underflow@stdiobuf@@UEAAHXZ");
380 SET(p_ios_copy_ctor, "??0ios@@IEAA@AEBV0@@Z");
381 SET(p_ios_ctor, "??0ios@@IEAA@XZ");
382 SET(p_ios_sb_ctor, "??0ios@@QEAA@PEAVstreambuf@@@Z");
383 SET(p_ios_assign, "??4ios@@IEAAAEAV0@AEBV0@@Z");
384 SET(p_ios_init, "?init@ios@@IEAAXPEAVstreambuf@@@Z");
385 SET(p_ios_dtor, "??1ios@@UEAA@XZ");
386 SET(p_ios_clrlock, "?clrlock@ios@@QEAAXXZ");
387 SET(p_ios_setlock, "?setlock@ios@@QEAAXXZ");
388 SET(p_ios_lock, "?lock@ios@@QEAAXXZ");
389 SET(p_ios_unlock, "?unlock@ios@@QEAAXXZ");
390 SET(p_ios_lockbuf, "?lockbuf@ios@@QEAAXXZ");
391 SET(p_ios_unlockbuf, "?unlockbuf@ios@@QEAAXXZ");
392 SET(p_ios_flags_set, "?flags@ios@@QEAAJJ@Z");
393 SET(p_ios_flags_get, "?flags@ios@@QEBAJXZ");
394 SET(p_ios_setf, "?setf@ios@@QEAAJJ@Z");
395 SET(p_ios_setf_mask, "?setf@ios@@QEAAJJJ@Z");
396 SET(p_ios_unsetf, "?unsetf@ios@@QEAAJJ@Z");
397 SET(p_ios_good, "?good@ios@@QEBAHXZ");
398 SET(p_ios_bad, "?bad@ios@@QEBAHXZ");
399 SET(p_ios_eof, "?eof@ios@@QEBAHXZ");
400 SET(p_ios_fail, "?fail@ios@@QEBAHXZ");
401 SET(p_ios_clear, "?clear@ios@@QEAAXH@Z");
402 SET(p_ios_iword, "?iword@ios@@QEBAAEAJH@Z");
403 SET(p_ios_pword, "?pword@ios@@QEBAAEAPEAXH@Z");
404 } else {
405 p_operator_new = (void*)GetProcAddress(msvcrt, "??2@YAPAXI@Z");
406 p_operator_delete = (void*)GetProcAddress(msvcrt, "??3@YAXPAX@Z");
408 SET(p_streambuf_reserve_ctor, "??0streambuf@@IAE@PADH@Z");
409 SET(p_streambuf_ctor, "??0streambuf@@IAE@XZ");
410 SET(p_streambuf_dtor, "??1streambuf@@UAE@XZ");
411 SET(p_streambuf_allocate, "?allocate@streambuf@@IAEHXZ");
412 SET(p_streambuf_clrclock, "?clrlock@streambuf@@QAEXXZ");
413 SET(p_streambuf_doallocate, "?doallocate@streambuf@@MAEHXZ");
414 SET(p_streambuf_gbump, "?gbump@streambuf@@IAEXH@Z");
415 SET(p_streambuf_lock, "?lock@streambuf@@QAEXXZ");
416 SET(p_streambuf_pbackfail, "?pbackfail@streambuf@@UAEHH@Z");
417 SET(p_streambuf_pbump, "?pbump@streambuf@@IAEXH@Z");
418 SET(p_streambuf_sbumpc, "?sbumpc@streambuf@@QAEHXZ");
419 SET(p_streambuf_setb, "?setb@streambuf@@IAEXPAD0H@Z");
420 SET(p_streambuf_setbuf, "?setbuf@streambuf@@UAEPAV1@PADH@Z");
421 SET(p_streambuf_setlock, "?setlock@streambuf@@QAEXXZ");
422 SET(p_streambuf_sgetc, "?sgetc@streambuf@@QAEHXZ");
423 SET(p_streambuf_snextc, "?snextc@streambuf@@QAEHXZ");
424 SET(p_streambuf_sputc, "?sputc@streambuf@@QAEHH@Z");
425 SET(p_streambuf_stossc, "?stossc@streambuf@@QAEXXZ");
426 SET(p_streambuf_sync, "?sync@streambuf@@UAEHXZ");
427 SET(p_streambuf_unlock, "?unlock@streambuf@@QAEXXZ");
428 SET(p_streambuf_xsgetn, "?xsgetn@streambuf@@UAEHPADH@Z");
429 SET(p_streambuf_xsputn, "?xsputn@streambuf@@UAEHPBDH@Z");
431 SET(p_filebuf_fd_ctor, "??0filebuf@@QAE@H@Z");
432 SET(p_filebuf_fd_reserve_ctor, "??0filebuf@@QAE@HPADH@Z");
433 SET(p_filebuf_ctor, "??0filebuf@@QAE@XZ");
434 SET(p_filebuf_dtor, "??1filebuf@@UAE@XZ");
435 SET(p_filebuf_attach, "?attach@filebuf@@QAEPAV1@H@Z");
436 SET(p_filebuf_open, "?open@filebuf@@QAEPAV1@PBDHH@Z");
437 SET(p_filebuf_close, "?close@filebuf@@QAEPAV1@XZ");
438 SET(p_filebuf_setmode, "?setmode@filebuf@@QAEHH@Z");
439 SET(p_filebuf_setbuf, "?setbuf@filebuf@@UAEPAVstreambuf@@PADH@Z");
440 SET(p_filebuf_sync, "?sync@filebuf@@UAEHXZ");
441 SET(p_filebuf_overflow, "?overflow@filebuf@@UAEHH@Z");
442 SET(p_filebuf_underflow, "?underflow@filebuf@@UAEHXZ");
443 SET(p_filebuf_seekoff, "?seekoff@filebuf@@UAEJJW4seek_dir@ios@@H@Z");
445 SET(p_strstreambuf_dynamic_ctor, "??0strstreambuf@@QAE@H@Z");
446 SET(p_strstreambuf_funcs_ctor, "??0strstreambuf@@QAE@P6APAXJ@ZP6AXPAX@Z@Z");
447 SET(p_strstreambuf_buffer_ctor, "??0strstreambuf@@QAE@PADH0@Z");
448 SET(p_strstreambuf_ubuffer_ctor, "??0strstreambuf@@QAE@PAEH0@Z");
449 SET(p_strstreambuf_ctor, "??0strstreambuf@@QAE@XZ");
450 SET(p_strstreambuf_dtor, "??1strstreambuf@@UAE@XZ");
451 SET(p_strstreambuf_doallocate, "?doallocate@strstreambuf@@MAEHXZ");
452 SET(p_strstreambuf_freeze, "?freeze@strstreambuf@@QAEXH@Z");
453 SET(p_strstreambuf_overflow, "?overflow@strstreambuf@@UAEHH@Z");
454 SET(p_strstreambuf_seekoff, "?seekoff@strstreambuf@@UAEJJW4seek_dir@ios@@H@Z");
455 SET(p_strstreambuf_setbuf, "?setbuf@strstreambuf@@UAEPAVstreambuf@@PADH@Z");
456 SET(p_strstreambuf_underflow, "?underflow@strstreambuf@@UAEHXZ");
458 SET(p_stdiobuf_file_ctor, "??0stdiobuf@@QAE@PAU_iobuf@@@Z");
459 SET(p_stdiobuf_dtor, "??1stdiobuf@@UAE@XZ");
460 SET(p_stdiobuf_overflow, "?overflow@stdiobuf@@UAEHH@Z");
461 SET(p_stdiobuf_sync, "?sync@stdiobuf@@UAEHXZ");
462 SET(p_stdiobuf_underflow, "?underflow@stdiobuf@@UAEHXZ");
464 SET(p_ios_copy_ctor, "??0ios@@IAE@ABV0@@Z");
465 SET(p_ios_ctor, "??0ios@@IAE@XZ");
466 SET(p_ios_sb_ctor, "??0ios@@QAE@PAVstreambuf@@@Z");
467 SET(p_ios_assign, "??4ios@@IAEAAV0@ABV0@@Z");
468 SET(p_ios_init, "?init@ios@@IAEXPAVstreambuf@@@Z");
469 SET(p_ios_dtor, "??1ios@@UAE@XZ");
470 SET(p_ios_clrlock, "?clrlock@ios@@QAAXXZ");
471 SET(p_ios_setlock, "?setlock@ios@@QAAXXZ");
472 SET(p_ios_lock, "?lock@ios@@QAAXXZ");
473 SET(p_ios_unlock, "?unlock@ios@@QAAXXZ");
474 SET(p_ios_lockbuf, "?lockbuf@ios@@QAAXXZ");
475 SET(p_ios_unlockbuf, "?unlockbuf@ios@@QAAXXZ");
476 SET(p_ios_flags_set, "?flags@ios@@QAEJJ@Z");
477 SET(p_ios_flags_get, "?flags@ios@@QBEJXZ");
478 SET(p_ios_setf, "?setf@ios@@QAEJJ@Z");
479 SET(p_ios_setf_mask, "?setf@ios@@QAEJJJ@Z");
480 SET(p_ios_unsetf, "?unsetf@ios@@QAEJJ@Z");
481 SET(p_ios_good, "?good@ios@@QBEHXZ");
482 SET(p_ios_bad, "?bad@ios@@QBEHXZ");
483 SET(p_ios_eof, "?eof@ios@@QBEHXZ");
484 SET(p_ios_fail, "?fail@ios@@QBEHXZ");
485 SET(p_ios_clear, "?clear@ios@@QAEXH@Z");
486 SET(p_ios_iword, "?iword@ios@@QBEAAJH@Z");
487 SET(p_ios_pword, "?pword@ios@@QBEAAPAXH@Z");
489 SET(p_ios_static_lock, "?x_lockc@ios@@0U_CRT_CRITICAL_SECTION@@A");
490 SET(p_ios_lockc, "?lockc@ios@@KAXXZ");
491 SET(p_ios_unlockc, "?unlockc@ios@@KAXXZ");
492 SET(p_ios_maxbit, "?x_maxbit@ios@@0JA");
493 SET(p_ios_bitalloc, "?bitalloc@ios@@SAJXZ");
494 SET(p_ios_curindex, "?x_curindex@ios@@0HA");
495 SET(p_ios_statebuf, "?x_statebuf@ios@@0PAJA");
496 SET(p_ios_xalloc, "?xalloc@ios@@SAHXZ");
497 SET(p_ios_fLockcInit, "?fLockcInit@ios@@0HA");
499 init_thiscall_thunk();
500 return TRUE;
503 static int overflow_count, underflow_count;
504 static streambuf *test_this;
505 static char test_get_buffer[24];
506 static int buffer_pos, get_end;
508 #ifdef __i386__
509 static int __thiscall test_streambuf_overflow(int ch)
510 #else
511 static int __thiscall test_streambuf_overflow(streambuf *this, int ch)
512 #endif
514 overflow_count++;
515 if (ch == 'L') /* simulate a failure */
516 return EOF;
517 if (!test_this->unbuffered)
518 test_this->pptr = test_this->pbase + 5;
519 return ch;
522 #ifdef __i386__
523 static int __thiscall test_streambuf_underflow(void)
524 #else
525 static int __thiscall test_streambuf_underflow(streambuf *this)
526 #endif
528 underflow_count++;
529 if (test_this->unbuffered) {
530 return (buffer_pos < 23) ? test_get_buffer[buffer_pos++] : EOF;
531 } else if (test_this->gptr < test_this->egptr) {
532 return *test_this->gptr;
533 } else {
534 return get_end ? EOF : *(test_this->gptr = test_this->eback);
538 struct streambuf_lock_arg
540 streambuf *sb;
541 HANDLE lock[4];
542 HANDLE test[4];
545 static DWORD WINAPI lock_streambuf(void *arg)
547 struct streambuf_lock_arg *lock_arg = arg;
548 call_func1(p_streambuf_lock, lock_arg->sb);
549 SetEvent(lock_arg->lock[0]);
550 WaitForSingleObject(lock_arg->test[0], INFINITE);
551 call_func1(p_streambuf_lock, lock_arg->sb);
552 SetEvent(lock_arg->lock[1]);
553 WaitForSingleObject(lock_arg->test[1], INFINITE);
554 call_func1(p_streambuf_lock, lock_arg->sb);
555 SetEvent(lock_arg->lock[2]);
556 WaitForSingleObject(lock_arg->test[2], INFINITE);
557 call_func1(p_streambuf_unlock, lock_arg->sb);
558 SetEvent(lock_arg->lock[3]);
559 WaitForSingleObject(lock_arg->test[3], INFINITE);
560 call_func1(p_streambuf_unlock, lock_arg->sb);
561 return 0;
564 static void test_streambuf(void)
566 streambuf sb, sb2, sb3, *psb;
567 vtable_ptr test_streambuf_vtbl[11];
568 struct streambuf_lock_arg lock_arg;
569 HANDLE thread;
570 char reserve[16];
571 int ret, i;
572 BOOL locked;
574 memset(&sb, 0xab, sizeof(streambuf));
575 memset(&sb2, 0xab, sizeof(streambuf));
576 memset(&sb3, 0xab, sizeof(streambuf));
578 /* constructors */
579 call_func1(p_streambuf_ctor, &sb);
580 ok(sb.allocated == 0, "wrong allocate value, expected 0 got %d\n", sb.allocated);
581 ok(sb.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", sb.unbuffered);
582 ok(sb.base == NULL, "wrong base pointer, expected %p got %p\n", NULL, sb.base);
583 ok(sb.ebuf == NULL, "wrong ebuf pointer, expected %p got %p\n", NULL, sb.ebuf);
584 ok(sb.lock.LockCount == -1, "wrong critical section state, expected -1 got %d\n", sb.lock.LockCount);
585 call_func3(p_streambuf_reserve_ctor, &sb2, reserve, 16);
586 ok(sb2.allocated == 0, "wrong allocate value, expected 0 got %d\n", sb2.allocated);
587 ok(sb2.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", sb2.unbuffered);
588 ok(sb2.base == reserve, "wrong base pointer, expected %p got %p\n", reserve, sb2.base);
589 ok(sb2.ebuf == reserve+16, "wrong ebuf pointer, expected %p got %p\n", reserve+16, sb2.ebuf);
590 ok(sb.lock.LockCount == -1, "wrong critical section state, expected -1 got %d\n", sb.lock.LockCount);
591 call_func1(p_streambuf_ctor, &sb3);
592 ok(sb3.allocated == 0, "wrong allocate value, expected 0 got %d\n", sb3.allocated);
593 ok(sb3.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", sb3.unbuffered);
594 ok(sb3.base == NULL, "wrong base pointer, expected %p got %p\n", NULL, sb3.base);
595 ok(sb3.ebuf == NULL, "wrong ebuf pointer, expected %p got %p\n", NULL, sb3.ebuf);
597 memcpy(test_streambuf_vtbl, sb.vtable, sizeof(test_streambuf_vtbl));
598 test_streambuf_vtbl[7] = (vtable_ptr)&test_streambuf_overflow;
599 test_streambuf_vtbl[8] = (vtable_ptr)&test_streambuf_underflow;
600 sb2.vtable = test_streambuf_vtbl;
601 sb3.vtable = test_streambuf_vtbl;
602 overflow_count = underflow_count = 0;
603 strcpy(test_get_buffer, "CompuGlobalHyperMegaNet");
604 buffer_pos = get_end = 0;
606 /* setlock */
607 ok(sb.do_lock == -1, "expected do_lock value -1, got %d\n", sb.do_lock);
608 call_func1(p_streambuf_setlock, &sb);
609 ok(sb.do_lock == -2, "expected do_lock value -2, got %d\n", sb.do_lock);
610 call_func1(p_streambuf_setlock, &sb);
611 ok(sb.do_lock == -3, "expected do_lock value -3, got %d\n", sb.do_lock);
612 sb.do_lock = 3;
613 call_func1(p_streambuf_setlock, &sb);
614 ok(sb.do_lock == 2, "expected do_lock value 2, got %d\n", sb.do_lock);
616 /* clrlock */
617 sb.do_lock = -2;
618 call_func1(p_streambuf_clrclock, &sb);
619 ok(sb.do_lock == -1, "expected do_lock value -1, got %d\n", sb.do_lock);
620 call_func1(p_streambuf_clrclock, &sb);
621 ok(sb.do_lock == 0, "expected do_lock value 0, got %d\n", sb.do_lock);
622 call_func1(p_streambuf_clrclock, &sb);
623 ok(sb.do_lock == 1, "expected do_lock value 1, got %d\n", sb.do_lock);
624 call_func1(p_streambuf_clrclock, &sb);
625 ok(sb.do_lock == 1, "expected do_lock value 1, got %d\n", sb.do_lock);
627 /* lock/unlock */
628 lock_arg.sb = &sb;
629 for (i = 0; i < 4; i++) {
630 lock_arg.lock[i] = CreateEventW(NULL, FALSE, FALSE, NULL);
631 ok(lock_arg.lock[i] != NULL, "CreateEventW failed\n");
632 lock_arg.test[i] = CreateEventW(NULL, FALSE, FALSE, NULL);
633 ok(lock_arg.test[i] != NULL, "CreateEventW failed\n");
636 sb.do_lock = 0;
637 thread = CreateThread(NULL, 0, lock_streambuf, (void*)&lock_arg, 0, NULL);
638 ok(thread != NULL, "CreateThread failed\n");
639 WaitForSingleObject(lock_arg.lock[0], INFINITE);
640 locked = TryEnterCriticalSection(&sb.lock);
641 ok(locked != 0, "could not lock the streambuf\n");
642 LeaveCriticalSection(&sb.lock);
644 sb.do_lock = 1;
645 SetEvent(lock_arg.test[0]);
646 WaitForSingleObject(lock_arg.lock[1], INFINITE);
647 locked = TryEnterCriticalSection(&sb.lock);
648 ok(locked != 0, "could not lock the streambuf\n");
649 LeaveCriticalSection(&sb.lock);
651 sb.do_lock = -1;
652 SetEvent(lock_arg.test[1]);
653 WaitForSingleObject(lock_arg.lock[2], INFINITE);
654 locked = TryEnterCriticalSection(&sb.lock);
655 ok(locked == 0, "the streambuf was not locked before\n");
657 sb.do_lock = 0;
658 SetEvent(lock_arg.test[2]);
659 WaitForSingleObject(lock_arg.lock[3], INFINITE);
660 locked = TryEnterCriticalSection(&sb.lock);
661 ok(locked == 0, "the streambuf was not locked before\n");
662 sb.do_lock = -1;
664 /* setb */
665 call_func4(p_streambuf_setb, &sb, reserve, reserve+16, 0);
666 ok(sb.base == reserve, "wrong base pointer, expected %p got %p\n", reserve, sb.base);
667 ok(sb.ebuf == reserve+16, "wrong ebuf pointer, expected %p got %p\n", reserve+16, sb.ebuf);
668 call_func4(p_streambuf_setb, &sb, reserve, reserve+16, 4);
669 ok(sb.allocated == 4, "wrong allocate value, expected 4 got %d\n", sb.allocated);
670 sb.allocated = 0;
671 call_func4(p_streambuf_setb, &sb, NULL, NULL, 3);
672 ok(sb.allocated == 3, "wrong allocate value, expected 3 got %d\n", sb.allocated);
674 /* setbuf */
675 psb = call_func3(p_streambuf_setbuf, &sb, NULL, 5);
676 ok(psb == &sb, "wrong return value, expected %p got %p\n", &sb, psb);
677 ok(sb.allocated == 3, "wrong allocate value, expected 3 got %d\n", sb.allocated);
678 ok(sb.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", sb.unbuffered);
679 ok(sb.base == NULL, "wrong base pointer, expected %p got %p\n", NULL, sb.base);
680 ok(sb.ebuf == NULL, "wrong ebuf pointer, expected %p got %p\n", NULL, sb.ebuf);
681 psb = call_func3(p_streambuf_setbuf, &sb, reserve, 0);
682 ok(psb == &sb, "wrong return value, expected %p got %p\n", &sb, psb);
683 ok(sb.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", sb.unbuffered);
684 ok(sb.base == NULL, "wrong base pointer, expected %p got %p\n", NULL, sb.base);
685 ok(sb.ebuf == NULL, "wrong ebuf pointer, expected %p got %p\n", NULL, sb.ebuf);
686 psb = call_func3(p_streambuf_setbuf, &sb, reserve, 16);
687 ok(psb == &sb, "wrong return value, expected %p got %p\n", &sb, psb);
688 ok(sb.allocated == 3, "wrong allocate value, expected 3 got %d\n", sb.allocated);
689 ok(sb.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", sb.unbuffered);
690 ok(sb.base == reserve, "wrong base pointer, expected %p got %p\n", reserve, sb.base);
691 ok(sb.ebuf == reserve+16, "wrong ebuf pointer, expected %p got %p\n", reserve+16, sb.ebuf);
692 psb = call_func3(p_streambuf_setbuf, &sb, NULL, 8);
693 ok(psb == NULL, "wrong return value, expected %p got %p\n", NULL, psb);
694 ok(sb.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", sb.unbuffered);
695 ok(sb.base == reserve, "wrong base pointer, expected %p got %p\n", reserve, sb.base);
696 ok(sb.ebuf == reserve+16, "wrong ebuf pointer, expected %p got %p\n", reserve+16, sb.ebuf);
698 /* allocate */
699 ret = (int) call_func1(p_streambuf_allocate, &sb);
700 ok(ret == 0, "wrong return value, expected 0 got %d\n", ret);
701 sb.base = NULL;
702 ret = (int) call_func1(p_streambuf_allocate, &sb);
703 ok(ret == 1, "wrong return value, expected 1 got %d\n", ret);
704 ok(sb.allocated == 1, "wrong allocate value, expected 1 got %d\n", sb.allocated);
705 ok(sb.ebuf - sb.base == 512 , "wrong reserve area size, expected 512 got %p-%p\n", sb.ebuf, sb.base);
707 /* doallocate */
708 ret = (int) call_func1(p_streambuf_doallocate, &sb2);
709 ok(ret == 1, "doallocate failed, got %d\n", ret);
710 ok(sb2.allocated == 1, "wrong allocate value, expected 1 got %d\n", sb2.allocated);
711 ok(sb2.ebuf - sb2.base == 512 , "wrong reserve area size, expected 512 got %p-%p\n", sb2.ebuf, sb2.base);
712 ret = (int) call_func1(p_streambuf_doallocate, &sb3);
713 ok(ret == 1, "doallocate failed, got %d\n", ret);
714 ok(sb3.allocated == 1, "wrong allocate value, expected 1 got %d\n", sb3.allocated);
715 ok(sb3.ebuf - sb3.base == 512 , "wrong reserve area size, expected 512 got %p-%p\n", sb3.ebuf, sb3.base);
717 /* sb: buffered, space available */
718 sb.eback = sb.gptr = sb.base;
719 sb.egptr = sb.base + 256;
720 sb.pbase = sb.pptr = sb.base + 256;
721 sb.epptr = sb.base + 512;
722 /* sb2: buffered, no space available */
723 sb2.eback = sb2.base;
724 sb2.gptr = sb2.egptr = sb2.base + 256;
725 sb2.pbase = sb2.base + 256;
726 sb2.pptr = sb2.epptr = sb2.base + 512;
727 /* sb3: unbuffered */
728 sb3.unbuffered = 1;
730 /* gbump */
731 call_func2(p_streambuf_gbump, &sb, 10);
732 ok(sb.gptr == sb.eback + 10, "advance get pointer failed, expected %p got %p\n", sb.eback + 10, sb.gptr);
733 call_func2(p_streambuf_gbump, &sb, -15);
734 ok(sb.gptr == sb.eback - 5, "advance get pointer failed, expected %p got %p\n", sb.eback - 5, sb.gptr);
735 sb.gptr = sb.eback;
737 /* pbump */
738 call_func2(p_streambuf_pbump, &sb, -2);
739 ok(sb.pptr == sb.pbase - 2, "advance put pointer failed, expected %p got %p\n", sb.pbase - 2, sb.pptr);
740 call_func2(p_streambuf_pbump, &sb, 20);
741 ok(sb.pptr == sb.pbase + 18, "advance put pointer failed, expected %p got %p\n", sb.pbase + 18, sb.pptr);
742 sb.pptr = sb.pbase;
744 /* sync */
745 ret = (int) call_func1(p_streambuf_sync, &sb);
746 ok(ret == EOF, "sync failed, expected EOF got %d\n", ret);
747 sb.gptr = sb.egptr;
748 ret = (int) call_func1(p_streambuf_sync, &sb);
749 ok(ret == 0, "sync failed, expected 0 got %d\n", ret);
750 sb.gptr = sb.egptr + 1;
751 ret = (int) call_func1(p_streambuf_sync, &sb);
752 ok(ret == 0, "sync failed, expected 0 got %d\n", ret);
753 sb.gptr = sb.eback;
754 ret = (int) call_func1(p_streambuf_sync, &sb2);
755 ok(ret == EOF, "sync failed, expected EOF got %d\n", ret);
756 sb2.pptr = sb2.pbase;
757 ret = (int) call_func1(p_streambuf_sync, &sb2);
758 ok(ret == 0, "sync failed, expected 0 got %d\n", ret);
759 sb2.pptr = sb2.pbase - 1;
760 ret = (int) call_func1(p_streambuf_sync, &sb2);
761 ok(ret == 0, "sync failed, expected 0 got %d\n", ret);
762 sb2.pptr = sb2.epptr;
763 ret = (int) call_func1(p_streambuf_sync, &sb3);
764 ok(ret == 0, "sync failed, expected 0 got %d\n", ret);
766 /* sgetc */
767 strcpy(sb2.eback, "WorstTestEver");
768 test_this = &sb2;
769 ret = (int) call_func1(p_streambuf_sgetc, &sb2);
770 ok(ret == 'W', "expected 'W' got '%c'\n", ret);
771 ok(underflow_count == 1, "expected call to underflow\n");
772 ok(sb2.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb2.stored_char);
773 sb2.gptr++;
774 ret = (int) call_func1(p_streambuf_sgetc, &sb2);
775 ok(ret == 'o', "expected 'o' got '%c'\n", ret);
776 ok(underflow_count == 2, "expected call to underflow\n");
777 ok(sb2.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb2.stored_char);
778 sb2.gptr = sb2.egptr;
779 test_this = &sb3;
780 ret = (int) call_func1(p_streambuf_sgetc, &sb3);
781 ok(ret == 'C', "expected 'C' got '%c'\n", ret);
782 ok(underflow_count == 3, "expected call to underflow\n");
783 ok(sb3.stored_char == 'C', "wrong stored character, expected 'C' got %c\n", sb3.stored_char);
784 sb3.stored_char = 'b';
785 ret = (int) call_func1(p_streambuf_sgetc, &sb3);
786 ok(ret == 'b', "expected 'b' got '%c'\n", ret);
787 ok(underflow_count == 3, "no call to underflow expected\n");
788 ok(sb3.stored_char == 'b', "wrong stored character, expected 'b' got %c\n", sb3.stored_char);
790 /* sputc */
791 *sb.pbase = 'a';
792 ret = (int) call_func2(p_streambuf_sputc, &sb, 'c');
793 ok(ret == 'c', "wrong return value, expected 'c' got %d\n", ret);
794 ok(overflow_count == 0, "no call to overflow expected\n");
795 ok(*sb.pbase == 'c', "expected 'c' in the put area, got %c\n", *sb.pbase);
796 ok(sb.pptr == sb.pbase + 1, "wrong put pointer, expected %p got %p\n", sb.pbase + 1, sb.pptr);
797 test_this = &sb2;
798 ret = (int) call_func2(p_streambuf_sputc, &sb2, 'c');
799 ok(ret == 'c', "wrong return value, expected 'c' got %d\n", ret);
800 ok(overflow_count == 1, "expected call to overflow\n");
801 ok(sb2.pptr == sb2.pbase + 5, "wrong put pointer, expected %p got %p\n", sb2.pbase + 5, sb2.pptr);
802 test_this = &sb3;
803 ret = (int) call_func2(p_streambuf_sputc, &sb3, 'c');
804 ok(ret == 'c', "wrong return value, expected 'c' got %d\n", ret);
805 ok(overflow_count == 2, "expected call to overflow\n");
806 sb3.pbase = sb3.pptr = sb3.base;
807 sb3.epptr = sb3.ebuf;
808 ret = (int) call_func2(p_streambuf_sputc, &sb3, 'c');
809 ok(ret == 'c', "wrong return value, expected 'c' got %d\n", ret);
810 ok(overflow_count == 2, "no call to overflow expected\n");
811 ok(*sb3.pbase == 'c', "expected 'c' in the put area, got %c\n", *sb3.pbase);
812 sb3.pbase = sb3.pptr = sb3.epptr = NULL;
814 /* xsgetn */
815 sb2.gptr = sb2.egptr = sb2.eback + 13;
816 test_this = &sb2;
817 ret = (int) call_func3(p_streambuf_xsgetn, &sb2, reserve, 5);
818 ok(ret == 5, "wrong return value, expected 5 got %d\n", ret);
819 ok(!strncmp(reserve, "Worst", 5), "expected 'Worst' got %s\n", reserve);
820 ok(sb2.gptr == sb2.eback + 5, "wrong get pointer, expected %p got %p\n", sb2.eback + 5, sb2.gptr);
821 ok(underflow_count == 4, "expected call to underflow\n");
822 ret = (int) call_func3(p_streambuf_xsgetn, &sb2, reserve, 4);
823 ok(ret == 4, "wrong return value, expected 4 got %d\n", ret);
824 ok(!strncmp(reserve, "Test", 4), "expected 'Test' got %s\n", reserve);
825 ok(sb2.gptr == sb2.eback + 9, "wrong get pointer, expected %p got %p\n", sb2.eback + 9, sb2.gptr);
826 ok(underflow_count == 5, "expected call to underflow\n");
827 get_end = 1;
828 ret = (int) call_func3(p_streambuf_xsgetn, &sb2, reserve, 16);
829 ok(ret == 4, "wrong return value, expected 4 got %d\n", ret);
830 ok(!strncmp(reserve, "Ever", 4), "expected 'Ever' got %s\n", reserve);
831 ok(sb2.gptr == sb2.egptr, "wrong get pointer, expected %p got %p\n", sb2.egptr, sb2.gptr);
832 ok(underflow_count == 7, "expected 2 calls to underflow, got %d\n", underflow_count - 5);
833 test_this = &sb3;
834 ret = (int) call_func3(p_streambuf_xsgetn, &sb3, reserve, 11);
835 ok(ret == 11, "wrong return value, expected 11 got %d\n", ret);
836 ok(!strncmp(reserve, "bompuGlobal", 11), "expected 'bompuGlobal' got %s\n", reserve);
837 ok(sb3.stored_char == 'H', "wrong stored character, expected 'H' got %c\n", sb3.stored_char);
838 ok(underflow_count == 18, "expected 11 calls to underflow, got %d\n", underflow_count - 7);
839 ret = (int) call_func3(p_streambuf_xsgetn, &sb3, reserve, 16);
840 ok(ret == 12, "wrong return value, expected 12 got %d\n", ret);
841 ok(!strncmp(reserve, "HyperMegaNet", 12), "expected 'HyperMegaNet' got %s\n", reserve);
842 ok(sb3.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb3.stored_char);
843 ok(underflow_count == 30, "expected 12 calls to underflow, got %d\n", underflow_count - 18);
844 ret = (int) call_func3(p_streambuf_xsgetn, &sb3, reserve, 3);
845 ok(ret == 0, "wrong return value, expected 0 got %d\n", ret);
846 ok(sb3.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb3.stored_char);
847 ok(underflow_count == 31, "expected call to underflow\n");
848 buffer_pos = 0;
849 ret = (int) call_func3(p_streambuf_xsgetn, &sb3, reserve, 5);
850 ok(ret == 5, "wrong return value, expected 5 got %d\n", ret);
851 ok(!strncmp(reserve, "Compu", 5), "expected 'Compu' got %s\n", reserve);
852 ok(sb3.stored_char == 'G', "wrong stored character, expected 'G' got %c\n", sb3.stored_char);
853 ok(underflow_count == 37, "expected 6 calls to underflow, got %d\n", underflow_count - 31);
855 /* xsputn */
856 ret = (int) call_func3(p_streambuf_xsputn, &sb, "Test\0ing", 8);
857 ok(ret == 8, "wrong return value, expected 8 got %d\n", ret);
858 ok(sb.pptr == sb.pbase + 9, "wrong put pointer, expected %p got %p\n", sb.pbase + 9, sb.pptr);
859 test_this = &sb2;
860 sb2.pptr = sb2.epptr - 7;
861 ret = (int) call_func3(p_streambuf_xsputn, &sb2, "Testing", 7);
862 ok(ret == 7, "wrong return value, expected 7 got %d\n", ret);
863 ok(sb2.pptr == sb2.epptr, "wrong put pointer, expected %p got %p\n", sb2.epptr, sb2.pptr);
864 ok(overflow_count == 2, "no call to overflow expected\n");
865 sb2.pptr = sb2.epptr - 5;
866 sb2.pbase[5] = 'a';
867 ret = (int) call_func3(p_streambuf_xsputn, &sb2, "Testing", 7);
868 ok(ret == 7, "wrong return value, expected 7 got %d\n", ret);
869 ok(sb2.pbase[5] == 'g', "expected 'g' got %c\n", sb2.pbase[5]);
870 ok(sb2.pptr == sb2.pbase + 6, "wrong put pointer, expected %p got %p\n", sb2.pbase + 6, sb2.pptr);
871 ok(overflow_count == 3, "expected call to overflow\n");
872 sb2.pptr = sb2.epptr - 4;
873 ret = (int) call_func3(p_streambuf_xsputn, &sb2, "TestLing", 8);
874 ok(ret == 4, "wrong return value, expected 4 got %d\n", ret);
875 ok(sb2.pptr == sb2.epptr, "wrong put pointer, expected %p got %p\n", sb2.epptr, sb2.pptr);
876 ok(overflow_count == 4, "expected call to overflow\n");
877 test_this = &sb3;
878 ret = (int) call_func3(p_streambuf_xsputn, &sb3, "Testing", 7);
879 ok(ret == 7, "wrong return value, expected 7 got %d\n", ret);
880 ok(sb3.stored_char == 'G', "wrong stored character, expected 'G' got %c\n", sb3.stored_char);
881 ok(overflow_count == 11, "expected 7 calls to overflow, got %d\n", overflow_count - 4);
882 ret = (int) call_func3(p_streambuf_xsputn, &sb3, "TeLephone", 9);
883 ok(ret == 2, "wrong return value, expected 2 got %d\n", ret);
884 ok(sb3.stored_char == 'G', "wrong stored character, expected 'G' got %c\n", sb3.stored_char);
885 ok(overflow_count == 14, "expected 3 calls to overflow, got %d\n", overflow_count - 11);
887 /* snextc */
888 strcpy(sb.eback, "Test");
889 ret = (int) call_func1(p_streambuf_snextc, &sb);
890 ok(ret == 'e', "expected 'e' got '%c'\n", ret);
891 ok(sb.gptr == sb.eback + 1, "wrong get pointer, expected %p got %p\n", sb.eback + 1, sb.gptr);
892 test_this = &sb2;
893 ret = (int) call_func1(p_streambuf_snextc, &sb2);
894 ok(ret == EOF, "expected EOF got '%c'\n", ret);
895 ok(sb2.gptr == sb2.egptr + 1, "wrong get pointer, expected %p got %p\n", sb2.egptr + 1, sb2.gptr);
896 ok(underflow_count == 39, "expected 2 calls to underflow, got %d\n", underflow_count - 37);
897 sb2.gptr = sb2.egptr - 1;
898 ret = (int) call_func1(p_streambuf_snextc, &sb2);
899 ok(ret == EOF, "expected EOF got '%c'\n", ret);
900 ok(sb2.gptr == sb2.egptr, "wrong get pointer, expected %p got %p\n", sb2.egptr, sb2.gptr);
901 ok(underflow_count == 40, "expected call to underflow\n");
902 get_end = 0;
903 ret = (int) call_func1(p_streambuf_snextc, &sb2);
904 ok(ret == 'o', "expected 'o' got '%c'\n", ret);
905 ok(sb2.gptr == sb2.eback + 1, "wrong get pointer, expected %p got %p\n", sb2.eback + 1, sb2.gptr);
906 ok(underflow_count == 41, "expected call to underflow\n");
907 sb2.gptr = sb2.egptr - 1;
908 ret = (int) call_func1(p_streambuf_snextc, &sb2);
909 ok(ret == 'W', "expected 'W' got '%c'\n", ret);
910 ok(sb2.gptr == sb2.eback, "wrong get pointer, expected %p got %p\n", sb2.eback, sb2.gptr);
911 ok(underflow_count == 42, "expected call to underflow\n");
912 sb2.gptr = sb2.egptr;
913 test_this = &sb3;
914 ret = (int) call_func1(p_streambuf_snextc, &sb3);
915 ok(ret == 'l', "expected 'l' got '%c'\n", ret);
916 ok(sb3.stored_char == 'l', "wrong stored character, expected 'l' got %c\n", sb3.stored_char);
917 ok(underflow_count == 43, "expected call to underflow\n");
918 buffer_pos = 22;
919 ret = (int) call_func1(p_streambuf_snextc, &sb3);
920 ok(ret == 't', "expected 't' got '%c'\n", ret);
921 ok(sb3.stored_char == 't', "wrong stored character, expected 't' got %c\n", sb3.stored_char);
922 ok(underflow_count == 44, "expected call to underflow\n");
923 ret = (int) call_func1(p_streambuf_snextc, &sb3);
924 ok(ret == EOF, "expected EOF got '%c'\n", ret);
925 ok(sb3.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb3.stored_char);
926 ok(underflow_count == 45, "expected call to underflow\n");
927 buffer_pos = 0;
928 ret = (int) call_func1(p_streambuf_snextc, &sb3);
929 ok(ret == 'o', "expected 'o' got '%c'\n", ret);
930 ok(sb3.stored_char == 'o', "wrong stored character, expected 'o' got %c\n", sb3.stored_char);
931 ok(underflow_count == 47, "expected 2 calls to underflow, got %d\n", underflow_count - 45);
932 sb3.stored_char = EOF;
933 ret = (int) call_func1(p_streambuf_snextc, &sb3);
934 ok(ret == 'p', "expected 'p' got '%c'\n", ret);
935 ok(sb3.stored_char == 'p', "wrong stored character, expected 'p' got %c\n", sb3.stored_char);
936 ok(underflow_count == 49, "expected 2 calls to underflow, got %d\n", underflow_count - 47);
938 /* sbumpc */
939 ret = (int) call_func1(p_streambuf_sbumpc, &sb);
940 ok(ret == 'e', "expected 'e' got '%c'\n", ret);
941 ok(sb.gptr == sb.eback + 2, "wrong get pointer, expected %p got %p\n", sb.eback + 2, sb.gptr);
942 test_this = &sb2;
943 ret = (int) call_func1(p_streambuf_sbumpc, &sb2);
944 ok(ret == 'W', "expected 'W' got '%c'\n", ret);
945 ok(sb2.gptr == sb2.eback + 1, "wrong get pointer, expected %p got %p\n", sb2.eback + 1, sb2.gptr);
946 ok(underflow_count == 50, "expected call to underflow\n");
947 sb2.gptr = sb2.egptr - 1;
948 *sb2.gptr = 't';
949 ret = (int) call_func1(p_streambuf_sbumpc, &sb2);
950 ok(ret == 't', "expected 't' got '%c'\n", ret);
951 ok(sb2.gptr == sb2.egptr, "wrong get pointer, expected %p got %p\n", sb2.egptr, sb2.gptr);
952 ok(underflow_count == 50, "no call to underflow expected\n");
953 get_end = 1;
954 ret = (int) call_func1(p_streambuf_sbumpc, &sb2);
955 ok(ret == EOF, "expected EOF got '%c'\n", ret);
956 ok(sb2.gptr == sb2.egptr + 1, "wrong get pointer, expected %p got %p\n", sb2.egptr + 1, sb2.gptr);
957 ok(underflow_count == 51, "expected call to underflow\n");
958 sb2.gptr = sb2.egptr;
959 test_this = &sb3;
960 ret = (int) call_func1(p_streambuf_sbumpc, &sb3);
961 ok(ret == 'p', "expected 'p' got '%c'\n", ret);
962 ok(sb3.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb3.stored_char);
963 ok(underflow_count == 51, "no call to underflow expected\n");
964 ret = (int) call_func1(p_streambuf_sbumpc, &sb3);
965 ok(ret == 'u', "expected 'u' got '%c'\n", ret);
966 ok(sb3.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb3.stored_char);
967 ok(underflow_count == 52, "expected call to underflow\n");
968 buffer_pos = 23;
969 ret = (int) call_func1(p_streambuf_sbumpc, &sb3);
970 ok(ret == EOF, "expected EOF got '%c'\n", ret);
971 ok(sb3.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb3.stored_char);
972 ok(underflow_count == 53, "expected call to underflow\n");
973 buffer_pos = 0;
974 ret = (int) call_func1(p_streambuf_sbumpc, &sb3);
975 ok(ret == 'C', "expected 'C' got '%c'\n", ret);
976 ok(sb3.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb3.stored_char);
977 ok(underflow_count == 54, "expected call to underflow\n");
979 /* stossc */
980 call_func1(p_streambuf_stossc, &sb);
981 ok(sb.gptr == sb.eback + 3, "wrong get pointer, expected %p got %p\n", sb.eback + 3, sb.gptr);
982 test_this = &sb2;
983 call_func1(p_streambuf_stossc, &sb2);
984 ok(sb2.gptr == sb2.egptr, "wrong get pointer, expected %p got %p\n", sb2.egptr, sb2.gptr);
985 ok(underflow_count == 55, "expected call to underflow\n");
986 get_end = 0;
987 call_func1(p_streambuf_stossc, &sb2);
988 ok(sb2.gptr == sb2.eback + 1, "wrong get pointer, expected %p got %p\n", sb2.eback + 1, sb2.gptr);
989 ok(underflow_count == 56, "expected call to underflow\n");
990 sb2.gptr = sb2.egptr - 1;
991 call_func1(p_streambuf_stossc, &sb2);
992 ok(sb2.gptr == sb2.egptr, "wrong get pointer, expected %p got %p\n", sb2.egptr, sb2.gptr);
993 ok(underflow_count == 56, "no call to underflow expected\n");
994 test_this = &sb3;
995 call_func1(p_streambuf_stossc, &sb3);
996 ok(sb3.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb3.stored_char);
997 ok(underflow_count == 57, "expected call to underflow\n");
998 sb3.stored_char = 'a';
999 call_func1(p_streambuf_stossc, &sb3);
1000 ok(sb3.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb3.stored_char);
1001 ok(underflow_count == 57, "no call to underflow expected\n");
1003 /* pbackfail */
1004 ret = (int) call_func2(p_streambuf_pbackfail, &sb, 'A');
1005 ok(ret == 'A', "expected 'A' got '%c'\n", ret);
1006 ok(sb.gptr == sb.eback + 2, "wrong get pointer, expected %p got %p\n", sb.eback + 2, sb.gptr);
1007 ok(*sb.gptr == 'A', "expected 'A' in the get area, got %c\n", *sb.gptr);
1008 ret = (int) call_func2(p_streambuf_pbackfail, &sb, EOF);
1009 ok(ret == EOF, "expected EOF got '%c'\n", ret);
1010 ok(sb.gptr == sb.eback + 1, "wrong get pointer, expected %p got %p\n", sb.eback + 1, sb.gptr);
1011 ok((signed char)*sb.gptr == EOF, "expected EOF in the get area, got %c\n", *sb.gptr);
1012 sb.gptr = sb.eback;
1013 ret = (int) call_func2(p_streambuf_pbackfail, &sb, 'Z');
1014 ok(ret == EOF, "expected EOF got '%c'\n", ret);
1015 ok(sb.gptr == sb.eback, "wrong get pointer, expected %p got %p\n", sb.eback, sb.gptr);
1016 ok(*sb.gptr == 'T', "expected 'T' in the get area, got %c\n", *sb.gptr);
1017 ret = (int) call_func2(p_streambuf_pbackfail, &sb, EOF);
1018 ok(ret == EOF, "expected EOF got '%c'\n", ret);
1019 ok(sb.gptr == sb.eback, "wrong get pointer, expected %p got %p\n", sb.eback, sb.gptr);
1020 ok(*sb.gptr == 'T', "expected 'T' in the get area, got %c\n", *sb.gptr);
1021 sb2.gptr = sb2.egptr + 1;
1022 ret = (int) call_func2(p_streambuf_pbackfail, &sb2, 'X');
1023 ok(ret == 'X', "expected 'X' got '%c'\n", ret);
1024 ok(sb2.gptr == sb2.egptr, "wrong get pointer, expected %p got %p\n", sb2.egptr, sb2.gptr);
1025 ok(*sb2.gptr == 'X', "expected 'X' in the get area, got %c\n", *sb2.gptr);
1027 SetEvent(lock_arg.test[3]);
1028 WaitForSingleObject(thread, INFINITE);
1030 call_func1(p_streambuf_dtor, &sb);
1031 call_func1(p_streambuf_dtor, &sb2);
1032 call_func1(p_streambuf_dtor, &sb3);
1033 for (i = 0; i < 4; i++) {
1034 CloseHandle(lock_arg.lock[i]);
1035 CloseHandle(lock_arg.test[i]);
1037 CloseHandle(thread);
1040 struct filebuf_lock_arg
1042 filebuf *fb1, *fb2, *fb3;
1043 HANDLE lock;
1044 HANDLE test;
1047 static DWORD WINAPI lock_filebuf(void *arg)
1049 struct filebuf_lock_arg *lock_arg = arg;
1050 call_func1(p_streambuf_lock, &lock_arg->fb1->base);
1051 call_func1(p_streambuf_lock, &lock_arg->fb2->base);
1052 call_func1(p_streambuf_lock, &lock_arg->fb3->base);
1053 SetEvent(lock_arg->lock);
1054 WaitForSingleObject(lock_arg->test, INFINITE);
1055 call_func1(p_streambuf_unlock, &lock_arg->fb1->base);
1056 call_func1(p_streambuf_unlock, &lock_arg->fb2->base);
1057 call_func1(p_streambuf_unlock, &lock_arg->fb3->base);
1058 return 0;
1061 static void test_filebuf(void)
1063 filebuf fb1, fb2, fb3, *pret;
1064 struct filebuf_lock_arg lock_arg;
1065 HANDLE thread;
1066 const char filename1[] = "test1";
1067 const char filename2[] = "test2";
1068 const char filename3[] = "test3";
1069 char read_buffer[16];
1070 int ret;
1072 memset(&fb1, 0xab, sizeof(filebuf));
1073 memset(&fb2, 0xab, sizeof(filebuf));
1074 memset(&fb3, 0xab, sizeof(filebuf));
1076 /* constructors */
1077 call_func2(p_filebuf_fd_ctor, &fb1, 1);
1078 ok(fb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb1.base.allocated);
1079 ok(fb1.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fb1.base.unbuffered);
1080 ok(fb1.fd == 1, "wrong fd, expected 1 got %d\n", fb1.fd);
1081 ok(fb1.close == 0, "wrong value, expected 0 got %d\n", fb1.close);
1082 call_func4(p_filebuf_fd_reserve_ctor, &fb2, 4, NULL, 0);
1083 ok(fb2.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb2.base.allocated);
1084 ok(fb2.base.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fb2.base.unbuffered);
1085 ok(fb2.fd == 4, "wrong fd, expected 4 got %d\n", fb2.fd);
1086 ok(fb2.close == 0, "wrong value, expected 0 got %d\n", fb2.close);
1087 call_func1(p_filebuf_ctor, &fb3);
1088 ok(fb3.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb3.base.allocated);
1089 ok(fb3.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fb3.base.unbuffered);
1090 ok(fb3.fd == -1, "wrong fd, expected -1 got %d\n", fb3.fd);
1091 ok(fb3.close == 0, "wrong value, expected 0 got %d\n", fb3.close);
1093 lock_arg.fb1 = &fb1;
1094 lock_arg.fb2 = &fb2;
1095 lock_arg.fb3 = &fb3;
1096 lock_arg.lock = CreateEventW(NULL, FALSE, FALSE, NULL);
1097 ok(lock_arg.lock != NULL, "CreateEventW failed\n");
1098 lock_arg.test = CreateEventW(NULL, FALSE, FALSE, NULL);
1099 ok(lock_arg.test != NULL, "CreateEventW failed\n");
1100 thread = CreateThread(NULL, 0, lock_filebuf, (void*)&lock_arg, 0, NULL);
1101 ok(thread != NULL, "CreateThread failed\n");
1102 WaitForSingleObject(lock_arg.lock, INFINITE);
1104 /* setbuf */
1105 fb1.base.do_lock = 0;
1106 pret = (filebuf*) call_func3(p_filebuf_setbuf, &fb1, read_buffer, 16);
1107 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1108 ok(fb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb1.base.allocated);
1109 ok(fb1.base.base == read_buffer, "wrong buffer, expected %p got %p\n", read_buffer, fb1.base.base);
1110 ok(fb1.base.pbase == NULL, "wrong put area, expected %p got %p\n", NULL, fb1.base.pbase);
1111 fb1.base.pbase = fb1.base.pptr = fb1.base.base;
1112 fb1.base.epptr = fb1.base.ebuf;
1113 fb1.base.do_lock = -1;
1114 pret = (filebuf*) call_func3(p_filebuf_setbuf, &fb1, read_buffer, 16);
1115 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1116 ok(fb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb1.base.allocated);
1117 ok(fb1.base.base == read_buffer, "wrong buffer, expected %p got %p\n", read_buffer, fb1.base.base);
1118 ok(fb1.base.pbase == read_buffer, "wrong put area, expected %p got %p\n", read_buffer, fb1.base.pbase);
1119 fb1.base.base = fb1.base.ebuf = NULL;
1120 fb1.base.do_lock = 0;
1121 pret = (filebuf*) call_func3(p_filebuf_setbuf, &fb1, read_buffer, 0);
1122 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1123 ok(fb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb1.base.allocated);
1124 ok(fb1.base.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fb1.base.unbuffered);
1125 ok(fb1.base.base == NULL, "wrong buffer, expected %p got %p\n", NULL, fb1.base.base);
1126 ok(fb1.base.pbase == read_buffer, "wrong put area, expected %p got %p\n", read_buffer, fb1.base.pbase);
1127 fb1.base.pbase = fb1.base.pptr = fb1.base.epptr = NULL;
1128 fb1.base.unbuffered = 0;
1129 fb1.base.do_lock = -1;
1131 /* attach */
1132 pret = (filebuf*) call_func2(p_filebuf_attach, &fb1, 2);
1133 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1134 ok(fb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb1.base.allocated);
1135 ok(fb1.fd == 1, "wrong fd, expected 1 got %d\n", fb1.fd);
1136 fb2.fd = -1;
1137 fb2.base.do_lock = 0;
1138 pret = (filebuf*) call_func2(p_filebuf_attach, &fb2, 3);
1139 ok(pret == &fb2, "wrong return, expected %p got %p\n", &fb2, pret);
1140 ok(fb2.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb2.base.allocated);
1141 ok(fb2.fd == 3, "wrong fd, expected 3 got %d\n", fb2.fd);
1142 fb2.base.do_lock = -1;
1143 fb3.base.do_lock = 0;
1144 pret = (filebuf*) call_func2(p_filebuf_attach, &fb3, 2);
1145 ok(pret == &fb3, "wrong return, expected %p got %p\n", &fb3, pret);
1146 ok(fb3.base.allocated == 1, "wrong allocate value, expected 1 got %d\n", fb3.base.allocated);
1147 ok(fb3.fd == 2, "wrong fd, expected 2 got %d\n", fb3.fd);
1148 fb3.base.do_lock = -1;
1150 /* open modes */
1151 pret = (filebuf*) call_func4(p_filebuf_open, &fb1, filename1, OPENMODE_out, filebuf_openprot);
1152 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1153 fb1.fd = -1;
1154 pret = (filebuf*) call_func4(p_filebuf_open, &fb1, filename1,
1155 OPENMODE_ate|OPENMODE_nocreate|OPENMODE_noreplace|OPENMODE_binary, filebuf_openprot);
1156 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1157 ok(fb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb1.base.allocated);
1158 fb1.base.do_lock = 0;
1159 pret = (filebuf*) call_func4(p_filebuf_open, &fb1, filename1, OPENMODE_out, filebuf_openprot);
1160 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1161 ok(fb1.base.allocated == 1, "wrong allocate value, expected 1 got %d\n", fb1.base.allocated);
1162 ok(_write(fb1.fd, "testing", 7) == 7, "_write failed\n");
1163 pret = (filebuf*) call_func1(p_filebuf_close, &fb1);
1164 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1165 ok(fb1.fd == -1, "wrong fd, expected -1 got %d\n", fb1.fd);
1166 pret = (filebuf*) call_func4(p_filebuf_open, &fb1, filename1, OPENMODE_out, filebuf_openprot);
1167 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1168 ok(_read(fb1.fd, read_buffer, 1) == -1, "file should not be open for reading\n");
1169 pret = (filebuf*) call_func1(p_filebuf_close, &fb1);
1170 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1171 pret = (filebuf*) call_func4(p_filebuf_open, &fb1, filename1, OPENMODE_app, filebuf_openprot);
1172 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1173 ok(_read(fb1.fd, read_buffer, 1) == -1, "file should not be open for reading\n");
1174 ok(_write(fb1.fd, "testing", 7) == 7, "_write failed\n");
1175 ok(_lseek(fb1.fd, 0, SEEK_SET) == 0, "_lseek failed\n");
1176 ok(_write(fb1.fd, "append", 6) == 6, "_write failed\n");
1177 pret = (filebuf*) call_func1(p_filebuf_close, &fb1);
1178 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1179 pret = (filebuf*) call_func4(p_filebuf_open, &fb1, filename1, OPENMODE_out|OPENMODE_ate, filebuf_openprot);
1180 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1181 ok(_read(fb1.fd, read_buffer, 1) == -1, "file should not be open for reading\n");
1182 ok(_lseek(fb1.fd, 0, SEEK_SET) == 0, "_lseek failed\n");
1183 ok(_write(fb1.fd, "ate", 3) == 3, "_write failed\n");
1184 pret = (filebuf*) call_func1(p_filebuf_close, &fb1);
1185 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1186 pret = (filebuf*) call_func4(p_filebuf_open, &fb1, filename1, OPENMODE_in, filebuf_openprot);
1187 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1188 ok(_read(fb1.fd, read_buffer, 13) == 13, "read failed\n");
1189 read_buffer[13] = 0;
1190 ok(!strncmp(read_buffer, "atetingappend", 13), "wrong contents, expected 'atetingappend' got '%s'\n", read_buffer);
1191 pret = (filebuf*) call_func1(p_filebuf_close, &fb1);
1192 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1193 pret = (filebuf*) call_func4(p_filebuf_open, &fb1, filename1, OPENMODE_in|OPENMODE_trunc, filebuf_openprot);
1194 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1195 ok(_read(fb1.fd, read_buffer, 1) == 0, "read failed\n");
1196 ok(_write(fb1.fd, "file1", 5) == 5, "_write failed\n");
1197 pret = (filebuf*) call_func1(p_filebuf_close, &fb1);
1198 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1199 pret = (filebuf*) call_func4(p_filebuf_open, &fb1, filename1, OPENMODE_in|OPENMODE_app, filebuf_openprot);
1200 ok(pret == &fb1, "wrong return, expected %p got %p\n", &fb1, pret);
1201 ok(_write(fb1.fd, "app", 3) == 3, "_write failed\n");
1202 ok(_read(fb1.fd, read_buffer, 1) == 0, "read failed\n");
1203 ok(_lseek(fb1.fd, 0, SEEK_SET) == 0, "_lseek failed\n");
1204 ok(_read(fb1.fd, read_buffer, 8) == 8, "read failed\n");
1205 read_buffer[8] = 0;
1206 ok(!strncmp(read_buffer, "file1app", 8), "wrong contents, expected 'file1app' got '%s'\n", read_buffer);
1207 fb1.base.do_lock = -1;
1209 fb2.fd = -1;
1210 pret = (filebuf*) call_func4(p_filebuf_open, &fb2, filename2, OPENMODE_out|OPENMODE_nocreate, filebuf_openprot);
1211 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1212 pret = (filebuf*) call_func4(p_filebuf_open, &fb2, filename2, OPENMODE_in|OPENMODE_nocreate, filebuf_openprot);
1213 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1214 fb2.base.do_lock = 0;
1215 pret = (filebuf*) call_func4(p_filebuf_open, &fb2, filename2, OPENMODE_in, filebuf_openprot);
1216 ok(pret == &fb2, "wrong return, expected %p got %p\n", &fb2, pret);
1217 ok(_read(fb1.fd, read_buffer, 1) == 0, "read failed\n");
1218 pret = (filebuf*) call_func1(p_filebuf_close, &fb2);
1219 ok(pret == &fb2, "wrong return, expected %p got %p\n", &fb2, pret);
1220 fb2.base.do_lock = -1;
1221 pret = (filebuf*) call_func4(p_filebuf_open, &fb2, filename2, OPENMODE_in|OPENMODE_noreplace, filebuf_openprot);
1222 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1223 pret = (filebuf*) call_func4(p_filebuf_open, &fb2, filename2, OPENMODE_trunc|OPENMODE_noreplace, filebuf_openprot);
1224 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1225 pret = (filebuf*) call_func4(p_filebuf_open, &fb2, filename3, OPENMODE_out|OPENMODE_nocreate|OPENMODE_noreplace, filebuf_openprot);
1226 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1228 /* open protection*/
1229 fb3.fd = -1;
1230 fb3.base.do_lock = 0;
1231 pret = (filebuf*) call_func4(p_filebuf_open, &fb3, filename3, OPENMODE_in|OPENMODE_out, filebuf_openprot);
1232 ok(pret == &fb3, "wrong return, expected %p got %p\n", &fb3, pret);
1233 ok(_write(fb3.fd, "You wouldn't\nget this from\nany other guy", 40) == 40, "_write failed\n");
1234 fb2.base.do_lock = 0;
1235 pret = (filebuf*) call_func4(p_filebuf_open, &fb2, filename3, OPENMODE_in|OPENMODE_out, filebuf_openprot);
1236 ok(pret == &fb2, "wrong return, expected %p got %p\n", &fb2, pret);
1237 pret = (filebuf*) call_func1(p_filebuf_close, &fb2);
1238 ok(pret == &fb2, "wrong return, expected %p got %p\n", &fb2, pret);
1239 fb2.base.do_lock = -1;
1240 pret = (filebuf*) call_func1(p_filebuf_close, &fb3);
1241 ok(pret == &fb3, "wrong return, expected %p got %p\n", &fb3, pret);
1242 pret = (filebuf*) call_func4(p_filebuf_open, &fb3, filename3, OPENMODE_in, filebuf_sh_none);
1243 ok(pret == &fb3, "wrong return, expected %p got %p\n", &fb3, pret);
1244 pret = (filebuf*) call_func4(p_filebuf_open, &fb2, filename3, OPENMODE_in, filebuf_openprot);
1245 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1246 fb3.base.do_lock = -1;
1248 /* setmode */
1249 fb1.base.do_lock = 0;
1250 fb1.base.pbase = fb1.base.pptr = fb1.base.base;
1251 fb1.base.epptr = fb1.base.ebuf;
1252 ret = (int) call_func2(p_filebuf_setmode, &fb1, filebuf_binary);
1253 ok(ret == filebuf_text, "wrong return, expected %d got %d\n", filebuf_text, ret);
1254 ok(fb1.base.pptr == NULL, "wrong put pointer, expected %p got %p\n", NULL, fb1.base.pptr);
1255 ret = (int) call_func2(p_filebuf_setmode, &fb1, filebuf_binary);
1256 ok(ret == filebuf_binary, "wrong return, expected %d got %d\n", filebuf_binary, ret);
1257 fb1.base.do_lock = -1;
1258 ret = (int) call_func2(p_filebuf_setmode, &fb1, 0x9000);
1259 ok(ret == -1, "wrong return, expected -1 got %d\n", ret);
1260 fb2.base.do_lock = 0;
1261 ret = (int) call_func2(p_filebuf_setmode, &fb2, filebuf_text);
1262 ok(ret == -1, "wrong return, expected -1 got %d\n", ret);
1263 fb2.base.do_lock = -1;
1265 /* sync */
1266 ret = (int) call_func1(p_filebuf_sync, &fb1);
1267 ok(ret == 0, "wrong return, expected 0 got %d\n", ret);
1268 fb1.base.eback = fb1.base.gptr = fb1.base.base;
1269 fb1.base.egptr = fb1.base.pbase = fb1.base.pptr = fb1.base.base + 256;
1270 fb1.base.epptr = fb1.base.ebuf;
1271 ret = (int) call_func3(p_streambuf_xsputn, &fb1.base, "We're no strangers to love\n", 27);
1272 ok(ret == 27, "wrong return, expected 27 got %d\n", ret);
1273 ret = (int) call_func1(p_filebuf_sync, &fb1);
1274 ok(ret == -1, "wrong return, expected -1 got %d\n", ret);
1275 ok(fb1.base.gptr == fb1.base.base, "wrong get pointer, expected %p got %p\n", fb1.base.base, fb1.base.gptr);
1276 ok(fb1.base.pptr == NULL, "wrong put pointer, expected %p got %p\n", NULL, fb1.base.pptr);
1277 fb1.base.eback = fb1.base.gptr = fb1.base.egptr = NULL;
1278 fb1.base.pbase = fb1.base.pptr = fb1.base.base;
1279 fb1.base.epptr = fb1.base.ebuf;
1280 ret = (int) call_func3(p_streambuf_xsputn, &fb1.base, "You know the rules and so do I\n", 31);
1281 ok(ret == 31, "wrong return, expected 31 got %d\n", ret);
1282 ret = (int) call_func1(p_filebuf_sync, &fb1);
1283 ok(ret == 0, "wrong return, expected 0 got %d\n", ret);
1284 ok(fb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, fb1.base.gptr);
1285 ok(fb1.base.pptr == NULL, "wrong put pointer, expected %p got %p\n", NULL, fb1.base.pptr);
1286 fb1.base.eback = fb1.base.base;
1287 fb1.base.gptr = fb1.base.base + 190;
1288 fb1.base.egptr = fb1.base.pbase = fb1.base.pptr = fb1.base.base + 256;
1289 fb1.base.epptr = fb1.base.ebuf;
1290 ret = (int) call_func1(p_filebuf_sync, &fb1);
1291 ok(ret == 0, "wrong return, expected 0 got %d\n", ret);
1292 ok(fb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, fb1.base.gptr);
1293 ok(fb1.base.pptr == NULL, "wrong put pointer, expected %p got %p\n", NULL, fb1.base.pptr);
1294 ok(_tell(fb1.fd) == 0, "_tell failed\n");
1295 ret = (int) call_func1(p_filebuf_sync, &fb2);
1296 ok(ret == -1, "wrong return, expected -1 got %d\n", ret);
1297 fb3.base.eback = fb3.base.base;
1298 fb3.base.gptr = fb3.base.egptr = fb3.base.pbase = fb3.base.pptr = fb3.base.base + 256;
1299 fb3.base.epptr = fb3.base.ebuf;
1300 ret = (int) call_func3(p_streambuf_xsputn, &fb3.base, "A full commitment's what I'm thinking of\n", 41);
1301 ok(ret == 41, "wrong return, expected 41 got %d\n", ret);
1302 ret = (int) call_func1(p_filebuf_sync, &fb3);
1303 ok(ret == -1, "wrong return, expected -1 got %d\n", ret);
1304 ok(fb3.base.gptr == fb3.base.base + 256, "wrong get pointer, expected %p got %p\n", fb3.base.base + 256, fb3.base.gptr);
1305 ok(fb3.base.pptr == fb3.base.base + 297, "wrong put pointer, expected %p got %p\n", fb3.base.base + 297, fb3.base.pptr);
1306 fb3.base.eback = fb3.base.base;
1307 fb3.base.gptr = fb3.base.egptr = fb3.base.pbase = fb3.base.pptr = fb3.base.base + 256;
1308 fb3.base.epptr = fb3.base.ebuf;
1309 ret = (int) call_func1(p_filebuf_sync, &fb3);
1310 ok(ret == 0, "wrong return, expected 0 got %d\n", ret);
1311 ok(fb3.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, fb3.base.gptr);
1312 ok(fb3.base.pptr == NULL, "wrong put pointer, expected %p got %p\n", NULL, fb3.base.pptr);
1313 fb3.base.eback = fb3.base.base;
1314 fb3.base.gptr = fb3.base.base + 216;
1315 fb3.base.egptr = fb3.base.pbase = fb3.base.pptr = fb3.base.base + 256;
1316 fb3.base.epptr = fb3.base.ebuf;
1317 ok(_read(fb3.fd, fb3.base.gptr, 42) == 40, "read failed\n");
1318 ret = (int) call_func1(p_filebuf_sync, &fb3);
1319 ok(ret == 0, "wrong return, expected 0 got %d\n", ret);
1320 ok(fb3.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, fb3.base.gptr);
1321 ok(fb3.base.pptr == NULL, "wrong put pointer, expected %p got %p\n", NULL, fb3.base.pptr);
1322 ok(_tell(fb3.fd) == 0, "_tell failed\n");
1323 fb3.base.eback = fb3.base.gptr = fb3.base.egptr = NULL;
1324 fb3.base.pbase = fb3.base.pptr = fb3.base.epptr = NULL;
1326 /* overflow */
1327 ret = (int) call_func2(p_filebuf_overflow, &fb1, EOF);
1328 ok(ret == 1, "wrong return, expected 1 got %d\n", ret);
1329 fb1.base.pbase = fb1.base.pptr = fb1.base.epptr = NULL;
1330 fb1.base.eback = fb1.base.gptr = fb1.base.base;
1331 fb1.base.egptr = fb1.base.ebuf;
1332 ret = (int) call_func2(p_filebuf_overflow, &fb1, 'a');
1333 ok(ret == EOF, "wrong return, expected EOF got %d\n", ret);
1334 fb1.base.gptr = fb1.base.egptr = fb1.base.pbase = fb1.base.pptr = fb1.base.base + 256;
1335 fb1.base.epptr = fb1.base.ebuf;
1336 ret = (int) call_func3(p_streambuf_xsputn, &fb1.base, "I just want to tell you how I'm feeling", 39);
1337 ok(ret == 39, "wrong return, expected 39 got %d\n", ret);
1338 ret = (int) call_func2(p_filebuf_overflow, &fb1, '\n');
1339 ok(ret == 1, "wrong return, expected 1 got %d\n", ret);
1340 ok(fb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, fb1.base.gptr);
1341 ok(fb1.base.pbase == fb1.base.base, "wrong put base, expected %p got %p\n", fb1.base.base, fb1.base.pbase);
1342 ok(fb1.base.pptr == fb1.base.base + 1, "wrong put pointer, expected %p got %p\n", fb1.base.base + 1, fb1.base.pptr);
1343 ok(fb1.base.epptr == fb1.base.ebuf, "wrong put end pointer, expected %p got %p\n", fb1.base.ebuf, fb1.base.epptr);
1344 ok(*fb1.base.pbase == '\n', "wrong character, expected '\\n' got '%c'\n", *fb1.base.pbase);
1345 ret = (int) call_func2(p_filebuf_overflow, &fb1, EOF);
1346 ok(ret == 1, "wrong return, expected 1 got %d\n", ret);
1347 ok(fb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, fb1.base.gptr);
1348 ok(fb1.base.pbase == fb1.base.base, "wrong put base, expected %p got %p\n", fb1.base.base, fb1.base.pbase);
1349 ok(fb1.base.pptr == fb1.base.base, "wrong put pointer, expected %p got %p\n", fb1.base.base, fb1.base.pptr);
1350 ok(fb1.base.epptr == fb1.base.ebuf, "wrong put end pointer, expected %p got %p\n", fb1.base.ebuf, fb1.base.epptr);
1351 ret = (int) call_func2(p_filebuf_overflow, &fb2, EOF);
1352 ok(ret == EOF, "wrong return, expected EOF got %d\n", ret);
1353 fb2.base.do_lock = 0;
1354 pret = (filebuf*) call_func4(p_filebuf_open, &fb2, filename2, OPENMODE_in|OPENMODE_out, filebuf_openprot);
1355 ok(pret == &fb2, "wrong return, expected %p got %p\n", &fb2, pret);
1356 fb2.base.do_lock = -1;
1357 ret = (int) call_func2(p_filebuf_overflow, &fb2, EOF);
1358 ok(ret == 1, "wrong return, expected 1 got %d\n", ret);
1360 /* underflow */
1361 ret = (int) call_func1(p_filebuf_underflow, &fb1);
1362 ok(ret == EOF, "wrong return, expected EOF got %d\n", ret);
1363 ok(fb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, fb1.base.gptr);
1364 ok(fb1.base.pptr == NULL, "wrong put pointer, expected %p got %p\n", NULL, fb1.base.pptr);
1365 fb1.base.eback = fb1.base.gptr = fb1.base.base;
1366 fb1.base.egptr = fb1.base.pbase = fb1.base.pptr = fb1.base.base + 256;
1367 fb1.base.epptr = fb1.base.ebuf;
1368 *fb1.base.gptr = 'A';
1369 ret = (int) call_func1(p_filebuf_underflow, &fb1);
1370 ok(ret == 'A', "wrong return, expected 'A' got %d\n", ret);
1371 ok(fb1.base.gptr == fb1.base.base, "wrong get pointer, expected %p got %p\n", fb1.base.base, fb1.base.gptr);
1372 ok(fb1.base.pptr == fb1.base.base + 256, "wrong put pointer, expected %p got %p\n", fb1.base.base + 256, fb1.base.pptr);
1373 fb1.base.gptr = fb1.base.ebuf;
1374 ret = (int) call_func1(p_filebuf_underflow, &fb1);
1375 ok(ret == EOF, "wrong return, expected EOF got %d\n", ret);
1376 ok(fb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, fb1.base.gptr);
1377 ok(fb1.base.pptr == NULL, "wrong put pointer, expected %p got %p\n", NULL, fb1.base.pptr);
1378 ok(_lseek(fb1.fd, 0, SEEK_SET) == 0, "_lseek failed\n");
1379 ret = (int) call_func1(p_filebuf_underflow, &fb1);
1380 ok(ret == 'f', "wrong return, expected 'f' got %d\n", ret);
1381 ok(fb1.base.eback == fb1.base.base, "wrong get base, expected %p got %p\n", fb1.base.base, fb1.base.eback);
1382 ok(fb1.base.gptr == fb1.base.base, "wrong get pointer, expected %p got %p\n", fb1.base.base, fb1.base.gptr);
1383 ok(fb1.base.egptr == fb1.base.base + 106, "wrong get end pointer, expected %p got %p\n", fb1.base.base + 106, fb1.base.egptr);
1384 ok(fb1.base.pptr == NULL, "wrong put pointer, expected %p got %p\n", NULL, fb1.base.pptr);
1385 ret = (int) call_func1(p_filebuf_underflow, &fb2);
1386 ok(ret == EOF, "wrong return, expected EOF got %d\n", ret);
1387 ok(_write(fb2.fd, "A\n", 2) == 2, "_write failed\n");
1388 ok(_lseek(fb2.fd, 0, SEEK_SET) == 0, "_lseek failed\n");
1389 ret = (int) call_func1(p_filebuf_underflow, &fb2);
1390 ok(ret == 'A', "wrong return, expected 'A' got %d\n", ret);
1391 ret = (int) call_func1(p_filebuf_underflow, &fb2);
1392 ok(ret == '\n', "wrong return, expected '\\n' got %d\n", ret);
1393 fb2.base.do_lock = 0;
1394 pret = (filebuf*) call_func1(p_filebuf_close, &fb2);
1395 ok(pret == &fb2, "wrong return, expected %p got %p\n", &fb2, pret);
1396 fb2.base.do_lock = -1;
1397 ret = (int) call_func1(p_filebuf_underflow, &fb2);
1398 ok(ret == EOF, "wrong return, expected EOF got %d\n", ret);
1400 /* seekoff */
1401 ret = (int) call_func4(p_filebuf_seekoff, &fb1, 5, SEEKDIR_beg, 0);
1402 ok(ret == 5, "wrong return, expected 5 got %d\n", ret);
1403 ok(fb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, fb1.base.gptr);
1404 ok(fb1.base.pptr == NULL, "wrong put pointer, expected %p got %p\n", NULL, fb1.base.pptr);
1405 fb1.base.eback = fb1.base.gptr = fb1.base.base;
1406 fb1.base.egptr = fb1.base.ebuf;
1407 ret = (int) call_func4(p_filebuf_seekoff, &fb1, 0, SEEKDIR_beg, 0);
1408 ok(ret == EOF, "wrong return, expected EOF got %d\n", ret);
1409 fb1.base.eback = fb1.base.gptr = fb1.base.egptr = NULL;
1410 ret = (int) call_func4(p_filebuf_seekoff, &fb1, 10, SEEKDIR_beg, OPENMODE_in|OPENMODE_out);
1411 ok(ret == 10, "wrong return, expected 10 got %d\n", ret);
1412 ret = (int) call_func4(p_filebuf_seekoff, &fb1, 0, SEEKDIR_cur, 0);
1413 ok(ret == 10, "wrong return, expected 10 got %d\n", ret);
1414 ret = (int) call_func4(p_filebuf_seekoff, &fb1, 200, SEEKDIR_cur, OPENMODE_in);
1415 ok(ret == 210, "wrong return, expected 210 got %d\n", ret);
1416 ret = (int) call_func4(p_filebuf_seekoff, &fb1, -60, SEEKDIR_cur, 0);
1417 ok(ret == 150, "wrong return, expected 150 got %d\n", ret);
1418 ret = (int) call_func4(p_filebuf_seekoff, &fb1, 0, SEEKDIR_end, 0);
1419 ok(ret == 106, "wrong return, expected 106 got %d\n", ret);
1420 ret = (int) call_func4(p_filebuf_seekoff, &fb1, 20, SEEKDIR_end, OPENMODE_out);
1421 ok(ret == 126, "wrong return, expected 126 got %d\n", ret);
1422 ret = (int) call_func4(p_filebuf_seekoff, &fb1, -150, SEEKDIR_end, -1);
1423 ok(ret == EOF, "wrong return, expected EOF got %d\n", ret);
1424 ret = (int) call_func4(p_filebuf_seekoff, &fb1, 10, 3, 0);
1425 ok(ret == EOF, "wrong return, expected EOF got %d\n", ret);
1426 ret = (int) call_func4(p_filebuf_seekoff, &fb1, 16, SEEKDIR_beg, 0);
1427 ok(ret == 16, "wrong return, expected 16 got %d\n", ret);
1429 /* close */
1430 pret = (filebuf*) call_func1(p_filebuf_close, &fb2);
1431 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1432 fb3.base.do_lock = 0;
1433 pret = (filebuf*) call_func1(p_filebuf_close, &fb3);
1434 ok(pret == &fb3, "wrong return, expected %p got %p\n", &fb3, pret);
1435 ok(fb3.fd == -1, "wrong fd, expected -1 got %d\n", fb3.fd);
1436 fb3.fd = 5;
1437 pret = (filebuf*) call_func1(p_filebuf_close, &fb3);
1438 ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);
1439 ok(fb3.fd == 5, "wrong fd, expected 5 got %d\n", fb3.fd);
1440 fb3.base.do_lock = -1;
1442 SetEvent(lock_arg.test);
1443 WaitForSingleObject(thread, INFINITE);
1445 /* destructor */
1446 call_func1(p_filebuf_dtor, &fb1);
1447 ok(fb1.fd == -1, "wrong fd, expected -1 got %d\n", fb1.fd);
1448 call_func1(p_filebuf_dtor, &fb2);
1449 call_func1(p_filebuf_dtor, &fb3);
1451 ok(_unlink(filename1) == 0, "Couldn't unlink file named '%s'\n", filename1);
1452 ok(_unlink(filename2) == 0, "Couldn't unlink file named '%s'\n", filename2);
1453 ok(_unlink(filename3) == 0, "Couldn't unlink file named '%s'\n", filename3);
1454 CloseHandle(lock_arg.lock);
1455 CloseHandle(lock_arg.test);
1456 CloseHandle(thread);
1459 static void test_strstreambuf(void)
1461 strstreambuf ssb1, ssb2;
1462 streambuf *pret;
1463 char buffer[64], *pbuffer;
1464 int ret;
1466 memset(&ssb1, 0xab, sizeof(strstreambuf));
1467 memset(&ssb2, 0xab, sizeof(strstreambuf));
1469 /* constructors/destructor */
1470 call_func2(p_strstreambuf_dynamic_ctor, &ssb1, 64);
1471 ok(ssb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", ssb1.base.allocated);
1472 ok(ssb1.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", ssb1.base.unbuffered);
1473 ok(ssb1.dynamic == 1, "expected 1, got %d\n", ssb1.dynamic);
1474 ok(ssb1.increase == 64, "expected 64, got %d\n", ssb1.increase);
1475 ok(ssb1.constant == 0, "expected 0, got %d\n", ssb1.constant);
1476 ok(ssb1.f_alloc == NULL, "expected %p, got %p\n", NULL, ssb1.f_alloc);
1477 ok(ssb1.f_free == NULL, "expected %p, got %p\n", NULL, ssb1.f_free);
1478 call_func1(p_strstreambuf_dtor, &ssb1);
1479 call_func3(p_strstreambuf_funcs_ctor, &ssb2, (allocFunction)p_operator_new, p_operator_delete);
1480 ok(ssb2.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", ssb2.base.allocated);
1481 ok(ssb2.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", ssb2.base.unbuffered);
1482 ok(ssb2.dynamic == 1, "expected 1, got %d\n", ssb2.dynamic);
1483 ok(ssb2.increase == 1, "expected 1, got %d\n", ssb2.increase);
1484 ok(ssb2.constant == 0, "expected 0, got %d\n", ssb2.constant);
1485 ok(ssb2.f_alloc == (allocFunction)p_operator_new, "expected %p, got %p\n", p_operator_new, ssb2.f_alloc);
1486 ok(ssb2.f_free == p_operator_delete, "expected %p, got %p\n", p_operator_delete, ssb2.f_free);
1487 call_func1(p_strstreambuf_dtor, &ssb2);
1488 memset(&ssb1, 0xab, sizeof(strstreambuf));
1489 memset(&ssb2, 0xab, sizeof(strstreambuf));
1490 call_func4(p_strstreambuf_buffer_ctor, &ssb1, buffer, 64, buffer + 20);
1491 ok(ssb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", ssb1.base.allocated);
1492 ok(ssb1.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", ssb1.base.unbuffered);
1493 ok(ssb1.base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, ssb1.base.base);
1494 ok(ssb1.base.ebuf == buffer + 64, "wrong buffer end, expected %p got %p\n", buffer + 64, ssb1.base.ebuf);
1495 ok(ssb1.base.eback == buffer, "wrong get base, expected %p got %p\n", buffer, ssb1.base.eback);
1496 ok(ssb1.base.gptr == buffer, "wrong get pointer, expected %p got %p\n", buffer, ssb1.base.gptr);
1497 ok(ssb1.base.egptr == buffer + 20, "wrong get end, expected %p got %p\n", buffer + 20, ssb1.base.egptr);
1498 ok(ssb1.base.pbase == buffer + 20, "wrong put base, expected %p got %p\n", buffer + 20, ssb1.base.pbase);
1499 ok(ssb1.base.pptr == buffer + 20, "wrong put pointer, expected %p got %p\n", buffer + 20, ssb1.base.pptr);
1500 ok(ssb1.base.epptr == buffer + 64, "wrong put end, expected %p got %p\n", buffer + 64, ssb1.base.epptr);
1501 ok(ssb1.dynamic == 0, "expected 0, got %d\n", ssb1.dynamic);
1502 ok(ssb1.constant == 1, "expected 1, got %d\n", ssb1.constant);
1503 call_func1(p_strstreambuf_dtor, &ssb1);
1504 strcpy(buffer, "Test");
1505 call_func4(p_strstreambuf_buffer_ctor, &ssb2, buffer, 0, buffer + 20);
1506 ok(ssb2.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", ssb2.base.allocated);
1507 ok(ssb2.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", ssb2.base.unbuffered);
1508 ok(ssb2.base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, ssb2.base.base);
1509 ok(ssb2.base.ebuf == buffer + 4, "wrong buffer end, expected %p got %p\n", buffer + 4, ssb2.base.ebuf);
1510 ok(ssb2.base.eback == buffer, "wrong get base, expected %p got %p\n", buffer, ssb2.base.eback);
1511 ok(ssb2.base.gptr == buffer, "wrong get pointer, expected %p got %p\n", buffer, ssb2.base.gptr);
1512 ok(ssb2.base.egptr == buffer + 20, "wrong get end, expected %p got %p\n", buffer + 20, ssb2.base.egptr);
1513 ok(ssb2.base.pbase == buffer + 20, "wrong put base, expected %p got %p\n", buffer + 20, ssb2.base.pbase);
1514 ok(ssb2.base.pptr == buffer + 20, "wrong put pointer, expected %p got %p\n", buffer + 20, ssb2.base.pptr);
1515 ok(ssb2.base.epptr == buffer + 4, "wrong put end, expected %p got %p\n", buffer + 4, ssb2.base.epptr);
1516 ok(ssb2.dynamic == 0, "expected 0, got %d\n", ssb2.dynamic);
1517 ok(ssb2.constant == 1, "expected 1, got %d\n", ssb2.constant);
1518 call_func1(p_strstreambuf_dtor, &ssb2);
1519 memset(&ssb1, 0xab, sizeof(strstreambuf));
1520 memset(&ssb2, 0xab, sizeof(strstreambuf));
1521 call_func4(p_strstreambuf_buffer_ctor, &ssb1, NULL, 16, buffer + 20);
1522 ok(ssb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", ssb1.base.allocated);
1523 ok(ssb1.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", ssb1.base.unbuffered);
1524 ok(ssb1.base.base == NULL, "wrong buffer, expected %p got %p\n", NULL, ssb1.base.base);
1525 ok(ssb1.base.ebuf == (char*)16, "wrong buffer end, expected %p got %p\n", (char*)16, ssb1.base.ebuf);
1526 ok(ssb1.base.eback == NULL, "wrong get base, expected %p got %p\n", NULL, ssb1.base.eback);
1527 ok(ssb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, ssb1.base.gptr);
1528 ok(ssb1.base.egptr == buffer + 20, "wrong get end, expected %p got %p\n", buffer + 20, ssb1.base.egptr);
1529 ok(ssb1.base.pbase == buffer + 20, "wrong put base, expected %p got %p\n", buffer + 20, ssb1.base.pbase);
1530 ok(ssb1.base.pptr == buffer + 20, "wrong put pointer, expected %p got %p\n", buffer + 20, ssb1.base.pptr);
1531 ok(ssb1.base.epptr == (char*)16, "wrong put end, expected %p got %p\n", (char*)16, ssb1.base.epptr);
1532 ok(ssb1.dynamic == 0, "expected 0, got %d\n", ssb1.dynamic);
1533 ok(ssb1.constant == 1, "expected 1, got %d\n", ssb1.constant);
1534 call_func1(p_strstreambuf_dtor, &ssb1);
1535 call_func4(p_strstreambuf_buffer_ctor, &ssb2, buffer, 0, NULL);
1536 ok(ssb2.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", ssb2.base.allocated);
1537 ok(ssb2.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", ssb2.base.unbuffered);
1538 ok(ssb2.base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, ssb2.base.base);
1539 ok(ssb2.base.ebuf == buffer + 4, "wrong buffer end, expected %p got %p\n", buffer + 4, ssb2.base.ebuf);
1540 ok(ssb2.base.eback == buffer, "wrong get base, expected %p got %p\n", buffer, ssb2.base.eback);
1541 ok(ssb2.base.gptr == buffer, "wrong get pointer, expected %p got %p\n", buffer, ssb2.base.gptr);
1542 ok(ssb2.base.egptr == buffer + 4, "wrong get end, expected %p got %p\n", buffer + 4, ssb2.base.egptr);
1543 ok(ssb2.base.pbase == NULL, "wrong put base, expected %p got %p\n", NULL, ssb2.base.pbase);
1544 ok(ssb2.base.pptr == NULL, "wrong put pointer, expected %p got %p\n", NULL, ssb2.base.pptr);
1545 ok(ssb2.base.epptr == NULL, "wrong put end, expected %p got %p\n", NULL, ssb2.base.epptr);
1546 ok(ssb2.dynamic == 0, "expected 0, got %d\n", ssb2.dynamic);
1547 ok(ssb2.constant == 1, "expected 1, got %d\n", ssb2.constant);
1548 call_func1(p_strstreambuf_dtor, &ssb2);
1549 memset(&ssb1, 0xab, sizeof(strstreambuf));
1550 memset(&ssb2, 0xab, sizeof(strstreambuf));
1551 call_func4(p_strstreambuf_buffer_ctor, &ssb1, buffer, -5, buffer + 20);
1552 ok(ssb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", ssb1.base.allocated);
1553 ok(ssb1.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", ssb1.base.unbuffered);
1554 ok(ssb1.base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, ssb1.base.base);
1555 ok(ssb1.base.ebuf == buffer + 0x7fffffff || ssb1.base.ebuf == (char*)-1,
1556 "wrong buffer end, expected %p + 0x7fffffff or -1, got %p\n", buffer, ssb1.base.ebuf);
1557 ok(ssb1.base.eback == buffer, "wrong get base, expected %p got %p\n", buffer, ssb1.base.eback);
1558 ok(ssb1.base.gptr == buffer, "wrong get pointer, expected %p got %p\n", buffer, ssb1.base.gptr);
1559 ok(ssb1.base.egptr == buffer + 20, "wrong get end, expected %p got %p\n", buffer + 20, ssb1.base.egptr);
1560 ok(ssb1.base.pbase == buffer + 20, "wrong put base, expected %p got %p\n", buffer + 20, ssb1.base.pbase);
1561 ok(ssb1.base.pptr == buffer + 20, "wrong put pointer, expected %p got %p\n", buffer + 20, ssb1.base.pptr);
1562 ok(ssb1.base.epptr == buffer + 0x7fffffff || ssb1.base.epptr == (char*)-1,
1563 "wrong put end, expected %p + 0x7fffffff or -1, got %p\n", buffer, ssb1.base.epptr);
1564 ok(ssb1.dynamic == 0, "expected 0, got %d\n", ssb1.dynamic);
1565 ok(ssb1.constant == 1, "expected 1, got %d\n", ssb1.constant);
1566 call_func1(p_strstreambuf_ctor, &ssb2);
1567 ok(ssb2.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", ssb2.base.allocated);
1568 ok(ssb2.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", ssb2.base.unbuffered);
1569 ok(ssb2.dynamic == 1, "expected 1, got %d\n", ssb2.dynamic);
1570 ok(ssb2.increase == 1, "expected 1, got %d\n", ssb2.increase);
1571 ok(ssb2.constant == 0, "expected 0, got %d\n", ssb2.constant);
1572 ok(ssb2.f_alloc == NULL, "expected %p, got %p\n", NULL, ssb2.f_alloc);
1573 ok(ssb2.f_free == NULL, "expected %p, got %p\n", NULL, ssb2.f_free);
1575 /* freeze */
1576 call_func2(p_strstreambuf_freeze, &ssb1, 0);
1577 ok(ssb1.dynamic == 0, "expected 0, got %d\n", ssb1.dynamic);
1578 ssb1.constant = 0;
1579 call_func2(p_strstreambuf_freeze, &ssb1, 0);
1580 ok(ssb1.dynamic == 1, "expected 1, got %d\n", ssb1.dynamic);
1581 call_func2(p_strstreambuf_freeze, &ssb1, 3);
1582 ok(ssb1.dynamic == 0, "expected 0, got %d\n", ssb1.dynamic);
1583 ssb1.constant = 1;
1584 call_func2(p_strstreambuf_freeze, &ssb2, 5);
1585 ok(ssb2.dynamic == 0, "expected 0, got %d\n", ssb2.dynamic);
1586 call_func2(p_strstreambuf_freeze, &ssb2, 0);
1587 ok(ssb2.dynamic == 1, "expected 1, got %d\n", ssb2.dynamic);
1589 /* doallocate */
1590 ssb2.dynamic = 0;
1591 ssb2.increase = 5;
1592 ret = (int) call_func1(p_strstreambuf_doallocate, &ssb2);
1593 ok(ret == 1, "return value %d\n", ret);
1594 ok(ssb2.base.ebuf == ssb2.base.base + 5, "expected %p, got %p\n", ssb2.base.base + 5, ssb2.base.ebuf);
1595 ssb2.base.eback = ssb2.base.base;
1596 ssb2.base.gptr = ssb2.base.base + 2;
1597 ssb2.base.egptr = ssb2.base.base + 4;
1598 strcpy(ssb2.base.base, "Check");
1599 ret = (int) call_func1(p_strstreambuf_doallocate, &ssb2);
1600 ok(ret == 1, "return value %d\n", ret);
1601 ok(ssb2.base.ebuf == ssb2.base.base + 10, "expected %p, got %p\n", ssb2.base.base + 10, ssb2.base.ebuf);
1602 ok(ssb2.base.eback == ssb2.base.base, "wrong get base, expected %p got %p\n", ssb2.base.base, ssb2.base.eback);
1603 ok(ssb2.base.gptr == ssb2.base.base + 2, "wrong get pointer, expected %p got %p\n", ssb2.base.base + 2, ssb2.base.gptr);
1604 ok(ssb2.base.egptr == ssb2.base.base + 4, "wrong get end, expected %p got %p\n", ssb2.base.base + 4, ssb2.base.egptr);
1605 ok(!strncmp(ssb2.base.base, "Check", 5), "strings are not equal\n");
1606 ssb2.base.pbase = ssb2.base.pptr = ssb2.base.base + 4;
1607 ssb2.base.epptr = ssb2.base.ebuf;
1608 ssb2.increase = -3;
1609 ret = (int) call_func1(p_strstreambuf_doallocate, &ssb2);
1610 ok(ret == 1, "return value %d\n", ret);
1611 ok(ssb2.base.ebuf == ssb2.base.base + 11, "expected %p, got %p\n", ssb2.base.base + 11, ssb2.base.ebuf);
1612 ok(ssb2.base.pbase == ssb2.base.base + 4, "wrong put base, expected %p got %p\n", ssb2.base.base + 4, ssb2.base.pbase);
1613 ok(ssb2.base.pptr == ssb2.base.base + 4, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 4, ssb2.base.pptr);
1614 ok(ssb2.base.epptr == ssb2.base.base + 10, "wrong put end, expected %p got %p\n", ssb2.base.base + 10, ssb2.base.epptr);
1615 ok(!strncmp(ssb2.base.base, "Check", 5), "strings are not equal\n");
1616 ssb2.dynamic = 1;
1618 /* setbuf */
1619 pret = (streambuf*) call_func3(p_strstreambuf_setbuf, &ssb1, buffer + 16, 16);
1620 ok(pret == &ssb1.base, "expected %p got %p\n", &ssb1.base, pret);
1621 ok(ssb1.base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, ssb1.base.base);
1622 ok(ssb1.increase == 16, "expected 16, got %d\n", ssb1.increase);
1623 pret = (streambuf*) call_func3(p_strstreambuf_setbuf, &ssb2, NULL, 2);
1624 ok(pret == &ssb2.base, "expected %p got %p\n", &ssb2.base, pret);
1625 ok(ssb2.increase == 2, "expected 2, got %d\n", ssb2.increase);
1626 pret = (streambuf*) call_func3(p_strstreambuf_setbuf, &ssb2, buffer, 0);
1627 ok(pret == &ssb2.base, "expected %p got %p\n", &ssb2.base, pret);
1628 ok(ssb2.increase == 2, "expected 2, got %d\n", ssb2.increase);
1629 pret = (streambuf*) call_func3(p_strstreambuf_setbuf, &ssb2, NULL, -2);
1630 ok(pret == &ssb2.base, "expected %p got %p\n", &ssb2.base, pret);
1631 ok(ssb2.increase == -2, "expected -2, got %d\n", ssb2.increase);
1633 /* underflow */
1634 ssb1.base.epptr = ssb1.base.ebuf = ssb1.base.base + 64;
1635 ret = (int) call_func1(p_strstreambuf_underflow, &ssb1);
1636 ok(ret == 'T', "expected 'T' got %d\n", ret);
1637 ssb1.base.gptr = ssb1.base.egptr;
1638 ret = (int) call_func1(p_strstreambuf_underflow, &ssb1);
1639 ok(ret == EOF, "expected EOF got %d\n", ret);
1640 ret = (int) call_func3(p_streambuf_xsputn, &ssb1.base, "Gotta make you understand", 5);
1641 ok(ret == 5, "expected 5 got %d\n", ret);
1642 ok(ssb1.base.pptr == buffer + 25, "wrong put pointer, expected %p got %p\n", buffer + 25, ssb1.base.pptr);
1643 ret = (int) call_func1(p_strstreambuf_underflow, &ssb1);
1644 ok(ret == 'G', "expected 'G' got %d\n", ret);
1645 ok(ssb1.base.egptr == buffer + 25, "wrong get end, expected %p got %p\n", buffer + 25, ssb1.base.egptr);
1646 ssb1.base.gptr = ssb1.base.egptr = ssb1.base.pptr = ssb1.base.epptr;
1647 ret = (int) call_func1(p_strstreambuf_underflow, &ssb1);
1648 ok(ret == EOF, "expected EOF got %d\n", ret);
1649 ssb2.base.eback = ssb2.base.gptr = ssb2.base.egptr = NULL;
1650 ssb2.base.pbase = ssb2.base.pptr = ssb2.base.epptr = NULL;
1651 ret = (int) call_func1(p_strstreambuf_underflow, &ssb2);
1652 ok(ret == EOF, "expected EOF got %d\n", ret);
1653 ssb2.base.eback = ssb2.base.base;
1654 ssb2.base.gptr = ssb2.base.egptr = ssb2.base.ebuf;
1655 ret = (int) call_func1(p_strstreambuf_underflow, &ssb2);
1656 ok(ret == EOF, "expected EOF got %d\n", ret);
1658 /* overflow */
1659 ssb1.base.pptr = ssb1.base.epptr - 1;
1660 ret = (int) call_func2(p_strstreambuf_overflow, &ssb1, EOF);
1661 ok(ret == 1, "expected 1 got %d\n", ret);
1662 ret = (int) call_func2(p_strstreambuf_overflow, &ssb1, 'A');
1663 ok(ret == 1, "expected 1 got %d\n", ret);
1664 ok(ssb1.base.pptr == ssb1.base.epptr, "wrong put pointer, expected %p got %p\n", ssb1.base.epptr, ssb1.base.pptr);
1665 ok(*(ssb1.base.pptr - 1) == 'A', "expected 'A' got %d\n", *(ssb1.base.pptr - 1));
1666 ret = (int) call_func2(p_strstreambuf_overflow, &ssb1, 'B');
1667 ok(ret == EOF, "expected EOF got %d\n", ret);
1668 ret = (int) call_func2(p_strstreambuf_overflow, &ssb1, EOF);
1669 ok(ret == EOF, "expected EOF got %d\n", ret);
1670 ssb2.dynamic = 0;
1671 ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'C');
1672 ok(ret == EOF, "expected EOF got %d\n", ret);
1673 ssb2.dynamic = 1;
1674 ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'C');
1675 ok(ret == 1, "expected 1 got %d\n", ret);
1676 ok(ssb2.base.ebuf == ssb2.base.base + 12, "expected %p got %p\n", ssb2.base.base + 12, ssb2.base.ebuf);
1677 ok(ssb2.base.gptr == ssb2.base.base + 11, "wrong get pointer, expected %p got %p\n", ssb2.base.base + 11, ssb2.base.gptr);
1678 ok(ssb2.base.pbase == ssb2.base.base + 11, "wrong put base, expected %p got %p\n", ssb2.base.base + 11, ssb2.base.pbase);
1679 ok(ssb2.base.pptr == ssb2.base.base + 12, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 12, ssb2.base.pptr);
1680 ok(ssb2.base.epptr == ssb2.base.base + 12, "wrong put end, expected %p got %p\n", ssb2.base.base + 12, ssb2.base.epptr);
1681 ok(*(ssb2.base.pptr - 1) == 'C', "expected 'C' got %d\n", *(ssb2.base.pptr - 1));
1682 ssb2.increase = 4;
1683 ssb2.base.eback = ssb2.base.gptr = ssb2.base.egptr = NULL;
1684 ssb2.base.pbase = ssb2.base.pptr = ssb2.base.epptr = NULL;
1685 ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'D');
1686 ok(ret == 1, "expected 1 got %d\n", ret);
1687 ok(ssb2.base.ebuf == ssb2.base.base + 16, "expected %p got %p\n", ssb2.base.base + 16, ssb2.base.ebuf);
1688 ok(ssb2.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, ssb2.base.gptr);
1689 ok(ssb2.base.pbase == ssb2.base.base, "wrong put base, expected %p got %p\n", ssb2.base.base, ssb2.base.pbase);
1690 ok(ssb2.base.pptr == ssb2.base.base + 1, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 1, ssb2.base.pptr);
1691 ok(ssb2.base.epptr == ssb2.base.base + 16, "wrong put end, expected %p got %p\n", ssb2.base.base + 16, ssb2.base.epptr);
1692 ok(*(ssb2.base.pptr - 1) == 'D', "expected 'D' got %d\n", *(ssb2.base.pptr - 1));
1693 ssb2.base.pbase = ssb2.base.base + 3;
1694 ssb2.base.pptr = ssb2.base.epptr + 5;
1695 ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'E');
1696 ok(ret == 1, "expected 1 got %d\n", ret);
1697 ok(ssb2.base.ebuf == ssb2.base.base + 20, "expected %p got %p\n", ssb2.base.base + 20, ssb2.base.ebuf);
1698 ok(ssb2.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, ssb2.base.gptr);
1699 ok(ssb2.base.pbase == ssb2.base.base + 3, "wrong put base, expected %p got %p\n", ssb2.base.base + 3, ssb2.base.pbase);
1700 ok(ssb2.base.pptr == ssb2.base.base + 22, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 22, ssb2.base.pptr);
1701 ok(ssb2.base.epptr == ssb2.base.base + 20, "wrong put end, expected %p got %p\n", ssb2.base.base + 20, ssb2.base.epptr);
1702 ok(*(ssb2.base.pptr - 1) == 'E', "expected 'E' got %d\n", *(ssb2.base.pptr - 1));
1703 ssb2.base.egptr = ssb2.base.base + 2;
1704 ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'F');
1705 ok(ret == 1, "expected 1 got %d\n", ret);
1706 ok(ssb2.base.ebuf == ssb2.base.base + 24, "expected %p got %p\n", ssb2.base.base + 24, ssb2.base.ebuf);
1707 ok(ssb2.base.gptr != NULL, "wrong get pointer, expected != NULL\n");
1708 ok(ssb2.base.pbase == ssb2.base.base + 3, "wrong put base, expected %p got %p\n", ssb2.base.base + 3, ssb2.base.pbase);
1709 ok(ssb2.base.pptr == ssb2.base.base + 23, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 23, ssb2.base.pptr);
1710 ok(ssb2.base.epptr == ssb2.base.base + 24, "wrong put end, expected %p got %p\n", ssb2.base.base + 24, ssb2.base.epptr);
1711 ok(*(ssb2.base.pptr - 1) == 'F', "expected 'F' got %d\n", *(ssb2.base.pptr - 1));
1712 ssb2.base.eback = ssb2.base.gptr = ssb2.base.base;
1713 ssb2.base.epptr = NULL;
1714 ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'G');
1715 ok(ret == 1, "expected 1 got %d\n", ret);
1716 ok(ssb2.base.ebuf == ssb2.base.base + 28, "expected %p got %p\n", ssb2.base.base + 28, ssb2.base.ebuf);
1717 ok(ssb2.base.gptr == ssb2.base.base, "wrong get pointer, expected %p got %p\n", ssb2.base.base, ssb2.base.gptr);
1718 ok(ssb2.base.pbase == ssb2.base.base + 2, "wrong put base, expected %p got %p\n", ssb2.base.base + 2, ssb2.base.pbase);
1719 ok(ssb2.base.pptr == ssb2.base.base + 3, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 3, ssb2.base.pptr);
1720 ok(ssb2.base.epptr == ssb2.base.base + 28, "wrong put end, expected %p got %p\n", ssb2.base.base + 28, ssb2.base.epptr);
1721 ok(*(ssb2.base.pptr - 1) == 'G', "expected 'G' got %d\n", *(ssb2.base.pptr - 1));
1723 /* seekoff */
1724 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 0, SEEKDIR_beg, OPENMODE_in);
1725 ok(ret == 0, "expected 0 got %d\n", ret);
1726 ok(ssb1.base.gptr == ssb1.base.eback, "wrong get pointer, expected %p got %p\n", ssb1.base.eback, ssb1.base.gptr);
1727 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 3, SEEKDIR_beg, OPENMODE_in);
1728 ok(ret == 3, "expected 3 got %d\n", ret);
1729 ok(ssb1.base.gptr == ssb1.base.eback + 3, "wrong get pointer, expected %p got %p\n", ssb1.base.eback + 3, ssb1.base.gptr);
1730 ssb1.base.egptr = ssb1.base.pbase;
1731 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 25, SEEKDIR_beg, OPENMODE_in);
1732 ok(ret == EOF, "expected EOF got %d\n", ret);
1733 ok(ssb1.base.gptr == ssb1.base.eback + 3, "wrong get pointer, expected %p got %p\n", ssb1.base.eback + 3, ssb1.base.gptr);
1734 ssb1.base.gptr = ssb1.base.egptr;
1735 ssb1.base.pptr = ssb1.base.pbase + 10;
1736 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 25, SEEKDIR_beg, OPENMODE_in);
1737 ok(ret == 25, "expected 25 got %d\n", ret);
1738 ok(ssb1.base.gptr == ssb1.base.eback + 25, "wrong get pointer, expected %p got %p\n", ssb1.base.eback + 25, ssb1.base.gptr);
1739 ok(ssb1.base.egptr == ssb1.base.pptr, "wrong get end, expected %p got %p\n", ssb1.base.pptr, ssb1.base.egptr);
1740 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, -24, SEEKDIR_cur, OPENMODE_in);
1741 ok(ret == 1, "expected 1 got %d\n", ret);
1742 ok(ssb1.base.gptr == ssb1.base.eback + 1, "wrong get pointer, expected %p got %p\n", ssb1.base.eback + 1, ssb1.base.gptr);
1743 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, -5, SEEKDIR_cur, OPENMODE_in);
1744 ok(ret == EOF, "expected EOF got %d\n", ret);
1745 ok(ssb1.base.gptr == ssb1.base.eback + 1, "wrong get pointer, expected %p got %p\n", ssb1.base.eback + 1, ssb1.base.gptr);
1746 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 0, SEEKDIR_end, OPENMODE_in);
1747 ok(ret == 30, "expected 30 got %d\n", ret);
1748 ok(ssb1.base.gptr == ssb1.base.egptr, "wrong get pointer, expected %p got %p\n", ssb1.base.egptr, ssb1.base.gptr);
1749 ssb1.base.gptr = ssb1.base.eback;
1750 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, -2, SEEKDIR_end, OPENMODE_in);
1751 ok(ret == 28, "expected 28 got %d\n", ret);
1752 ok(ssb1.base.gptr == ssb1.base.egptr - 2, "wrong get pointer, expected %p got %p\n", ssb1.base.egptr - 2, ssb1.base.gptr);
1753 ssb1.base.gptr = ssb1.base.egptr;
1754 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, -5, SEEKDIR_end, OPENMODE_in);
1755 ok(ret == 25, "expected 25 got %d\n", ret);
1756 ok(ssb1.base.gptr == ssb1.base.egptr - 5, "wrong get pointer, expected %p got %p\n", ssb1.base.egptr - 5, ssb1.base.gptr);
1757 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 1, SEEKDIR_end, OPENMODE_in);
1758 ok(ret == EOF, "expected EOF got %d\n", ret);
1759 ok(ssb1.base.gptr == ssb1.base.egptr - 5, "wrong get pointer, expected %p got %p\n", ssb1.base.egptr - 5, ssb1.base.gptr);
1760 ssb1.base.gptr = ssb1.base.egptr;
1761 ssb1.base.pptr = ssb1.base.egptr + 5;
1762 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 1, SEEKDIR_end, OPENMODE_in);
1763 ok(ret == EOF, "expected EOF got %d\n", ret);
1764 ok(ssb1.base.gptr == ssb1.base.egptr - 5, "wrong get pointer, expected %p got %p\n", ssb1.base.egptr - 5, ssb1.base.gptr);
1765 ok(ssb1.base.egptr == ssb1.base.pptr, "wrong get end, expected %p got %p\n", ssb1.base.pptr, ssb1.base.egptr);
1766 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 3, SEEKDIR_beg, OPENMODE_out);
1767 ok(ret == 3, "expected 3 got %d\n", ret);
1768 ok(ssb1.base.pptr == ssb1.base.pbase + 3, "wrong put pointer, expected %p got %p\n", ssb1.base.pbase + 3, ssb1.base.pptr);
1769 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, -2, SEEKDIR_beg, OPENMODE_out);
1770 ok(ret == EOF, "expected EOF got %d\n", ret);
1771 ok(ssb1.base.pptr == ssb1.base.pbase + 3, "wrong put pointer, expected %p got %p\n", ssb1.base.pbase + 3, ssb1.base.pptr);
1772 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 50, SEEKDIR_beg, OPENMODE_out);
1773 ok(ret == EOF, "expected EOF got %d\n", ret);
1774 ok(ssb1.base.pptr == ssb1.base.pbase + 3, "wrong put pointer, expected %p got %p\n", ssb1.base.pbase + 3, ssb1.base.pptr);
1775 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 5, SEEKDIR_cur, OPENMODE_out);
1776 ok(ret == 8, "expected 8 got %d\n", ret);
1777 ok(ssb1.base.pptr == ssb1.base.pbase + 8, "wrong put pointer, expected %p got %p\n", ssb1.base.pbase + 8, ssb1.base.pptr);
1778 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, -2, SEEKDIR_end, OPENMODE_out);
1779 ok(ret == 42, "expected 42 got %d\n", ret);
1780 ok(ssb1.base.pptr == ssb1.base.epptr - 2, "wrong put pointer, expected %p got %p\n", ssb1.base.epptr - 2, ssb1.base.pptr);
1781 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 0, SEEKDIR_end, OPENMODE_out);
1782 ok(ret == 44, "expected 44 got %d\n", ret);
1783 ok(ssb1.base.pptr == ssb1.base.epptr, "wrong put pointer, expected %p got %p\n", ssb1.base.epptr, ssb1.base.pptr);
1784 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 5, SEEKDIR_beg, OPENMODE_in|OPENMODE_out);
1785 ok(ret == 5, "expected 5 got %d\n", ret);
1786 ok(ssb1.base.gptr == ssb1.base.eback + 5, "wrong get pointer, expected %p got %p\n", ssb1.base.eback + 5, ssb1.base.gptr);
1787 ok(ssb1.base.pptr == ssb1.base.pbase + 5, "wrong put pointer, expected %p got %p\n", ssb1.base.pbase + 5, ssb1.base.pptr);
1788 ssb1.base.egptr = ssb1.base.pbase;
1789 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 21, SEEKDIR_beg, OPENMODE_in|OPENMODE_out);
1790 ok(ret == EOF, "expected EOF got %d\n", ret);
1791 ok(ssb1.base.gptr == ssb1.base.eback + 5, "wrong get pointer, expected %p got %p\n", ssb1.base.eback + 5, ssb1.base.gptr);
1792 ok(ssb1.base.pptr == ssb1.base.pbase + 5, "wrong put pointer, expected %p got %p\n", ssb1.base.pbase + 5, ssb1.base.pptr);
1793 ssb1.base.egptr = ssb1.base.epptr;
1794 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 50, SEEKDIR_beg, OPENMODE_in|OPENMODE_out);
1795 ok(ret == EOF, "expected EOF got %d\n", ret);
1796 ok(ssb1.base.gptr == ssb1.base.eback + 50, "wrong get pointer, expected %p got %p\n", ssb1.base.eback + 50, ssb1.base.gptr);
1797 ok(ssb1.base.pptr == ssb1.base.pbase + 5, "wrong put pointer, expected %p got %p\n", ssb1.base.pbase + 5, ssb1.base.pptr);
1798 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb1, 2, SEEKDIR_cur, OPENMODE_in|OPENMODE_out);
1799 ok(ret == 7, "expected 7 got %d\n", ret);
1800 ok(ssb1.base.gptr == ssb1.base.eback + 52, "wrong get pointer, expected %p got %p\n", ssb1.base.eback + 52, ssb1.base.gptr);
1801 ok(ssb1.base.pptr == ssb1.base.pbase + 7, "wrong put pointer, expected %p got %p\n", ssb1.base.pbase + 7, ssb1.base.pptr);
1802 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb2, 0, SEEKDIR_beg, OPENMODE_in|OPENMODE_out);
1803 ok(ret == 0, "expected 0 got %d\n", ret);
1804 ok(ssb2.base.gptr == ssb2.base.eback, "wrong get pointer, expected %p got %p\n", ssb2.base.eback, ssb2.base.gptr);
1805 ok(ssb2.base.pptr == ssb2.base.pbase, "wrong put pointer, expected %p got %p\n", ssb2.base.pbase, ssb2.base.pptr);
1806 ssb2.base.gptr = ssb2.base.egptr;
1807 ssb2.base.pptr += 10;
1808 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb2, 5, SEEKDIR_cur, OPENMODE_in|OPENMODE_out);
1809 ok(ret == 15, "expected 15 got %d\n", ret);
1810 ok(ssb2.base.gptr == ssb2.base.eback + 7, "wrong get pointer, expected %p got %p\n", ssb2.base.eback + 7, ssb2.base.gptr);
1811 ok(ssb2.base.egptr == ssb2.base.eback + 12, "wrong get end, expected %p got %p\n", ssb2.base.eback + 12, ssb2.base.egptr);
1812 ok(ssb2.base.pptr == ssb2.base.pbase + 15, "wrong put pointer, expected %p got %p\n", ssb2.base.pbase + 15, ssb2.base.pptr);
1813 ssb2.base.pptr = ssb2.base.epptr;
1814 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb2, -1, SEEKDIR_cur, OPENMODE_in|OPENMODE_out);
1815 ok(ret == 25, "expected 25 got %d\n", ret);
1816 ok(ssb2.base.gptr == ssb2.base.eback + 6, "wrong get pointer, expected %p got %p\n", ssb2.base.eback + 6, ssb2.base.gptr);
1817 ok(ssb2.base.pptr == ssb2.base.pbase + 25, "wrong put pointer, expected %p got %p\n", ssb2.base.pbase + 25, ssb2.base.pptr);
1818 pbuffer = ssb2.base.pbase;
1819 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb2, 50, SEEKDIR_beg, OPENMODE_out);
1820 ok(ret == 50, "expected 50 got %d\n", ret);
1821 ok(ssb2.base.gptr == ssb2.base.eback + 6, "wrong get pointer, expected %p got %p\n", ssb2.base.eback + 6, ssb2.base.gptr);
1822 ok(ssb2.base.pptr == pbuffer + 50, "wrong put pointer, expected %p got %p\n", pbuffer + 50, ssb2.base.pptr);
1823 ok(ssb2.increase == 50, "expected 50 got %d\n", ssb2.increase);
1824 ssb2.base.epptr = NULL;
1825 ssb2.increase = 8;
1826 ret = (int) call_func4(p_strstreambuf_seekoff, &ssb2, 0, SEEKDIR_end, OPENMODE_out);
1827 ok(ret == 74, "expected 74 got %d\n", ret);
1828 ok(ssb2.base.pptr == ssb2.base.epptr, "wrong put pointer, expected %p got %p\n", ssb2.base.epptr, ssb2.base.pptr);
1830 call_func1(p_strstreambuf_dtor, &ssb1);
1831 call_func1(p_strstreambuf_dtor, &ssb2);
1834 static void test_stdiobuf(void)
1836 stdiobuf stb1, stb2;
1837 FILE *file1, *file2;
1838 const char filename1[] = "stdiobuf_test1";
1839 const char filename2[] = "stdiobuf_test2";
1840 int ret;
1841 char buffer[64];
1843 memset(&stb1, 0xab, sizeof(stdiobuf));
1844 memset(&stb2, 0xab, sizeof(stdiobuf));
1846 file1 = fopen(filename1, "w");
1847 fputs("Never gonna give you up, never gonna let you down", file1);
1848 fclose(file1);
1849 file1 = fopen(filename1, "r");
1850 ok(file1 != NULL, "Couldn't open the file named '%s'\n", filename1);
1851 file2 = fopen(filename2, "w+");
1852 ok(file2 != NULL, "Couldn't open the file named '%s'\n", filename2);
1854 /* constructors/destructor */
1855 call_func2(p_stdiobuf_file_ctor, &stb1, NULL);
1856 ok(stb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", stb1.base.allocated);
1857 ok(stb1.base.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", stb1.base.unbuffered);
1858 ok(stb1.file == NULL, "wrong file pointer, expected %p got %p\n", NULL, stb1.file);
1859 call_func1(p_stdiobuf_dtor, &stb1);
1860 call_func2(p_stdiobuf_file_ctor, &stb1, file1);
1861 ok(stb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", stb1.base.allocated);
1862 ok(stb1.base.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", stb1.base.unbuffered);
1863 ok(stb1.file == file1, "wrong file pointer, expected %p got %p\n", file1, stb1.file);
1864 call_func2(p_stdiobuf_file_ctor, &stb2, file2);
1865 ok(stb2.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", stb2.base.allocated);
1866 ok(stb2.base.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", stb2.base.unbuffered);
1867 ok(stb2.file == file2, "wrong file pointer, expected %p got %p\n", file2, stb2.file);
1869 /* overflow */
1870 ret = (int) call_func2(p_stdiobuf_overflow, &stb1, EOF);
1871 ok(ret == 1, "expected 1 got %d\n", ret);
1872 ret = (int) call_func2(p_stdiobuf_overflow, &stb1, 'a');
1873 ok(ret == EOF, "expected EOF got %d\n", ret);
1874 stb1.base.unbuffered = 0;
1875 ret = (int) call_func2(p_stdiobuf_overflow, &stb1, 'a');
1876 ok(ret == 1, "expected 1 got %d\n", ret);
1877 ok(stb1.base.allocated == 1, "wrong allocate value, expected 1 got %d\n", stb1.base.allocated);
1878 ok(stb1.base.ebuf == stb1.base.base + 512, "expected %p got %p\n", stb1.base.base + 512, stb1.base.ebuf);
1879 ok(stb1.base.pbase == stb1.base.base + 256, "wrong put base, expected %p got %p\n", stb1.base.base + 256, stb1.base.pbase);
1880 ok(stb1.base.pptr == stb1.base.pbase + 1, "wrong put pointer, expected %p got %p\n", stb1.base.pbase + 1, stb1.base.pptr);
1881 ok(stb1.base.epptr == stb1.base.ebuf, "wrong put end, expected %p got %p\n", stb1.base.ebuf, stb1.base.epptr);
1882 ok(*(stb1.base.pptr-1) == 'a', "expected 'a', got '%c'\n", *(stb1.base.pptr-1));
1883 ret = (int) call_func2(p_stdiobuf_overflow, &stb1, EOF);
1884 ok(ret == EOF, "expected EOF got %d\n", ret);
1885 ok(stb1.base.pptr == stb1.base.pbase + 1, "wrong put pointer, expected %p got %p\n", stb1.base.pbase + 1, stb1.base.pptr);
1886 stb1.base.pptr = stb1.base.pbase;
1887 ret = (int) call_func2(p_stdiobuf_overflow, &stb1, EOF);
1888 ok(ret == 1, "expected 1 got %d\n", ret);
1889 ok(stb1.base.pptr == stb1.base.pbase, "wrong put pointer, expected %p got %p\n", stb1.base.pbase, stb1.base.pptr);
1890 ret = (int) call_func2(p_stdiobuf_overflow, &stb1, 'b');
1891 ok(ret == 1, "expected 1 got %d\n", ret);
1892 ok(stb1.base.pptr == stb1.base.pbase + 1, "wrong put pointer, expected %p got %p\n", stb1.base.pbase + 1, stb1.base.pptr);
1893 ok(*(stb1.base.pptr-1) == 'b', "expected 'b', got '%c'\n", *(stb1.base.pptr-1));
1894 stb1.base.unbuffered = 1;
1895 ret = (int) call_func2(p_stdiobuf_overflow, &stb2, EOF);
1896 ok(ret == 1, "expected 1 got %d\n", ret);
1897 ret = (int) call_func2(p_stdiobuf_overflow, &stb2, 'a');
1898 ok(ret == 'a', "expected 'a' got %d\n", ret);
1899 stb2.base.unbuffered = 0;
1900 stb2.base.base = buffer;
1901 stb2.base.pbase = stb2.base.pptr = buffer + 32;
1902 stb2.base.ebuf = stb2.base.epptr = buffer + 64;
1903 ret = (int) call_func3(p_streambuf_xsputn, &stb2.base, "Never gonna run around", 22);
1904 ok(ret == 22, "expected 22 got %d\n", ret);
1905 ret = (int) call_func2(p_stdiobuf_overflow, &stb2, 'c');
1906 ok(ret == 1, "expected 1 got %d\n", ret);
1907 ok(stb2.base.pptr == stb2.base.pbase + 1, "wrong put pointer, expected %p got %p\n", stb2.base.pbase + 1, stb2.base.pptr);
1908 ok(*(stb2.base.pptr-1) == 'c', "expected 'c', got '%c'\n", *(stb2.base.pptr-1));
1909 stb2.base.pbase = stb2.base.pptr + 3;
1910 ret = (int) call_func2(p_stdiobuf_overflow, &stb2, 'd');
1911 ok(ret == 1, "expected 1 got %d\n", ret);
1912 ok(stb2.base.pptr == stb2.base.pbase - 2, "wrong put pointer, expected %p got %p\n", stb2.base.pbase - 2, stb2.base.pptr);
1913 ok(*(stb2.base.pptr-1) == 'd', "expected 'd', got '%c'\n", *(stb2.base.pptr-1));
1914 stb2.base.pbase = stb2.base.pptr = buffer + 32;
1915 stb2.base.epptr = buffer + 30;
1916 ret = (int) call_func2(p_stdiobuf_overflow, &stb2, 'd');
1917 ok(ret == 'd', "expected 'd' got %d\n", ret);
1918 ok(stb2.base.pptr == stb2.base.pbase, "wrong put pointer, expected %p got %p\n", stb2.base.pbase, stb2.base.pptr);
1919 stb2.base.epptr = buffer + 64;
1920 stb2.base.unbuffered = 1;
1922 /* underflow */
1923 ret = (int) call_func1(p_stdiobuf_underflow, &stb1);
1924 ok(ret == 'N', "expected 'N' got %d\n", ret);
1925 stb1.base.unbuffered = 0;
1926 ret = (int) call_func1(p_stdiobuf_underflow, &stb1);
1927 ok(ret == 'e', "expected 'e' got %d\n", ret);
1928 ok(stb1.base.eback == stb1.base.base, "wrong get base, expected %p got %p\n", stb1.base.base, stb1.base.eback);
1929 ok(stb1.base.gptr == stb1.base.egptr - 47, "wrong get pointer, expected %p got %p\n", stb1.base.egptr - 47, stb1.base.gptr);
1930 ok(stb1.base.egptr == stb1.base.base + 256, "wrong get end, expected %p got %p\n", stb1.base.base + 256, stb1.base.egptr);
1931 ok(*stb1.base.gptr == 'v', "expected 'v' got '%c'\n", *stb1.base.gptr);
1932 stb1.base.pbase = stb1.base.pptr = stb1.base.epptr = NULL;
1933 ret = (int) call_func1(p_stdiobuf_underflow, &stb1);
1934 ok(ret == 'v', "expected 'v' got %d\n", ret);
1935 ok(stb1.base.gptr == stb1.base.egptr - 46, "wrong get pointer, expected %p got %p\n", stb1.base.egptr - 46, stb1.base.gptr);
1936 stb1.base.gptr = stb1.base.egptr;
1937 ret = (int) call_func1(p_stdiobuf_underflow, &stb1);
1938 ok(ret == EOF, "expected EOF got %d\n", ret);
1939 stb1.base.unbuffered = 1;
1940 ret = (int) call_func1(p_stdiobuf_underflow, &stb1);
1941 ok(ret == EOF, "expected EOF got %d\n", ret);
1942 rewind(stb2.file);
1943 ret = (int) call_func1(p_stdiobuf_underflow, &stb2);
1944 ok(ret == 'a', "expected 'a' got %d\n", ret);
1945 stb2.base.unbuffered = 0;
1946 stb2.base.eback = stb2.base.gptr = buffer + 16;
1947 stb2.base.egptr = buffer + 32;
1948 strcpy(buffer + 16, "and desert you");
1949 ret = (int) call_func1(p_stdiobuf_underflow, &stb2);
1950 ok(ret == 'a', "expected 'a' got %d\n", ret);
1951 ok(stb2.base.gptr == buffer + 17, "wrong get pointer, expected %p got %p\n", buffer + 17, stb2.base.gptr);
1952 stb2.base.eback = buffer;
1953 stb2.base.gptr = stb2.base.egptr;
1954 stb2.base.pbase = stb2.base.pptr = stb2.base.epptr = NULL;
1955 ret = (int) call_func1(p_stdiobuf_underflow, &stb2);
1956 ok(ret == 'N', "expected 'N' got %d\n", ret);
1957 ok(stb2.base.gptr == stb2.base.egptr - 22, "wrong get pointer, expected %p got %p\n", stb2.base.egptr - 22, stb2.base.gptr);
1958 ok(ftell(stb2.file) == 24, "ftell failed\n");
1959 stb2.base.gptr = stb2.base.egptr;
1960 ret = (int) call_func1(p_stdiobuf_underflow, &stb2);
1961 ok(ret == EOF, "expected EOF got %d\n", ret);
1962 stb2.base.unbuffered = 1;
1963 ret = (int) call_func1(p_stdiobuf_underflow, &stb2);
1964 ok(ret == EOF, "expected EOF got %d\n", ret);
1966 /* sync */
1967 ret = (int) call_func1(p_stdiobuf_sync, &stb1);
1968 ok(ret == 0, "expected 0 got %d\n", ret);
1969 stb1.base.gptr = stb1.base.eback;
1970 ret = (int) call_func1(p_stdiobuf_sync, &stb1);
1971 ok(ret == 0, "expected 0 got %d\n", ret);
1972 stb1.base.unbuffered = 0;
1973 ret = (int) call_func1(p_stdiobuf_sync, &stb1);
1974 ok(ret == EOF, "expected EOF got %d\n", ret);
1975 ok(stb1.base.pbase == stb1.base.base + 256, "wrong put base, expected %p got %p\n", stb1.base.base + 256, stb1.base.pbase);
1976 ok(stb1.base.pptr == stb1.base.base + 256, "wrong put pointer, expected %p got %p\n", stb1.base.base + 256, stb1.base.pptr);
1977 ok(stb1.base.epptr == stb1.base.base + 512, "wrong put end, expected %p got %p\n", stb1.base.base + 512, stb1.base.epptr);
1978 stb1.base.gptr = stb1.base.egptr;
1979 ret = (int) call_func1(p_stdiobuf_sync, &stb1);
1980 ok(ret == 0, "expected 0 got %d\n", ret);
1981 stb1.base.eback = stb1.base.gptr = stb1.base.egptr = NULL;
1982 stb1.base.pptr = stb1.base.epptr;
1983 ret = (int) call_func1(p_stdiobuf_sync, &stb1);
1984 ok(ret == EOF, "expected EOF got %d\n", ret);
1985 ok(stb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, stb1.base.gptr);
1986 stb1.base.pptr = stb1.base.pbase;
1987 ret = (int) call_func1(p_stdiobuf_sync, &stb1);
1988 ok(ret == 0, "expected 0 got %d\n", ret);
1989 ok(stb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, stb1.base.gptr);
1990 stb1.base.unbuffered = 1;
1991 stb2.base.unbuffered = 0;
1992 stb2.base.egptr = stb2.base.ebuf;
1993 ret = (int) call_func1(p_stdiobuf_sync, &stb2);
1994 ok(ret == EOF, "expected EOF got %d\n", ret);
1995 ok(stb2.base.pbase == stb2.base.base + 32, "wrong put base, expected %p got %p\n", stb2.base.base + 32, stb2.base.pbase);
1996 ok(stb2.base.pptr == stb2.base.base + 32, "wrong put pointer, expected %p got %p\n", stb2.base.base + 32, stb2.base.pptr);
1997 ok(stb2.base.epptr == stb2.base.base + 64, "wrong put end, expected %p got %p\n", stb2.base.base + 64, stb2.base.epptr);
1998 stb2.base.egptr = stb2.base.pbase;
1999 stb2.base.gptr = stb2.base.egptr - 25;
2000 ret = (int) call_func1(p_stdiobuf_sync, &stb2);
2001 ok(ret == EOF, "expected EOF got %d\n", ret);
2002 ret = (int) call_func3(p_streambuf_xsputn, &stb2.base, "Never gonna make you cry", 24);
2003 ok(ret == 24, "expected 24 got %d\n", ret);
2004 ret = (int) call_func1(p_stdiobuf_sync, &stb2);
2005 ok(ret == 0, "expected 0 got %d\n", ret);
2006 ok(ftell(stb2.file) == 23, "ftell failed\n");
2007 ok(fseek(stb2.file, 3, SEEK_SET) == 0, "fseek failed\n");
2008 stb2.base.gptr = stb2.base.egptr - 3;
2009 strcpy(stb2.base.gptr, "a\nc");
2010 ret = (int) call_func1(p_stdiobuf_sync, &stb2);
2011 ok(ret == EOF, "expected EOF got %d\n", ret);
2012 ok(stb2.base.gptr == stb2.base.egptr - 3, "wrong get pointer, expected %p got %p\n", stb2.base.egptr - 3, stb2.base.gptr);
2013 *(stb2.base.gptr+1) = 'b';
2014 ret = (int) call_func1(p_stdiobuf_sync, &stb2);
2015 ok(ret == 0, "expected 0 got %d\n", ret);
2016 ok(stb2.base.gptr == stb2.base.egptr, "wrong get pointer, expected %p got %p\n", stb2.base.egptr, stb2.base.gptr);
2017 stb2.base.unbuffered = 1;
2019 call_func1(p_stdiobuf_dtor, &stb1);
2020 call_func1(p_stdiobuf_dtor, &stb2);
2021 fclose(file1);
2022 fclose(file2);
2023 ok(_unlink(filename1) == 0, "Couldn't unlink file named '%s'\n", filename1);
2024 ok(_unlink(filename2) == 0, "Couldn't unlink file named '%s'\n", filename2);
2027 struct ios_lock_arg
2029 ios *ios_obj;
2030 HANDLE lock;
2031 HANDLE release[3];
2034 static DWORD WINAPI lock_ios(void *arg)
2036 struct ios_lock_arg *lock_arg = arg;
2037 p_ios_lock(lock_arg->ios_obj);
2038 p_ios_lockbuf(lock_arg->ios_obj);
2039 p_ios_lockc();
2040 SetEvent(lock_arg->lock);
2041 WaitForSingleObject(lock_arg->release[0], INFINITE);
2042 p_ios_unlockc();
2043 WaitForSingleObject(lock_arg->release[1], INFINITE);
2044 p_ios_unlockbuf(lock_arg->ios_obj);
2045 WaitForSingleObject(lock_arg->release[2], INFINITE);
2046 p_ios_unlock(lock_arg->ios_obj);
2047 return 0;
2050 static void test_ios(void)
2052 ios ios_obj, ios_obj2;
2053 streambuf *psb;
2054 struct ios_lock_arg lock_arg;
2055 HANDLE thread;
2056 BOOL locked;
2057 LONG *pret, expected, ret;
2058 void **pret2;
2059 int i;
2061 memset(&ios_obj, 0xab, sizeof(ios));
2062 memset(&ios_obj2, 0xab, sizeof(ios));
2063 psb = p_operator_new(sizeof(streambuf));
2064 ok(psb != NULL, "failed to allocate streambuf object\n");
2065 call_func1(p_streambuf_ctor, psb);
2067 /* constructor/destructor */
2068 ok(*p_ios_fLockcInit == 4, "expected 4 got %d\n", *p_ios_fLockcInit);
2069 call_func2(p_ios_sb_ctor, &ios_obj, NULL);
2070 ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
2071 ok(ios_obj.state == IOSTATE_badbit, "expected %x got %x\n", IOSTATE_badbit, ios_obj.state);
2072 ok(ios_obj.special[0] == 0, "expected 0 got %d\n", ios_obj.special[0]);
2073 ok(ios_obj.special[1] == 0, "expected 0 got %d\n", ios_obj.special[1]);
2074 ok(ios_obj.delbuf == 0, "expected 0 got %d\n", ios_obj.delbuf);
2075 ok(ios_obj.tie == NULL, "expected %p got %p\n", NULL, ios_obj.tie);
2076 ok(ios_obj.flags == 0, "expected 0 got %x\n", ios_obj.flags);
2077 ok(ios_obj.precision == 6, "expected 6 got %d\n", ios_obj.precision);
2078 ok(ios_obj.fill == ' ', "expected ' ' got %d\n", ios_obj.fill);
2079 ok(ios_obj.width == 0, "expected 0 got %d\n", ios_obj.width);
2080 ok(ios_obj.do_lock == -1, "expected -1 got %d\n", ios_obj.do_lock);
2081 ok(ios_obj.lock.LockCount == -1, "expected -1 got %d\n", ios_obj.lock.LockCount);
2082 ok(*p_ios_fLockcInit == 5, "expected 5 got %d\n", *p_ios_fLockcInit);
2083 ios_obj.state = 0x8;
2084 call_func1(p_ios_dtor, &ios_obj);
2085 ok(ios_obj.state == IOSTATE_badbit, "expected %x got %x\n", IOSTATE_badbit, ios_obj.state);
2086 ok(*p_ios_fLockcInit == 4, "expected 4 got %d\n", *p_ios_fLockcInit);
2087 ios_obj.state = 0x8;
2088 call_func2(p_ios_sb_ctor, &ios_obj, psb);
2089 ok(ios_obj.sb == psb, "expected %p got %p\n", psb, ios_obj.sb);
2090 ok(ios_obj.state == IOSTATE_goodbit, "expected %x got %x\n", IOSTATE_goodbit, ios_obj.state);
2091 ok(ios_obj.delbuf == 0, "expected 0 got %d\n", ios_obj.delbuf);
2092 ok(*p_ios_fLockcInit == 5, "expected 5 got %d\n", *p_ios_fLockcInit);
2093 ios_obj.state = 0x8;
2094 call_func1(p_ios_dtor, &ios_obj);
2095 ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
2096 ok(ios_obj.state == IOSTATE_badbit, "expected %x got %x\n", IOSTATE_badbit, ios_obj.state);
2097 ok(*p_ios_fLockcInit == 4, "expected 4 got %d\n", *p_ios_fLockcInit);
2098 ios_obj.sb = psb;
2099 ios_obj.state = 0x8;
2100 call_func1(p_ios_ctor, &ios_obj);
2101 ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
2102 ok(ios_obj.state == IOSTATE_badbit, "expected %x got %x\n", IOSTATE_badbit, ios_obj.state);
2103 ok(*p_ios_fLockcInit == 5, "expected 5 got %d\n", *p_ios_fLockcInit);
2105 /* init */
2106 ios_obj.state |= 0x8;
2107 call_func2(p_ios_init, &ios_obj, psb);
2108 ok(ios_obj.sb == psb, "expected %p got %p\n", psb, ios_obj.sb);
2109 ok(ios_obj.state == 0x8, "expected %x got %x\n", 0x8, ios_obj.state);
2110 call_func2(p_ios_init, &ios_obj, NULL);
2111 ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
2112 ok(ios_obj.state == (0x8|IOSTATE_badbit), "expected %x got %x\n", (0x8|IOSTATE_badbit), ios_obj.state);
2113 ios_obj.sb = psb;
2114 ios_obj.delbuf = 0;
2115 call_func2(p_ios_init, &ios_obj, psb);
2116 ok(ios_obj.sb == psb, "expected %p got %p\n", psb, ios_obj.sb);
2117 ok(ios_obj.state == 0x8, "expected %x got %x\n", 0x8, ios_obj.state);
2118 call_func1(p_ios_dtor, &ios_obj);
2120 /* copy constructor */
2121 call_func2(p_ios_copy_ctor, &ios_obj, &ios_obj2);
2122 ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
2123 ok(ios_obj.state == (ios_obj2.state|IOSTATE_badbit), "expected %x got %x\n", (ios_obj2.state|IOSTATE_badbit), ios_obj.state);
2124 ok(ios_obj.delbuf == 0, "expected 0 got %d\n", ios_obj.delbuf);
2125 ok(ios_obj.tie == ios_obj2.tie, "expected %p got %p\n", ios_obj2.tie, ios_obj.tie);
2126 ok(ios_obj.flags == ios_obj2.flags, "expected %x got %x\n", ios_obj2.flags, ios_obj.flags);
2127 ok(ios_obj.precision == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.precision);
2128 ok(ios_obj.fill == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.fill);
2129 ok(ios_obj.width == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.width);
2130 ok(ios_obj.do_lock == -1, "expected -1 got %d\n", ios_obj.do_lock);
2131 ok(*p_ios_fLockcInit == 5, "expected 5 got %d\n", *p_ios_fLockcInit);
2133 /* assignment */
2134 ios_obj.state = 0x8;
2135 ios_obj.delbuf = 2;
2136 ios_obj.tie = NULL;
2137 ios_obj.flags = 0;
2138 ios_obj.precision = 6;
2139 ios_obj.fill = ' ';
2140 ios_obj.width = 0;
2141 ios_obj.do_lock = 2;
2142 call_func2(p_ios_assign, &ios_obj, &ios_obj2);
2143 ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
2144 ok(ios_obj.state == (ios_obj2.state|IOSTATE_badbit), "expected %x got %x\n", (ios_obj2.state|IOSTATE_badbit), ios_obj.state);
2145 ok(ios_obj.delbuf == 2, "expected 2 got %d\n", ios_obj.delbuf);
2146 ok(ios_obj.tie == ios_obj2.tie, "expected %p got %p\n", ios_obj2.tie, ios_obj.tie);
2147 ok(ios_obj.flags == ios_obj2.flags, "expected %x got %x\n", ios_obj2.flags, ios_obj.flags);
2148 ok(ios_obj.precision == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.precision);
2149 ok(ios_obj.fill == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.fill);
2150 ok(ios_obj.width == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.width);
2151 ok(ios_obj.do_lock == 2, "expected 2 got %d\n", ios_obj.do_lock);
2153 /* locking */
2154 ios_obj.sb = psb;
2155 ios_obj.do_lock = 1;
2156 ios_obj.sb->do_lock = 0;
2157 p_ios_clrlock(&ios_obj);
2158 ok(ios_obj.do_lock == 1, "expected 1 got %d\n", ios_obj.do_lock);
2159 ok(ios_obj.sb->do_lock == 1, "expected 1 got %d\n", ios_obj.sb->do_lock);
2160 ios_obj.do_lock = 0;
2161 p_ios_clrlock(&ios_obj);
2162 ok(ios_obj.do_lock == 1, "expected 1 got %d\n", ios_obj.do_lock);
2163 ok(ios_obj.sb->do_lock == 1, "expected 1 got %d\n", ios_obj.sb->do_lock);
2164 p_ios_setlock(&ios_obj);
2165 ok(ios_obj.do_lock == 0, "expected 0 got %d\n", ios_obj.do_lock);
2166 ok(ios_obj.sb->do_lock == 0, "expected 0 got %d\n", ios_obj.sb->do_lock);
2167 ios_obj.do_lock = -1;
2168 p_ios_setlock(&ios_obj);
2169 ok(ios_obj.do_lock == -2, "expected -2 got %d\n", ios_obj.do_lock);
2170 ok(ios_obj.sb->do_lock == -1, "expected -1 got %d\n", ios_obj.sb->do_lock);
2172 lock_arg.ios_obj = &ios_obj;
2173 lock_arg.lock = CreateEventW(NULL, FALSE, FALSE, NULL);
2174 ok(lock_arg.lock != NULL, "CreateEventW failed\n");
2175 lock_arg.release[0] = CreateEventW(NULL, FALSE, FALSE, NULL);
2176 ok(lock_arg.release[0] != NULL, "CreateEventW failed\n");
2177 lock_arg.release[1] = CreateEventW(NULL, FALSE, FALSE, NULL);
2178 ok(lock_arg.release[1] != NULL, "CreateEventW failed\n");
2179 lock_arg.release[2] = CreateEventW(NULL, FALSE, FALSE, NULL);
2180 ok(lock_arg.release[2] != NULL, "CreateEventW failed\n");
2181 thread = CreateThread(NULL, 0, lock_ios, (void*)&lock_arg, 0, NULL);
2182 ok(thread != NULL, "CreateThread failed\n");
2183 WaitForSingleObject(lock_arg.lock, INFINITE);
2185 locked = TryEnterCriticalSection(&ios_obj.lock);
2186 ok(locked == 0, "the ios object was not locked before\n");
2187 locked = TryEnterCriticalSection(&ios_obj.sb->lock);
2188 ok(locked == 0, "the streambuf was not locked before\n");
2189 locked = TryEnterCriticalSection(p_ios_static_lock);
2190 ok(locked == 0, "the static critical section was not locked before\n");
2192 /* flags */
2193 ios_obj.flags = 0x8000;
2194 ret = (LONG) call_func1(p_ios_flags_get, &ios_obj);
2195 ok(ret == 0x8000, "expected %x got %x\n", 0x8000, ret);
2196 ret = (LONG) call_func2(p_ios_flags_set, &ios_obj, 0x444);
2197 ok(ret == 0x8000, "expected %x got %x\n", 0x8000, ret);
2198 ok(ios_obj.flags == 0x444, "expected %x got %x\n", 0x444, ios_obj.flags);
2199 ret = (LONG) call_func2(p_ios_flags_set, &ios_obj, 0);
2200 ok(ret == 0x444, "expected %x got %x\n", 0x444, ret);
2201 ok(ios_obj.flags == 0, "expected %x got %x\n", 0, ios_obj.flags);
2203 /* setf */
2204 ios_obj.do_lock = 0;
2205 ios_obj.flags = 0x8400;
2206 ret = (LONG) call_func2(p_ios_setf, &ios_obj, 0x444);
2207 ok(ret == 0x8400, "expected %x got %x\n", 0x8400, ret);
2208 ok(ios_obj.flags == 0x8444, "expected %x got %x\n", 0x8444, ios_obj.flags);
2209 ret = (LONG) call_func3(p_ios_setf_mask, &ios_obj, 0x111, 0);
2210 ok(ret == 0x8444, "expected %x got %x\n", 0x8444, ret);
2211 ok(ios_obj.flags == 0x8444, "expected %x got %x\n", 0x8444, ios_obj.flags);
2212 ret = (LONG) call_func3(p_ios_setf_mask, &ios_obj, 0x111, 0x105);
2213 ok(ret == 0x8444, "expected %x got %x\n", 0x8444, ret);
2214 ok(ios_obj.flags == 0x8541, "expected %x got %x\n", 0x8541, ios_obj.flags);
2216 /* unsetf */
2217 ret = (LONG) call_func2(p_ios_unsetf, &ios_obj, 0x1111);
2218 ok(ret == 0x8541, "expected %x got %x\n", 0x8541, ret);
2219 ok(ios_obj.flags == 0x8440, "expected %x got %x\n", 0x8440, ios_obj.flags);
2220 ret = (LONG) call_func2(p_ios_unsetf, &ios_obj, 0x8008);
2221 ok(ret == 0x8440, "expected %x got %x\n", 0x8440, ret);
2222 ok(ios_obj.flags == 0x440, "expected %x got %x\n", 0x440, ios_obj.flags);
2223 ios_obj.do_lock = -1;
2225 /* state */
2226 ios_obj.state = 0x8;
2227 ret = (LONG) call_func1(p_ios_good, &ios_obj);
2228 ok(ret == 0, "expected 0 got %d\n", ret);
2229 ios_obj.state = IOSTATE_goodbit;
2230 ret = (LONG) call_func1(p_ios_good, &ios_obj);
2231 ok(ret == 1, "expected 1 got %d\n", ret);
2232 ret = (LONG) call_func1(p_ios_bad, &ios_obj);
2233 ok(ret == 0, "expected 0 got %d\n", ret);
2234 ios_obj.state = (IOSTATE_eofbit|IOSTATE_badbit);
2235 ret = (LONG) call_func1(p_ios_bad, &ios_obj);
2236 ok(ret == IOSTATE_badbit, "expected 4 got %d\n", ret);
2237 ret = (LONG) call_func1(p_ios_eof, &ios_obj);
2238 ok(ret == IOSTATE_eofbit, "expected 1 got %d\n", ret);
2239 ios_obj.state = 0x8;
2240 ret = (LONG) call_func1(p_ios_eof, &ios_obj);
2241 ok(ret == 0, "expected 0 got %d\n", ret);
2242 ret = (LONG) call_func1(p_ios_fail, &ios_obj);
2243 ok(ret == 0, "expected 0 got %d\n", ret);
2244 ios_obj.state = IOSTATE_badbit;
2245 ret = (LONG) call_func1(p_ios_fail, &ios_obj);
2246 ok(ret == IOSTATE_badbit, "expected 4 got %d\n", ret);
2247 ios_obj.state = (IOSTATE_eofbit|IOSTATE_failbit);
2248 ret = (LONG) call_func1(p_ios_fail, &ios_obj);
2249 ok(ret == IOSTATE_failbit, "expected 2 got %d\n", ret);
2250 ios_obj.state = (IOSTATE_eofbit|IOSTATE_failbit|IOSTATE_badbit);
2251 ret = (LONG) call_func1(p_ios_fail, &ios_obj);
2252 ok(ret == (IOSTATE_failbit|IOSTATE_badbit), "expected 6 got %d\n", ret);
2253 ios_obj.do_lock = 0;
2254 call_func2(p_ios_clear, &ios_obj, 0);
2255 ok(ios_obj.state == IOSTATE_goodbit, "expected 0 got %d\n", ios_obj.state);
2256 call_func2(p_ios_clear, &ios_obj, 0x8|IOSTATE_eofbit);
2257 ok(ios_obj.state == (0x8|IOSTATE_eofbit), "expected 9 got %d\n", ios_obj.state);
2258 ios_obj.do_lock = -1;
2260 SetEvent(lock_arg.release[0]);
2262 /* bitalloc */
2263 expected = 0x10000;
2264 for (i = 0; i < 20; i++) {
2265 ret = p_ios_bitalloc();
2266 ok(ret == expected, "expected %x got %x\n", expected, ret);
2267 ok(*p_ios_maxbit == expected, "expected %x got %x\n", expected, *p_ios_maxbit);
2268 expected <<= 1;
2271 /* xalloc/pword/iword */
2272 ok(*p_ios_curindex == -1, "expected -1 got %d\n", *p_ios_curindex);
2273 expected = 0;
2274 for (i = 0; i < 8; i++) {
2275 ret = p_ios_xalloc();
2276 ok(ret == expected, "expected %d got %d\n", expected, ret);
2277 ok(*p_ios_curindex == expected, "expected %d got %d\n", expected, *p_ios_curindex);
2278 pret = (LONG*) call_func2(p_ios_iword, &ios_obj, ret);
2279 ok(pret == &p_ios_statebuf[ret], "expected %p got %p\n", &p_ios_statebuf[ret], pret);
2280 ok(*pret == 0, "expected 0 got %d\n", *pret);
2281 pret2 = (void**) call_func2(p_ios_pword, &ios_obj, ret);
2282 ok(pret2 == (void**)&p_ios_statebuf[ret], "expected %p got %p\n", (void**)&p_ios_statebuf[ret], pret2);
2283 expected++;
2285 ret = p_ios_xalloc();
2286 ok(ret == -1, "expected -1 got %d\n", ret);
2287 ok(*p_ios_curindex == 7, "expected 7 got %d\n", *p_ios_curindex);
2289 SetEvent(lock_arg.release[1]);
2290 SetEvent(lock_arg.release[2]);
2291 WaitForSingleObject(thread, INFINITE);
2293 ios_obj.delbuf = 1;
2294 call_func1(p_ios_dtor, &ios_obj);
2295 ok(ios_obj.state == IOSTATE_badbit, "expected %x got %x\n", IOSTATE_badbit, ios_obj.state);
2296 ok(*p_ios_fLockcInit == 4, "expected 4 got %d\n", *p_ios_fLockcInit);
2297 CloseHandle(lock_arg.lock);
2298 CloseHandle(lock_arg.release[0]);
2299 CloseHandle(lock_arg.release[1]);
2300 CloseHandle(lock_arg.release[2]);
2301 CloseHandle(thread);
2304 START_TEST(msvcirt)
2306 if(!init())
2307 return;
2309 test_streambuf();
2310 test_filebuf();
2311 test_strstreambuf();
2312 test_stdiobuf();
2313 test_ios();
2315 FreeLibrary(msvcrt);
2316 FreeLibrary(msvcirt);