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
24 #include "wine/test.h"
26 typedef void (*vtable_ptr
)(void);
27 typedef LONG streamoff
;
28 typedef LONG streampos
;
30 typedef void* (__cdecl
*allocFunction
)(LONG
);
31 typedef void (__cdecl
*freeFunction
)(void*);
34 IOSTATE_goodbit
= 0x0,
36 IOSTATE_failbit
= 0x2,
45 OPENMODE_trunc
= 0x10,
46 OPENMODE_nocreate
= 0x20,
47 OPENMODE_noreplace
= 0x40,
48 OPENMODE_binary
= 0x80
65 FLAGS_showbase
= 0x80,
66 FLAGS_showpoint
= 0x100,
67 FLAGS_uppercase
= 0x200,
68 FLAGS_showpos
= 0x400,
69 FLAGS_scientific
= 0x800,
71 FLAGS_unitbuf
= 0x2000,
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
;
84 const vtable_ptr
*vtable
;
97 CRITICAL_SECTION lock
;
107 /* class strstreambuf */
114 allocFunction f_alloc
;
127 const vtable_ptr
*vtable
;
132 struct _ostream
*tie
;
138 CRITICAL_SECTION lock
;
142 typedef struct _ostream
{
143 const vtable_ptr
*vtable
;
148 #define __thiscall __stdcall
150 #define __thiscall __cdecl
153 static void* (__cdecl
*p_operator_new
)(unsigned int);
154 static void (__cdecl
*p_operator_delete
)(void*);
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);
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);
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
*);
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
*);
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 */
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 */
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
,
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), \
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))
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");
316 win_skip("msvcirt.dll not installed\n");
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");
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();
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
;
509 static int __thiscall
test_streambuf_overflow(int ch
)
511 static int __thiscall
test_streambuf_overflow(streambuf
*this, int ch
)
515 if (ch
== 'L') /* simulate a failure */
517 if (!test_this
->unbuffered
)
518 test_this
->pptr
= test_this
->pbase
+ 5;
523 static int __thiscall
test_streambuf_underflow(void)
525 static int __thiscall
test_streambuf_underflow(streambuf
*this)
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
;
534 return get_end
? EOF
: *(test_this
->gptr
= test_this
->eback
);
538 struct streambuf_lock_arg
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
);
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
;
574 memset(&sb
, 0xab, sizeof(streambuf
));
575 memset(&sb2
, 0xab, sizeof(streambuf
));
576 memset(&sb3
, 0xab, sizeof(streambuf
));
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;
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
);
613 call_func1(p_streambuf_setlock
, &sb
);
614 ok(sb
.do_lock
== 2, "expected do_lock value 2, got %d\n", sb
.do_lock
);
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
);
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");
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
);
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
);
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");
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");
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
);
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
);
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
);
699 ret
= (int) call_func1(p_streambuf_allocate
, &sb
);
700 ok(ret
== 0, "wrong return value, expected 0 got %d\n", ret
);
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
);
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 */
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
);
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
);
745 ret
= (int) call_func1(p_streambuf_sync
, &sb
);
746 ok(ret
== EOF
, "sync failed, expected EOF got %d\n", ret
);
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
);
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
);
767 strcpy(sb2
.eback
, "WorstTestEver");
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
);
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
;
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
);
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
);
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
);
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
;
815 sb2
.gptr
= sb2
.egptr
= sb2
.eback
+ 13;
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");
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);
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");
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);
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
);
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;
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");
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);
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
);
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");
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
;
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");
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");
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);
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
);
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;
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");
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
;
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");
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");
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");
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
);
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");
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");
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");
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
);
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
;
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
);
1061 static void test_filebuf(void)
1063 filebuf fb1
, fb2
, fb3
, *pret
;
1064 struct filebuf_lock_arg lock_arg
;
1066 const char filename1
[] = "test1";
1067 const char filename2
[] = "test2";
1068 const char filename3
[] = "test3";
1069 char read_buffer
[16];
1072 memset(&fb1
, 0xab, sizeof(filebuf
));
1073 memset(&fb2
, 0xab, sizeof(filebuf
));
1074 memset(&fb3
, 0xab, sizeof(filebuf
));
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
);
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;
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
);
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;
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
);
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");
1206 ok(!strncmp(read_buffer
, "file1app", 8), "wrong contents, expected 'file1app' got '%s'\n", read_buffer
);
1207 fb1
.base
.do_lock
= -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*/
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;
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;
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
;
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
);
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
);
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
);
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
);
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
);
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
;
1463 char buffer
[64], *pbuffer
;
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
);
1576 call_func2(p_strstreambuf_freeze
, &ssb1
, 0);
1577 ok(ssb1
.dynamic
== 0, "expected 0, got %d\n", ssb1
.dynamic
);
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
);
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
);
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
;
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");
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
);
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
);
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
);
1671 ret
= (int) call_func2(p_strstreambuf_overflow
, &ssb2
, 'C');
1672 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
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));
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));
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
;
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";
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
);
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
);
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;
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
);
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
);
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
);
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
);
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
);
2040 SetEvent(lock_arg
->lock
);
2041 WaitForSingleObject(lock_arg
->release
[0], INFINITE
);
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
);
2050 static void test_ios(void)
2052 ios ios_obj
, ios_obj2
;
2054 struct ios_lock_arg lock_arg
;
2057 LONG
*pret
, expected
, ret
;
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
);
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
);
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
);
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
);
2134 ios_obj
.state
= 0x8;
2138 ios_obj
.precision
= 6;
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
);
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");
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
);
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
);
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;
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]);
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
);
2271 /* xalloc/pword/iword */
2272 ok(*p_ios_curindex
== -1, "expected -1 got %d\n", *p_ios_curindex
);
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
);
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
);
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
);
2311 test_strstreambuf();
2315 FreeLibrary(msvcrt
);
2316 FreeLibrary(msvcirt
);