2 * Copyright 2015-2016 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
25 #include "wine/test.h"
27 typedef void (*vtable_ptr
)(void);
28 typedef LONG streamoff
;
29 typedef LONG streampos
;
31 typedef void* (__cdecl
*allocFunction
)(LONG
);
32 typedef void (__cdecl
*freeFunction
)(void*);
35 IOSTATE_goodbit
= 0x0,
37 IOSTATE_failbit
= 0x2,
46 OPENMODE_trunc
= 0x10,
47 OPENMODE_nocreate
= 0x20,
48 OPENMODE_noreplace
= 0x40,
49 OPENMODE_binary
= 0x80
66 FLAGS_showbase
= 0x80,
67 FLAGS_showpoint
= 0x100,
68 FLAGS_uppercase
= 0x200,
69 FLAGS_showpos
= 0x400,
70 FLAGS_scientific
= 0x800,
72 FLAGS_unitbuf
= 0x2000,
76 const int filebuf_sh_none
= 0x800;
77 const int filebuf_sh_read
= 0xa00;
78 const int filebuf_sh_write
= 0xc00;
79 const int filebuf_openprot
= 420;
80 const int filebuf_binary
= _O_BINARY
;
81 const int filebuf_text
= _O_TEXT
;
85 const vtable_ptr
*vtable
;
98 CRITICAL_SECTION lock
;
108 /* class strstreambuf */
115 allocFunction f_alloc
;
128 const vtable_ptr
*vtable
;
133 struct _ostream
*tie
;
139 CRITICAL_SECTION lock
;
143 typedef struct _ostream
{
146 ios base_ios
; /* virtually inherited */
149 static inline float __port_infinity(void)
151 static const unsigned __inf_bytes
= 0x7f800000;
152 return *(const float *)&__inf_bytes
;
154 #define INFINITY __port_infinity()
156 static inline float __port_nan(void)
158 static const unsigned __nan_bytes
= 0x7fc00000;
159 return *(const float *)&__nan_bytes
;
161 #define NAN __port_nan()
165 #define __thiscall __stdcall
167 #define __thiscall __cdecl
170 static void* (__cdecl
*p_operator_new
)(unsigned int);
171 static void (__cdecl
*p_operator_delete
)(void*);
174 static streambuf
* (*__thiscall p_streambuf_reserve_ctor
)(streambuf
*, char*, int);
175 static streambuf
* (*__thiscall p_streambuf_ctor
)(streambuf
*);
176 static void (*__thiscall p_streambuf_dtor
)(streambuf
*);
177 static int (*__thiscall p_streambuf_allocate
)(streambuf
*);
178 static void (*__thiscall p_streambuf_clrclock
)(streambuf
*);
179 static int (*__thiscall p_streambuf_doallocate
)(streambuf
*);
180 static void (*__thiscall p_streambuf_gbump
)(streambuf
*, int);
181 static void (*__thiscall p_streambuf_lock
)(streambuf
*);
182 static int (*__thiscall p_streambuf_pbackfail
)(streambuf
*, int);
183 static void (*__thiscall p_streambuf_pbump
)(streambuf
*, int);
184 static int (*__thiscall p_streambuf_sbumpc
)(streambuf
*);
185 static void (*__thiscall p_streambuf_setb
)(streambuf
*, char*, char*, int);
186 static void (*__thiscall p_streambuf_setlock
)(streambuf
*);
187 static streambuf
* (*__thiscall p_streambuf_setbuf
)(streambuf
*, char*, int);
188 static int (*__thiscall p_streambuf_sgetc
)(streambuf
*);
189 static int (*__thiscall p_streambuf_snextc
)(streambuf
*);
190 static int (*__thiscall p_streambuf_sputc
)(streambuf
*, int);
191 static void (*__thiscall p_streambuf_stossc
)(streambuf
*);
192 static int (*__thiscall p_streambuf_sync
)(streambuf
*);
193 static void (*__thiscall p_streambuf_unlock
)(streambuf
*);
194 static int (*__thiscall p_streambuf_xsgetn
)(streambuf
*, char*, int);
195 static int (*__thiscall p_streambuf_xsputn
)(streambuf
*, const char*, int);
198 static filebuf
* (*__thiscall p_filebuf_fd_ctor
)(filebuf
*, int);
199 static filebuf
* (*__thiscall p_filebuf_fd_reserve_ctor
)(filebuf
*, int, char*, int);
200 static filebuf
* (*__thiscall p_filebuf_ctor
)(filebuf
*);
201 static void (*__thiscall p_filebuf_dtor
)(filebuf
*);
202 static filebuf
* (*__thiscall p_filebuf_attach
)(filebuf
*, filedesc
);
203 static filebuf
* (*__thiscall p_filebuf_open
)(filebuf
*, const char*, ios_open_mode
, int);
204 static filebuf
* (*__thiscall p_filebuf_close
)(filebuf
*);
205 static int (*__thiscall p_filebuf_setmode
)(filebuf
*, int);
206 static streambuf
* (*__thiscall p_filebuf_setbuf
)(filebuf
*, char*, int);
207 static int (*__thiscall p_filebuf_sync
)(filebuf
*);
208 static int (*__thiscall p_filebuf_overflow
)(filebuf
*, int);
209 static int (*__thiscall p_filebuf_underflow
)(filebuf
*);
210 static streampos (*__thiscall p_filebuf_seekoff
)(filebuf
*, streamoff
, ios_seek_dir
, int);
213 static strstreambuf
* (*__thiscall p_strstreambuf_dynamic_ctor
)(strstreambuf
*, int);
214 static strstreambuf
* (*__thiscall p_strstreambuf_funcs_ctor
)(strstreambuf
*, allocFunction
, freeFunction
);
215 static strstreambuf
* (*__thiscall p_strstreambuf_buffer_ctor
)(strstreambuf
*, char*, int, char*);
216 static strstreambuf
* (*__thiscall p_strstreambuf_ubuffer_ctor
)(strstreambuf
*, unsigned char*, int, unsigned char*);
217 static strstreambuf
* (*__thiscall p_strstreambuf_ctor
)(strstreambuf
*);
218 static void (*__thiscall p_strstreambuf_dtor
)(strstreambuf
*);
219 static int (*__thiscall p_strstreambuf_doallocate
)(strstreambuf
*);
220 static void (*__thiscall p_strstreambuf_freeze
)(strstreambuf
*, int);
221 static int (*__thiscall p_strstreambuf_overflow
)(strstreambuf
*, int);
222 static streampos (*__thiscall p_strstreambuf_seekoff
)(strstreambuf
*, streamoff
, ios_seek_dir
, int);
223 static streambuf
* (*__thiscall p_strstreambuf_setbuf
)(strstreambuf
*, char*, int);
224 static int (*__thiscall p_strstreambuf_underflow
)(strstreambuf
*);
227 static stdiobuf
* (*__thiscall p_stdiobuf_file_ctor
)(stdiobuf
*, FILE*);
228 static void (*__thiscall p_stdiobuf_dtor
)(stdiobuf
*);
229 static int (*__thiscall p_stdiobuf_overflow
)(stdiobuf
*, int);
230 static int (*__thiscall p_stdiobuf_pbackfail
)(stdiobuf
*, int);
231 static streampos (*__thiscall p_stdiobuf_seekoff
)(stdiobuf
*, streamoff
, ios_seek_dir
, int);
232 static int (*__thiscall p_stdiobuf_setrwbuf
)(stdiobuf
*, int, int);
233 static int (*__thiscall p_stdiobuf_sync
)(stdiobuf
*);
234 static int (*__thiscall p_stdiobuf_underflow
)(stdiobuf
*);
237 static ios
* (*__thiscall p_ios_copy_ctor
)(ios
*, const ios
*);
238 static ios
* (*__thiscall p_ios_ctor
)(ios
*);
239 static ios
* (*__thiscall p_ios_sb_ctor
)(ios
*, streambuf
*);
240 static ios
* (*__thiscall p_ios_assign
)(ios
*, const ios
*);
241 static void (*__thiscall p_ios_init
)(ios
*, streambuf
*);
242 static void (*__thiscall p_ios_dtor
)(ios
*);
243 static void (*__cdecl p_ios_clrlock
)(ios
*);
244 static void (*__cdecl p_ios_setlock
)(ios
*);
245 static void (*__cdecl p_ios_lock
)(ios
*);
246 static void (*__cdecl p_ios_unlock
)(ios
*);
247 static void (*__cdecl p_ios_lockbuf
)(ios
*);
248 static void (*__cdecl p_ios_unlockbuf
)(ios
*);
249 static CRITICAL_SECTION
*p_ios_static_lock
;
250 static void (*__cdecl p_ios_lockc
)(void);
251 static void (*__cdecl p_ios_unlockc
)(void);
252 static LONG (*__thiscall p_ios_flags_set
)(ios
*, LONG
);
253 static LONG (*__thiscall p_ios_flags_get
)(const ios
*);
254 static LONG (*__thiscall p_ios_setf
)(ios
*, LONG
);
255 static LONG (*__thiscall p_ios_setf_mask
)(ios
*, LONG
, LONG
);
256 static LONG (*__thiscall p_ios_unsetf
)(ios
*, LONG
);
257 static int (*__thiscall p_ios_good
)(const ios
*);
258 static int (*__thiscall p_ios_bad
)(const ios
*);
259 static int (*__thiscall p_ios_eof
)(const ios
*);
260 static int (*__thiscall p_ios_fail
)(const ios
*);
261 static void (*__thiscall p_ios_clear
)(ios
*, int);
262 static LONG
*p_ios_maxbit
;
263 static LONG (*__cdecl p_ios_bitalloc
)(void);
264 static int *p_ios_curindex
;
265 static LONG
*p_ios_statebuf
;
266 static LONG
* (*__thiscall p_ios_iword
)(const ios
*, int);
267 static void** (*__thiscall p_ios_pword
)(const ios
*, int);
268 static int (*__cdecl p_ios_xalloc
)(void);
269 static int *p_ios_fLockcInit
;
272 static ostream
* (*__thiscall p_ostream_copy_ctor
)(ostream
*, const ostream
*, BOOL
);
273 static ostream
* (*__thiscall p_ostream_sb_ctor
)(ostream
*, streambuf
*, BOOL
);
274 static ostream
* (*__thiscall p_ostream_ctor
)(ostream
*, BOOL
);
275 static void (*__thiscall p_ostream_dtor
)(ios
*);
276 static ostream
* (*__thiscall p_ostream_assign
)(ostream
*, const ostream
*);
277 static ostream
* (*__thiscall p_ostream_assign_sb
)(ostream
*, streambuf
*);
278 static void (*__thiscall p_ostream_vbase_dtor
)(ostream
*);
279 static ostream
* (*__thiscall p_ostream_flush
)(ostream
*);
280 static int (*__thiscall p_ostream_opfx
)(ostream
*);
281 static void (*__thiscall p_ostream_osfx
)(ostream
*);
282 static ostream
* (*__thiscall p_ostream_put_char
)(ostream
*, char);
283 static ostream
* (*__thiscall p_ostream_write_char
)(ostream
*, const char*, int);
284 static ostream
* (*__thiscall p_ostream_seekp_offset
)(ostream
*, streamoff
, ios_seek_dir
);
285 static ostream
* (*__thiscall p_ostream_seekp
)(ostream
*, streampos
);
286 static streampos (*__thiscall p_ostream_tellp
)(ostream
*);
287 static ostream
* (*__thiscall p_ostream_writepad
)(ostream
*, const char*, const char*);
288 static ostream
* (*__thiscall p_ostream_print_char
)(ostream
*, char);
289 static ostream
* (*__thiscall p_ostream_print_str
)(ostream
*, const char*);
290 static ostream
* (*__thiscall p_ostream_print_int
)(ostream
*, int);
291 static ostream
* (*__thiscall p_ostream_print_float
)(ostream
*, float);
292 static ostream
* (*__thiscall p_ostream_print_double
)(ostream
*, double);
293 static ostream
* (*__thiscall p_ostream_print_ptr
)(ostream
*, const void*);
294 static ostream
* (*__thiscall p_ostream_print_streambuf
)(ostream
*, streambuf
*);
296 /* Emulate a __thiscall */
299 #include "pshpack1.h"
300 struct thiscall_thunk
302 BYTE pop_eax
; /* popl %eax (ret addr) */
303 BYTE pop_edx
; /* popl %edx (func) */
304 BYTE pop_ecx
; /* popl %ecx (this) */
305 BYTE push_eax
; /* pushl %eax */
306 WORD jmp_edx
; /* jmp *%edx */
310 static void * (WINAPI
*call_thiscall_func1
)( void *func
, void *this );
311 static void * (WINAPI
*call_thiscall_func2
)( void *func
, void *this, const void *a
);
312 static void * (WINAPI
*call_thiscall_func3
)( void *func
, void *this, const void *a
, const void *b
);
313 static void * (WINAPI
*call_thiscall_func4
)( void *func
, void *this, const void *a
, const void *b
,
315 static void * (WINAPI
*call_thiscall_func5
)( void *func
, void *this, const void *a
, const void *b
,
316 const void *c
, const void *d
);
317 static void * (WINAPI
*call_thiscall_func2_ptr_dbl
)( void *func
, void *this, double a
);
318 static void * (WINAPI
*call_thiscall_func2_ptr_flt
)( void *func
, void *this, float a
);
320 static void init_thiscall_thunk(void)
322 struct thiscall_thunk
*thunk
= VirtualAlloc( NULL
, sizeof(*thunk
),
323 MEM_COMMIT
, PAGE_EXECUTE_READWRITE
);
324 thunk
->pop_eax
= 0x58; /* popl %eax */
325 thunk
->pop_edx
= 0x5a; /* popl %edx */
326 thunk
->pop_ecx
= 0x59; /* popl %ecx */
327 thunk
->push_eax
= 0x50; /* pushl %eax */
328 thunk
->jmp_edx
= 0xe2ff; /* jmp *%edx */
329 call_thiscall_func1
= (void *)thunk
;
330 call_thiscall_func2
= (void *)thunk
;
331 call_thiscall_func3
= (void *)thunk
;
332 call_thiscall_func4
= (void *)thunk
;
333 call_thiscall_func5
= (void *)thunk
;
334 call_thiscall_func2_ptr_dbl
= (void *)thunk
;
335 call_thiscall_func2_ptr_flt
= (void *)thunk
;
338 #define call_func1(func,_this) call_thiscall_func1(func,_this)
339 #define call_func2(func,_this,a) call_thiscall_func2(func,_this,(const void*)(a))
340 #define call_func3(func,_this,a,b) call_thiscall_func3(func,_this,(const void*)(a),(const void*)(b))
341 #define call_func4(func,_this,a,b,c) call_thiscall_func4(func,_this,(const void*)(a),(const void*)(b), \
343 #define call_func5(func,_this,a,b,c,d) call_thiscall_func5(func,_this,(const void*)(a),(const void*)(b), \
344 (const void*)(c), (const void *)(d))
345 #define call_func2_ptr_dbl(func,_this,a) call_thiscall_func2_ptr_dbl(func,_this,a)
346 #define call_func2_ptr_flt(func,_this,a) call_thiscall_func2_ptr_flt(func,_this,a)
350 #define init_thiscall_thunk()
351 #define call_func1(func,_this) func(_this)
352 #define call_func2(func,_this,a) func(_this,a)
353 #define call_func3(func,_this,a,b) func(_this,a,b)
354 #define call_func4(func,_this,a,b,c) func(_this,a,b,c)
355 #define call_func5(func,_this,a,b,c,d) func(_this,a,b,c,d)
356 #define call_func2_ptr_dbl call_func2
357 #define call_func2_ptr_flt call_func2
359 #endif /* __i386__ */
361 static HMODULE msvcrt
, msvcirt
;
362 #define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcirt,y)
363 #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0)
364 static BOOL
init(void)
366 msvcrt
= LoadLibraryA("msvcrt.dll");
367 msvcirt
= LoadLibraryA("msvcirt.dll");
369 win_skip("msvcirt.dll not installed\n");
373 if(sizeof(void*) == 8) { /* 64-bit initialization */
374 p_operator_new
= (void*)GetProcAddress(msvcrt
, "??2@YAPEAX_K@Z");
375 p_operator_delete
= (void*)GetProcAddress(msvcrt
, "??3@YAXPEAX@Z");
377 SET(p_streambuf_reserve_ctor
, "??0streambuf@@IEAA@PEADH@Z");
378 SET(p_streambuf_ctor
, "??0streambuf@@IEAA@XZ");
379 SET(p_streambuf_dtor
, "??1streambuf@@UEAA@XZ");
380 SET(p_streambuf_allocate
, "?allocate@streambuf@@IEAAHXZ");
381 SET(p_streambuf_clrclock
, "?clrlock@streambuf@@QEAAXXZ");
382 SET(p_streambuf_doallocate
, "?doallocate@streambuf@@MEAAHXZ");
383 SET(p_streambuf_gbump
, "?gbump@streambuf@@IEAAXH@Z");
384 SET(p_streambuf_lock
, "?lock@streambuf@@QEAAXXZ");
385 SET(p_streambuf_pbackfail
, "?pbackfail@streambuf@@UEAAHH@Z");
386 SET(p_streambuf_pbump
, "?pbump@streambuf@@IEAAXH@Z");
387 SET(p_streambuf_sbumpc
, "?sbumpc@streambuf@@QEAAHXZ");
388 SET(p_streambuf_setb
, "?setb@streambuf@@IEAAXPEAD0H@Z");
389 SET(p_streambuf_setbuf
, "?setbuf@streambuf@@UEAAPEAV1@PEADH@Z");
390 SET(p_streambuf_setlock
, "?setlock@streambuf@@QEAAXXZ");
391 SET(p_streambuf_sgetc
, "?sgetc@streambuf@@QEAAHXZ");
392 SET(p_streambuf_snextc
, "?snextc@streambuf@@QEAAHXZ");
393 SET(p_streambuf_sputc
, "?sputc@streambuf@@QEAAHH@Z");
394 SET(p_streambuf_stossc
, "?stossc@streambuf@@QEAAXXZ");
395 SET(p_streambuf_sync
, "?sync@streambuf@@UEAAHXZ");
396 SET(p_streambuf_unlock
, "?unlock@streambuf@@QEAAXXZ");
397 SET(p_streambuf_xsgetn
, "?xsgetn@streambuf@@UEAAHPEADH@Z");
398 SET(p_streambuf_xsputn
, "?xsputn@streambuf@@UEAAHPEBDH@Z");
400 SET(p_filebuf_fd_ctor
, "??0filebuf@@QEAA@H@Z");
401 SET(p_filebuf_fd_reserve_ctor
, "??0filebuf@@QEAA@HPEADH@Z");
402 SET(p_filebuf_ctor
, "??0filebuf@@QEAA@XZ");
403 SET(p_filebuf_dtor
, "??1filebuf@@UEAA@XZ");
404 SET(p_filebuf_attach
, "?attach@filebuf@@QEAAPEAV1@H@Z");
405 SET(p_filebuf_open
, "?open@filebuf@@QEAAPEAV1@PEBDHH@Z");
406 SET(p_filebuf_close
, "?close@filebuf@@QEAAPEAV1@XZ");
407 SET(p_filebuf_setmode
, "?setmode@filebuf@@QEAAHH@Z");
408 SET(p_filebuf_setbuf
, "?setbuf@filebuf@@UEAAPEAVstreambuf@@PEADH@Z");
409 SET(p_filebuf_sync
, "?sync@filebuf@@UEAAHXZ");
410 SET(p_filebuf_overflow
, "?overflow@filebuf@@UEAAHH@Z");
411 SET(p_filebuf_underflow
, "?underflow@filebuf@@UEAAHXZ");
412 SET(p_filebuf_seekoff
, "?seekoff@filebuf@@UEAAJJW4seek_dir@ios@@H@Z");
414 SET(p_strstreambuf_dynamic_ctor
, "??0strstreambuf@@QEAA@H@Z");
415 SET(p_strstreambuf_funcs_ctor
, "??0strstreambuf@@QEAA@P6APEAXJ@ZP6AXPEAX@Z@Z");
416 SET(p_strstreambuf_buffer_ctor
, "??0strstreambuf@@QEAA@PEADH0@Z");
417 SET(p_strstreambuf_ubuffer_ctor
, "??0strstreambuf@@QEAA@PEAEH0@Z");
418 SET(p_strstreambuf_ctor
, "??0strstreambuf@@QEAA@XZ");
419 SET(p_strstreambuf_dtor
, "??1strstreambuf@@UEAA@XZ");
420 SET(p_strstreambuf_doallocate
, "?doallocate@strstreambuf@@MEAAHXZ");
421 SET(p_strstreambuf_freeze
, "?freeze@strstreambuf@@QEAAXH@Z");
422 SET(p_strstreambuf_overflow
, "?overflow@strstreambuf@@UEAAHH@Z");
423 SET(p_strstreambuf_seekoff
, "?seekoff@strstreambuf@@UEAAJJW4seek_dir@ios@@H@Z");
424 SET(p_strstreambuf_setbuf
, "?setbuf@strstreambuf@@UEAAPEAVstreambuf@@PEADH@Z");
425 SET(p_strstreambuf_underflow
, "?underflow@strstreambuf@@UEAAHXZ");
427 SET(p_stdiobuf_file_ctor
, "??0stdiobuf@@QEAA@PEAU_iobuf@@@Z");
428 SET(p_stdiobuf_dtor
, "??1stdiobuf@@UEAA@XZ");
429 SET(p_stdiobuf_overflow
, "?overflow@stdiobuf@@UEAAHH@Z");
430 SET(p_stdiobuf_pbackfail
, "?pbackfail@stdiobuf@@UEAAHH@Z");
431 SET(p_stdiobuf_seekoff
, "?seekoff@stdiobuf@@UEAAJJW4seek_dir@ios@@H@Z");
432 SET(p_stdiobuf_setrwbuf
, "?setrwbuf@stdiobuf@@QEAAHHH@Z");
433 SET(p_stdiobuf_sync
, "?sync@stdiobuf@@UEAAHXZ");
434 SET(p_stdiobuf_underflow
, "?underflow@stdiobuf@@UEAAHXZ");
436 SET(p_ios_copy_ctor
, "??0ios@@IEAA@AEBV0@@Z");
437 SET(p_ios_ctor
, "??0ios@@IEAA@XZ");
438 SET(p_ios_sb_ctor
, "??0ios@@QEAA@PEAVstreambuf@@@Z");
439 SET(p_ios_assign
, "??4ios@@IEAAAEAV0@AEBV0@@Z");
440 SET(p_ios_init
, "?init@ios@@IEAAXPEAVstreambuf@@@Z");
441 SET(p_ios_dtor
, "??1ios@@UEAA@XZ");
442 SET(p_ios_clrlock
, "?clrlock@ios@@QEAAXXZ");
443 SET(p_ios_setlock
, "?setlock@ios@@QEAAXXZ");
444 SET(p_ios_lock
, "?lock@ios@@QEAAXXZ");
445 SET(p_ios_unlock
, "?unlock@ios@@QEAAXXZ");
446 SET(p_ios_lockbuf
, "?lockbuf@ios@@QEAAXXZ");
447 SET(p_ios_unlockbuf
, "?unlockbuf@ios@@QEAAXXZ");
448 SET(p_ios_flags_set
, "?flags@ios@@QEAAJJ@Z");
449 SET(p_ios_flags_get
, "?flags@ios@@QEBAJXZ");
450 SET(p_ios_setf
, "?setf@ios@@QEAAJJ@Z");
451 SET(p_ios_setf_mask
, "?setf@ios@@QEAAJJJ@Z");
452 SET(p_ios_unsetf
, "?unsetf@ios@@QEAAJJ@Z");
453 SET(p_ios_good
, "?good@ios@@QEBAHXZ");
454 SET(p_ios_bad
, "?bad@ios@@QEBAHXZ");
455 SET(p_ios_eof
, "?eof@ios@@QEBAHXZ");
456 SET(p_ios_fail
, "?fail@ios@@QEBAHXZ");
457 SET(p_ios_clear
, "?clear@ios@@QEAAXH@Z");
458 SET(p_ios_iword
, "?iword@ios@@QEBAAEAJH@Z");
459 SET(p_ios_pword
, "?pword@ios@@QEBAAEAPEAXH@Z");
461 SET(p_ostream_copy_ctor
, "??0ostream@@IEAA@AEBV0@@Z");
462 SET(p_ostream_sb_ctor
, "??0ostream@@QEAA@PEAVstreambuf@@@Z");
463 SET(p_ostream_ctor
, "??0ostream@@IEAA@XZ");
464 SET(p_ostream_dtor
, "??1ostream@@UEAA@XZ");
465 SET(p_ostream_assign
, "??4ostream@@IEAAAEAV0@AEBV0@@Z");
466 SET(p_ostream_assign_sb
, "??4ostream@@IEAAAEAV0@PEAVstreambuf@@@Z");
467 SET(p_ostream_vbase_dtor
, "??_Dostream@@QEAAXXZ");
468 SET(p_ostream_flush
, "?flush@ostream@@QEAAAEAV1@XZ");
469 SET(p_ostream_opfx
, "?opfx@ostream@@QEAAHXZ");
470 SET(p_ostream_osfx
, "?osfx@ostream@@QEAAXXZ");
471 SET(p_ostream_put_char
, "?put@ostream@@QEAAAEAV1@D@Z");
472 SET(p_ostream_write_char
, "?write@ostream@@QEAAAEAV1@PEBDH@Z");
473 SET(p_ostream_seekp_offset
, "?seekp@ostream@@QEAAAEAV1@JW4seek_dir@ios@@@Z");
474 SET(p_ostream_seekp
, "?seekp@ostream@@QEAAAEAV1@J@Z");
475 SET(p_ostream_tellp
, "?tellp@ostream@@QEAAJXZ");
476 SET(p_ostream_writepad
, "?writepad@ostream@@AEAAAEAV1@PEBD0@Z");
477 SET(p_ostream_print_char
, "??6ostream@@QEAAAEAV0@D@Z");
478 SET(p_ostream_print_str
, "??6ostream@@QEAAAEAV0@PEBD@Z");
479 SET(p_ostream_print_int
, "??6ostream@@QEAAAEAV0@H@Z");
480 SET(p_ostream_print_float
, "??6ostream@@QEAAAEAV0@M@Z");
481 SET(p_ostream_print_double
, "??6ostream@@QEAAAEAV0@N@Z");
482 SET(p_ostream_print_ptr
, "??6ostream@@QEAAAEAV0@PEBX@Z");
483 SET(p_ostream_print_streambuf
, "??6ostream@@QEAAAEAV0@PEAVstreambuf@@@Z");
485 p_operator_new
= (void*)GetProcAddress(msvcrt
, "??2@YAPAXI@Z");
486 p_operator_delete
= (void*)GetProcAddress(msvcrt
, "??3@YAXPAX@Z");
488 SET(p_streambuf_reserve_ctor
, "??0streambuf@@IAE@PADH@Z");
489 SET(p_streambuf_ctor
, "??0streambuf@@IAE@XZ");
490 SET(p_streambuf_dtor
, "??1streambuf@@UAE@XZ");
491 SET(p_streambuf_allocate
, "?allocate@streambuf@@IAEHXZ");
492 SET(p_streambuf_clrclock
, "?clrlock@streambuf@@QAEXXZ");
493 SET(p_streambuf_doallocate
, "?doallocate@streambuf@@MAEHXZ");
494 SET(p_streambuf_gbump
, "?gbump@streambuf@@IAEXH@Z");
495 SET(p_streambuf_lock
, "?lock@streambuf@@QAEXXZ");
496 SET(p_streambuf_pbackfail
, "?pbackfail@streambuf@@UAEHH@Z");
497 SET(p_streambuf_pbump
, "?pbump@streambuf@@IAEXH@Z");
498 SET(p_streambuf_sbumpc
, "?sbumpc@streambuf@@QAEHXZ");
499 SET(p_streambuf_setb
, "?setb@streambuf@@IAEXPAD0H@Z");
500 SET(p_streambuf_setbuf
, "?setbuf@streambuf@@UAEPAV1@PADH@Z");
501 SET(p_streambuf_setlock
, "?setlock@streambuf@@QAEXXZ");
502 SET(p_streambuf_sgetc
, "?sgetc@streambuf@@QAEHXZ");
503 SET(p_streambuf_snextc
, "?snextc@streambuf@@QAEHXZ");
504 SET(p_streambuf_sputc
, "?sputc@streambuf@@QAEHH@Z");
505 SET(p_streambuf_stossc
, "?stossc@streambuf@@QAEXXZ");
506 SET(p_streambuf_sync
, "?sync@streambuf@@UAEHXZ");
507 SET(p_streambuf_unlock
, "?unlock@streambuf@@QAEXXZ");
508 SET(p_streambuf_xsgetn
, "?xsgetn@streambuf@@UAEHPADH@Z");
509 SET(p_streambuf_xsputn
, "?xsputn@streambuf@@UAEHPBDH@Z");
511 SET(p_filebuf_fd_ctor
, "??0filebuf@@QAE@H@Z");
512 SET(p_filebuf_fd_reserve_ctor
, "??0filebuf@@QAE@HPADH@Z");
513 SET(p_filebuf_ctor
, "??0filebuf@@QAE@XZ");
514 SET(p_filebuf_dtor
, "??1filebuf@@UAE@XZ");
515 SET(p_filebuf_attach
, "?attach@filebuf@@QAEPAV1@H@Z");
516 SET(p_filebuf_open
, "?open@filebuf@@QAEPAV1@PBDHH@Z");
517 SET(p_filebuf_close
, "?close@filebuf@@QAEPAV1@XZ");
518 SET(p_filebuf_setmode
, "?setmode@filebuf@@QAEHH@Z");
519 SET(p_filebuf_setbuf
, "?setbuf@filebuf@@UAEPAVstreambuf@@PADH@Z");
520 SET(p_filebuf_sync
, "?sync@filebuf@@UAEHXZ");
521 SET(p_filebuf_overflow
, "?overflow@filebuf@@UAEHH@Z");
522 SET(p_filebuf_underflow
, "?underflow@filebuf@@UAEHXZ");
523 SET(p_filebuf_seekoff
, "?seekoff@filebuf@@UAEJJW4seek_dir@ios@@H@Z");
525 SET(p_strstreambuf_dynamic_ctor
, "??0strstreambuf@@QAE@H@Z");
526 SET(p_strstreambuf_funcs_ctor
, "??0strstreambuf@@QAE@P6APAXJ@ZP6AXPAX@Z@Z");
527 SET(p_strstreambuf_buffer_ctor
, "??0strstreambuf@@QAE@PADH0@Z");
528 SET(p_strstreambuf_ubuffer_ctor
, "??0strstreambuf@@QAE@PAEH0@Z");
529 SET(p_strstreambuf_ctor
, "??0strstreambuf@@QAE@XZ");
530 SET(p_strstreambuf_dtor
, "??1strstreambuf@@UAE@XZ");
531 SET(p_strstreambuf_doallocate
, "?doallocate@strstreambuf@@MAEHXZ");
532 SET(p_strstreambuf_freeze
, "?freeze@strstreambuf@@QAEXH@Z");
533 SET(p_strstreambuf_overflow
, "?overflow@strstreambuf@@UAEHH@Z");
534 SET(p_strstreambuf_seekoff
, "?seekoff@strstreambuf@@UAEJJW4seek_dir@ios@@H@Z");
535 SET(p_strstreambuf_setbuf
, "?setbuf@strstreambuf@@UAEPAVstreambuf@@PADH@Z");
536 SET(p_strstreambuf_underflow
, "?underflow@strstreambuf@@UAEHXZ");
538 SET(p_stdiobuf_file_ctor
, "??0stdiobuf@@QAE@PAU_iobuf@@@Z");
539 SET(p_stdiobuf_dtor
, "??1stdiobuf@@UAE@XZ");
540 SET(p_stdiobuf_overflow
, "?overflow@stdiobuf@@UAEHH@Z");
541 SET(p_stdiobuf_pbackfail
, "?pbackfail@stdiobuf@@UAEHH@Z");
542 SET(p_stdiobuf_seekoff
, "?seekoff@stdiobuf@@UAEJJW4seek_dir@ios@@H@Z");
543 SET(p_stdiobuf_setrwbuf
, "?setrwbuf@stdiobuf@@QAEHHH@Z");
544 SET(p_stdiobuf_sync
, "?sync@stdiobuf@@UAEHXZ");
545 SET(p_stdiobuf_underflow
, "?underflow@stdiobuf@@UAEHXZ");
547 SET(p_ios_copy_ctor
, "??0ios@@IAE@ABV0@@Z");
548 SET(p_ios_ctor
, "??0ios@@IAE@XZ");
549 SET(p_ios_sb_ctor
, "??0ios@@QAE@PAVstreambuf@@@Z");
550 SET(p_ios_assign
, "??4ios@@IAEAAV0@ABV0@@Z");
551 SET(p_ios_init
, "?init@ios@@IAEXPAVstreambuf@@@Z");
552 SET(p_ios_dtor
, "??1ios@@UAE@XZ");
553 SET(p_ios_clrlock
, "?clrlock@ios@@QAAXXZ");
554 SET(p_ios_setlock
, "?setlock@ios@@QAAXXZ");
555 SET(p_ios_lock
, "?lock@ios@@QAAXXZ");
556 SET(p_ios_unlock
, "?unlock@ios@@QAAXXZ");
557 SET(p_ios_lockbuf
, "?lockbuf@ios@@QAAXXZ");
558 SET(p_ios_unlockbuf
, "?unlockbuf@ios@@QAAXXZ");
559 SET(p_ios_flags_set
, "?flags@ios@@QAEJJ@Z");
560 SET(p_ios_flags_get
, "?flags@ios@@QBEJXZ");
561 SET(p_ios_setf
, "?setf@ios@@QAEJJ@Z");
562 SET(p_ios_setf_mask
, "?setf@ios@@QAEJJJ@Z");
563 SET(p_ios_unsetf
, "?unsetf@ios@@QAEJJ@Z");
564 SET(p_ios_good
, "?good@ios@@QBEHXZ");
565 SET(p_ios_bad
, "?bad@ios@@QBEHXZ");
566 SET(p_ios_eof
, "?eof@ios@@QBEHXZ");
567 SET(p_ios_fail
, "?fail@ios@@QBEHXZ");
568 SET(p_ios_clear
, "?clear@ios@@QAEXH@Z");
569 SET(p_ios_iword
, "?iword@ios@@QBEAAJH@Z");
570 SET(p_ios_pword
, "?pword@ios@@QBEAAPAXH@Z");
572 SET(p_ostream_copy_ctor
, "??0ostream@@IAE@ABV0@@Z");
573 SET(p_ostream_sb_ctor
, "??0ostream@@QAE@PAVstreambuf@@@Z");
574 SET(p_ostream_ctor
, "??0ostream@@IAE@XZ");
575 SET(p_ostream_dtor
, "??1ostream@@UAE@XZ");
576 SET(p_ostream_assign
, "??4ostream@@IAEAAV0@ABV0@@Z");
577 SET(p_ostream_assign_sb
, "??4ostream@@IAEAAV0@PAVstreambuf@@@Z");
578 SET(p_ostream_vbase_dtor
, "??_Dostream@@QAEXXZ");
579 SET(p_ostream_flush
, "?flush@ostream@@QAEAAV1@XZ");
580 SET(p_ostream_opfx
, "?opfx@ostream@@QAEHXZ");
581 SET(p_ostream_osfx
, "?osfx@ostream@@QAEXXZ");
582 SET(p_ostream_put_char
, "?put@ostream@@QAEAAV1@D@Z");
583 SET(p_ostream_write_char
, "?write@ostream@@QAEAAV1@PBDH@Z");
584 SET(p_ostream_seekp_offset
, "?seekp@ostream@@QAEAAV1@JW4seek_dir@ios@@@Z");
585 SET(p_ostream_seekp
, "?seekp@ostream@@QAEAAV1@J@Z");
586 SET(p_ostream_tellp
, "?tellp@ostream@@QAEJXZ");
587 SET(p_ostream_writepad
, "?writepad@ostream@@AAEAAV1@PBD0@Z");
588 SET(p_ostream_print_char
, "??6ostream@@QAEAAV0@D@Z");
589 SET(p_ostream_print_str
, "??6ostream@@QAEAAV0@PBD@Z");
590 SET(p_ostream_print_int
, "??6ostream@@QAEAAV0@H@Z");
591 SET(p_ostream_print_float
, "??6ostream@@QAEAAV0@M@Z");
592 SET(p_ostream_print_double
, "??6ostream@@QAEAAV0@N@Z");
593 SET(p_ostream_print_ptr
, "??6ostream@@QAEAAV0@PBX@Z");
594 SET(p_ostream_print_streambuf
, "??6ostream@@QAEAAV0@PAVstreambuf@@@Z");
596 SET(p_ios_static_lock
, "?x_lockc@ios@@0U_CRT_CRITICAL_SECTION@@A");
597 SET(p_ios_lockc
, "?lockc@ios@@KAXXZ");
598 SET(p_ios_unlockc
, "?unlockc@ios@@KAXXZ");
599 SET(p_ios_maxbit
, "?x_maxbit@ios@@0JA");
600 SET(p_ios_bitalloc
, "?bitalloc@ios@@SAJXZ");
601 SET(p_ios_curindex
, "?x_curindex@ios@@0HA");
602 SET(p_ios_statebuf
, "?x_statebuf@ios@@0PAJA");
603 SET(p_ios_xalloc
, "?xalloc@ios@@SAHXZ");
604 SET(p_ios_fLockcInit
, "?fLockcInit@ios@@0HA");
606 init_thiscall_thunk();
610 static int overflow_count
, underflow_count
;
611 static streambuf
*test_this
;
612 static char test_get_buffer
[24];
613 static int buffer_pos
, get_end
;
616 static int __thiscall
test_streambuf_overflow(int ch
)
618 static int __thiscall
test_streambuf_overflow(streambuf
*this, int ch
)
622 if (ch
== 'L') /* simulate a failure */
624 if (!test_this
->unbuffered
)
625 test_this
->pptr
= test_this
->pbase
+ 5;
630 static int __thiscall
test_streambuf_underflow(void)
632 static int __thiscall
test_streambuf_underflow(streambuf
*this)
636 if (test_this
->unbuffered
) {
637 return (buffer_pos
< 23) ? test_get_buffer
[buffer_pos
++] : EOF
;
638 } else if (test_this
->gptr
< test_this
->egptr
) {
639 return *test_this
->gptr
;
641 return get_end
? EOF
: *(test_this
->gptr
= test_this
->eback
);
645 struct streambuf_lock_arg
652 static DWORD WINAPI
lock_streambuf(void *arg
)
654 struct streambuf_lock_arg
*lock_arg
= arg
;
655 call_func1(p_streambuf_lock
, lock_arg
->sb
);
656 SetEvent(lock_arg
->lock
[0]);
657 WaitForSingleObject(lock_arg
->test
[0], INFINITE
);
658 call_func1(p_streambuf_lock
, lock_arg
->sb
);
659 SetEvent(lock_arg
->lock
[1]);
660 WaitForSingleObject(lock_arg
->test
[1], INFINITE
);
661 call_func1(p_streambuf_lock
, lock_arg
->sb
);
662 SetEvent(lock_arg
->lock
[2]);
663 WaitForSingleObject(lock_arg
->test
[2], INFINITE
);
664 call_func1(p_streambuf_unlock
, lock_arg
->sb
);
665 SetEvent(lock_arg
->lock
[3]);
666 WaitForSingleObject(lock_arg
->test
[3], INFINITE
);
667 call_func1(p_streambuf_unlock
, lock_arg
->sb
);
671 static void test_streambuf(void)
673 streambuf sb
, sb2
, sb3
, *psb
;
674 vtable_ptr test_streambuf_vtbl
[11];
675 struct streambuf_lock_arg lock_arg
;
681 memset(&sb
, 0xab, sizeof(streambuf
));
682 memset(&sb2
, 0xab, sizeof(streambuf
));
683 memset(&sb3
, 0xab, sizeof(streambuf
));
686 call_func1(p_streambuf_ctor
, &sb
);
687 ok(sb
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", sb
.allocated
);
688 ok(sb
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", sb
.unbuffered
);
689 ok(sb
.base
== NULL
, "wrong base pointer, expected %p got %p\n", NULL
, sb
.base
);
690 ok(sb
.ebuf
== NULL
, "wrong ebuf pointer, expected %p got %p\n", NULL
, sb
.ebuf
);
691 ok(sb
.lock
.LockCount
== -1, "wrong critical section state, expected -1 got %d\n", sb
.lock
.LockCount
);
692 call_func3(p_streambuf_reserve_ctor
, &sb2
, reserve
, 16);
693 ok(sb2
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", sb2
.allocated
);
694 ok(sb2
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", sb2
.unbuffered
);
695 ok(sb2
.base
== reserve
, "wrong base pointer, expected %p got %p\n", reserve
, sb2
.base
);
696 ok(sb2
.ebuf
== reserve
+16, "wrong ebuf pointer, expected %p got %p\n", reserve
+16, sb2
.ebuf
);
697 ok(sb
.lock
.LockCount
== -1, "wrong critical section state, expected -1 got %d\n", sb
.lock
.LockCount
);
698 call_func1(p_streambuf_ctor
, &sb3
);
699 ok(sb3
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", sb3
.allocated
);
700 ok(sb3
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", sb3
.unbuffered
);
701 ok(sb3
.base
== NULL
, "wrong base pointer, expected %p got %p\n", NULL
, sb3
.base
);
702 ok(sb3
.ebuf
== NULL
, "wrong ebuf pointer, expected %p got %p\n", NULL
, sb3
.ebuf
);
704 memcpy(test_streambuf_vtbl
, sb
.vtable
, sizeof(test_streambuf_vtbl
));
705 test_streambuf_vtbl
[7] = (vtable_ptr
)&test_streambuf_overflow
;
706 test_streambuf_vtbl
[8] = (vtable_ptr
)&test_streambuf_underflow
;
707 sb2
.vtable
= test_streambuf_vtbl
;
708 sb3
.vtable
= test_streambuf_vtbl
;
709 overflow_count
= underflow_count
= 0;
710 strcpy(test_get_buffer
, "CompuGlobalHyperMegaNet");
711 buffer_pos
= get_end
= 0;
714 ok(sb
.do_lock
== -1, "expected do_lock value -1, got %d\n", sb
.do_lock
);
715 call_func1(p_streambuf_setlock
, &sb
);
716 ok(sb
.do_lock
== -2, "expected do_lock value -2, got %d\n", sb
.do_lock
);
717 call_func1(p_streambuf_setlock
, &sb
);
718 ok(sb
.do_lock
== -3, "expected do_lock value -3, got %d\n", sb
.do_lock
);
720 call_func1(p_streambuf_setlock
, &sb
);
721 ok(sb
.do_lock
== 2, "expected do_lock value 2, got %d\n", sb
.do_lock
);
725 call_func1(p_streambuf_clrclock
, &sb
);
726 ok(sb
.do_lock
== -1, "expected do_lock value -1, got %d\n", sb
.do_lock
);
727 call_func1(p_streambuf_clrclock
, &sb
);
728 ok(sb
.do_lock
== 0, "expected do_lock value 0, got %d\n", sb
.do_lock
);
729 call_func1(p_streambuf_clrclock
, &sb
);
730 ok(sb
.do_lock
== 1, "expected do_lock value 1, got %d\n", sb
.do_lock
);
731 call_func1(p_streambuf_clrclock
, &sb
);
732 ok(sb
.do_lock
== 1, "expected do_lock value 1, got %d\n", sb
.do_lock
);
736 for (i
= 0; i
< 4; i
++) {
737 lock_arg
.lock
[i
] = CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
738 ok(lock_arg
.lock
[i
] != NULL
, "CreateEventW failed\n");
739 lock_arg
.test
[i
] = CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
740 ok(lock_arg
.test
[i
] != NULL
, "CreateEventW failed\n");
744 thread
= CreateThread(NULL
, 0, lock_streambuf
, (void*)&lock_arg
, 0, NULL
);
745 ok(thread
!= NULL
, "CreateThread failed\n");
746 WaitForSingleObject(lock_arg
.lock
[0], INFINITE
);
747 locked
= TryEnterCriticalSection(&sb
.lock
);
748 ok(locked
!= 0, "could not lock the streambuf\n");
749 LeaveCriticalSection(&sb
.lock
);
752 SetEvent(lock_arg
.test
[0]);
753 WaitForSingleObject(lock_arg
.lock
[1], INFINITE
);
754 locked
= TryEnterCriticalSection(&sb
.lock
);
755 ok(locked
!= 0, "could not lock the streambuf\n");
756 LeaveCriticalSection(&sb
.lock
);
759 SetEvent(lock_arg
.test
[1]);
760 WaitForSingleObject(lock_arg
.lock
[2], INFINITE
);
761 locked
= TryEnterCriticalSection(&sb
.lock
);
762 ok(locked
== 0, "the streambuf was not locked before\n");
765 SetEvent(lock_arg
.test
[2]);
766 WaitForSingleObject(lock_arg
.lock
[3], INFINITE
);
767 locked
= TryEnterCriticalSection(&sb
.lock
);
768 ok(locked
== 0, "the streambuf was not locked before\n");
772 call_func4(p_streambuf_setb
, &sb
, reserve
, reserve
+16, 0);
773 ok(sb
.base
== reserve
, "wrong base pointer, expected %p got %p\n", reserve
, sb
.base
);
774 ok(sb
.ebuf
== reserve
+16, "wrong ebuf pointer, expected %p got %p\n", reserve
+16, sb
.ebuf
);
775 call_func4(p_streambuf_setb
, &sb
, reserve
, reserve
+16, 4);
776 ok(sb
.allocated
== 4, "wrong allocate value, expected 4 got %d\n", sb
.allocated
);
778 call_func4(p_streambuf_setb
, &sb
, NULL
, NULL
, 3);
779 ok(sb
.allocated
== 3, "wrong allocate value, expected 3 got %d\n", sb
.allocated
);
782 psb
= call_func3(p_streambuf_setbuf
, &sb
, NULL
, 5);
783 ok(psb
== &sb
, "wrong return value, expected %p got %p\n", &sb
, psb
);
784 ok(sb
.allocated
== 3, "wrong allocate value, expected 3 got %d\n", sb
.allocated
);
785 ok(sb
.unbuffered
== 1, "wrong unbuffered value, expected 1 got %d\n", sb
.unbuffered
);
786 ok(sb
.base
== NULL
, "wrong base pointer, expected %p got %p\n", NULL
, sb
.base
);
787 ok(sb
.ebuf
== NULL
, "wrong ebuf pointer, expected %p got %p\n", NULL
, sb
.ebuf
);
788 psb
= call_func3(p_streambuf_setbuf
, &sb
, reserve
, 0);
789 ok(psb
== &sb
, "wrong return value, expected %p got %p\n", &sb
, psb
);
790 ok(sb
.unbuffered
== 1, "wrong unbuffered value, expected 1 got %d\n", sb
.unbuffered
);
791 ok(sb
.base
== NULL
, "wrong base pointer, expected %p got %p\n", NULL
, sb
.base
);
792 ok(sb
.ebuf
== NULL
, "wrong ebuf pointer, expected %p got %p\n", NULL
, sb
.ebuf
);
793 psb
= call_func3(p_streambuf_setbuf
, &sb
, reserve
, 16);
794 ok(psb
== &sb
, "wrong return value, expected %p got %p\n", &sb
, psb
);
795 ok(sb
.allocated
== 3, "wrong allocate value, expected 3 got %d\n", sb
.allocated
);
796 ok(sb
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", sb
.unbuffered
);
797 ok(sb
.base
== reserve
, "wrong base pointer, expected %p got %p\n", reserve
, sb
.base
);
798 ok(sb
.ebuf
== reserve
+16, "wrong ebuf pointer, expected %p got %p\n", reserve
+16, sb
.ebuf
);
799 psb
= call_func3(p_streambuf_setbuf
, &sb
, NULL
, 8);
800 ok(psb
== NULL
, "wrong return value, expected %p got %p\n", NULL
, psb
);
801 ok(sb
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", sb
.unbuffered
);
802 ok(sb
.base
== reserve
, "wrong base pointer, expected %p got %p\n", reserve
, sb
.base
);
803 ok(sb
.ebuf
== reserve
+16, "wrong ebuf pointer, expected %p got %p\n", reserve
+16, sb
.ebuf
);
806 ret
= (int) call_func1(p_streambuf_allocate
, &sb
);
807 ok(ret
== 0, "wrong return value, expected 0 got %d\n", ret
);
809 ret
= (int) call_func1(p_streambuf_allocate
, &sb
);
810 ok(ret
== 1, "wrong return value, expected 1 got %d\n", ret
);
811 ok(sb
.allocated
== 1, "wrong allocate value, expected 1 got %d\n", sb
.allocated
);
812 ok(sb
.ebuf
- sb
.base
== 512 , "wrong reserve area size, expected 512 got %p-%p\n", sb
.ebuf
, sb
.base
);
815 ret
= (int) call_func1(p_streambuf_doallocate
, &sb2
);
816 ok(ret
== 1, "doallocate failed, got %d\n", ret
);
817 ok(sb2
.allocated
== 1, "wrong allocate value, expected 1 got %d\n", sb2
.allocated
);
818 ok(sb2
.ebuf
- sb2
.base
== 512 , "wrong reserve area size, expected 512 got %p-%p\n", sb2
.ebuf
, sb2
.base
);
819 ret
= (int) call_func1(p_streambuf_doallocate
, &sb3
);
820 ok(ret
== 1, "doallocate failed, got %d\n", ret
);
821 ok(sb3
.allocated
== 1, "wrong allocate value, expected 1 got %d\n", sb3
.allocated
);
822 ok(sb3
.ebuf
- sb3
.base
== 512 , "wrong reserve area size, expected 512 got %p-%p\n", sb3
.ebuf
, sb3
.base
);
824 /* sb: buffered, space available */
825 sb
.eback
= sb
.gptr
= sb
.base
;
826 sb
.egptr
= sb
.base
+ 256;
827 sb
.pbase
= sb
.pptr
= sb
.base
+ 256;
828 sb
.epptr
= sb
.base
+ 512;
829 /* sb2: buffered, no space available */
830 sb2
.eback
= sb2
.base
;
831 sb2
.gptr
= sb2
.egptr
= sb2
.base
+ 256;
832 sb2
.pbase
= sb2
.base
+ 256;
833 sb2
.pptr
= sb2
.epptr
= sb2
.base
+ 512;
834 /* sb3: unbuffered */
838 call_func2(p_streambuf_gbump
, &sb
, 10);
839 ok(sb
.gptr
== sb
.eback
+ 10, "advance get pointer failed, expected %p got %p\n", sb
.eback
+ 10, sb
.gptr
);
840 call_func2(p_streambuf_gbump
, &sb
, -15);
841 ok(sb
.gptr
== sb
.eback
- 5, "advance get pointer failed, expected %p got %p\n", sb
.eback
- 5, sb
.gptr
);
845 call_func2(p_streambuf_pbump
, &sb
, -2);
846 ok(sb
.pptr
== sb
.pbase
- 2, "advance put pointer failed, expected %p got %p\n", sb
.pbase
- 2, sb
.pptr
);
847 call_func2(p_streambuf_pbump
, &sb
, 20);
848 ok(sb
.pptr
== sb
.pbase
+ 18, "advance put pointer failed, expected %p got %p\n", sb
.pbase
+ 18, sb
.pptr
);
852 ret
= (int) call_func1(p_streambuf_sync
, &sb
);
853 ok(ret
== EOF
, "sync failed, expected EOF got %d\n", ret
);
855 ret
= (int) call_func1(p_streambuf_sync
, &sb
);
856 ok(ret
== 0, "sync failed, expected 0 got %d\n", ret
);
857 sb
.gptr
= sb
.egptr
+ 1;
858 ret
= (int) call_func1(p_streambuf_sync
, &sb
);
859 ok(ret
== 0, "sync failed, expected 0 got %d\n", ret
);
861 ret
= (int) call_func1(p_streambuf_sync
, &sb2
);
862 ok(ret
== EOF
, "sync failed, expected EOF got %d\n", ret
);
863 sb2
.pptr
= sb2
.pbase
;
864 ret
= (int) call_func1(p_streambuf_sync
, &sb2
);
865 ok(ret
== 0, "sync failed, expected 0 got %d\n", ret
);
866 sb2
.pptr
= sb2
.pbase
- 1;
867 ret
= (int) call_func1(p_streambuf_sync
, &sb2
);
868 ok(ret
== 0, "sync failed, expected 0 got %d\n", ret
);
869 sb2
.pptr
= sb2
.epptr
;
870 ret
= (int) call_func1(p_streambuf_sync
, &sb3
);
871 ok(ret
== 0, "sync failed, expected 0 got %d\n", ret
);
874 strcpy(sb2
.eback
, "WorstTestEver");
876 ret
= (int) call_func1(p_streambuf_sgetc
, &sb2
);
877 ok(ret
== 'W', "expected 'W' got '%c'\n", ret
);
878 ok(underflow_count
== 1, "expected call to underflow\n");
879 ok(sb2
.stored_char
== EOF
, "wrong stored character, expected EOF got %c\n", sb2
.stored_char
);
881 ret
= (int) call_func1(p_streambuf_sgetc
, &sb2
);
882 ok(ret
== 'o', "expected 'o' got '%c'\n", ret
);
883 ok(underflow_count
== 2, "expected call to underflow\n");
884 ok(sb2
.stored_char
== EOF
, "wrong stored character, expected EOF got %c\n", sb2
.stored_char
);
885 sb2
.gptr
= sb2
.egptr
;
887 ret
= (int) call_func1(p_streambuf_sgetc
, &sb3
);
888 ok(ret
== 'C', "expected 'C' got '%c'\n", ret
);
889 ok(underflow_count
== 3, "expected call to underflow\n");
890 ok(sb3
.stored_char
== 'C', "wrong stored character, expected 'C' got %c\n", sb3
.stored_char
);
891 sb3
.stored_char
= 'b';
892 ret
= (int) call_func1(p_streambuf_sgetc
, &sb3
);
893 ok(ret
== 'b', "expected 'b' got '%c'\n", ret
);
894 ok(underflow_count
== 3, "no call to underflow expected\n");
895 ok(sb3
.stored_char
== 'b', "wrong stored character, expected 'b' got %c\n", sb3
.stored_char
);
899 ret
= (int) call_func2(p_streambuf_sputc
, &sb
, 'c');
900 ok(ret
== 'c', "wrong return value, expected 'c' got %d\n", ret
);
901 ok(overflow_count
== 0, "no call to overflow expected\n");
902 ok(*sb
.pbase
== 'c', "expected 'c' in the put area, got %c\n", *sb
.pbase
);
903 ok(sb
.pptr
== sb
.pbase
+ 1, "wrong put pointer, expected %p got %p\n", sb
.pbase
+ 1, sb
.pptr
);
905 ret
= (int) call_func2(p_streambuf_sputc
, &sb2
, 'c');
906 ok(ret
== 'c', "wrong return value, expected 'c' got %d\n", ret
);
907 ok(overflow_count
== 1, "expected call to overflow\n");
908 ok(sb2
.pptr
== sb2
.pbase
+ 5, "wrong put pointer, expected %p got %p\n", sb2
.pbase
+ 5, sb2
.pptr
);
910 ret
= (int) call_func2(p_streambuf_sputc
, &sb3
, 'c');
911 ok(ret
== 'c', "wrong return value, expected 'c' got %d\n", ret
);
912 ok(overflow_count
== 2, "expected call to overflow\n");
913 sb3
.pbase
= sb3
.pptr
= sb3
.base
;
914 sb3
.epptr
= sb3
.ebuf
;
915 ret
= (int) call_func2(p_streambuf_sputc
, &sb3
, 'c');
916 ok(ret
== 'c', "wrong return value, expected 'c' got %d\n", ret
);
917 ok(overflow_count
== 2, "no call to overflow expected\n");
918 ok(*sb3
.pbase
== 'c', "expected 'c' in the put area, got %c\n", *sb3
.pbase
);
919 sb3
.pbase
= sb3
.pptr
= sb3
.epptr
= NULL
;
922 sb2
.gptr
= sb2
.egptr
= sb2
.eback
+ 13;
924 ret
= (int) call_func3(p_streambuf_xsgetn
, &sb2
, reserve
, 5);
925 ok(ret
== 5, "wrong return value, expected 5 got %d\n", ret
);
926 ok(!strncmp(reserve
, "Worst", 5), "expected 'Worst' got %s\n", reserve
);
927 ok(sb2
.gptr
== sb2
.eback
+ 5, "wrong get pointer, expected %p got %p\n", sb2
.eback
+ 5, sb2
.gptr
);
928 ok(underflow_count
== 4, "expected call to underflow\n");
929 ret
= (int) call_func3(p_streambuf_xsgetn
, &sb2
, reserve
, 4);
930 ok(ret
== 4, "wrong return value, expected 4 got %d\n", ret
);
931 ok(!strncmp(reserve
, "Test", 4), "expected 'Test' got %s\n", reserve
);
932 ok(sb2
.gptr
== sb2
.eback
+ 9, "wrong get pointer, expected %p got %p\n", sb2
.eback
+ 9, sb2
.gptr
);
933 ok(underflow_count
== 5, "expected call to underflow\n");
935 ret
= (int) call_func3(p_streambuf_xsgetn
, &sb2
, reserve
, 16);
936 ok(ret
== 4, "wrong return value, expected 4 got %d\n", ret
);
937 ok(!strncmp(reserve
, "Ever", 4), "expected 'Ever' got %s\n", reserve
);
938 ok(sb2
.gptr
== sb2
.egptr
, "wrong get pointer, expected %p got %p\n", sb2
.egptr
, sb2
.gptr
);
939 ok(underflow_count
== 7, "expected 2 calls to underflow, got %d\n", underflow_count
- 5);
941 ret
= (int) call_func3(p_streambuf_xsgetn
, &sb3
, reserve
, 11);
942 ok(ret
== 11, "wrong return value, expected 11 got %d\n", ret
);
943 ok(!strncmp(reserve
, "bompuGlobal", 11), "expected 'bompuGlobal' got %s\n", reserve
);
944 ok(sb3
.stored_char
== 'H', "wrong stored character, expected 'H' got %c\n", sb3
.stored_char
);
945 ok(underflow_count
== 18, "expected 11 calls to underflow, got %d\n", underflow_count
- 7);
946 ret
= (int) call_func3(p_streambuf_xsgetn
, &sb3
, reserve
, 16);
947 ok(ret
== 12, "wrong return value, expected 12 got %d\n", ret
);
948 ok(!strncmp(reserve
, "HyperMegaNet", 12), "expected 'HyperMegaNet' got %s\n", reserve
);
949 ok(sb3
.stored_char
== EOF
, "wrong stored character, expected EOF got %c\n", sb3
.stored_char
);
950 ok(underflow_count
== 30, "expected 12 calls to underflow, got %d\n", underflow_count
- 18);
951 ret
= (int) call_func3(p_streambuf_xsgetn
, &sb3
, reserve
, 3);
952 ok(ret
== 0, "wrong return value, expected 0 got %d\n", ret
);
953 ok(sb3
.stored_char
== EOF
, "wrong stored character, expected EOF got %c\n", sb3
.stored_char
);
954 ok(underflow_count
== 31, "expected call to underflow\n");
956 ret
= (int) call_func3(p_streambuf_xsgetn
, &sb3
, reserve
, 5);
957 ok(ret
== 5, "wrong return value, expected 5 got %d\n", ret
);
958 ok(!strncmp(reserve
, "Compu", 5), "expected 'Compu' got %s\n", reserve
);
959 ok(sb3
.stored_char
== 'G', "wrong stored character, expected 'G' got %c\n", sb3
.stored_char
);
960 ok(underflow_count
== 37, "expected 6 calls to underflow, got %d\n", underflow_count
- 31);
963 ret
= (int) call_func3(p_streambuf_xsputn
, &sb
, "Test\0ing", 8);
964 ok(ret
== 8, "wrong return value, expected 8 got %d\n", ret
);
965 ok(sb
.pptr
== sb
.pbase
+ 9, "wrong put pointer, expected %p got %p\n", sb
.pbase
+ 9, sb
.pptr
);
967 sb2
.pptr
= sb2
.epptr
- 7;
968 ret
= (int) call_func3(p_streambuf_xsputn
, &sb2
, "Testing", 7);
969 ok(ret
== 7, "wrong return value, expected 7 got %d\n", ret
);
970 ok(sb2
.pptr
== sb2
.epptr
, "wrong put pointer, expected %p got %p\n", sb2
.epptr
, sb2
.pptr
);
971 ok(overflow_count
== 2, "no call to overflow expected\n");
972 sb2
.pptr
= sb2
.epptr
- 5;
974 ret
= (int) call_func3(p_streambuf_xsputn
, &sb2
, "Testing", 7);
975 ok(ret
== 7, "wrong return value, expected 7 got %d\n", ret
);
976 ok(sb2
.pbase
[5] == 'g', "expected 'g' got %c\n", sb2
.pbase
[5]);
977 ok(sb2
.pptr
== sb2
.pbase
+ 6, "wrong put pointer, expected %p got %p\n", sb2
.pbase
+ 6, sb2
.pptr
);
978 ok(overflow_count
== 3, "expected call to overflow\n");
979 sb2
.pptr
= sb2
.epptr
- 4;
980 ret
= (int) call_func3(p_streambuf_xsputn
, &sb2
, "TestLing", 8);
981 ok(ret
== 4, "wrong return value, expected 4 got %d\n", ret
);
982 ok(sb2
.pptr
== sb2
.epptr
, "wrong put pointer, expected %p got %p\n", sb2
.epptr
, sb2
.pptr
);
983 ok(overflow_count
== 4, "expected call to overflow\n");
985 ret
= (int) call_func3(p_streambuf_xsputn
, &sb3
, "Testing", 7);
986 ok(ret
== 7, "wrong return value, expected 7 got %d\n", ret
);
987 ok(sb3
.stored_char
== 'G', "wrong stored character, expected 'G' got %c\n", sb3
.stored_char
);
988 ok(overflow_count
== 11, "expected 7 calls to overflow, got %d\n", overflow_count
- 4);
989 ret
= (int) call_func3(p_streambuf_xsputn
, &sb3
, "TeLephone", 9);
990 ok(ret
== 2, "wrong return value, expected 2 got %d\n", ret
);
991 ok(sb3
.stored_char
== 'G', "wrong stored character, expected 'G' got %c\n", sb3
.stored_char
);
992 ok(overflow_count
== 14, "expected 3 calls to overflow, got %d\n", overflow_count
- 11);
995 strcpy(sb
.eback
, "Test");
996 ret
= (int) call_func1(p_streambuf_snextc
, &sb
);
997 ok(ret
== 'e', "expected 'e' got '%c'\n", ret
);
998 ok(sb
.gptr
== sb
.eback
+ 1, "wrong get pointer, expected %p got %p\n", sb
.eback
+ 1, sb
.gptr
);
1000 ret
= (int) call_func1(p_streambuf_snextc
, &sb2
);
1001 ok(ret
== EOF
, "expected EOF got '%c'\n", ret
);
1002 ok(sb2
.gptr
== sb2
.egptr
+ 1, "wrong get pointer, expected %p got %p\n", sb2
.egptr
+ 1, sb2
.gptr
);
1003 ok(underflow_count
== 39, "expected 2 calls to underflow, got %d\n", underflow_count
- 37);
1004 sb2
.gptr
= sb2
.egptr
- 1;
1005 ret
= (int) call_func1(p_streambuf_snextc
, &sb2
);
1006 ok(ret
== EOF
, "expected EOF got '%c'\n", ret
);
1007 ok(sb2
.gptr
== sb2
.egptr
, "wrong get pointer, expected %p got %p\n", sb2
.egptr
, sb2
.gptr
);
1008 ok(underflow_count
== 40, "expected call to underflow\n");
1010 ret
= (int) call_func1(p_streambuf_snextc
, &sb2
);
1011 ok(ret
== 'o', "expected 'o' got '%c'\n", ret
);
1012 ok(sb2
.gptr
== sb2
.eback
+ 1, "wrong get pointer, expected %p got %p\n", sb2
.eback
+ 1, sb2
.gptr
);
1013 ok(underflow_count
== 41, "expected call to underflow\n");
1014 sb2
.gptr
= sb2
.egptr
- 1;
1015 ret
= (int) call_func1(p_streambuf_snextc
, &sb2
);
1016 ok(ret
== 'W', "expected 'W' got '%c'\n", ret
);
1017 ok(sb2
.gptr
== sb2
.eback
, "wrong get pointer, expected %p got %p\n", sb2
.eback
, sb2
.gptr
);
1018 ok(underflow_count
== 42, "expected call to underflow\n");
1019 sb2
.gptr
= sb2
.egptr
;
1021 ret
= (int) call_func1(p_streambuf_snextc
, &sb3
);
1022 ok(ret
== 'l', "expected 'l' got '%c'\n", ret
);
1023 ok(sb3
.stored_char
== 'l', "wrong stored character, expected 'l' got %c\n", sb3
.stored_char
);
1024 ok(underflow_count
== 43, "expected call to underflow\n");
1026 ret
= (int) call_func1(p_streambuf_snextc
, &sb3
);
1027 ok(ret
== 't', "expected 't' got '%c'\n", ret
);
1028 ok(sb3
.stored_char
== 't', "wrong stored character, expected 't' got %c\n", sb3
.stored_char
);
1029 ok(underflow_count
== 44, "expected call to underflow\n");
1030 ret
= (int) call_func1(p_streambuf_snextc
, &sb3
);
1031 ok(ret
== EOF
, "expected EOF got '%c'\n", ret
);
1032 ok(sb3
.stored_char
== EOF
, "wrong stored character, expected EOF got %c\n", sb3
.stored_char
);
1033 ok(underflow_count
== 45, "expected call to underflow\n");
1035 ret
= (int) call_func1(p_streambuf_snextc
, &sb3
);
1036 ok(ret
== 'o', "expected 'o' got '%c'\n", ret
);
1037 ok(sb3
.stored_char
== 'o', "wrong stored character, expected 'o' got %c\n", sb3
.stored_char
);
1038 ok(underflow_count
== 47, "expected 2 calls to underflow, got %d\n", underflow_count
- 45);
1039 sb3
.stored_char
= EOF
;
1040 ret
= (int) call_func1(p_streambuf_snextc
, &sb3
);
1041 ok(ret
== 'p', "expected 'p' got '%c'\n", ret
);
1042 ok(sb3
.stored_char
== 'p', "wrong stored character, expected 'p' got %c\n", sb3
.stored_char
);
1043 ok(underflow_count
== 49, "expected 2 calls to underflow, got %d\n", underflow_count
- 47);
1046 ret
= (int) call_func1(p_streambuf_sbumpc
, &sb
);
1047 ok(ret
== 'e', "expected 'e' got '%c'\n", ret
);
1048 ok(sb
.gptr
== sb
.eback
+ 2, "wrong get pointer, expected %p got %p\n", sb
.eback
+ 2, sb
.gptr
);
1050 ret
= (int) call_func1(p_streambuf_sbumpc
, &sb2
);
1051 ok(ret
== 'W', "expected 'W' got '%c'\n", ret
);
1052 ok(sb2
.gptr
== sb2
.eback
+ 1, "wrong get pointer, expected %p got %p\n", sb2
.eback
+ 1, sb2
.gptr
);
1053 ok(underflow_count
== 50, "expected call to underflow\n");
1054 sb2
.gptr
= sb2
.egptr
- 1;
1056 ret
= (int) call_func1(p_streambuf_sbumpc
, &sb2
);
1057 ok(ret
== 't', "expected 't' got '%c'\n", ret
);
1058 ok(sb2
.gptr
== sb2
.egptr
, "wrong get pointer, expected %p got %p\n", sb2
.egptr
, sb2
.gptr
);
1059 ok(underflow_count
== 50, "no call to underflow expected\n");
1061 ret
= (int) call_func1(p_streambuf_sbumpc
, &sb2
);
1062 ok(ret
== EOF
, "expected EOF got '%c'\n", ret
);
1063 ok(sb2
.gptr
== sb2
.egptr
+ 1, "wrong get pointer, expected %p got %p\n", sb2
.egptr
+ 1, sb2
.gptr
);
1064 ok(underflow_count
== 51, "expected call to underflow\n");
1065 sb2
.gptr
= sb2
.egptr
;
1067 ret
= (int) call_func1(p_streambuf_sbumpc
, &sb3
);
1068 ok(ret
== 'p', "expected 'p' got '%c'\n", ret
);
1069 ok(sb3
.stored_char
== EOF
, "wrong stored character, expected EOF got %c\n", sb3
.stored_char
);
1070 ok(underflow_count
== 51, "no call to underflow expected\n");
1071 ret
= (int) call_func1(p_streambuf_sbumpc
, &sb3
);
1072 ok(ret
== 'u', "expected 'u' got '%c'\n", ret
);
1073 ok(sb3
.stored_char
== EOF
, "wrong stored character, expected EOF got %c\n", sb3
.stored_char
);
1074 ok(underflow_count
== 52, "expected call to underflow\n");
1076 ret
= (int) call_func1(p_streambuf_sbumpc
, &sb3
);
1077 ok(ret
== EOF
, "expected EOF got '%c'\n", ret
);
1078 ok(sb3
.stored_char
== EOF
, "wrong stored character, expected EOF got %c\n", sb3
.stored_char
);
1079 ok(underflow_count
== 53, "expected call to underflow\n");
1081 ret
= (int) call_func1(p_streambuf_sbumpc
, &sb3
);
1082 ok(ret
== 'C', "expected 'C' got '%c'\n", ret
);
1083 ok(sb3
.stored_char
== EOF
, "wrong stored character, expected EOF got %c\n", sb3
.stored_char
);
1084 ok(underflow_count
== 54, "expected call to underflow\n");
1087 call_func1(p_streambuf_stossc
, &sb
);
1088 ok(sb
.gptr
== sb
.eback
+ 3, "wrong get pointer, expected %p got %p\n", sb
.eback
+ 3, sb
.gptr
);
1090 call_func1(p_streambuf_stossc
, &sb2
);
1091 ok(sb2
.gptr
== sb2
.egptr
, "wrong get pointer, expected %p got %p\n", sb2
.egptr
, sb2
.gptr
);
1092 ok(underflow_count
== 55, "expected call to underflow\n");
1094 call_func1(p_streambuf_stossc
, &sb2
);
1095 ok(sb2
.gptr
== sb2
.eback
+ 1, "wrong get pointer, expected %p got %p\n", sb2
.eback
+ 1, sb2
.gptr
);
1096 ok(underflow_count
== 56, "expected call to underflow\n");
1097 sb2
.gptr
= sb2
.egptr
- 1;
1098 call_func1(p_streambuf_stossc
, &sb2
);
1099 ok(sb2
.gptr
== sb2
.egptr
, "wrong get pointer, expected %p got %p\n", sb2
.egptr
, sb2
.gptr
);
1100 ok(underflow_count
== 56, "no call to underflow expected\n");
1102 call_func1(p_streambuf_stossc
, &sb3
);
1103 ok(sb3
.stored_char
== EOF
, "wrong stored character, expected EOF got %c\n", sb3
.stored_char
);
1104 ok(underflow_count
== 57, "expected call to underflow\n");
1105 sb3
.stored_char
= 'a';
1106 call_func1(p_streambuf_stossc
, &sb3
);
1107 ok(sb3
.stored_char
== EOF
, "wrong stored character, expected EOF got %c\n", sb3
.stored_char
);
1108 ok(underflow_count
== 57, "no call to underflow expected\n");
1111 ret
= (int) call_func2(p_streambuf_pbackfail
, &sb
, 'A');
1112 ok(ret
== 'A', "expected 'A' got '%c'\n", ret
);
1113 ok(sb
.gptr
== sb
.eback
+ 2, "wrong get pointer, expected %p got %p\n", sb
.eback
+ 2, sb
.gptr
);
1114 ok(*sb
.gptr
== 'A', "expected 'A' in the get area, got %c\n", *sb
.gptr
);
1115 ret
= (int) call_func2(p_streambuf_pbackfail
, &sb
, EOF
);
1116 ok(ret
== EOF
, "expected EOF got '%c'\n", ret
);
1117 ok(sb
.gptr
== sb
.eback
+ 1, "wrong get pointer, expected %p got %p\n", sb
.eback
+ 1, sb
.gptr
);
1118 ok((signed char)*sb
.gptr
== EOF
, "expected EOF in the get area, got %c\n", *sb
.gptr
);
1120 ret
= (int) call_func2(p_streambuf_pbackfail
, &sb
, 'Z');
1121 ok(ret
== EOF
, "expected EOF got '%c'\n", ret
);
1122 ok(sb
.gptr
== sb
.eback
, "wrong get pointer, expected %p got %p\n", sb
.eback
, sb
.gptr
);
1123 ok(*sb
.gptr
== 'T', "expected 'T' in the get area, got %c\n", *sb
.gptr
);
1124 ret
= (int) call_func2(p_streambuf_pbackfail
, &sb
, EOF
);
1125 ok(ret
== EOF
, "expected EOF got '%c'\n", ret
);
1126 ok(sb
.gptr
== sb
.eback
, "wrong get pointer, expected %p got %p\n", sb
.eback
, sb
.gptr
);
1127 ok(*sb
.gptr
== 'T', "expected 'T' in the get area, got %c\n", *sb
.gptr
);
1128 sb2
.gptr
= sb2
.egptr
+ 1;
1129 ret
= (int) call_func2(p_streambuf_pbackfail
, &sb2
, 'X');
1130 ok(ret
== 'X', "expected 'X' got '%c'\n", ret
);
1131 ok(sb2
.gptr
== sb2
.egptr
, "wrong get pointer, expected %p got %p\n", sb2
.egptr
, sb2
.gptr
);
1132 ok(*sb2
.gptr
== 'X', "expected 'X' in the get area, got %c\n", *sb2
.gptr
);
1134 SetEvent(lock_arg
.test
[3]);
1135 WaitForSingleObject(thread
, INFINITE
);
1137 call_func1(p_streambuf_dtor
, &sb
);
1138 call_func1(p_streambuf_dtor
, &sb2
);
1139 call_func1(p_streambuf_dtor
, &sb3
);
1140 for (i
= 0; i
< 4; i
++) {
1141 CloseHandle(lock_arg
.lock
[i
]);
1142 CloseHandle(lock_arg
.test
[i
]);
1144 CloseHandle(thread
);
1147 struct filebuf_lock_arg
1149 filebuf
*fb1
, *fb2
, *fb3
;
1154 static DWORD WINAPI
lock_filebuf(void *arg
)
1156 struct filebuf_lock_arg
*lock_arg
= arg
;
1157 call_func1(p_streambuf_lock
, &lock_arg
->fb1
->base
);
1158 call_func1(p_streambuf_lock
, &lock_arg
->fb2
->base
);
1159 call_func1(p_streambuf_lock
, &lock_arg
->fb3
->base
);
1160 SetEvent(lock_arg
->lock
);
1161 WaitForSingleObject(lock_arg
->test
, INFINITE
);
1162 call_func1(p_streambuf_unlock
, &lock_arg
->fb1
->base
);
1163 call_func1(p_streambuf_unlock
, &lock_arg
->fb2
->base
);
1164 call_func1(p_streambuf_unlock
, &lock_arg
->fb3
->base
);
1168 static void test_filebuf(void)
1170 filebuf fb1
, fb2
, fb3
, *pret
;
1171 struct filebuf_lock_arg lock_arg
;
1173 const char filename1
[] = "test1";
1174 const char filename2
[] = "test2";
1175 const char filename3
[] = "test3";
1176 char read_buffer
[16];
1179 memset(&fb1
, 0xab, sizeof(filebuf
));
1180 memset(&fb2
, 0xab, sizeof(filebuf
));
1181 memset(&fb3
, 0xab, sizeof(filebuf
));
1184 call_func2(p_filebuf_fd_ctor
, &fb1
, 1);
1185 ok(fb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", fb1
.base
.allocated
);
1186 ok(fb1
.base
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", fb1
.base
.unbuffered
);
1187 ok(fb1
.fd
== 1, "wrong fd, expected 1 got %d\n", fb1
.fd
);
1188 ok(fb1
.close
== 0, "wrong value, expected 0 got %d\n", fb1
.close
);
1189 call_func4(p_filebuf_fd_reserve_ctor
, &fb2
, 4, NULL
, 0);
1190 ok(fb2
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", fb2
.base
.allocated
);
1191 ok(fb2
.base
.unbuffered
== 1, "wrong unbuffered value, expected 1 got %d\n", fb2
.base
.unbuffered
);
1192 ok(fb2
.fd
== 4, "wrong fd, expected 4 got %d\n", fb2
.fd
);
1193 ok(fb2
.close
== 0, "wrong value, expected 0 got %d\n", fb2
.close
);
1194 call_func1(p_filebuf_ctor
, &fb3
);
1195 ok(fb3
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", fb3
.base
.allocated
);
1196 ok(fb3
.base
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", fb3
.base
.unbuffered
);
1197 ok(fb3
.fd
== -1, "wrong fd, expected -1 got %d\n", fb3
.fd
);
1198 ok(fb3
.close
== 0, "wrong value, expected 0 got %d\n", fb3
.close
);
1200 lock_arg
.fb1
= &fb1
;
1201 lock_arg
.fb2
= &fb2
;
1202 lock_arg
.fb3
= &fb3
;
1203 lock_arg
.lock
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
1204 ok(lock_arg
.lock
!= NULL
, "CreateEventW failed\n");
1205 lock_arg
.test
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
1206 ok(lock_arg
.test
!= NULL
, "CreateEventW failed\n");
1207 thread
= CreateThread(NULL
, 0, lock_filebuf
, (void*)&lock_arg
, 0, NULL
);
1208 ok(thread
!= NULL
, "CreateThread failed\n");
1209 WaitForSingleObject(lock_arg
.lock
, INFINITE
);
1212 fb1
.base
.do_lock
= 0;
1213 pret
= (filebuf
*) call_func3(p_filebuf_setbuf
, &fb1
, read_buffer
, 16);
1214 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1215 ok(fb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", fb1
.base
.allocated
);
1216 ok(fb1
.base
.base
== read_buffer
, "wrong buffer, expected %p got %p\n", read_buffer
, fb1
.base
.base
);
1217 ok(fb1
.base
.pbase
== NULL
, "wrong put area, expected %p got %p\n", NULL
, fb1
.base
.pbase
);
1218 fb1
.base
.pbase
= fb1
.base
.pptr
= fb1
.base
.base
;
1219 fb1
.base
.epptr
= fb1
.base
.ebuf
;
1220 fb1
.base
.do_lock
= -1;
1221 pret
= (filebuf
*) call_func3(p_filebuf_setbuf
, &fb1
, read_buffer
, 16);
1222 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1223 ok(fb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", fb1
.base
.allocated
);
1224 ok(fb1
.base
.base
== read_buffer
, "wrong buffer, expected %p got %p\n", read_buffer
, fb1
.base
.base
);
1225 ok(fb1
.base
.pbase
== read_buffer
, "wrong put area, expected %p got %p\n", read_buffer
, fb1
.base
.pbase
);
1226 fb1
.base
.base
= fb1
.base
.ebuf
= NULL
;
1227 fb1
.base
.do_lock
= 0;
1228 pret
= (filebuf
*) call_func3(p_filebuf_setbuf
, &fb1
, read_buffer
, 0);
1229 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1230 ok(fb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", fb1
.base
.allocated
);
1231 ok(fb1
.base
.unbuffered
== 1, "wrong unbuffered value, expected 1 got %d\n", fb1
.base
.unbuffered
);
1232 ok(fb1
.base
.base
== NULL
, "wrong buffer, expected %p got %p\n", NULL
, fb1
.base
.base
);
1233 ok(fb1
.base
.pbase
== read_buffer
, "wrong put area, expected %p got %p\n", read_buffer
, fb1
.base
.pbase
);
1234 fb1
.base
.pbase
= fb1
.base
.pptr
= fb1
.base
.epptr
= NULL
;
1235 fb1
.base
.unbuffered
= 0;
1236 fb1
.base
.do_lock
= -1;
1239 pret
= call_func2(p_filebuf_attach
, &fb1
, 2);
1240 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1241 ok(fb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", fb1
.base
.allocated
);
1242 ok(fb1
.fd
== 1, "wrong fd, expected 1 got %d\n", fb1
.fd
);
1244 fb2
.base
.do_lock
= 0;
1245 pret
= call_func2(p_filebuf_attach
, &fb2
, 3);
1246 ok(pret
== &fb2
, "wrong return, expected %p got %p\n", &fb2
, pret
);
1247 ok(fb2
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", fb2
.base
.allocated
);
1248 ok(fb2
.fd
== 3, "wrong fd, expected 3 got %d\n", fb2
.fd
);
1249 fb2
.base
.do_lock
= -1;
1250 fb3
.base
.do_lock
= 0;
1251 pret
= call_func2(p_filebuf_attach
, &fb3
, 2);
1252 ok(pret
== &fb3
, "wrong return, expected %p got %p\n", &fb3
, pret
);
1253 ok(fb3
.base
.allocated
== 1, "wrong allocate value, expected 1 got %d\n", fb3
.base
.allocated
);
1254 ok(fb3
.fd
== 2, "wrong fd, expected 2 got %d\n", fb3
.fd
);
1255 fb3
.base
.do_lock
= -1;
1258 pret
= call_func4(p_filebuf_open
, &fb1
, filename1
, OPENMODE_out
, filebuf_openprot
);
1259 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1261 pret
= call_func4(p_filebuf_open
, &fb1
, filename1
,
1262 OPENMODE_ate
|OPENMODE_nocreate
|OPENMODE_noreplace
|OPENMODE_binary
, filebuf_openprot
);
1263 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1264 ok(fb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", fb1
.base
.allocated
);
1265 fb1
.base
.do_lock
= 0;
1266 pret
= call_func4(p_filebuf_open
, &fb1
, filename1
, OPENMODE_out
, filebuf_openprot
);
1267 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1268 ok(fb1
.base
.allocated
== 1, "wrong allocate value, expected 1 got %d\n", fb1
.base
.allocated
);
1269 ok(_write(fb1
.fd
, "testing", 7) == 7, "_write failed\n");
1270 pret
= call_func1(p_filebuf_close
, &fb1
);
1271 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1272 ok(fb1
.fd
== -1, "wrong fd, expected -1 got %d\n", fb1
.fd
);
1273 pret
= call_func4(p_filebuf_open
, &fb1
, filename1
, OPENMODE_out
, filebuf_openprot
);
1274 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1275 ok(_read(fb1
.fd
, read_buffer
, 1) == -1, "file should not be open for reading\n");
1276 pret
= call_func1(p_filebuf_close
, &fb1
);
1277 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1278 pret
= call_func4(p_filebuf_open
, &fb1
, filename1
, OPENMODE_app
, filebuf_openprot
);
1279 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1280 ok(_read(fb1
.fd
, read_buffer
, 1) == -1, "file should not be open for reading\n");
1281 ok(_write(fb1
.fd
, "testing", 7) == 7, "_write failed\n");
1282 ok(_lseek(fb1
.fd
, 0, SEEK_SET
) == 0, "_lseek failed\n");
1283 ok(_write(fb1
.fd
, "append", 6) == 6, "_write failed\n");
1284 pret
= call_func1(p_filebuf_close
, &fb1
);
1285 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1286 pret
= call_func4(p_filebuf_open
, &fb1
, filename1
, OPENMODE_out
|OPENMODE_ate
, filebuf_openprot
);
1287 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1288 ok(_read(fb1
.fd
, read_buffer
, 1) == -1, "file should not be open for reading\n");
1289 ok(_lseek(fb1
.fd
, 0, SEEK_SET
) == 0, "_lseek failed\n");
1290 ok(_write(fb1
.fd
, "ate", 3) == 3, "_write failed\n");
1291 pret
= call_func1(p_filebuf_close
, &fb1
);
1292 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1293 pret
= call_func4(p_filebuf_open
, &fb1
, filename1
, OPENMODE_in
, filebuf_openprot
);
1294 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1295 ok(_read(fb1
.fd
, read_buffer
, 13) == 13, "read failed\n");
1296 read_buffer
[13] = 0;
1297 ok(!strncmp(read_buffer
, "atetingappend", 13), "wrong contents, expected 'atetingappend' got '%s'\n", read_buffer
);
1298 pret
= call_func1(p_filebuf_close
, &fb1
);
1299 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1300 pret
= call_func4(p_filebuf_open
, &fb1
, filename1
, OPENMODE_in
|OPENMODE_trunc
, filebuf_openprot
);
1301 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1302 ok(_read(fb1
.fd
, read_buffer
, 1) == 0, "read failed\n");
1303 ok(_write(fb1
.fd
, "file1", 5) == 5, "_write failed\n");
1304 pret
= call_func1(p_filebuf_close
, &fb1
);
1305 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1306 pret
= call_func4(p_filebuf_open
, &fb1
, filename1
, OPENMODE_in
|OPENMODE_app
, filebuf_openprot
);
1307 ok(pret
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pret
);
1308 ok(_write(fb1
.fd
, "app", 3) == 3, "_write failed\n");
1309 ok(_read(fb1
.fd
, read_buffer
, 1) == 0, "read failed\n");
1310 ok(_lseek(fb1
.fd
, 0, SEEK_SET
) == 0, "_lseek failed\n");
1311 ok(_read(fb1
.fd
, read_buffer
, 8) == 8, "read failed\n");
1313 ok(!strncmp(read_buffer
, "file1app", 8), "wrong contents, expected 'file1app' got '%s'\n", read_buffer
);
1314 fb1
.base
.do_lock
= -1;
1317 pret
= call_func4(p_filebuf_open
, &fb2
, filename2
, OPENMODE_out
|OPENMODE_nocreate
, filebuf_openprot
);
1318 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1319 pret
= call_func4(p_filebuf_open
, &fb2
, filename2
, OPENMODE_in
|OPENMODE_nocreate
, filebuf_openprot
);
1320 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1321 fb2
.base
.do_lock
= 0;
1322 pret
= call_func4(p_filebuf_open
, &fb2
, filename2
, OPENMODE_in
, filebuf_openprot
);
1323 ok(pret
== &fb2
, "wrong return, expected %p got %p\n", &fb2
, pret
);
1324 ok(_read(fb1
.fd
, read_buffer
, 1) == 0, "read failed\n");
1325 pret
= call_func1(p_filebuf_close
, &fb2
);
1326 ok(pret
== &fb2
, "wrong return, expected %p got %p\n", &fb2
, pret
);
1327 fb2
.base
.do_lock
= -1;
1328 pret
= call_func4(p_filebuf_open
, &fb2
, filename2
, OPENMODE_in
|OPENMODE_noreplace
, filebuf_openprot
);
1329 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1330 pret
= call_func4(p_filebuf_open
, &fb2
, filename2
, OPENMODE_trunc
|OPENMODE_noreplace
, filebuf_openprot
);
1331 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1332 pret
= call_func4(p_filebuf_open
, &fb2
, filename3
, OPENMODE_out
|OPENMODE_nocreate
|OPENMODE_noreplace
, filebuf_openprot
);
1333 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1335 /* open protection*/
1337 fb3
.base
.do_lock
= 0;
1338 pret
= call_func4(p_filebuf_open
, &fb3
, filename3
, OPENMODE_in
|OPENMODE_out
, filebuf_openprot
);
1339 ok(pret
== &fb3
, "wrong return, expected %p got %p\n", &fb3
, pret
);
1340 ok(_write(fb3
.fd
, "You wouldn't\nget this from\nany other guy", 40) == 40, "_write failed\n");
1341 fb2
.base
.do_lock
= 0;
1342 pret
= call_func4(p_filebuf_open
, &fb2
, filename3
, OPENMODE_in
|OPENMODE_out
, filebuf_openprot
);
1343 ok(pret
== &fb2
, "wrong return, expected %p got %p\n", &fb2
, pret
);
1344 pret
= call_func1(p_filebuf_close
, &fb2
);
1345 ok(pret
== &fb2
, "wrong return, expected %p got %p\n", &fb2
, pret
);
1346 fb2
.base
.do_lock
= -1;
1347 pret
= call_func1(p_filebuf_close
, &fb3
);
1348 ok(pret
== &fb3
, "wrong return, expected %p got %p\n", &fb3
, pret
);
1349 pret
= call_func4(p_filebuf_open
, &fb3
, filename3
, OPENMODE_in
, filebuf_sh_none
);
1350 ok(pret
== &fb3
, "wrong return, expected %p got %p\n", &fb3
, pret
);
1351 pret
= call_func4(p_filebuf_open
, &fb2
, filename3
, OPENMODE_in
, filebuf_openprot
);
1352 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1353 fb3
.base
.do_lock
= -1;
1356 fb1
.base
.do_lock
= 0;
1357 fb1
.base
.pbase
= fb1
.base
.pptr
= fb1
.base
.base
;
1358 fb1
.base
.epptr
= fb1
.base
.ebuf
;
1359 ret
= (int) call_func2(p_filebuf_setmode
, &fb1
, filebuf_binary
);
1360 ok(ret
== filebuf_text
, "wrong return, expected %d got %d\n", filebuf_text
, ret
);
1361 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1362 ret
= (int) call_func2(p_filebuf_setmode
, &fb1
, filebuf_binary
);
1363 ok(ret
== filebuf_binary
, "wrong return, expected %d got %d\n", filebuf_binary
, ret
);
1364 fb1
.base
.do_lock
= -1;
1365 ret
= (int) call_func2(p_filebuf_setmode
, &fb1
, 0x9000);
1366 ok(ret
== -1, "wrong return, expected -1 got %d\n", ret
);
1367 fb2
.base
.do_lock
= 0;
1368 ret
= (int) call_func2(p_filebuf_setmode
, &fb2
, filebuf_text
);
1369 ok(ret
== -1, "wrong return, expected -1 got %d\n", ret
);
1370 fb2
.base
.do_lock
= -1;
1373 ret
= (int) call_func1(p_filebuf_sync
, &fb1
);
1374 ok(ret
== 0, "wrong return, expected 0 got %d\n", ret
);
1375 fb1
.base
.eback
= fb1
.base
.gptr
= fb1
.base
.base
;
1376 fb1
.base
.egptr
= fb1
.base
.pbase
= fb1
.base
.pptr
= fb1
.base
.base
+ 256;
1377 fb1
.base
.epptr
= fb1
.base
.ebuf
;
1378 ret
= (int) call_func3(p_streambuf_xsputn
, &fb1
.base
, "We're no strangers to love\n", 27);
1379 ok(ret
== 27, "wrong return, expected 27 got %d\n", ret
);
1380 ret
= (int) call_func1(p_filebuf_sync
, &fb1
);
1381 ok(ret
== -1, "wrong return, expected -1 got %d\n", ret
);
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
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1384 fb1
.base
.eback
= fb1
.base
.gptr
= fb1
.base
.egptr
= NULL
;
1385 fb1
.base
.pbase
= fb1
.base
.pptr
= fb1
.base
.base
;
1386 fb1
.base
.epptr
= fb1
.base
.ebuf
;
1387 ret
= (int) call_func3(p_streambuf_xsputn
, &fb1
.base
, "You know the rules and so do I\n", 31);
1388 ok(ret
== 31, "wrong return, expected 31 got %d\n", ret
);
1389 ret
= (int) call_func1(p_filebuf_sync
, &fb1
);
1390 ok(ret
== 0, "wrong return, expected 0 got %d\n", ret
);
1391 ok(fb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, fb1
.base
.gptr
);
1392 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1393 fb1
.base
.eback
= fb1
.base
.base
;
1394 fb1
.base
.gptr
= fb1
.base
.base
+ 190;
1395 fb1
.base
.egptr
= fb1
.base
.pbase
= fb1
.base
.pptr
= fb1
.base
.base
+ 256;
1396 fb1
.base
.epptr
= fb1
.base
.ebuf
;
1397 ret
= (int) call_func1(p_filebuf_sync
, &fb1
);
1398 ok(ret
== 0, "wrong return, expected 0 got %d\n", ret
);
1399 ok(fb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, fb1
.base
.gptr
);
1400 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1401 ok(_tell(fb1
.fd
) == 0, "_tell failed\n");
1402 ret
= (int) call_func1(p_filebuf_sync
, &fb2
);
1403 ok(ret
== -1, "wrong return, expected -1 got %d\n", ret
);
1404 fb3
.base
.eback
= fb3
.base
.base
;
1405 fb3
.base
.gptr
= fb3
.base
.egptr
= fb3
.base
.pbase
= fb3
.base
.pptr
= fb3
.base
.base
+ 256;
1406 fb3
.base
.epptr
= fb3
.base
.ebuf
;
1407 ret
= (int) call_func3(p_streambuf_xsputn
, &fb3
.base
, "A full commitment's what I'm thinking of\n", 41);
1408 ok(ret
== 41, "wrong return, expected 41 got %d\n", ret
);
1409 ret
= (int) call_func1(p_filebuf_sync
, &fb3
);
1410 ok(ret
== -1, "wrong return, expected -1 got %d\n", ret
);
1411 ok(fb3
.base
.gptr
== fb3
.base
.base
+ 256, "wrong get pointer, expected %p got %p\n", fb3
.base
.base
+ 256, fb3
.base
.gptr
);
1412 ok(fb3
.base
.pptr
== fb3
.base
.base
+ 297, "wrong put pointer, expected %p got %p\n", fb3
.base
.base
+ 297, fb3
.base
.pptr
);
1413 fb3
.base
.eback
= fb3
.base
.base
;
1414 fb3
.base
.gptr
= fb3
.base
.egptr
= fb3
.base
.pbase
= fb3
.base
.pptr
= fb3
.base
.base
+ 256;
1415 fb3
.base
.epptr
= fb3
.base
.ebuf
;
1416 ret
= (int) call_func1(p_filebuf_sync
, &fb3
);
1417 ok(ret
== 0, "wrong return, expected 0 got %d\n", ret
);
1418 ok(fb3
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, fb3
.base
.gptr
);
1419 ok(fb3
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb3
.base
.pptr
);
1420 fb3
.base
.eback
= fb3
.base
.base
;
1421 fb3
.base
.gptr
= fb3
.base
.base
+ 216;
1422 fb3
.base
.egptr
= fb3
.base
.pbase
= fb3
.base
.pptr
= fb3
.base
.base
+ 256;
1423 fb3
.base
.epptr
= fb3
.base
.ebuf
;
1424 ok(_read(fb3
.fd
, fb3
.base
.gptr
, 42) == 40, "read failed\n");
1425 ret
= (int) call_func1(p_filebuf_sync
, &fb3
);
1426 ok(ret
== 0, "wrong return, expected 0 got %d\n", ret
);
1427 ok(fb3
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, fb3
.base
.gptr
);
1428 ok(fb3
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb3
.base
.pptr
);
1429 ok(_tell(fb3
.fd
) == 0, "_tell failed\n");
1430 fb3
.base
.eback
= fb3
.base
.gptr
= fb3
.base
.egptr
= NULL
;
1431 fb3
.base
.pbase
= fb3
.base
.pptr
= fb3
.base
.epptr
= NULL
;
1434 ret
= (int) call_func2(p_filebuf_overflow
, &fb1
, EOF
);
1435 ok(ret
== 1, "wrong return, expected 1 got %d\n", ret
);
1436 fb1
.base
.pbase
= fb1
.base
.pptr
= fb1
.base
.epptr
= NULL
;
1437 fb1
.base
.eback
= fb1
.base
.gptr
= fb1
.base
.base
;
1438 fb1
.base
.egptr
= fb1
.base
.ebuf
;
1439 ret
= (int) call_func2(p_filebuf_overflow
, &fb1
, 'a');
1440 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
1441 fb1
.base
.gptr
= fb1
.base
.egptr
= fb1
.base
.pbase
= fb1
.base
.pptr
= fb1
.base
.base
+ 256;
1442 fb1
.base
.epptr
= fb1
.base
.ebuf
;
1443 ret
= (int) call_func3(p_streambuf_xsputn
, &fb1
.base
, "I just want to tell you how I'm feeling", 39);
1444 ok(ret
== 39, "wrong return, expected 39 got %d\n", ret
);
1445 ret
= (int) call_func2(p_filebuf_overflow
, &fb1
, '\n');
1446 ok(ret
== 1, "wrong return, expected 1 got %d\n", ret
);
1447 ok(fb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, fb1
.base
.gptr
);
1448 ok(fb1
.base
.pbase
== fb1
.base
.base
, "wrong put base, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.pbase
);
1449 ok(fb1
.base
.pptr
== fb1
.base
.base
+ 1, "wrong put pointer, expected %p got %p\n", fb1
.base
.base
+ 1, fb1
.base
.pptr
);
1450 ok(fb1
.base
.epptr
== fb1
.base
.ebuf
, "wrong put end pointer, expected %p got %p\n", fb1
.base
.ebuf
, fb1
.base
.epptr
);
1451 ok(*fb1
.base
.pbase
== '\n', "wrong character, expected '\\n' got '%c'\n", *fb1
.base
.pbase
);
1452 ret
= (int) call_func2(p_filebuf_overflow
, &fb1
, EOF
);
1453 ok(ret
== 1, "wrong return, expected 1 got %d\n", ret
);
1454 ok(fb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, fb1
.base
.gptr
);
1455 ok(fb1
.base
.pbase
== fb1
.base
.base
, "wrong put base, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.pbase
);
1456 ok(fb1
.base
.pptr
== fb1
.base
.base
, "wrong put pointer, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.pptr
);
1457 ok(fb1
.base
.epptr
== fb1
.base
.ebuf
, "wrong put end pointer, expected %p got %p\n", fb1
.base
.ebuf
, fb1
.base
.epptr
);
1458 ret
= (int) call_func2(p_filebuf_overflow
, &fb2
, EOF
);
1459 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
1460 fb2
.base
.do_lock
= 0;
1461 pret
= call_func4(p_filebuf_open
, &fb2
, filename2
, OPENMODE_in
|OPENMODE_out
, filebuf_openprot
);
1462 ok(pret
== &fb2
, "wrong return, expected %p got %p\n", &fb2
, pret
);
1463 fb2
.base
.do_lock
= -1;
1464 ret
= (int) call_func2(p_filebuf_overflow
, &fb2
, EOF
);
1465 ok(ret
== 1, "wrong return, expected 1 got %d\n", ret
);
1468 ret
= (int) call_func1(p_filebuf_underflow
, &fb1
);
1469 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
1470 ok(fb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, fb1
.base
.gptr
);
1471 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1472 fb1
.base
.eback
= fb1
.base
.gptr
= fb1
.base
.base
;
1473 fb1
.base
.egptr
= fb1
.base
.pbase
= fb1
.base
.pptr
= fb1
.base
.base
+ 256;
1474 fb1
.base
.epptr
= fb1
.base
.ebuf
;
1475 *fb1
.base
.gptr
= 'A';
1476 ret
= (int) call_func1(p_filebuf_underflow
, &fb1
);
1477 ok(ret
== 'A', "wrong return, expected 'A' got %d\n", ret
);
1478 ok(fb1
.base
.gptr
== fb1
.base
.base
, "wrong get pointer, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.gptr
);
1479 ok(fb1
.base
.pptr
== fb1
.base
.base
+ 256, "wrong put pointer, expected %p got %p\n", fb1
.base
.base
+ 256, fb1
.base
.pptr
);
1480 fb1
.base
.gptr
= fb1
.base
.ebuf
;
1481 ret
= (int) call_func1(p_filebuf_underflow
, &fb1
);
1482 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
1483 ok(fb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, fb1
.base
.gptr
);
1484 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1485 ok(_lseek(fb1
.fd
, 0, SEEK_SET
) == 0, "_lseek failed\n");
1486 ret
= (int) call_func1(p_filebuf_underflow
, &fb1
);
1487 ok(ret
== 'f', "wrong return, expected 'f' got %d\n", ret
);
1488 ok(fb1
.base
.eback
== fb1
.base
.base
, "wrong get base, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.eback
);
1489 ok(fb1
.base
.gptr
== fb1
.base
.base
, "wrong get pointer, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.gptr
);
1490 ok(fb1
.base
.egptr
== fb1
.base
.base
+ 106, "wrong get end pointer, expected %p got %p\n", fb1
.base
.base
+ 106, fb1
.base
.egptr
);
1491 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1492 ret
= (int) call_func1(p_filebuf_underflow
, &fb2
);
1493 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
1494 ok(_write(fb2
.fd
, "A\n", 2) == 2, "_write failed\n");
1495 ok(_lseek(fb2
.fd
, 0, SEEK_SET
) == 0, "_lseek failed\n");
1496 ret
= (int) call_func1(p_filebuf_underflow
, &fb2
);
1497 ok(ret
== 'A', "wrong return, expected 'A' got %d\n", ret
);
1498 ret
= (int) call_func1(p_filebuf_underflow
, &fb2
);
1499 ok(ret
== '\n', "wrong return, expected '\\n' got %d\n", ret
);
1500 fb2
.base
.do_lock
= 0;
1501 pret
= call_func1(p_filebuf_close
, &fb2
);
1502 ok(pret
== &fb2
, "wrong return, expected %p got %p\n", &fb2
, pret
);
1503 fb2
.base
.do_lock
= -1;
1504 ret
= (int) call_func1(p_filebuf_underflow
, &fb2
);
1505 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
1508 ret
= (int) call_func4(p_filebuf_seekoff
, &fb1
, 5, SEEKDIR_beg
, 0);
1509 ok(ret
== 5, "wrong return, expected 5 got %d\n", ret
);
1510 ok(fb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, fb1
.base
.gptr
);
1511 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1512 fb1
.base
.eback
= fb1
.base
.gptr
= fb1
.base
.base
;
1513 fb1
.base
.egptr
= fb1
.base
.ebuf
;
1514 ret
= (int) call_func4(p_filebuf_seekoff
, &fb1
, 0, SEEKDIR_beg
, 0);
1515 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
1516 fb1
.base
.eback
= fb1
.base
.gptr
= fb1
.base
.egptr
= NULL
;
1517 ret
= (int) call_func4(p_filebuf_seekoff
, &fb1
, 10, SEEKDIR_beg
, OPENMODE_in
|OPENMODE_out
);
1518 ok(ret
== 10, "wrong return, expected 10 got %d\n", ret
);
1519 ret
= (int) call_func4(p_filebuf_seekoff
, &fb1
, 0, SEEKDIR_cur
, 0);
1520 ok(ret
== 10, "wrong return, expected 10 got %d\n", ret
);
1521 ret
= (int) call_func4(p_filebuf_seekoff
, &fb1
, 200, SEEKDIR_cur
, OPENMODE_in
);
1522 ok(ret
== 210, "wrong return, expected 210 got %d\n", ret
);
1523 ret
= (int) call_func4(p_filebuf_seekoff
, &fb1
, -60, SEEKDIR_cur
, 0);
1524 ok(ret
== 150, "wrong return, expected 150 got %d\n", ret
);
1525 ret
= (int) call_func4(p_filebuf_seekoff
, &fb1
, 0, SEEKDIR_end
, 0);
1526 ok(ret
== 106, "wrong return, expected 106 got %d\n", ret
);
1527 ret
= (int) call_func4(p_filebuf_seekoff
, &fb1
, 20, SEEKDIR_end
, OPENMODE_out
);
1528 ok(ret
== 126, "wrong return, expected 126 got %d\n", ret
);
1529 ret
= (int) call_func4(p_filebuf_seekoff
, &fb1
, -150, SEEKDIR_end
, -1);
1530 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
1531 ret
= (int) call_func4(p_filebuf_seekoff
, &fb1
, 10, 3, 0);
1532 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
1533 ret
= (int) call_func4(p_filebuf_seekoff
, &fb1
, 16, SEEKDIR_beg
, 0);
1534 ok(ret
== 16, "wrong return, expected 16 got %d\n", ret
);
1537 ret
= (int) call_func2(p_streambuf_pbackfail
, &fb1
.base
, 'B');
1538 ok(ret
== 'B', "wrong return, expected 'B' got %d\n", ret
);
1539 ok(fb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, fb1
.base
.gptr
);
1540 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1541 ok(_tell(fb1
.fd
) == 15, "_tell failed\n");
1542 fb1
.base
.eback
= fb1
.base
.gptr
= fb1
.base
.base
;
1543 fb1
.base
.egptr
= fb1
.base
.pbase
= fb1
.base
.pptr
= fb1
.base
.base
+ 256;
1544 fb1
.base
.epptr
= fb1
.base
.ebuf
;
1545 ret
= (int) call_func2(p_streambuf_pbackfail
, &fb1
.base
, 'C');
1546 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
1547 ok(fb1
.base
.gptr
== fb1
.base
.base
, "wrong get pointer, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.gptr
);
1548 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1549 ok(_tell(fb1
.fd
) == 15, "_tell failed\n");
1550 fb1
.base
.eback
= fb1
.base
.gptr
= fb1
.base
.base
;
1551 fb1
.base
.egptr
= fb1
.base
.base
+ 2;
1552 ret
= (int) call_func2(p_streambuf_pbackfail
, &fb1
.base
, 'C');
1553 ok(ret
== 'C', "wrong return, expected 'C' got %d\n", ret
);
1554 ok(fb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, fb1
.base
.gptr
);
1555 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1556 ok(_tell(fb1
.fd
) == 12, "_tell failed\n");
1557 fb1
.base
.eback
= fb1
.base
.gptr
= fb1
.base
.base
;
1558 fb1
.base
.egptr
= fb1
.base
.ebuf
;
1559 *fb1
.base
.gptr
++ = 'D';
1560 ret
= (int) call_func2(p_streambuf_pbackfail
, &fb1
.base
, 'C');
1561 ok(ret
== 'C', "wrong return, expected 'C' got %d\n", ret
);
1562 ok(fb1
.base
.gptr
== fb1
.base
.base
, "wrong get pointer, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.gptr
);
1563 ok(*fb1
.base
.gptr
== 'C', "wrong character, expected 'C' got '%c'\n", *fb1
.base
.gptr
);
1564 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
1565 ok(_tell(fb1
.fd
) == 12, "_tell failed\n");
1566 fb1
.base
.eback
= fb1
.base
.gptr
= fb1
.base
.egptr
= NULL
;
1569 pret
= call_func1(p_filebuf_close
, &fb2
);
1570 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1571 fb3
.base
.do_lock
= 0;
1572 pret
= call_func1(p_filebuf_close
, &fb3
);
1573 ok(pret
== &fb3
, "wrong return, expected %p got %p\n", &fb3
, pret
);
1574 ok(fb3
.fd
== -1, "wrong fd, expected -1 got %d\n", fb3
.fd
);
1576 pret
= call_func1(p_filebuf_close
, &fb3
);
1577 ok(pret
== NULL
, "wrong return, expected %p got %p\n", NULL
, pret
);
1578 ok(fb3
.fd
== 5, "wrong fd, expected 5 got %d\n", fb3
.fd
);
1579 fb3
.base
.do_lock
= -1;
1581 SetEvent(lock_arg
.test
);
1582 WaitForSingleObject(thread
, INFINITE
);
1585 call_func1(p_filebuf_dtor
, &fb1
);
1586 ok(fb1
.fd
== -1, "wrong fd, expected -1 got %d\n", fb1
.fd
);
1587 call_func1(p_filebuf_dtor
, &fb2
);
1588 call_func1(p_filebuf_dtor
, &fb3
);
1590 ok(_unlink(filename1
) == 0, "Couldn't unlink file named '%s'\n", filename1
);
1591 ok(_unlink(filename2
) == 0, "Couldn't unlink file named '%s'\n", filename2
);
1592 ok(_unlink(filename3
) == 0, "Couldn't unlink file named '%s'\n", filename3
);
1593 CloseHandle(lock_arg
.lock
);
1594 CloseHandle(lock_arg
.test
);
1595 CloseHandle(thread
);
1598 static void test_strstreambuf(void)
1600 strstreambuf ssb1
, ssb2
;
1602 char buffer
[64], *pbuffer
;
1605 memset(&ssb1
, 0xab, sizeof(strstreambuf
));
1606 memset(&ssb2
, 0xab, sizeof(strstreambuf
));
1608 /* constructors/destructor */
1609 call_func2(p_strstreambuf_dynamic_ctor
, &ssb1
, 64);
1610 ok(ssb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", ssb1
.base
.allocated
);
1611 ok(ssb1
.base
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", ssb1
.base
.unbuffered
);
1612 ok(ssb1
.dynamic
== 1, "expected 1, got %d\n", ssb1
.dynamic
);
1613 ok(ssb1
.increase
== 64, "expected 64, got %d\n", ssb1
.increase
);
1614 ok(ssb1
.constant
== 0, "expected 0, got %d\n", ssb1
.constant
);
1615 ok(ssb1
.f_alloc
== NULL
, "expected %p, got %p\n", NULL
, ssb1
.f_alloc
);
1616 ok(ssb1
.f_free
== NULL
, "expected %p, got %p\n", NULL
, ssb1
.f_free
);
1617 call_func1(p_strstreambuf_dtor
, &ssb1
);
1618 call_func3(p_strstreambuf_funcs_ctor
, &ssb2
, (allocFunction
)p_operator_new
, p_operator_delete
);
1619 ok(ssb2
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", ssb2
.base
.allocated
);
1620 ok(ssb2
.base
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", ssb2
.base
.unbuffered
);
1621 ok(ssb2
.dynamic
== 1, "expected 1, got %d\n", ssb2
.dynamic
);
1622 ok(ssb2
.increase
== 1, "expected 1, got %d\n", ssb2
.increase
);
1623 ok(ssb2
.constant
== 0, "expected 0, got %d\n", ssb2
.constant
);
1624 ok(ssb2
.f_alloc
== (allocFunction
)p_operator_new
, "expected %p, got %p\n", p_operator_new
, ssb2
.f_alloc
);
1625 ok(ssb2
.f_free
== p_operator_delete
, "expected %p, got %p\n", p_operator_delete
, ssb2
.f_free
);
1626 call_func1(p_strstreambuf_dtor
, &ssb2
);
1627 memset(&ssb1
, 0xab, sizeof(strstreambuf
));
1628 memset(&ssb2
, 0xab, sizeof(strstreambuf
));
1629 call_func4(p_strstreambuf_buffer_ctor
, &ssb1
, buffer
, 64, buffer
+ 20);
1630 ok(ssb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", ssb1
.base
.allocated
);
1631 ok(ssb1
.base
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", ssb1
.base
.unbuffered
);
1632 ok(ssb1
.base
.base
== buffer
, "wrong buffer, expected %p got %p\n", buffer
, ssb1
.base
.base
);
1633 ok(ssb1
.base
.ebuf
== buffer
+ 64, "wrong buffer end, expected %p got %p\n", buffer
+ 64, ssb1
.base
.ebuf
);
1634 ok(ssb1
.base
.eback
== buffer
, "wrong get base, expected %p got %p\n", buffer
, ssb1
.base
.eback
);
1635 ok(ssb1
.base
.gptr
== buffer
, "wrong get pointer, expected %p got %p\n", buffer
, ssb1
.base
.gptr
);
1636 ok(ssb1
.base
.egptr
== buffer
+ 20, "wrong get end, expected %p got %p\n", buffer
+ 20, ssb1
.base
.egptr
);
1637 ok(ssb1
.base
.pbase
== buffer
+ 20, "wrong put base, expected %p got %p\n", buffer
+ 20, ssb1
.base
.pbase
);
1638 ok(ssb1
.base
.pptr
== buffer
+ 20, "wrong put pointer, expected %p got %p\n", buffer
+ 20, ssb1
.base
.pptr
);
1639 ok(ssb1
.base
.epptr
== buffer
+ 64, "wrong put end, expected %p got %p\n", buffer
+ 64, ssb1
.base
.epptr
);
1640 ok(ssb1
.dynamic
== 0, "expected 0, got %d\n", ssb1
.dynamic
);
1641 ok(ssb1
.constant
== 1, "expected 1, got %d\n", ssb1
.constant
);
1642 call_func1(p_strstreambuf_dtor
, &ssb1
);
1643 strcpy(buffer
, "Test");
1644 call_func4(p_strstreambuf_buffer_ctor
, &ssb2
, buffer
, 0, buffer
+ 20);
1645 ok(ssb2
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", ssb2
.base
.allocated
);
1646 ok(ssb2
.base
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", ssb2
.base
.unbuffered
);
1647 ok(ssb2
.base
.base
== buffer
, "wrong buffer, expected %p got %p\n", buffer
, ssb2
.base
.base
);
1648 ok(ssb2
.base
.ebuf
== buffer
+ 4, "wrong buffer end, expected %p got %p\n", buffer
+ 4, ssb2
.base
.ebuf
);
1649 ok(ssb2
.base
.eback
== buffer
, "wrong get base, expected %p got %p\n", buffer
, ssb2
.base
.eback
);
1650 ok(ssb2
.base
.gptr
== buffer
, "wrong get pointer, expected %p got %p\n", buffer
, ssb2
.base
.gptr
);
1651 ok(ssb2
.base
.egptr
== buffer
+ 20, "wrong get end, expected %p got %p\n", buffer
+ 20, ssb2
.base
.egptr
);
1652 ok(ssb2
.base
.pbase
== buffer
+ 20, "wrong put base, expected %p got %p\n", buffer
+ 20, ssb2
.base
.pbase
);
1653 ok(ssb2
.base
.pptr
== buffer
+ 20, "wrong put pointer, expected %p got %p\n", buffer
+ 20, ssb2
.base
.pptr
);
1654 ok(ssb2
.base
.epptr
== buffer
+ 4, "wrong put end, expected %p got %p\n", buffer
+ 4, ssb2
.base
.epptr
);
1655 ok(ssb2
.dynamic
== 0, "expected 0, got %d\n", ssb2
.dynamic
);
1656 ok(ssb2
.constant
== 1, "expected 1, got %d\n", ssb2
.constant
);
1657 call_func1(p_strstreambuf_dtor
, &ssb2
);
1658 memset(&ssb1
, 0xab, sizeof(strstreambuf
));
1659 memset(&ssb2
, 0xab, sizeof(strstreambuf
));
1660 call_func4(p_strstreambuf_buffer_ctor
, &ssb1
, NULL
, 16, buffer
+ 20);
1661 ok(ssb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", ssb1
.base
.allocated
);
1662 ok(ssb1
.base
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", ssb1
.base
.unbuffered
);
1663 ok(ssb1
.base
.base
== NULL
, "wrong buffer, expected %p got %p\n", NULL
, ssb1
.base
.base
);
1664 ok(ssb1
.base
.ebuf
== (char*)16, "wrong buffer end, expected %p got %p\n", (char*)16, ssb1
.base
.ebuf
);
1665 ok(ssb1
.base
.eback
== NULL
, "wrong get base, expected %p got %p\n", NULL
, ssb1
.base
.eback
);
1666 ok(ssb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, ssb1
.base
.gptr
);
1667 ok(ssb1
.base
.egptr
== buffer
+ 20, "wrong get end, expected %p got %p\n", buffer
+ 20, ssb1
.base
.egptr
);
1668 ok(ssb1
.base
.pbase
== buffer
+ 20, "wrong put base, expected %p got %p\n", buffer
+ 20, ssb1
.base
.pbase
);
1669 ok(ssb1
.base
.pptr
== buffer
+ 20, "wrong put pointer, expected %p got %p\n", buffer
+ 20, ssb1
.base
.pptr
);
1670 ok(ssb1
.base
.epptr
== (char*)16, "wrong put end, expected %p got %p\n", (char*)16, ssb1
.base
.epptr
);
1671 ok(ssb1
.dynamic
== 0, "expected 0, got %d\n", ssb1
.dynamic
);
1672 ok(ssb1
.constant
== 1, "expected 1, got %d\n", ssb1
.constant
);
1673 call_func1(p_strstreambuf_dtor
, &ssb1
);
1674 call_func4(p_strstreambuf_buffer_ctor
, &ssb2
, buffer
, 0, NULL
);
1675 ok(ssb2
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", ssb2
.base
.allocated
);
1676 ok(ssb2
.base
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", ssb2
.base
.unbuffered
);
1677 ok(ssb2
.base
.base
== buffer
, "wrong buffer, expected %p got %p\n", buffer
, ssb2
.base
.base
);
1678 ok(ssb2
.base
.ebuf
== buffer
+ 4, "wrong buffer end, expected %p got %p\n", buffer
+ 4, ssb2
.base
.ebuf
);
1679 ok(ssb2
.base
.eback
== buffer
, "wrong get base, expected %p got %p\n", buffer
, ssb2
.base
.eback
);
1680 ok(ssb2
.base
.gptr
== buffer
, "wrong get pointer, expected %p got %p\n", buffer
, ssb2
.base
.gptr
);
1681 ok(ssb2
.base
.egptr
== buffer
+ 4, "wrong get end, expected %p got %p\n", buffer
+ 4, ssb2
.base
.egptr
);
1682 ok(ssb2
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, ssb2
.base
.pbase
);
1683 ok(ssb2
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, ssb2
.base
.pptr
);
1684 ok(ssb2
.base
.epptr
== NULL
, "wrong put end, expected %p got %p\n", NULL
, ssb2
.base
.epptr
);
1685 ok(ssb2
.dynamic
== 0, "expected 0, got %d\n", ssb2
.dynamic
);
1686 ok(ssb2
.constant
== 1, "expected 1, got %d\n", ssb2
.constant
);
1687 call_func1(p_strstreambuf_dtor
, &ssb2
);
1688 memset(&ssb1
, 0xab, sizeof(strstreambuf
));
1689 memset(&ssb2
, 0xab, sizeof(strstreambuf
));
1690 call_func4(p_strstreambuf_buffer_ctor
, &ssb1
, buffer
, -5, buffer
+ 20);
1691 ok(ssb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", ssb1
.base
.allocated
);
1692 ok(ssb1
.base
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", ssb1
.base
.unbuffered
);
1693 ok(ssb1
.base
.base
== buffer
, "wrong buffer, expected %p got %p\n", buffer
, ssb1
.base
.base
);
1694 ok(ssb1
.base
.ebuf
== buffer
+ 0x7fffffff || ssb1
.base
.ebuf
== (char*)-1,
1695 "wrong buffer end, expected %p + 0x7fffffff or -1, got %p\n", buffer
, ssb1
.base
.ebuf
);
1696 ok(ssb1
.base
.eback
== buffer
, "wrong get base, expected %p got %p\n", buffer
, ssb1
.base
.eback
);
1697 ok(ssb1
.base
.gptr
== buffer
, "wrong get pointer, expected %p got %p\n", buffer
, ssb1
.base
.gptr
);
1698 ok(ssb1
.base
.egptr
== buffer
+ 20, "wrong get end, expected %p got %p\n", buffer
+ 20, ssb1
.base
.egptr
);
1699 ok(ssb1
.base
.pbase
== buffer
+ 20, "wrong put base, expected %p got %p\n", buffer
+ 20, ssb1
.base
.pbase
);
1700 ok(ssb1
.base
.pptr
== buffer
+ 20, "wrong put pointer, expected %p got %p\n", buffer
+ 20, ssb1
.base
.pptr
);
1701 ok(ssb1
.base
.epptr
== buffer
+ 0x7fffffff || ssb1
.base
.epptr
== (char*)-1,
1702 "wrong put end, expected %p + 0x7fffffff or -1, got %p\n", buffer
, ssb1
.base
.epptr
);
1703 ok(ssb1
.dynamic
== 0, "expected 0, got %d\n", ssb1
.dynamic
);
1704 ok(ssb1
.constant
== 1, "expected 1, got %d\n", ssb1
.constant
);
1705 call_func1(p_strstreambuf_ctor
, &ssb2
);
1706 ok(ssb2
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", ssb2
.base
.allocated
);
1707 ok(ssb2
.base
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", ssb2
.base
.unbuffered
);
1708 ok(ssb2
.dynamic
== 1, "expected 1, got %d\n", ssb2
.dynamic
);
1709 ok(ssb2
.increase
== 1, "expected 1, got %d\n", ssb2
.increase
);
1710 ok(ssb2
.constant
== 0, "expected 0, got %d\n", ssb2
.constant
);
1711 ok(ssb2
.f_alloc
== NULL
, "expected %p, got %p\n", NULL
, ssb2
.f_alloc
);
1712 ok(ssb2
.f_free
== NULL
, "expected %p, got %p\n", NULL
, ssb2
.f_free
);
1715 call_func2(p_strstreambuf_freeze
, &ssb1
, 0);
1716 ok(ssb1
.dynamic
== 0, "expected 0, got %d\n", ssb1
.dynamic
);
1718 call_func2(p_strstreambuf_freeze
, &ssb1
, 0);
1719 ok(ssb1
.dynamic
== 1, "expected 1, got %d\n", ssb1
.dynamic
);
1720 call_func2(p_strstreambuf_freeze
, &ssb1
, 3);
1721 ok(ssb1
.dynamic
== 0, "expected 0, got %d\n", ssb1
.dynamic
);
1723 call_func2(p_strstreambuf_freeze
, &ssb2
, 5);
1724 ok(ssb2
.dynamic
== 0, "expected 0, got %d\n", ssb2
.dynamic
);
1725 call_func2(p_strstreambuf_freeze
, &ssb2
, 0);
1726 ok(ssb2
.dynamic
== 1, "expected 1, got %d\n", ssb2
.dynamic
);
1731 ret
= (int) call_func1(p_strstreambuf_doallocate
, &ssb2
);
1732 ok(ret
== 1, "return value %d\n", ret
);
1733 ok(ssb2
.base
.ebuf
== ssb2
.base
.base
+ 5, "expected %p, got %p\n", ssb2
.base
.base
+ 5, ssb2
.base
.ebuf
);
1734 ssb2
.base
.eback
= ssb2
.base
.base
;
1735 ssb2
.base
.gptr
= ssb2
.base
.base
+ 2;
1736 ssb2
.base
.egptr
= ssb2
.base
.base
+ 4;
1737 strcpy(ssb2
.base
.base
, "Check");
1738 ret
= (int) call_func1(p_strstreambuf_doallocate
, &ssb2
);
1739 ok(ret
== 1, "return value %d\n", ret
);
1740 ok(ssb2
.base
.ebuf
== ssb2
.base
.base
+ 10, "expected %p, got %p\n", ssb2
.base
.base
+ 10, ssb2
.base
.ebuf
);
1741 ok(ssb2
.base
.eback
== ssb2
.base
.base
, "wrong get base, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.eback
);
1742 ok(ssb2
.base
.gptr
== ssb2
.base
.base
+ 2, "wrong get pointer, expected %p got %p\n", ssb2
.base
.base
+ 2, ssb2
.base
.gptr
);
1743 ok(ssb2
.base
.egptr
== ssb2
.base
.base
+ 4, "wrong get end, expected %p got %p\n", ssb2
.base
.base
+ 4, ssb2
.base
.egptr
);
1744 ok(!strncmp(ssb2
.base
.base
, "Check", 5), "strings are not equal\n");
1745 ssb2
.base
.pbase
= ssb2
.base
.pptr
= ssb2
.base
.base
+ 4;
1746 ssb2
.base
.epptr
= ssb2
.base
.ebuf
;
1748 ret
= (int) call_func1(p_strstreambuf_doallocate
, &ssb2
);
1749 ok(ret
== 1, "return value %d\n", ret
);
1750 ok(ssb2
.base
.ebuf
== ssb2
.base
.base
+ 11, "expected %p, got %p\n", ssb2
.base
.base
+ 11, ssb2
.base
.ebuf
);
1751 ok(ssb2
.base
.pbase
== ssb2
.base
.base
+ 4, "wrong put base, expected %p got %p\n", ssb2
.base
.base
+ 4, ssb2
.base
.pbase
);
1752 ok(ssb2
.base
.pptr
== ssb2
.base
.base
+ 4, "wrong put pointer, expected %p got %p\n", ssb2
.base
.base
+ 4, ssb2
.base
.pptr
);
1753 ok(ssb2
.base
.epptr
== ssb2
.base
.base
+ 10, "wrong put end, expected %p got %p\n", ssb2
.base
.base
+ 10, ssb2
.base
.epptr
);
1754 ok(!strncmp(ssb2
.base
.base
, "Check", 5), "strings are not equal\n");
1758 pret
= call_func3(p_strstreambuf_setbuf
, &ssb1
, buffer
+ 16, 16);
1759 ok(pret
== &ssb1
.base
, "expected %p got %p\n", &ssb1
.base
, pret
);
1760 ok(ssb1
.base
.base
== buffer
, "wrong buffer, expected %p got %p\n", buffer
, ssb1
.base
.base
);
1761 ok(ssb1
.increase
== 16, "expected 16, got %d\n", ssb1
.increase
);
1762 pret
= call_func3(p_strstreambuf_setbuf
, &ssb2
, NULL
, 2);
1763 ok(pret
== &ssb2
.base
, "expected %p got %p\n", &ssb2
.base
, pret
);
1764 ok(ssb2
.increase
== 2, "expected 2, got %d\n", ssb2
.increase
);
1765 pret
= call_func3(p_strstreambuf_setbuf
, &ssb2
, buffer
, 0);
1766 ok(pret
== &ssb2
.base
, "expected %p got %p\n", &ssb2
.base
, pret
);
1767 ok(ssb2
.increase
== 2, "expected 2, got %d\n", ssb2
.increase
);
1768 pret
= call_func3(p_strstreambuf_setbuf
, &ssb2
, NULL
, -2);
1769 ok(pret
== &ssb2
.base
, "expected %p got %p\n", &ssb2
.base
, pret
);
1770 ok(ssb2
.increase
== -2, "expected -2, got %d\n", ssb2
.increase
);
1773 ssb1
.base
.epptr
= ssb1
.base
.ebuf
= ssb1
.base
.base
+ 64;
1774 ret
= (int) call_func1(p_strstreambuf_underflow
, &ssb1
);
1775 ok(ret
== 'T', "expected 'T' got %d\n", ret
);
1776 ssb1
.base
.gptr
= ssb1
.base
.egptr
;
1777 ret
= (int) call_func1(p_strstreambuf_underflow
, &ssb1
);
1778 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1779 ret
= (int) call_func3(p_streambuf_xsputn
, &ssb1
.base
, "Gotta make you understand", 5);
1780 ok(ret
== 5, "expected 5 got %d\n", ret
);
1781 ok(ssb1
.base
.pptr
== buffer
+ 25, "wrong put pointer, expected %p got %p\n", buffer
+ 25, ssb1
.base
.pptr
);
1782 ret
= (int) call_func1(p_strstreambuf_underflow
, &ssb1
);
1783 ok(ret
== 'G', "expected 'G' got %d\n", ret
);
1784 ok(ssb1
.base
.egptr
== buffer
+ 25, "wrong get end, expected %p got %p\n", buffer
+ 25, ssb1
.base
.egptr
);
1785 ssb1
.base
.gptr
= ssb1
.base
.egptr
= ssb1
.base
.pptr
= ssb1
.base
.epptr
;
1786 ret
= (int) call_func1(p_strstreambuf_underflow
, &ssb1
);
1787 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1788 ssb2
.base
.eback
= ssb2
.base
.gptr
= ssb2
.base
.egptr
= NULL
;
1789 ssb2
.base
.pbase
= ssb2
.base
.pptr
= ssb2
.base
.epptr
= NULL
;
1790 ret
= (int) call_func1(p_strstreambuf_underflow
, &ssb2
);
1791 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1792 ssb2
.base
.pbase
= ssb2
.base
.pptr
= ssb2
.base
.base
;
1793 ret
= (int) call_func1(p_strstreambuf_underflow
, &ssb2
);
1794 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1795 ok(ssb2
.base
.eback
== ssb2
.base
.base
, "wrong get base, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.eback
);
1796 ok(ssb2
.base
.gptr
== ssb2
.base
.base
, "wrong get pointer, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.gptr
);
1797 ok(ssb2
.base
.egptr
== ssb2
.base
.base
, "wrong get end, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.egptr
);
1798 ssb2
.base
.pptr
= ssb2
.base
.base
+ 3;
1799 ret
= (int) call_func1(p_strstreambuf_underflow
, &ssb2
);
1800 ok(ret
== 'C', "expected 'C' got %d\n", ret
);
1801 ok(ssb2
.base
.eback
== ssb2
.base
.base
, "wrong get base, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.eback
);
1802 ok(ssb2
.base
.gptr
== ssb2
.base
.base
, "wrong get pointer, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.gptr
);
1803 ok(ssb2
.base
.egptr
== ssb2
.base
.base
+ 3, "wrong get end, expected %p got %p\n", ssb2
.base
.base
+ 3, ssb2
.base
.egptr
);
1804 ssb2
.base
.gptr
= ssb2
.base
.base
+ 2;
1805 ssb2
.base
.egptr
= NULL
;
1806 ret
= (int) call_func1(p_strstreambuf_underflow
, &ssb2
);
1807 ok(ret
== 'e', "expected 'e' got %d\n", ret
);
1808 ok(ssb2
.base
.eback
== ssb2
.base
.base
, "wrong get base, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.eback
);
1809 ok(ssb2
.base
.gptr
== ssb2
.base
.base
+ 2, "wrong get pointer, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.gptr
);
1810 ok(ssb2
.base
.egptr
== ssb2
.base
.base
+ 3, "wrong get end, expected %p got %p\n", ssb2
.base
.base
+ 3, ssb2
.base
.egptr
);
1811 ssb2
.base
.eback
= ssb2
.base
.egptr
= ssb2
.base
.base
+ 1;
1812 ssb2
.base
.gptr
= ssb2
.base
.base
+ 3;
1813 ssb2
.base
.pptr
= ssb2
.base
.base
+ 5;
1814 ret
= (int) call_func1(p_strstreambuf_underflow
, &ssb2
);
1815 ok(ret
== 'e', "expected 'e' got %d\n", ret
);
1816 ok(ssb2
.base
.eback
== ssb2
.base
.base
, "wrong get base, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.eback
);
1817 ok(ssb2
.base
.gptr
== ssb2
.base
.base
+ 2, "wrong get pointer, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.gptr
);
1818 ok(ssb2
.base
.egptr
== ssb2
.base
.base
+ 5, "wrong get end, expected %p got %p\n", ssb2
.base
.base
+ 5, ssb2
.base
.egptr
);
1819 ssb2
.base
.eback
= ssb2
.base
.base
;
1820 ssb2
.base
.gptr
= ssb2
.base
.egptr
= ssb2
.base
.ebuf
;
1821 ssb2
.base
.pbase
= ssb2
.base
.pptr
= NULL
;
1822 ret
= (int) call_func1(p_strstreambuf_underflow
, &ssb2
);
1823 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1826 ssb1
.base
.pptr
= ssb1
.base
.epptr
- 1;
1827 ret
= (int) call_func2(p_strstreambuf_overflow
, &ssb1
, EOF
);
1828 ok(ret
== 1, "expected 1 got %d\n", ret
);
1829 ret
= (int) call_func2(p_strstreambuf_overflow
, &ssb1
, 'A');
1830 ok(ret
== 1, "expected 1 got %d\n", ret
);
1831 ok(ssb1
.base
.pptr
== ssb1
.base
.epptr
, "wrong put pointer, expected %p got %p\n", ssb1
.base
.epptr
, ssb1
.base
.pptr
);
1832 ok(*(ssb1
.base
.pptr
- 1) == 'A', "expected 'A' got %d\n", *(ssb1
.base
.pptr
- 1));
1833 ret
= (int) call_func2(p_strstreambuf_overflow
, &ssb1
, 'B');
1834 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1835 ret
= (int) call_func2(p_strstreambuf_overflow
, &ssb1
, EOF
);
1836 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1838 ret
= (int) call_func2(p_strstreambuf_overflow
, &ssb2
, 'C');
1839 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1841 ret
= (int) call_func2(p_strstreambuf_overflow
, &ssb2
, 'C');
1842 ok(ret
== 1, "expected 1 got %d\n", ret
);
1843 ok(ssb2
.base
.ebuf
== ssb2
.base
.base
+ 12, "expected %p got %p\n", ssb2
.base
.base
+ 12, ssb2
.base
.ebuf
);
1844 ok(ssb2
.base
.gptr
== ssb2
.base
.base
+ 11, "wrong get pointer, expected %p got %p\n", ssb2
.base
.base
+ 11, ssb2
.base
.gptr
);
1845 ok(ssb2
.base
.pbase
== ssb2
.base
.base
+ 11, "wrong put base, expected %p got %p\n", ssb2
.base
.base
+ 11, ssb2
.base
.pbase
);
1846 ok(ssb2
.base
.pptr
== ssb2
.base
.base
+ 12, "wrong put pointer, expected %p got %p\n", ssb2
.base
.base
+ 12, ssb2
.base
.pptr
);
1847 ok(ssb2
.base
.epptr
== ssb2
.base
.base
+ 12, "wrong put end, expected %p got %p\n", ssb2
.base
.base
+ 12, ssb2
.base
.epptr
);
1848 ok(*(ssb2
.base
.pptr
- 1) == 'C', "expected 'C' got %d\n", *(ssb2
.base
.pptr
- 1));
1850 ssb2
.base
.eback
= ssb2
.base
.gptr
= ssb2
.base
.egptr
= NULL
;
1851 ssb2
.base
.pbase
= ssb2
.base
.pptr
= ssb2
.base
.epptr
= NULL
;
1852 ret
= (int) call_func2(p_strstreambuf_overflow
, &ssb2
, 'D');
1853 ok(ret
== 1, "expected 1 got %d\n", ret
);
1854 ok(ssb2
.base
.ebuf
== ssb2
.base
.base
+ 16, "expected %p got %p\n", ssb2
.base
.base
+ 16, ssb2
.base
.ebuf
);
1855 ok(ssb2
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, ssb2
.base
.gptr
);
1856 ok(ssb2
.base
.pbase
== ssb2
.base
.base
, "wrong put base, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.pbase
);
1857 ok(ssb2
.base
.pptr
== ssb2
.base
.base
+ 1, "wrong put pointer, expected %p got %p\n", ssb2
.base
.base
+ 1, ssb2
.base
.pptr
);
1858 ok(ssb2
.base
.epptr
== ssb2
.base
.base
+ 16, "wrong put end, expected %p got %p\n", ssb2
.base
.base
+ 16, ssb2
.base
.epptr
);
1859 ok(*(ssb2
.base
.pptr
- 1) == 'D', "expected 'D' got %d\n", *(ssb2
.base
.pptr
- 1));
1860 ssb2
.base
.pbase
= ssb2
.base
.base
+ 3;
1861 ssb2
.base
.pptr
= ssb2
.base
.epptr
+ 5;
1862 ret
= (int) call_func2(p_strstreambuf_overflow
, &ssb2
, 'E');
1863 ok(ret
== 1, "expected 1 got %d\n", ret
);
1864 ok(ssb2
.base
.ebuf
== ssb2
.base
.base
+ 20, "expected %p got %p\n", ssb2
.base
.base
+ 20, ssb2
.base
.ebuf
);
1865 ok(ssb2
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, ssb2
.base
.gptr
);
1866 ok(ssb2
.base
.pbase
== ssb2
.base
.base
+ 3, "wrong put base, expected %p got %p\n", ssb2
.base
.base
+ 3, ssb2
.base
.pbase
);
1867 ok(ssb2
.base
.pptr
== ssb2
.base
.base
+ 22, "wrong put pointer, expected %p got %p\n", ssb2
.base
.base
+ 22, ssb2
.base
.pptr
);
1868 ok(ssb2
.base
.epptr
== ssb2
.base
.base
+ 20, "wrong put end, expected %p got %p\n", ssb2
.base
.base
+ 20, ssb2
.base
.epptr
);
1869 ok(*(ssb2
.base
.pptr
- 1) == 'E', "expected 'E' got %d\n", *(ssb2
.base
.pptr
- 1));
1870 ssb2
.base
.egptr
= ssb2
.base
.base
+ 2;
1871 ret
= (int) call_func2(p_strstreambuf_overflow
, &ssb2
, 'F');
1872 ok(ret
== 1, "expected 1 got %d\n", ret
);
1873 ok(ssb2
.base
.ebuf
== ssb2
.base
.base
+ 24, "expected %p got %p\n", ssb2
.base
.base
+ 24, ssb2
.base
.ebuf
);
1874 ok(ssb2
.base
.gptr
!= NULL
, "wrong get pointer, expected != NULL\n");
1875 ok(ssb2
.base
.pbase
== ssb2
.base
.base
+ 3, "wrong put base, expected %p got %p\n", ssb2
.base
.base
+ 3, ssb2
.base
.pbase
);
1876 ok(ssb2
.base
.pptr
== ssb2
.base
.base
+ 23, "wrong put pointer, expected %p got %p\n", ssb2
.base
.base
+ 23, ssb2
.base
.pptr
);
1877 ok(ssb2
.base
.epptr
== ssb2
.base
.base
+ 24, "wrong put end, expected %p got %p\n", ssb2
.base
.base
+ 24, ssb2
.base
.epptr
);
1878 ok(*(ssb2
.base
.pptr
- 1) == 'F', "expected 'F' got %d\n", *(ssb2
.base
.pptr
- 1));
1879 ssb2
.base
.eback
= ssb2
.base
.gptr
= ssb2
.base
.base
;
1880 ssb2
.base
.epptr
= NULL
;
1881 ret
= (int) call_func2(p_strstreambuf_overflow
, &ssb2
, 'G');
1882 ok(ret
== 1, "expected 1 got %d\n", ret
);
1883 ok(ssb2
.base
.ebuf
== ssb2
.base
.base
+ 28, "expected %p got %p\n", ssb2
.base
.base
+ 28, ssb2
.base
.ebuf
);
1884 ok(ssb2
.base
.gptr
== ssb2
.base
.base
, "wrong get pointer, expected %p got %p\n", ssb2
.base
.base
, ssb2
.base
.gptr
);
1885 ok(ssb2
.base
.pbase
== ssb2
.base
.base
+ 2, "wrong put base, expected %p got %p\n", ssb2
.base
.base
+ 2, ssb2
.base
.pbase
);
1886 ok(ssb2
.base
.pptr
== ssb2
.base
.base
+ 3, "wrong put pointer, expected %p got %p\n", ssb2
.base
.base
+ 3, ssb2
.base
.pptr
);
1887 ok(ssb2
.base
.epptr
== ssb2
.base
.base
+ 28, "wrong put end, expected %p got %p\n", ssb2
.base
.base
+ 28, ssb2
.base
.epptr
);
1888 ok(*(ssb2
.base
.pptr
- 1) == 'G', "expected 'G' got %d\n", *(ssb2
.base
.pptr
- 1));
1891 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 0, SEEKDIR_beg
, OPENMODE_in
);
1892 ok(ret
== 0, "expected 0 got %d\n", ret
);
1893 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
, ssb1
.base
.gptr
);
1894 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 3, SEEKDIR_beg
, OPENMODE_in
);
1895 ok(ret
== 3, "expected 3 got %d\n", ret
);
1896 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
+ 3, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
+ 3, ssb1
.base
.gptr
);
1897 ssb1
.base
.egptr
= ssb1
.base
.pbase
;
1898 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 25, SEEKDIR_beg
, OPENMODE_in
);
1899 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1900 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
+ 3, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
+ 3, ssb1
.base
.gptr
);
1901 ssb1
.base
.gptr
= ssb1
.base
.egptr
;
1902 ssb1
.base
.pptr
= ssb1
.base
.pbase
+ 10;
1903 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 25, SEEKDIR_beg
, OPENMODE_in
);
1904 ok(ret
== 25, "expected 25 got %d\n", ret
);
1905 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
+ 25, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
+ 25, ssb1
.base
.gptr
);
1906 ok(ssb1
.base
.egptr
== ssb1
.base
.pptr
, "wrong get end, expected %p got %p\n", ssb1
.base
.pptr
, ssb1
.base
.egptr
);
1907 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, -24, SEEKDIR_cur
, OPENMODE_in
);
1908 ok(ret
== 1, "expected 1 got %d\n", ret
);
1909 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
+ 1, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
+ 1, ssb1
.base
.gptr
);
1910 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, -5, SEEKDIR_cur
, OPENMODE_in
);
1911 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1912 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
+ 1, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
+ 1, ssb1
.base
.gptr
);
1913 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 0, SEEKDIR_end
, OPENMODE_in
);
1914 ok(ret
== 30, "expected 30 got %d\n", ret
);
1915 ok(ssb1
.base
.gptr
== ssb1
.base
.egptr
, "wrong get pointer, expected %p got %p\n", ssb1
.base
.egptr
, ssb1
.base
.gptr
);
1916 ssb1
.base
.gptr
= ssb1
.base
.eback
;
1917 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, -2, SEEKDIR_end
, OPENMODE_in
);
1918 ok(ret
== 28, "expected 28 got %d\n", ret
);
1919 ok(ssb1
.base
.gptr
== ssb1
.base
.egptr
- 2, "wrong get pointer, expected %p got %p\n", ssb1
.base
.egptr
- 2, ssb1
.base
.gptr
);
1920 ssb1
.base
.gptr
= ssb1
.base
.egptr
;
1921 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, -5, SEEKDIR_end
, OPENMODE_in
);
1922 ok(ret
== 25, "expected 25 got %d\n", ret
);
1923 ok(ssb1
.base
.gptr
== ssb1
.base
.egptr
- 5, "wrong get pointer, expected %p got %p\n", ssb1
.base
.egptr
- 5, ssb1
.base
.gptr
);
1924 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 1, SEEKDIR_end
, OPENMODE_in
);
1925 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1926 ok(ssb1
.base
.gptr
== ssb1
.base
.egptr
- 5, "wrong get pointer, expected %p got %p\n", ssb1
.base
.egptr
- 5, ssb1
.base
.gptr
);
1927 ssb1
.base
.gptr
= ssb1
.base
.egptr
;
1928 ssb1
.base
.pptr
= ssb1
.base
.egptr
+ 5;
1929 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 1, SEEKDIR_end
, OPENMODE_in
);
1930 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1931 ok(ssb1
.base
.gptr
== ssb1
.base
.egptr
- 5, "wrong get pointer, expected %p got %p\n", ssb1
.base
.egptr
- 5, ssb1
.base
.gptr
);
1932 ok(ssb1
.base
.egptr
== ssb1
.base
.pptr
, "wrong get end, expected %p got %p\n", ssb1
.base
.pptr
, ssb1
.base
.egptr
);
1933 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 3, SEEKDIR_beg
, OPENMODE_out
);
1934 ok(ret
== 3, "expected 3 got %d\n", ret
);
1935 ok(ssb1
.base
.pptr
== ssb1
.base
.pbase
+ 3, "wrong put pointer, expected %p got %p\n", ssb1
.base
.pbase
+ 3, ssb1
.base
.pptr
);
1936 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, -2, SEEKDIR_beg
, OPENMODE_out
);
1937 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1938 ok(ssb1
.base
.pptr
== ssb1
.base
.pbase
+ 3, "wrong put pointer, expected %p got %p\n", ssb1
.base
.pbase
+ 3, ssb1
.base
.pptr
);
1939 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 50, SEEKDIR_beg
, OPENMODE_out
);
1940 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1941 ok(ssb1
.base
.pptr
== ssb1
.base
.pbase
+ 3, "wrong put pointer, expected %p got %p\n", ssb1
.base
.pbase
+ 3, ssb1
.base
.pptr
);
1942 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 5, SEEKDIR_cur
, OPENMODE_out
);
1943 ok(ret
== 8, "expected 8 got %d\n", ret
);
1944 ok(ssb1
.base
.pptr
== ssb1
.base
.pbase
+ 8, "wrong put pointer, expected %p got %p\n", ssb1
.base
.pbase
+ 8, ssb1
.base
.pptr
);
1945 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, -2, SEEKDIR_end
, OPENMODE_out
);
1946 ok(ret
== 42, "expected 42 got %d\n", ret
);
1947 ok(ssb1
.base
.pptr
== ssb1
.base
.epptr
- 2, "wrong put pointer, expected %p got %p\n", ssb1
.base
.epptr
- 2, ssb1
.base
.pptr
);
1948 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 0, SEEKDIR_end
, OPENMODE_out
);
1949 ok(ret
== 44, "expected 44 got %d\n", ret
);
1950 ok(ssb1
.base
.pptr
== ssb1
.base
.epptr
, "wrong put pointer, expected %p got %p\n", ssb1
.base
.epptr
, ssb1
.base
.pptr
);
1951 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 5, SEEKDIR_beg
, OPENMODE_in
|OPENMODE_out
);
1952 ok(ret
== 5, "expected 5 got %d\n", ret
);
1953 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
+ 5, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
+ 5, ssb1
.base
.gptr
);
1954 ok(ssb1
.base
.pptr
== ssb1
.base
.pbase
+ 5, "wrong put pointer, expected %p got %p\n", ssb1
.base
.pbase
+ 5, ssb1
.base
.pptr
);
1955 ssb1
.base
.egptr
= ssb1
.base
.pbase
;
1956 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 21, SEEKDIR_beg
, OPENMODE_in
|OPENMODE_out
);
1957 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1958 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
+ 5, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
+ 5, ssb1
.base
.gptr
);
1959 ok(ssb1
.base
.pptr
== ssb1
.base
.pbase
+ 5, "wrong put pointer, expected %p got %p\n", ssb1
.base
.pbase
+ 5, ssb1
.base
.pptr
);
1960 ssb1
.base
.egptr
= ssb1
.base
.epptr
;
1961 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 50, SEEKDIR_beg
, OPENMODE_in
|OPENMODE_out
);
1962 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
1963 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
+ 50, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
+ 50, ssb1
.base
.gptr
);
1964 ok(ssb1
.base
.pptr
== ssb1
.base
.pbase
+ 5, "wrong put pointer, expected %p got %p\n", ssb1
.base
.pbase
+ 5, ssb1
.base
.pptr
);
1965 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb1
, 2, SEEKDIR_cur
, OPENMODE_in
|OPENMODE_out
);
1966 ok(ret
== 7, "expected 7 got %d\n", ret
);
1967 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
+ 52, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
+ 52, ssb1
.base
.gptr
);
1968 ok(ssb1
.base
.pptr
== ssb1
.base
.pbase
+ 7, "wrong put pointer, expected %p got %p\n", ssb1
.base
.pbase
+ 7, ssb1
.base
.pptr
);
1969 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb2
, 0, SEEKDIR_beg
, OPENMODE_in
|OPENMODE_out
);
1970 ok(ret
== 0, "expected 0 got %d\n", ret
);
1971 ok(ssb2
.base
.gptr
== ssb2
.base
.eback
, "wrong get pointer, expected %p got %p\n", ssb2
.base
.eback
, ssb2
.base
.gptr
);
1972 ok(ssb2
.base
.pptr
== ssb2
.base
.pbase
, "wrong put pointer, expected %p got %p\n", ssb2
.base
.pbase
, ssb2
.base
.pptr
);
1973 ssb2
.base
.gptr
= ssb2
.base
.egptr
;
1974 ssb2
.base
.pptr
+= 10;
1975 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb2
, 5, SEEKDIR_cur
, OPENMODE_in
|OPENMODE_out
);
1976 ok(ret
== 15, "expected 15 got %d\n", ret
);
1977 ok(ssb2
.base
.gptr
== ssb2
.base
.eback
+ 7, "wrong get pointer, expected %p got %p\n", ssb2
.base
.eback
+ 7, ssb2
.base
.gptr
);
1978 ok(ssb2
.base
.egptr
== ssb2
.base
.eback
+ 12, "wrong get end, expected %p got %p\n", ssb2
.base
.eback
+ 12, ssb2
.base
.egptr
);
1979 ok(ssb2
.base
.pptr
== ssb2
.base
.pbase
+ 15, "wrong put pointer, expected %p got %p\n", ssb2
.base
.pbase
+ 15, ssb2
.base
.pptr
);
1980 ssb2
.base
.pptr
= ssb2
.base
.epptr
;
1981 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb2
, -1, SEEKDIR_cur
, OPENMODE_in
|OPENMODE_out
);
1982 ok(ret
== 25, "expected 25 got %d\n", ret
);
1983 ok(ssb2
.base
.gptr
== ssb2
.base
.eback
+ 6, "wrong get pointer, expected %p got %p\n", ssb2
.base
.eback
+ 6, ssb2
.base
.gptr
);
1984 ok(ssb2
.base
.pptr
== ssb2
.base
.pbase
+ 25, "wrong put pointer, expected %p got %p\n", ssb2
.base
.pbase
+ 25, ssb2
.base
.pptr
);
1985 pbuffer
= ssb2
.base
.pbase
;
1986 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb2
, 50, SEEKDIR_beg
, OPENMODE_out
);
1987 ok(ret
== 50, "expected 50 got %d\n", ret
);
1988 ok(ssb2
.base
.gptr
== ssb2
.base
.eback
+ 6, "wrong get pointer, expected %p got %p\n", ssb2
.base
.eback
+ 6, ssb2
.base
.gptr
);
1989 ok(ssb2
.base
.pptr
== pbuffer
+ 50, "wrong put pointer, expected %p got %p\n", pbuffer
+ 50, ssb2
.base
.pptr
);
1990 ok(ssb2
.increase
== 50, "expected 50 got %d\n", ssb2
.increase
);
1991 ssb2
.base
.epptr
= NULL
;
1993 ret
= (int) call_func4(p_strstreambuf_seekoff
, &ssb2
, 0, SEEKDIR_end
, OPENMODE_out
);
1994 ok(ret
== 74, "expected 74 got %d\n", ret
);
1995 ok(ssb2
.base
.pptr
== ssb2
.base
.epptr
, "wrong put pointer, expected %p got %p\n", ssb2
.base
.epptr
, ssb2
.base
.pptr
);
1998 *(ssb1
.base
.gptr
-1) = 'A';
1999 ret
= (int) call_func2(p_streambuf_pbackfail
, &ssb1
.base
, 'X');
2000 ok(ret
== 'X', "wrong return, expected 'X' got %d\n", ret
);
2001 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
+ 51, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
+ 51, ssb1
.base
.gptr
);
2002 ok(*ssb1
.base
.gptr
== 'X', "expected 'X' got '%c'\n", *ssb1
.base
.gptr
);
2003 ssb1
.base
.gptr
= ssb1
.base
.eback
;
2004 ret
= (int) call_func2(p_streambuf_pbackfail
, &ssb1
.base
, 'Y');
2005 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
2006 ssb1
.base
.gptr
= ssb1
.base
.eback
+ 1;
2007 ret
= (int) call_func2(p_streambuf_pbackfail
, &ssb1
.base
, EOF
);
2008 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
2009 ok(ssb1
.base
.gptr
== ssb1
.base
.eback
, "wrong get pointer, expected %p got %p\n", ssb1
.base
.eback
, ssb1
.base
.gptr
);
2010 ok((signed char)*ssb1
.base
.gptr
== EOF
, "expected EOF got '%c'\n", *ssb1
.base
.gptr
);
2012 call_func1(p_strstreambuf_dtor
, &ssb1
);
2013 call_func1(p_strstreambuf_dtor
, &ssb2
);
2016 static void test_stdiobuf(void)
2018 stdiobuf stb1
, stb2
;
2019 FILE *file1
, *file2
;
2020 const char filename1
[] = "stdiobuf_test1";
2021 const char filename2
[] = "stdiobuf_test2";
2025 memset(&stb1
, 0xab, sizeof(stdiobuf
));
2026 memset(&stb2
, 0xab, sizeof(stdiobuf
));
2028 file1
= fopen(filename1
, "w");
2029 fputs("Never gonna give you up, never gonna let you down", file1
);
2031 file1
= fopen(filename1
, "r");
2032 ok(file1
!= NULL
, "Couldn't open the file named '%s'\n", filename1
);
2033 file2
= fopen(filename2
, "w+");
2034 ok(file2
!= NULL
, "Couldn't open the file named '%s'\n", filename2
);
2036 /* constructors/destructor */
2037 call_func2(p_stdiobuf_file_ctor
, &stb1
, NULL
);
2038 ok(stb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", stb1
.base
.allocated
);
2039 ok(stb1
.base
.unbuffered
== 1, "wrong unbuffered value, expected 1 got %d\n", stb1
.base
.unbuffered
);
2040 ok(stb1
.file
== NULL
, "wrong file pointer, expected %p got %p\n", NULL
, stb1
.file
);
2041 call_func1(p_stdiobuf_dtor
, &stb1
);
2042 call_func2(p_stdiobuf_file_ctor
, &stb1
, file1
);
2043 ok(stb1
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", stb1
.base
.allocated
);
2044 ok(stb1
.base
.unbuffered
== 1, "wrong unbuffered value, expected 1 got %d\n", stb1
.base
.unbuffered
);
2045 ok(stb1
.file
== file1
, "wrong file pointer, expected %p got %p\n", file1
, stb1
.file
);
2046 call_func2(p_stdiobuf_file_ctor
, &stb2
, file2
);
2047 ok(stb2
.base
.allocated
== 0, "wrong allocate value, expected 0 got %d\n", stb2
.base
.allocated
);
2048 ok(stb2
.base
.unbuffered
== 1, "wrong unbuffered value, expected 1 got %d\n", stb2
.base
.unbuffered
);
2049 ok(stb2
.file
== file2
, "wrong file pointer, expected %p got %p\n", file2
, stb2
.file
);
2052 ret
= (int) call_func2(p_stdiobuf_overflow
, &stb1
, EOF
);
2053 ok(ret
== 1, "expected 1 got %d\n", ret
);
2054 ret
= (int) call_func2(p_stdiobuf_overflow
, &stb1
, 'a');
2055 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2056 stb1
.base
.unbuffered
= 0;
2057 ret
= (int) call_func2(p_stdiobuf_overflow
, &stb1
, 'a');
2058 ok(ret
== 1, "expected 1 got %d\n", ret
);
2059 ok(stb1
.base
.allocated
== 1, "wrong allocate value, expected 1 got %d\n", stb1
.base
.allocated
);
2060 ok(stb1
.base
.ebuf
== stb1
.base
.base
+ 512, "expected %p got %p\n", stb1
.base
.base
+ 512, stb1
.base
.ebuf
);
2061 ok(stb1
.base
.pbase
== stb1
.base
.base
+ 256, "wrong put base, expected %p got %p\n", stb1
.base
.base
+ 256, stb1
.base
.pbase
);
2062 ok(stb1
.base
.pptr
== stb1
.base
.pbase
+ 1, "wrong put pointer, expected %p got %p\n", stb1
.base
.pbase
+ 1, stb1
.base
.pptr
);
2063 ok(stb1
.base
.epptr
== stb1
.base
.ebuf
, "wrong put end, expected %p got %p\n", stb1
.base
.ebuf
, stb1
.base
.epptr
);
2064 ok(*(stb1
.base
.pptr
-1) == 'a', "expected 'a', got '%c'\n", *(stb1
.base
.pptr
-1));
2065 ret
= (int) call_func2(p_stdiobuf_overflow
, &stb1
, EOF
);
2066 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2067 ok(stb1
.base
.pptr
== stb1
.base
.pbase
+ 1, "wrong put pointer, expected %p got %p\n", stb1
.base
.pbase
+ 1, stb1
.base
.pptr
);
2068 stb1
.base
.pptr
= stb1
.base
.pbase
;
2069 ret
= (int) call_func2(p_stdiobuf_overflow
, &stb1
, EOF
);
2070 ok(ret
== 1, "expected 1 got %d\n", ret
);
2071 ok(stb1
.base
.pptr
== stb1
.base
.pbase
, "wrong put pointer, expected %p got %p\n", stb1
.base
.pbase
, stb1
.base
.pptr
);
2072 ret
= (int) call_func2(p_stdiobuf_overflow
, &stb1
, 'b');
2073 ok(ret
== 1, "expected 1 got %d\n", ret
);
2074 ok(stb1
.base
.pptr
== stb1
.base
.pbase
+ 1, "wrong put pointer, expected %p got %p\n", stb1
.base
.pbase
+ 1, stb1
.base
.pptr
);
2075 ok(*(stb1
.base
.pptr
-1) == 'b', "expected 'b', got '%c'\n", *(stb1
.base
.pptr
-1));
2076 stb1
.base
.unbuffered
= 1;
2077 ret
= (int) call_func2(p_stdiobuf_overflow
, &stb2
, EOF
);
2078 ok(ret
== 1, "expected 1 got %d\n", ret
);
2079 ret
= (int) call_func2(p_stdiobuf_overflow
, &stb2
, 'a');
2080 ok(ret
== 'a', "expected 'a' got %d\n", ret
);
2081 stb2
.base
.unbuffered
= 0;
2082 stb2
.base
.base
= buffer
;
2083 stb2
.base
.pbase
= stb2
.base
.pptr
= buffer
+ 32;
2084 stb2
.base
.ebuf
= stb2
.base
.epptr
= buffer
+ 64;
2085 ret
= (int) call_func3(p_streambuf_xsputn
, &stb2
.base
, "Never gonna run around", 22);
2086 ok(ret
== 22, "expected 22 got %d\n", ret
);
2087 ret
= (int) call_func2(p_stdiobuf_overflow
, &stb2
, 'c');
2088 ok(ret
== 1, "expected 1 got %d\n", ret
);
2089 ok(stb2
.base
.pptr
== stb2
.base
.pbase
+ 1, "wrong put pointer, expected %p got %p\n", stb2
.base
.pbase
+ 1, stb2
.base
.pptr
);
2090 ok(*(stb2
.base
.pptr
-1) == 'c', "expected 'c', got '%c'\n", *(stb2
.base
.pptr
-1));
2091 stb2
.base
.pbase
= stb2
.base
.pptr
+ 3;
2092 ret
= (int) call_func2(p_stdiobuf_overflow
, &stb2
, 'd');
2093 ok(ret
== 1, "expected 1 got %d\n", ret
);
2094 ok(stb2
.base
.pptr
== stb2
.base
.pbase
- 2, "wrong put pointer, expected %p got %p\n", stb2
.base
.pbase
- 2, stb2
.base
.pptr
);
2095 ok(*(stb2
.base
.pptr
-1) == 'd', "expected 'd', got '%c'\n", *(stb2
.base
.pptr
-1));
2096 stb2
.base
.pbase
= stb2
.base
.pptr
= buffer
+ 32;
2097 stb2
.base
.epptr
= buffer
+ 30;
2098 ret
= (int) call_func2(p_stdiobuf_overflow
, &stb2
, 'd');
2099 ok(ret
== 'd', "expected 'd' got %d\n", ret
);
2100 ok(stb2
.base
.pptr
== stb2
.base
.pbase
, "wrong put pointer, expected %p got %p\n", stb2
.base
.pbase
, stb2
.base
.pptr
);
2101 stb2
.base
.epptr
= buffer
+ 64;
2102 stb2
.base
.unbuffered
= 1;
2105 ret
= (int) call_func1(p_stdiobuf_underflow
, &stb1
);
2106 ok(ret
== 'N', "expected 'N' got %d\n", ret
);
2107 stb1
.base
.unbuffered
= 0;
2108 ret
= (int) call_func1(p_stdiobuf_underflow
, &stb1
);
2109 ok(ret
== 'e', "expected 'e' got %d\n", ret
);
2110 ok(stb1
.base
.eback
== stb1
.base
.base
, "wrong get base, expected %p got %p\n", stb1
.base
.base
, stb1
.base
.eback
);
2111 ok(stb1
.base
.gptr
== stb1
.base
.egptr
- 47, "wrong get pointer, expected %p got %p\n", stb1
.base
.egptr
- 47, stb1
.base
.gptr
);
2112 ok(stb1
.base
.egptr
== stb1
.base
.base
+ 256, "wrong get end, expected %p got %p\n", stb1
.base
.base
+ 256, stb1
.base
.egptr
);
2113 ok(*stb1
.base
.gptr
== 'v', "expected 'v' got '%c'\n", *stb1
.base
.gptr
);
2114 stb1
.base
.pbase
= stb1
.base
.pptr
= stb1
.base
.epptr
= NULL
;
2115 ret
= (int) call_func1(p_stdiobuf_underflow
, &stb1
);
2116 ok(ret
== 'v', "expected 'v' got %d\n", ret
);
2117 ok(stb1
.base
.gptr
== stb1
.base
.egptr
- 46, "wrong get pointer, expected %p got %p\n", stb1
.base
.egptr
- 46, stb1
.base
.gptr
);
2118 stb1
.base
.gptr
= stb1
.base
.egptr
;
2119 ret
= (int) call_func1(p_stdiobuf_underflow
, &stb1
);
2120 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2121 stb1
.base
.unbuffered
= 1;
2122 ret
= (int) call_func1(p_stdiobuf_underflow
, &stb1
);
2123 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2125 ret
= (int) call_func1(p_stdiobuf_underflow
, &stb2
);
2126 ok(ret
== 'a', "expected 'a' got %d\n", ret
);
2127 stb2
.base
.unbuffered
= 0;
2128 stb2
.base
.eback
= stb2
.base
.gptr
= buffer
+ 16;
2129 stb2
.base
.egptr
= buffer
+ 32;
2130 strcpy(buffer
+ 16, "and desert you");
2131 ret
= (int) call_func1(p_stdiobuf_underflow
, &stb2
);
2132 ok(ret
== 'a', "expected 'a' got %d\n", ret
);
2133 ok(stb2
.base
.gptr
== buffer
+ 17, "wrong get pointer, expected %p got %p\n", buffer
+ 17, stb2
.base
.gptr
);
2134 stb2
.base
.eback
= buffer
;
2135 stb2
.base
.gptr
= stb2
.base
.egptr
;
2136 stb2
.base
.pbase
= stb2
.base
.pptr
= stb2
.base
.epptr
= NULL
;
2137 ret
= (int) call_func1(p_stdiobuf_underflow
, &stb2
);
2138 ok(ret
== 'N', "expected 'N' got %d\n", ret
);
2139 ok(stb2
.base
.gptr
== stb2
.base
.egptr
- 22, "wrong get pointer, expected %p got %p\n", stb2
.base
.egptr
- 22, stb2
.base
.gptr
);
2140 ok(ftell(stb2
.file
) == 24, "ftell failed\n");
2141 stb2
.base
.gptr
= stb2
.base
.egptr
;
2142 ret
= (int) call_func1(p_stdiobuf_underflow
, &stb2
);
2143 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2144 stb2
.base
.unbuffered
= 1;
2145 ret
= (int) call_func1(p_stdiobuf_underflow
, &stb2
);
2146 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2149 ret
= (int) call_func1(p_stdiobuf_sync
, &stb1
);
2150 ok(ret
== 0, "expected 0 got %d\n", ret
);
2151 stb1
.base
.gptr
= stb1
.base
.eback
;
2152 ret
= (int) call_func1(p_stdiobuf_sync
, &stb1
);
2153 ok(ret
== 0, "expected 0 got %d\n", ret
);
2154 stb1
.base
.unbuffered
= 0;
2155 ret
= (int) call_func1(p_stdiobuf_sync
, &stb1
);
2156 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2157 ok(stb1
.base
.pbase
== stb1
.base
.base
+ 256, "wrong put base, expected %p got %p\n", stb1
.base
.base
+ 256, stb1
.base
.pbase
);
2158 ok(stb1
.base
.pptr
== stb1
.base
.base
+ 256, "wrong put pointer, expected %p got %p\n", stb1
.base
.base
+ 256, stb1
.base
.pptr
);
2159 ok(stb1
.base
.epptr
== stb1
.base
.base
+ 512, "wrong put end, expected %p got %p\n", stb1
.base
.base
+ 512, stb1
.base
.epptr
);
2160 stb1
.base
.gptr
= stb1
.base
.egptr
;
2161 ret
= (int) call_func1(p_stdiobuf_sync
, &stb1
);
2162 ok(ret
== 0, "expected 0 got %d\n", ret
);
2163 stb1
.base
.eback
= stb1
.base
.gptr
= stb1
.base
.egptr
= NULL
;
2164 stb1
.base
.pptr
= stb1
.base
.epptr
;
2165 ret
= (int) call_func1(p_stdiobuf_sync
, &stb1
);
2166 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2167 ok(stb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, stb1
.base
.gptr
);
2168 stb1
.base
.pptr
= stb1
.base
.pbase
;
2169 ret
= (int) call_func1(p_stdiobuf_sync
, &stb1
);
2170 ok(ret
== 0, "expected 0 got %d\n", ret
);
2171 ok(stb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, stb1
.base
.gptr
);
2172 stb1
.base
.unbuffered
= 1;
2173 stb2
.base
.unbuffered
= 0;
2174 stb2
.base
.egptr
= stb2
.base
.ebuf
;
2175 ret
= (int) call_func1(p_stdiobuf_sync
, &stb2
);
2176 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2177 ok(stb2
.base
.pbase
== stb2
.base
.base
+ 32, "wrong put base, expected %p got %p\n", stb2
.base
.base
+ 32, stb2
.base
.pbase
);
2178 ok(stb2
.base
.pptr
== stb2
.base
.base
+ 32, "wrong put pointer, expected %p got %p\n", stb2
.base
.base
+ 32, stb2
.base
.pptr
);
2179 ok(stb2
.base
.epptr
== stb2
.base
.base
+ 64, "wrong put end, expected %p got %p\n", stb2
.base
.base
+ 64, stb2
.base
.epptr
);
2180 stb2
.base
.egptr
= stb2
.base
.pbase
;
2181 stb2
.base
.gptr
= stb2
.base
.egptr
- 25;
2182 ret
= (int) call_func1(p_stdiobuf_sync
, &stb2
);
2183 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2184 ret
= (int) call_func3(p_streambuf_xsputn
, &stb2
.base
, "Never gonna make you cry", 24);
2185 ok(ret
== 24, "expected 24 got %d\n", ret
);
2186 ret
= (int) call_func1(p_stdiobuf_sync
, &stb2
);
2187 ok(ret
== 0, "expected 0 got %d\n", ret
);
2188 ok(ftell(stb2
.file
) == 23, "ftell failed\n");
2189 ok(fseek(stb2
.file
, 3, SEEK_SET
) == 0, "fseek failed\n");
2190 stb2
.base
.gptr
= stb2
.base
.egptr
- 3;
2191 strcpy(stb2
.base
.gptr
, "a\nc");
2192 ret
= (int) call_func1(p_stdiobuf_sync
, &stb2
);
2193 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2194 ok(stb2
.base
.gptr
== stb2
.base
.egptr
- 3, "wrong get pointer, expected %p got %p\n", stb2
.base
.egptr
- 3, stb2
.base
.gptr
);
2195 *(stb2
.base
.gptr
+1) = 'b';
2196 ret
= (int) call_func1(p_stdiobuf_sync
, &stb2
);
2197 ok(ret
== 0, "expected 0 got %d\n", ret
);
2198 ok(stb2
.base
.gptr
== stb2
.base
.egptr
, "wrong get pointer, expected %p got %p\n", stb2
.base
.egptr
, stb2
.base
.gptr
);
2199 stb2
.base
.unbuffered
= 1;
2202 ret
= (int) call_func3(p_stdiobuf_setrwbuf
, &stb1
, 100, 60);
2203 ok(ret
== 1, "expected 1 got %d\n", ret
);
2204 ok(stb1
.base
.allocated
== 1, "wrong allocate value, expected 1 got %d\n", stb1
.base
.allocated
);
2205 ok(stb1
.base
.unbuffered
== 0, "wrong unbuffered value, expected 0 got %d\n", stb1
.base
.unbuffered
);
2206 ok(stb1
.base
.ebuf
== stb1
.base
.base
+ 160, "expected %p got %p\n", stb1
.base
.base
+ 160, stb1
.base
.ebuf
);
2207 ok(stb1
.base
.eback
== stb1
.base
.base
, "wrong get base, expected %p got %p\n", stb1
.base
.base
, stb1
.base
.eback
);
2208 ok(stb1
.base
.gptr
== stb1
.base
.base
+ 100, "wrong get pointer, expected %p got %p\n", stb1
.base
.base
+ 100, stb1
.base
.gptr
);
2209 ok(stb1
.base
.egptr
== stb1
.base
.base
+ 100, "wrong get end, expected %p got %p\n", stb1
.base
.base
+ 100, stb1
.base
.egptr
);
2210 ok(stb1
.base
.pbase
== stb1
.base
.base
+ 100, "wrong put base, expected %p got %p\n", stb1
.base
.base
+ 100, stb1
.base
.pbase
);
2211 ok(stb1
.base
.pptr
== stb1
.base
.base
+ 100, "wrong put pointer, expected %p got %p\n", stb1
.base
.base
+ 100, stb1
.base
.pptr
);
2212 ok(stb1
.base
.epptr
== stb1
.base
.base
+ 160, "wrong put end, expected %p got %p\n", stb1
.base
.base
+ 160, stb1
.base
.epptr
);
2213 ret
= (int) call_func3(p_stdiobuf_setrwbuf
, &stb1
, -1, 64);
2214 ok(ret
== 0 || ret
== 1, "expected 0 or 1, got %d\n", ret
);
2215 ret
= (int) call_func3(p_stdiobuf_setrwbuf
, &stb1
, 32, -8);
2216 ok(ret
== 0 || ret
== 1, "expected 0 or 1, got %d\n", ret
);
2217 ret
= (int) call_func3(p_stdiobuf_setrwbuf
, &stb1
, 0, 64);
2218 ok(ret
== 1, "expected 1 got %d\n", ret
);
2219 ok(stb1
.base
.ebuf
== stb1
.base
.base
+ 64, "expected %p got %p\n", stb1
.base
.base
+ 64, stb1
.base
.ebuf
);
2220 ok(stb1
.base
.eback
== NULL
, "wrong get base, expected %p got %p\n", NULL
, stb1
.base
.eback
);
2221 ok(stb1
.base
.gptr
== NULL
, "wrong get pointer, expected %p got %p\n", NULL
, stb1
.base
.gptr
);
2222 ok(stb1
.base
.egptr
== NULL
, "wrong get end, expected %p got %p\n", NULL
, stb1
.base
.egptr
);
2223 ok(stb1
.base
.pbase
== stb1
.base
.base
, "wrong put base, expected %p got %p\n", stb1
.base
.base
, stb1
.base
.pbase
);
2224 ok(stb1
.base
.pptr
== stb1
.base
.base
, "wrong put pointer, expected %p got %p\n", stb1
.base
.base
, stb1
.base
.pptr
);
2225 ok(stb1
.base
.epptr
== stb1
.base
.base
+ 64, "wrong put end, expected %p got %p\n", stb1
.base
.base
+ 64, stb1
.base
.epptr
);
2226 ret
= (int) call_func3(p_stdiobuf_setrwbuf
, &stb1
, 0, 0);
2227 ok(ret
== 0, "expected 0 got %d\n", ret
);
2228 ok(stb1
.base
.unbuffered
== 1, "wrong unbuffered value, expected 1 got %d\n", stb1
.base
.unbuffered
);
2231 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb1
, 0, SEEKDIR_beg
, OPENMODE_in
);
2232 ok(ret
== 0, "expected 0 got %d\n", ret
);
2233 stb1
.base
.unbuffered
= 0;
2234 ret
= (int) call_func3(p_streambuf_xsputn
, &stb1
.base
, "Never gonna say goodbye", 22);
2235 ok(ret
== 22, "expected 22 got %d\n", ret
);
2236 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb1
, 5, SEEKDIR_beg
, OPENMODE_in
);
2237 ok(ret
== 5, "expected 5 got %d\n", ret
);
2238 ok(stb1
.base
.pptr
== stb1
.base
.pbase
+ 22, "wrong put pointer, expected %p got %p\n", stb1
.base
.pbase
+ 22, stb1
.base
.pptr
);
2239 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb1
, 300, SEEKDIR_beg
, OPENMODE_in
);
2240 ok(ret
== 300, "expected 300 got %d\n", ret
);
2241 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb1
, -310, SEEKDIR_cur
, OPENMODE_in
);
2242 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2243 stb1
.base
.eback
= stb1
.base
.base
;
2244 stb1
.base
.gptr
= stb1
.base
.egptr
= stb1
.base
.pbase
= stb1
.base
.base
+ 10;
2245 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb1
, -280, SEEKDIR_cur
, OPENMODE_in
);
2246 ok(ret
== 20, "expected 20 got %d\n", ret
);
2247 stb1
.base
.gptr
= stb1
.base
.eback
;
2248 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb1
, 80, SEEKDIR_cur
, OPENMODE_in
);
2249 ok(ret
== 100, "expected 100 got %d\n", ret
);
2250 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb1
, 0, SEEKDIR_end
, OPENMODE_in
);
2251 ok(ret
== 49, "expected 49 got %d\n", ret
);
2252 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb1
, 1, SEEKDIR_end
, OPENMODE_in
);
2253 ok(ret
== 50, "expected 50 got %d\n", ret
);
2254 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb1
, -60, SEEKDIR_end
, OPENMODE_in
);
2255 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2256 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb1
, -20, SEEKDIR_end
, OPENMODE_out
);
2257 ok(ret
== 29, "expected 29 got %d\n", ret
);
2258 stb1
.base
.eback
= stb1
.base
.gptr
= stb1
.base
.egptr
= NULL
;
2259 stb1
.base
.pptr
= stb1
.base
.pbase
;
2260 stb1
.base
.unbuffered
= 1;
2261 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb2
, 0, SEEKDIR_beg
, OPENMODE_in
);
2262 ok(ret
== 0, "expected 0 got %d\n", ret
);
2263 stb2
.base
.pptr
+= 10;
2264 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb2
, 20, SEEKDIR_beg
, OPENMODE_in
);
2265 ok(ret
== 20, "expected 20 got %d\n", ret
);
2266 ok(stb2
.base
.pptr
== stb2
.base
.pbase
+ 10, "wrong put pointer, expected %p got %p\n", stb2
.base
.pbase
+ 10, stb2
.base
.pptr
);
2267 stb2
.base
.unbuffered
= 0;
2268 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb2
, 10, SEEKDIR_cur
, OPENMODE_in
);
2269 ok(ret
== 40, "expected 40 got %d\n", ret
);
2270 ok(stb2
.base
.pptr
== stb2
.base
.pbase
, "wrong put pointer, expected %p got %p\n", stb2
.base
.pbase
, stb2
.base
.pptr
);
2271 stb2
.base
.gptr
= stb2
.base
.eback
;
2272 stb2
.base
.pptr
+= 5;
2273 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb2
, -50, SEEKDIR_cur
, OPENMODE_in
|OPENMODE_out
);
2274 ok(ret
== EOF
, "expected EOF got %d\n", ret
);
2275 ok(stb2
.base
.pptr
== stb2
.base
.pbase
, "wrong put pointer, expected %p got %p\n", stb2
.base
.pbase
, stb2
.base
.pptr
);
2276 stb2
.base
.pbase
= stb2
.base
.pptr
= stb2
.base
.epptr
= NULL
;
2277 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb2
, 0, SEEKDIR_end
, OPENMODE_in
|OPENMODE_out
);
2278 ok(ret
== 48, "expected 48 got %d\n", ret
);
2279 ok(stb2
.base
.pbase
== stb2
.base
.base
+ 32, "wrong put pointer, expected %p got %p\n", stb2
.base
.base
+ 32, stb2
.base
.pbase
);
2280 ok(stb2
.base
.pptr
== stb2
.base
.base
+ 32, "wrong put pointer, expected %p got %p\n", stb2
.base
.base
+ 32, stb2
.base
.pptr
);
2281 ok(stb2
.base
.epptr
== stb2
.base
.ebuf
, "wrong put pointer, expected %p got %p\n", stb2
.base
.ebuf
, stb2
.base
.epptr
);
2282 ret
= (int) call_func4(p_stdiobuf_seekoff
, &stb2
, -28, SEEKDIR_end
, -1);
2283 ok(ret
== 20, "expected 20 got %d\n", ret
);
2284 stb2
.base
.gptr
= stb2
.base
.egptr
;
2285 stb2
.base
.unbuffered
= 1;
2288 last
= fgetc(stb1
.file
);
2289 ok(last
== 'r', "expected 'r' got %d\n", last
);
2290 ok(ftell(stb1
.file
) == 30, "ftell failed\n");
2291 ret
= (int) call_func2(p_stdiobuf_pbackfail
, &stb1
, 'i');
2292 ok(ret
== 'i', "expected 'i' got %d\n", ret
);
2293 ok(ftell(stb1
.file
) == 29, "ftell failed\n");
2294 last
= fgetc(stb1
.file
);
2295 ok(last
== 'r', "expected 'r' got %d\n", last
);
2296 ok(ftell(stb1
.file
) == 30, "ftell failed\n");
2297 stb1
.base
.eback
= stb1
.base
.base
;
2298 stb1
.base
.gptr
= stb1
.base
.egptr
= stb1
.base
.base
+ 9;
2299 strcpy(stb1
.base
.eback
, "pbackfail");
2300 ret
= (int) call_func2(p_stdiobuf_pbackfail
, &stb1
, 'j');
2301 ok(ret
== 'j', "expected 'j' got %d\n", ret
);
2302 ok(stb1
.base
.gptr
== stb1
.base
.base
+ 8, "wrong get pointer, expected %p got %p\n", stb1
.base
.base
+ 8, stb1
.base
.gptr
);
2303 ok(strncmp(stb1
.base
.eback
, "pbackfaij", 9) == 0, "strncmp failed\n");
2304 ok(ftell(stb1
.file
) == 30, "ftell failed\n");
2305 stb1
.base
.gptr
= stb1
.base
.eback
;
2306 ret
= (int) call_func2(p_stdiobuf_pbackfail
, &stb1
, 'k');
2307 ok(ret
== 'k', "expected 'k' got %d\n", ret
);
2308 ok(stb1
.base
.gptr
== stb1
.base
.base
, "wrong get pointer, expected %p got %p\n", stb1
.base
.base
, stb1
.base
.gptr
);
2309 ok(strncmp(stb1
.base
.eback
, "pbackfaij", 9) == 0, "strncmp failed\n");
2310 ok(ftell(stb1
.file
) == 29, "ftell failed\n");
2311 stb1
.base
.unbuffered
= 0;
2312 ret
= (int) call_func2(p_stdiobuf_pbackfail
, &stb1
, 'l');
2313 ok(ret
== 'l', "expected 'l' got %d\n", ret
);
2314 ok(strncmp(stb1
.base
.eback
, "lpbackfai", 9) == 0, "strncmp failed\n");
2315 ok(ftell(stb1
.file
) == 28, "ftell failed\n");
2316 stb1
.base
.egptr
= NULL
;
2317 ret
= (int) call_func2(p_stdiobuf_pbackfail
, &stb1
, 'm');
2318 ok(ret
== 'm', "expected 'm' got %d\n", ret
);
2319 ok(strncmp(stb1
.base
.eback
, "lpbackfai", 9) == 0, "strncmp failed\n");
2320 ok(ftell(stb1
.file
) == 27, "ftell failed\n");
2321 stb1
.base
.unbuffered
= 1;
2323 call_func1(p_stdiobuf_dtor
, &stb1
);
2324 call_func1(p_stdiobuf_dtor
, &stb2
);
2327 ok(_unlink(filename1
) == 0, "Couldn't unlink file named '%s'\n", filename1
);
2328 ok(_unlink(filename2
) == 0, "Couldn't unlink file named '%s'\n", filename2
);
2338 static DWORD WINAPI
lock_ios(void *arg
)
2340 struct ios_lock_arg
*lock_arg
= arg
;
2341 p_ios_lock(lock_arg
->ios_obj
);
2342 p_ios_lockbuf(lock_arg
->ios_obj
);
2344 SetEvent(lock_arg
->lock
);
2345 WaitForSingleObject(lock_arg
->release
[0], INFINITE
);
2347 WaitForSingleObject(lock_arg
->release
[1], INFINITE
);
2348 p_ios_unlockbuf(lock_arg
->ios_obj
);
2349 WaitForSingleObject(lock_arg
->release
[2], INFINITE
);
2350 p_ios_unlock(lock_arg
->ios_obj
);
2354 static void test_ios(void)
2356 ios ios_obj
, ios_obj2
;
2358 struct ios_lock_arg lock_arg
;
2361 LONG
*pret
, expected
, ret
;
2365 memset(&ios_obj
, 0xab, sizeof(ios
));
2366 memset(&ios_obj2
, 0xab, sizeof(ios
));
2367 psb
= p_operator_new(sizeof(streambuf
));
2368 ok(psb
!= NULL
, "failed to allocate streambuf object\n");
2369 call_func1(p_streambuf_ctor
, psb
);
2371 /* constructor/destructor */
2372 ok(*p_ios_fLockcInit
== 4, "expected 4 got %d\n", *p_ios_fLockcInit
);
2373 call_func2(p_ios_sb_ctor
, &ios_obj
, NULL
);
2374 ok(ios_obj
.sb
== NULL
, "expected %p got %p\n", NULL
, ios_obj
.sb
);
2375 ok(ios_obj
.state
== IOSTATE_badbit
, "expected %x got %x\n", IOSTATE_badbit
, ios_obj
.state
);
2376 ok(ios_obj
.special
[0] == 0, "expected 0 got %d\n", ios_obj
.special
[0]);
2377 ok(ios_obj
.special
[1] == 0, "expected 0 got %d\n", ios_obj
.special
[1]);
2378 ok(ios_obj
.delbuf
== 0, "expected 0 got %d\n", ios_obj
.delbuf
);
2379 ok(ios_obj
.tie
== NULL
, "expected %p got %p\n", NULL
, ios_obj
.tie
);
2380 ok(ios_obj
.flags
== 0, "expected 0 got %x\n", ios_obj
.flags
);
2381 ok(ios_obj
.precision
== 6, "expected 6 got %d\n", ios_obj
.precision
);
2382 ok(ios_obj
.fill
== ' ', "expected ' ' got %d\n", ios_obj
.fill
);
2383 ok(ios_obj
.width
== 0, "expected 0 got %d\n", ios_obj
.width
);
2384 ok(ios_obj
.do_lock
== -1, "expected -1 got %d\n", ios_obj
.do_lock
);
2385 ok(ios_obj
.lock
.LockCount
== -1, "expected -1 got %d\n", ios_obj
.lock
.LockCount
);
2386 ok(*p_ios_fLockcInit
== 5, "expected 5 got %d\n", *p_ios_fLockcInit
);
2387 ios_obj
.state
= 0x8;
2388 call_func1(p_ios_dtor
, &ios_obj
);
2389 ok(ios_obj
.state
== IOSTATE_badbit
, "expected %x got %x\n", IOSTATE_badbit
, ios_obj
.state
);
2390 ok(*p_ios_fLockcInit
== 4, "expected 4 got %d\n", *p_ios_fLockcInit
);
2391 ios_obj
.state
= 0x8;
2392 call_func2(p_ios_sb_ctor
, &ios_obj
, psb
);
2393 ok(ios_obj
.sb
== psb
, "expected %p got %p\n", psb
, ios_obj
.sb
);
2394 ok(ios_obj
.state
== IOSTATE_goodbit
, "expected %x got %x\n", IOSTATE_goodbit
, ios_obj
.state
);
2395 ok(ios_obj
.delbuf
== 0, "expected 0 got %d\n", ios_obj
.delbuf
);
2396 ok(*p_ios_fLockcInit
== 5, "expected 5 got %d\n", *p_ios_fLockcInit
);
2397 ios_obj
.state
= 0x8;
2398 call_func1(p_ios_dtor
, &ios_obj
);
2399 ok(ios_obj
.sb
== NULL
, "expected %p got %p\n", NULL
, ios_obj
.sb
);
2400 ok(ios_obj
.state
== IOSTATE_badbit
, "expected %x got %x\n", IOSTATE_badbit
, ios_obj
.state
);
2401 ok(*p_ios_fLockcInit
== 4, "expected 4 got %d\n", *p_ios_fLockcInit
);
2403 ios_obj
.state
= 0x8;
2404 call_func1(p_ios_ctor
, &ios_obj
);
2405 ok(ios_obj
.sb
== NULL
, "expected %p got %p\n", NULL
, ios_obj
.sb
);
2406 ok(ios_obj
.state
== IOSTATE_badbit
, "expected %x got %x\n", IOSTATE_badbit
, ios_obj
.state
);
2407 ok(*p_ios_fLockcInit
== 5, "expected 5 got %d\n", *p_ios_fLockcInit
);
2410 ios_obj
.state
|= 0x8;
2411 call_func2(p_ios_init
, &ios_obj
, psb
);
2412 ok(ios_obj
.sb
== psb
, "expected %p got %p\n", psb
, ios_obj
.sb
);
2413 ok(ios_obj
.state
== 0x8, "expected %x got %x\n", 0x8, ios_obj
.state
);
2414 call_func2(p_ios_init
, &ios_obj
, NULL
);
2415 ok(ios_obj
.sb
== NULL
, "expected %p got %p\n", NULL
, ios_obj
.sb
);
2416 ok(ios_obj
.state
== (0x8|IOSTATE_badbit
), "expected %x got %x\n", (0x8|IOSTATE_badbit
), ios_obj
.state
);
2419 call_func2(p_ios_init
, &ios_obj
, psb
);
2420 ok(ios_obj
.sb
== psb
, "expected %p got %p\n", psb
, ios_obj
.sb
);
2421 ok(ios_obj
.state
== 0x8, "expected %x got %x\n", 0x8, ios_obj
.state
);
2422 call_func1(p_ios_dtor
, &ios_obj
);
2424 /* copy constructor */
2425 call_func2(p_ios_copy_ctor
, &ios_obj
, &ios_obj2
);
2426 ok(ios_obj
.sb
== NULL
, "expected %p got %p\n", NULL
, ios_obj
.sb
);
2427 ok(ios_obj
.state
== (ios_obj2
.state
|IOSTATE_badbit
), "expected %x got %x\n", (ios_obj2
.state
|IOSTATE_badbit
), ios_obj
.state
);
2428 ok(ios_obj
.delbuf
== 0, "expected 0 got %d\n", ios_obj
.delbuf
);
2429 ok(ios_obj
.tie
== ios_obj2
.tie
, "expected %p got %p\n", ios_obj2
.tie
, ios_obj
.tie
);
2430 ok(ios_obj
.flags
== ios_obj2
.flags
, "expected %x got %x\n", ios_obj2
.flags
, ios_obj
.flags
);
2431 ok(ios_obj
.precision
== (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj
.precision
);
2432 ok(ios_obj
.fill
== (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj
.fill
);
2433 ok(ios_obj
.width
== (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj
.width
);
2434 ok(ios_obj
.do_lock
== -1, "expected -1 got %d\n", ios_obj
.do_lock
);
2435 ok(*p_ios_fLockcInit
== 5, "expected 5 got %d\n", *p_ios_fLockcInit
);
2438 ios_obj
.state
= 0x8;
2442 ios_obj
.precision
= 6;
2445 ios_obj
.do_lock
= 2;
2446 call_func2(p_ios_assign
, &ios_obj
, &ios_obj2
);
2447 ok(ios_obj
.sb
== NULL
, "expected %p got %p\n", NULL
, ios_obj
.sb
);
2448 ok(ios_obj
.state
== (ios_obj2
.state
|IOSTATE_badbit
), "expected %x got %x\n", (ios_obj2
.state
|IOSTATE_badbit
), ios_obj
.state
);
2449 ok(ios_obj
.delbuf
== 2, "expected 2 got %d\n", ios_obj
.delbuf
);
2450 ok(ios_obj
.tie
== ios_obj2
.tie
, "expected %p got %p\n", ios_obj2
.tie
, ios_obj
.tie
);
2451 ok(ios_obj
.flags
== ios_obj2
.flags
, "expected %x got %x\n", ios_obj2
.flags
, ios_obj
.flags
);
2452 ok(ios_obj
.precision
== (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj
.precision
);
2453 ok(ios_obj
.fill
== (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj
.fill
);
2454 ok(ios_obj
.width
== (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj
.width
);
2455 ok(ios_obj
.do_lock
== 2, "expected 2 got %d\n", ios_obj
.do_lock
);
2459 ios_obj
.do_lock
= 1;
2460 ios_obj
.sb
->do_lock
= 0;
2461 p_ios_clrlock(&ios_obj
);
2462 ok(ios_obj
.do_lock
== 1, "expected 1 got %d\n", ios_obj
.do_lock
);
2463 ok(ios_obj
.sb
->do_lock
== 1, "expected 1 got %d\n", ios_obj
.sb
->do_lock
);
2464 ios_obj
.do_lock
= 0;
2465 p_ios_clrlock(&ios_obj
);
2466 ok(ios_obj
.do_lock
== 1, "expected 1 got %d\n", ios_obj
.do_lock
);
2467 ok(ios_obj
.sb
->do_lock
== 1, "expected 1 got %d\n", ios_obj
.sb
->do_lock
);
2468 p_ios_setlock(&ios_obj
);
2469 ok(ios_obj
.do_lock
== 0, "expected 0 got %d\n", ios_obj
.do_lock
);
2470 ok(ios_obj
.sb
->do_lock
== 0, "expected 0 got %d\n", ios_obj
.sb
->do_lock
);
2471 ios_obj
.do_lock
= -1;
2472 p_ios_setlock(&ios_obj
);
2473 ok(ios_obj
.do_lock
== -2, "expected -2 got %d\n", ios_obj
.do_lock
);
2474 ok(ios_obj
.sb
->do_lock
== -1, "expected -1 got %d\n", ios_obj
.sb
->do_lock
);
2476 lock_arg
.ios_obj
= &ios_obj
;
2477 lock_arg
.lock
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
2478 ok(lock_arg
.lock
!= NULL
, "CreateEventW failed\n");
2479 lock_arg
.release
[0] = CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
2480 ok(lock_arg
.release
[0] != NULL
, "CreateEventW failed\n");
2481 lock_arg
.release
[1] = CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
2482 ok(lock_arg
.release
[1] != NULL
, "CreateEventW failed\n");
2483 lock_arg
.release
[2] = CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
2484 ok(lock_arg
.release
[2] != NULL
, "CreateEventW failed\n");
2485 thread
= CreateThread(NULL
, 0, lock_ios
, (void*)&lock_arg
, 0, NULL
);
2486 ok(thread
!= NULL
, "CreateThread failed\n");
2487 WaitForSingleObject(lock_arg
.lock
, INFINITE
);
2489 locked
= TryEnterCriticalSection(&ios_obj
.lock
);
2490 ok(locked
== 0, "the ios object was not locked before\n");
2491 locked
= TryEnterCriticalSection(&ios_obj
.sb
->lock
);
2492 ok(locked
== 0, "the streambuf was not locked before\n");
2493 locked
= TryEnterCriticalSection(p_ios_static_lock
);
2494 ok(locked
== 0, "the static critical section was not locked before\n");
2497 ios_obj
.flags
= 0x8000;
2498 ret
= (LONG
) call_func1(p_ios_flags_get
, &ios_obj
);
2499 ok(ret
== 0x8000, "expected %x got %x\n", 0x8000, ret
);
2500 ret
= (LONG
) call_func2(p_ios_flags_set
, &ios_obj
, 0x444);
2501 ok(ret
== 0x8000, "expected %x got %x\n", 0x8000, ret
);
2502 ok(ios_obj
.flags
== 0x444, "expected %x got %x\n", 0x444, ios_obj
.flags
);
2503 ret
= (LONG
) call_func2(p_ios_flags_set
, &ios_obj
, 0);
2504 ok(ret
== 0x444, "expected %x got %x\n", 0x444, ret
);
2505 ok(ios_obj
.flags
== 0, "expected %x got %x\n", 0, ios_obj
.flags
);
2508 ios_obj
.do_lock
= 0;
2509 ios_obj
.flags
= 0x8400;
2510 ret
= (LONG
) call_func2(p_ios_setf
, &ios_obj
, 0x444);
2511 ok(ret
== 0x8400, "expected %x got %x\n", 0x8400, ret
);
2512 ok(ios_obj
.flags
== 0x8444, "expected %x got %x\n", 0x8444, ios_obj
.flags
);
2513 ret
= (LONG
) call_func3(p_ios_setf_mask
, &ios_obj
, 0x111, 0);
2514 ok(ret
== 0x8444, "expected %x got %x\n", 0x8444, ret
);
2515 ok(ios_obj
.flags
== 0x8444, "expected %x got %x\n", 0x8444, ios_obj
.flags
);
2516 ret
= (LONG
) call_func3(p_ios_setf_mask
, &ios_obj
, 0x111, 0x105);
2517 ok(ret
== 0x8444, "expected %x got %x\n", 0x8444, ret
);
2518 ok(ios_obj
.flags
== 0x8541, "expected %x got %x\n", 0x8541, ios_obj
.flags
);
2521 ret
= (LONG
) call_func2(p_ios_unsetf
, &ios_obj
, 0x1111);
2522 ok(ret
== 0x8541, "expected %x got %x\n", 0x8541, ret
);
2523 ok(ios_obj
.flags
== 0x8440, "expected %x got %x\n", 0x8440, ios_obj
.flags
);
2524 ret
= (LONG
) call_func2(p_ios_unsetf
, &ios_obj
, 0x8008);
2525 ok(ret
== 0x8440, "expected %x got %x\n", 0x8440, ret
);
2526 ok(ios_obj
.flags
== 0x440, "expected %x got %x\n", 0x440, ios_obj
.flags
);
2527 ios_obj
.do_lock
= -1;
2530 ios_obj
.state
= 0x8;
2531 ret
= (LONG
) call_func1(p_ios_good
, &ios_obj
);
2532 ok(ret
== 0, "expected 0 got %d\n", ret
);
2533 ios_obj
.state
= IOSTATE_goodbit
;
2534 ret
= (LONG
) call_func1(p_ios_good
, &ios_obj
);
2535 ok(ret
== 1, "expected 1 got %d\n", ret
);
2536 ret
= (LONG
) call_func1(p_ios_bad
, &ios_obj
);
2537 ok(ret
== 0, "expected 0 got %d\n", ret
);
2538 ios_obj
.state
= (IOSTATE_eofbit
|IOSTATE_badbit
);
2539 ret
= (LONG
) call_func1(p_ios_bad
, &ios_obj
);
2540 ok(ret
== IOSTATE_badbit
, "expected 4 got %d\n", ret
);
2541 ret
= (LONG
) call_func1(p_ios_eof
, &ios_obj
);
2542 ok(ret
== IOSTATE_eofbit
, "expected 1 got %d\n", ret
);
2543 ios_obj
.state
= 0x8;
2544 ret
= (LONG
) call_func1(p_ios_eof
, &ios_obj
);
2545 ok(ret
== 0, "expected 0 got %d\n", ret
);
2546 ret
= (LONG
) call_func1(p_ios_fail
, &ios_obj
);
2547 ok(ret
== 0, "expected 0 got %d\n", ret
);
2548 ios_obj
.state
= IOSTATE_badbit
;
2549 ret
= (LONG
) call_func1(p_ios_fail
, &ios_obj
);
2550 ok(ret
== IOSTATE_badbit
, "expected 4 got %d\n", ret
);
2551 ios_obj
.state
= (IOSTATE_eofbit
|IOSTATE_failbit
);
2552 ret
= (LONG
) call_func1(p_ios_fail
, &ios_obj
);
2553 ok(ret
== IOSTATE_failbit
, "expected 2 got %d\n", ret
);
2554 ios_obj
.state
= (IOSTATE_eofbit
|IOSTATE_failbit
|IOSTATE_badbit
);
2555 ret
= (LONG
) call_func1(p_ios_fail
, &ios_obj
);
2556 ok(ret
== (IOSTATE_failbit
|IOSTATE_badbit
), "expected 6 got %d\n", ret
);
2557 ios_obj
.do_lock
= 0;
2558 call_func2(p_ios_clear
, &ios_obj
, 0);
2559 ok(ios_obj
.state
== IOSTATE_goodbit
, "expected 0 got %d\n", ios_obj
.state
);
2560 call_func2(p_ios_clear
, &ios_obj
, 0x8|IOSTATE_eofbit
);
2561 ok(ios_obj
.state
== (0x8|IOSTATE_eofbit
), "expected 9 got %d\n", ios_obj
.state
);
2562 ios_obj
.do_lock
= -1;
2564 SetEvent(lock_arg
.release
[0]);
2568 for (i
= 0; i
< 20; i
++) {
2569 ret
= p_ios_bitalloc();
2570 ok(ret
== expected
, "expected %x got %x\n", expected
, ret
);
2571 ok(*p_ios_maxbit
== expected
, "expected %x got %x\n", expected
, *p_ios_maxbit
);
2575 /* xalloc/pword/iword */
2576 ok(*p_ios_curindex
== -1, "expected -1 got %d\n", *p_ios_curindex
);
2578 for (i
= 0; i
< 8; i
++) {
2579 ret
= p_ios_xalloc();
2580 ok(ret
== expected
, "expected %d got %d\n", expected
, ret
);
2581 ok(*p_ios_curindex
== expected
, "expected %d got %d\n", expected
, *p_ios_curindex
);
2582 pret
= call_func2(p_ios_iword
, &ios_obj
, ret
);
2583 ok(pret
== &p_ios_statebuf
[ret
], "expected %p got %p\n", &p_ios_statebuf
[ret
], pret
);
2584 ok(*pret
== 0, "expected 0 got %d\n", *pret
);
2585 pret2
= call_func2(p_ios_pword
, &ios_obj
, ret
);
2586 ok(pret2
== (void**)&p_ios_statebuf
[ret
], "expected %p got %p\n", (void**)&p_ios_statebuf
[ret
], pret2
);
2589 ret
= p_ios_xalloc();
2590 ok(ret
== -1, "expected -1 got %d\n", ret
);
2591 ok(*p_ios_curindex
== 7, "expected 7 got %d\n", *p_ios_curindex
);
2593 SetEvent(lock_arg
.release
[1]);
2594 SetEvent(lock_arg
.release
[2]);
2595 WaitForSingleObject(thread
, INFINITE
);
2598 call_func1(p_ios_dtor
, &ios_obj
);
2599 ok(ios_obj
.state
== IOSTATE_badbit
, "expected %x got %x\n", IOSTATE_badbit
, ios_obj
.state
);
2600 ok(*p_ios_fLockcInit
== 4, "expected 4 got %d\n", *p_ios_fLockcInit
);
2601 CloseHandle(lock_arg
.lock
);
2602 CloseHandle(lock_arg
.release
[0]);
2603 CloseHandle(lock_arg
.release
[1]);
2604 CloseHandle(lock_arg
.release
[2]);
2605 CloseHandle(thread
);
2608 static void test_ostream(void) {
2609 ostream os1
, os2
, *pos
;
2610 filebuf fb1
, fb2
, *pfb
;
2611 const char filename1
[] = "test1";
2612 const char filename2
[] = "test2";
2615 memset(&os1
, 0xab, sizeof(ostream
));
2616 memset(&os2
, 0xab, sizeof(ostream
));
2617 memset(&fb1
, 0xab, sizeof(filebuf
));
2618 memset(&fb2
, 0xab, sizeof(filebuf
));
2620 /* constructors/destructors */
2621 pos
= call_func2(p_ostream_ctor
, &os1
, TRUE
);
2622 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2623 ok(os1
.unknown
== 0, "expected 0 got %d\n", os1
.unknown
);
2624 ok(os1
.base_ios
.sb
== NULL
, "expected %p got %p\n", NULL
, os1
.base_ios
.sb
);
2625 ok(os1
.base_ios
.state
== IOSTATE_badbit
, "expected %d got %d\n", IOSTATE_badbit
, os1
.base_ios
.state
);
2626 call_func1(p_ostream_vbase_dtor
, &os1
);
2627 pos
= call_func3(p_ostream_sb_ctor
, &os1
, (streambuf
*) &fb1
, TRUE
);
2628 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2629 ok(os1
.unknown
== 0, "expected 0 got %d\n", os1
.unknown
);
2630 ok(os1
.base_ios
.sb
== (streambuf
*) &fb1
, "expected %p got %p\n", &fb1
, os1
.base_ios
.sb
);
2631 ok(os1
.base_ios
.state
== IOSTATE_goodbit
, "expected %d got %d\n", IOSTATE_goodbit
, os1
.base_ios
.state
);
2632 ok(fb1
.base
.allocated
== 0xabababab, "expected %d got %d\n", 0xabababab, fb1
.base
.allocated
);
2633 call_func1(p_filebuf_ctor
, &fb1
);
2634 pfb
= call_func4(p_filebuf_open
, &fb1
, filename1
, OPENMODE_out
, filebuf_openprot
);
2635 ok(pfb
== &fb1
, "wrong return, expected %p got %p\n", &fb1
, pfb
);
2636 ok(fb1
.base
.allocated
== 1, "expected %d got %d\n", 1, fb1
.base
.allocated
);
2637 call_func1(p_ostream_vbase_dtor
, &os1
);
2638 ok(os1
.base_ios
.sb
== NULL
, "expected %p got %p\n", NULL
, os1
.base_ios
.sb
);
2639 ok(os1
.base_ios
.state
== IOSTATE_badbit
, "expected %d got %d\n", IOSTATE_badbit
, os1
.base_ios
.state
);
2640 memset(&os1
.base_ios
, 0xab, sizeof(ios
));
2641 os1
.unknown
= 0xabababab;
2642 pos
= call_func2(p_ostream_ctor
, &os1
, FALSE
);
2643 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2644 ok(os1
.unknown
== 0, "expected 0 got %d\n", os1
.unknown
);
2645 ok(os1
.base_ios
.sb
== os2
.base_ios
.sb
, "expected %p got %p\n", os2
.base_ios
.sb
, os1
.base_ios
.sb
);
2646 ok(os1
.base_ios
.state
== 0xabababab, "expected %d got %d\n", 0xabababab, os1
.base_ios
.state
);
2647 call_func1(p_ostream_dtor
, &os1
.base_ios
);
2648 os1
.unknown
= 0xabababab;
2649 os1
.base_ios
.state
= 0xabababab | IOSTATE_badbit
;
2650 os1
.base_ios
.delbuf
= 0;
2651 pos
= call_func3(p_ostream_sb_ctor
, &os1
, (streambuf
*) &fb1
, FALSE
);
2652 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2653 ok(os1
.unknown
== 0, "expected 0 got %d\n", os1
.unknown
);
2654 ok(os1
.base_ios
.sb
== (streambuf
*) &fb1
, "expected %p got %p\n", &fb1
, os1
.base_ios
.sb
);
2655 ok(os1
.base_ios
.state
== 0xabababab, "expected %d got %d\n", 0xabababab, os1
.base_ios
.state
);
2656 call_func1(p_ostream_dtor
, &os1
.base_ios
);
2657 memset(&os1
, 0xab, sizeof(ostream
));
2658 pos
= call_func3(p_ostream_sb_ctor
, &os1
, NULL
, TRUE
);
2659 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2660 ok(os1
.unknown
== 0, "expected 0 got %d\n", os1
.unknown
);
2661 ok(os1
.base_ios
.sb
== NULL
, "expected %p got %p\n", NULL
, os1
.base_ios
.sb
);
2662 ok(os1
.base_ios
.state
== IOSTATE_badbit
, "expected %d got %d\n", IOSTATE_badbit
, os1
.base_ios
.state
);
2663 call_func1(p_ostream_vbase_dtor
, &os1
);
2664 os1
.unknown
= 0xcdcdcdcd;
2665 memset(&os1
.base_ios
, 0xcd, sizeof(ios
));
2666 memset(&os2
, 0xab, sizeof(ostream
));
2667 os2
.vbtable
= os1
.vbtable
;
2668 os2
.base_ios
.delbuf
= 0;
2669 os2
.base_ios
.tie
= &os2
;
2670 pos
= call_func3(p_ostream_copy_ctor
, &os2
, &os1
, FALSE
);
2671 ok(pos
== &os2
, "wrong return, expected %p got %p\n", &os2
, pos
);
2672 ok(os2
.unknown
== 0, "expected 0 got %d\n", os2
.unknown
);
2673 ok(os2
.base_ios
.sb
== os1
.base_ios
.sb
, "expected %p got %p\n", os1
.base_ios
.sb
, os2
.base_ios
.sb
);
2674 ok(os2
.base_ios
.state
== 0xabababab, "expected %d got %d\n", 0xabababab, os2
.base_ios
.state
);
2675 ok(os2
.base_ios
.delbuf
== 0, "expected 0 got %d\n", os2
.base_ios
.delbuf
);
2676 ok(os2
.base_ios
.tie
== &os2
, "expected %p got %p\n", &os2
, os2
.base_ios
.tie
);
2677 ok(os2
.base_ios
.flags
== 0xabababab, "expected %x got %x\n", 0xabababab, os2
.base_ios
.flags
);
2678 ok(os2
.base_ios
.precision
== 0xabababab, "expected %d got %d\n", 0xabababab, os2
.base_ios
.precision
);
2679 ok(os2
.base_ios
.fill
== (char) 0xab, "expected -85 got %d\n", os2
.base_ios
.fill
);
2680 ok(os2
.base_ios
.width
== 0xabababab, "expected %d got %d\n", 0xabababab, os2
.base_ios
.width
);
2681 call_func1(p_ostream_dtor
, &os2
.base_ios
);
2682 pos
= call_func3(p_ostream_copy_ctor
, &os2
, &os1
, TRUE
);
2683 ok(pos
== &os2
, "wrong return, expected %p got %p\n", &os2
, pos
);
2684 ok(os2
.unknown
== 0, "expected 0 got %d\n", os2
.unknown
);
2685 ok(os2
.base_ios
.sb
== os1
.base_ios
.sb
, "expected %p got %p\n", os1
.base_ios
.sb
, os2
.base_ios
.sb
);
2686 ok(os2
.base_ios
.state
== IOSTATE_goodbit
, "expected %d got %d\n", IOSTATE_goodbit
, os2
.base_ios
.state
);
2687 ok(os2
.base_ios
.delbuf
== 0, "expected 0 got %d\n", os2
.base_ios
.delbuf
);
2688 ok(os2
.base_ios
.tie
== NULL
, "expected %p got %p\n", NULL
, os2
.base_ios
.tie
);
2689 ok(os2
.base_ios
.flags
== 0, "expected 0 got %x\n", os2
.base_ios
.flags
);
2690 ok(os2
.base_ios
.precision
== 6, "expected 6 got %d\n", os2
.base_ios
.precision
);
2691 ok(os2
.base_ios
.fill
== ' ', "expected 32 got %d\n", os2
.base_ios
.fill
);
2692 ok(os2
.base_ios
.width
== 0, "expected 0 got %d\n", os2
.base_ios
.width
);
2695 pos
= call_func2(p_ostream_ctor
, &os1
, TRUE
);
2696 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2697 os1
.unknown
= 0xabababab;
2698 os1
.base_ios
.state
= 0xabababab;
2699 os1
.base_ios
.special
[0] = 0xabababab;
2700 os1
.base_ios
.delbuf
= 0xabababab;
2701 os1
.base_ios
.tie
= (ostream
*) 0xabababab;
2702 os1
.base_ios
.flags
= 0xabababab;
2703 os1
.base_ios
.precision
= 0xabababab;
2704 os1
.base_ios
.width
= 0xabababab;
2705 pos
= call_func2(p_ostream_assign_sb
, &os1
, (streambuf
*) &fb1
);
2706 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2707 ok(os1
.unknown
== 0xabababab, "expected 0 got %d\n", os1
.unknown
);
2708 ok(os1
.base_ios
.sb
== (streambuf
*) &fb1
, "expected %p got %p\n", &fb1
, os1
.base_ios
.sb
);
2709 ok(os1
.base_ios
.state
== IOSTATE_goodbit
, "expected %d got %d\n", IOSTATE_goodbit
, os1
.base_ios
.state
);
2710 ok(os1
.base_ios
.special
[0] == 0xabababab, "expected %d got %d\n", 0xabababab, os1
.base_ios
.fill
);
2711 ok(os1
.base_ios
.delbuf
== 0, "expected 0 got %d\n", os1
.base_ios
.delbuf
);
2712 ok(os1
.base_ios
.tie
== NULL
, "expected %p got %p\n", NULL
, os1
.base_ios
.tie
);
2713 ok(os1
.base_ios
.flags
== 0, "expected 0 got %x\n", os1
.base_ios
.flags
);
2714 ok(os1
.base_ios
.precision
== 6, "expected 6 got %d\n", os1
.base_ios
.precision
);
2715 ok(os1
.base_ios
.width
== 0, "expected 0 got %d\n", os1
.base_ios
.width
);
2716 os1
.base_ios
.state
= 0x8000;
2717 pos
= call_func2(p_ostream_assign_sb
, &os1
, NULL
);
2718 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2719 ok(os1
.base_ios
.sb
== NULL
, "expected %p got %p\n", NULL
, os1
.base_ios
.sb
);
2720 ok(os1
.base_ios
.state
== IOSTATE_badbit
, "expected %d got %d\n", IOSTATE_badbit
, os1
.base_ios
.state
);
2721 os2
.unknown
= 0xcdcdcdcd;
2722 os2
.base_ios
.state
= 0xcdcdcdcd;
2723 os2
.base_ios
.special
[0] = 0xcdcdcdcd;
2724 pos
= call_func2(p_ostream_assign
, &os2
, &os1
);
2725 ok(pos
== &os2
, "wrong return, expected %p got %p\n", &os2
, pos
);
2726 ok(os2
.unknown
== 0xcdcdcdcd, "expected 0 got %d\n", os2
.unknown
);
2727 ok(os2
.base_ios
.sb
== NULL
, "expected %p got %p\n", NULL
, os2
.base_ios
.sb
);
2728 ok(os2
.base_ios
.state
== IOSTATE_badbit
, "expected %d got %d\n", IOSTATE_badbit
, os2
.base_ios
.state
);
2729 ok(os2
.base_ios
.special
[0] == 0xcdcdcdcd, "expected %d got %d\n", 0xcdcdcdcd, os2
.base_ios
.fill
);
2732 if (0) /* crashes on native */
2733 pos
= call_func1(p_ostream_flush
, &os1
);
2734 os1
.base_ios
.sb
= (streambuf
*) &fb2
;
2735 call_func1(p_filebuf_ctor
, &fb2
);
2736 pos
= call_func1(p_ostream_flush
, &os1
);
2737 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2738 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
2739 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2740 os1
.base_ios
.sb
= (streambuf
*) &fb1
;
2741 os1
.base_ios
.state
= IOSTATE_eofbit
;
2742 ret
= (int) call_func3(p_streambuf_xsputn
, &fb1
.base
, "Never gonna tell a lie", 22);
2743 ok(ret
== 22, "expected 22 got %d\n", ret
);
2744 ok(fb1
.base
.pbase
== fb1
.base
.base
, "wrong put base, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.pbase
);
2745 ok(fb1
.base
.pptr
== fb1
.base
.base
+ 22, "wrong put pointer, expected %p got %p\n", fb1
.base
.base
+ 22, fb1
.base
.pptr
);
2746 pos
= call_func1(p_ostream_flush
, &os1
);
2747 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2748 ok(os1
.base_ios
.state
== IOSTATE_eofbit
, "expected %d got %d\n", IOSTATE_eofbit
, os1
.base_ios
.state
);
2749 ok(fb1
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb1
.base
.pbase
);
2750 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
2751 os1
.base_ios
.tie
= &os2
;
2752 os2
.base_ios
.sb
= (streambuf
*) &fb2
;
2753 os2
.base_ios
.state
= IOSTATE_goodbit
;
2754 pfb
= call_func4(p_filebuf_open
, &fb2
, filename2
, OPENMODE_out
, filebuf_openprot
);
2755 ok(pfb
== &fb2
, "wrong return, expected %p got %p\n", &fb2
, pfb
);
2756 ret
= (int) call_func3(p_streambuf_xsputn
, &fb2
.base
, "and hurt you", 12);
2757 ok(ret
== 12, "expected 12 got %d\n", ret
);
2758 ok(fb2
.base
.pbase
== fb2
.base
.base
, "wrong put base, expected %p got %p\n", fb2
.base
.base
, fb2
.base
.pbase
);
2759 ok(fb2
.base
.pptr
== fb2
.base
.base
+ 12, "wrong put pointer, expected %p got %p\n", fb2
.base
.base
+ 12, fb2
.base
.pptr
);
2760 pos
= call_func1(p_ostream_flush
, &os1
);
2761 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2762 ok(fb2
.base
.pbase
== fb2
.base
.base
, "wrong put base, expected %p got %p\n", fb2
.base
.base
, fb2
.base
.pbase
);
2763 ok(fb2
.base
.pptr
== fb2
.base
.base
+ 12, "wrong put pointer, expected %p got %p\n", fb2
.base
.base
+ 12, fb2
.base
.pptr
);
2766 ret
= (int) call_func1(p_ostream_opfx
, &os1
);
2767 ok(ret
== 0, "expected 0 got %d\n", ret
);
2768 ok(os1
.base_ios
.state
== (IOSTATE_eofbit
|IOSTATE_failbit
), "expected %d got %d\n",
2769 IOSTATE_eofbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2770 os1
.base_ios
.state
= IOSTATE_badbit
;
2771 ret
= (int) call_func1(p_ostream_opfx
, &os1
);
2772 ok(ret
== 0, "expected 0 got %d\n", ret
);
2773 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
2774 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2775 os1
.base_ios
.sb
= (streambuf
*) &fb1
;
2776 os1
.base_ios
.state
= IOSTATE_badbit
;
2777 ret
= (int) call_func1(p_ostream_opfx
, &os1
);
2778 ok(ret
== 0, "expected 0 got %d\n", ret
);
2779 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
2780 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2781 os1
.base_ios
.state
= IOSTATE_failbit
;
2782 ret
= (int) call_func1(p_ostream_opfx
, &os1
);
2783 ok(ret
== 0, "expected 0 got %d\n", ret
);
2784 ok(os1
.base_ios
.state
== IOSTATE_failbit
, "expected %d got %d\n", IOSTATE_failbit
, os1
.base_ios
.state
);
2785 os1
.base_ios
.state
= IOSTATE_goodbit
;
2786 os1
.base_ios
.tie
= &os2
;
2787 os2
.base_ios
.sb
= NULL
;
2788 if (0) /* crashes on native */
2789 ret
= (int) call_func1(p_ostream_opfx
, &os1
);
2790 os2
.base_ios
.sb
= (streambuf
*) &fb2
;
2791 os2
.base_ios
.state
= IOSTATE_badbit
;
2792 ret
= (int) call_func3(p_streambuf_xsputn
, &fb1
.base
, "We've known each other", 22);
2793 ok(ret
== 22, "expected 22 got %d\n", ret
);
2794 ret
= (int) call_func1(p_ostream_opfx
, &os1
);
2795 ok(ret
== 1, "expected 1 got %d\n", ret
);
2796 ok(os1
.base_ios
.state
== IOSTATE_goodbit
, "expected %d got %d\n", IOSTATE_goodbit
, os1
.base_ios
.state
);
2797 ok(os2
.base_ios
.state
== IOSTATE_badbit
, "expected %d got %d\n", IOSTATE_badbit
, os2
.base_ios
.state
);
2798 ok(fb1
.base
.pbase
== fb1
.base
.base
, "wrong put base, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.pbase
);
2799 ok(fb1
.base
.pptr
== fb1
.base
.base
+ 22, "wrong put pointer, expected %p got %p\n", fb1
.base
.base
+ 22, fb1
.base
.pptr
);
2800 ok(fb2
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb2
.base
.pbase
);
2801 ok(fb2
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb2
.base
.pptr
);
2804 os1
.base_ios
.state
= IOSTATE_badbit
;
2805 os1
.base_ios
.width
= 0xab;
2806 call_func1(p_ostream_osfx
, &os1
);
2807 ok(os1
.base_ios
.state
== IOSTATE_badbit
, "expected %d got %d\n", IOSTATE_badbit
, os1
.base_ios
.state
);
2808 ok(os1
.base_ios
.width
== 0, "expected 0 got %d\n", os1
.base_ios
.width
);
2809 ok(fb1
.base
.pbase
== fb1
.base
.base
, "wrong put base, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.pbase
);
2810 ok(fb1
.base
.pptr
== fb1
.base
.base
+ 22, "wrong put pointer, expected %p got %p\n", fb1
.base
.base
+ 22, fb1
.base
.pptr
);
2811 os1
.base_ios
.state
= IOSTATE_goodbit
;
2812 ret
= (int) call_func1(p_ostream_opfx
, &os1
);
2813 ok(ret
== 1, "expected 1 got %d\n", ret
);
2814 os1
.base_ios
.sb
= NULL
;
2815 if (0) /* crashes on native */
2816 call_func1(p_ostream_osfx
, &os1
);
2817 os1
.base_ios
.sb
= (streambuf
*) &fb1
;
2818 os1
.base_ios
.flags
= FLAGS_unitbuf
;
2819 call_func1(p_ostream_osfx
, &os1
);
2820 ok(os1
.base_ios
.state
== IOSTATE_goodbit
, "expected %d got %d\n", IOSTATE_goodbit
, os1
.base_ios
.state
);
2821 ok(os1
.base_ios
.flags
== FLAGS_unitbuf
, "expected %d got %d\n", FLAGS_unitbuf
, os1
.base_ios
.flags
);
2822 ok(fb1
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb1
.base
.pbase
);
2823 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
2826 ret
= (int) call_func3(p_streambuf_xsputn
, &fb2
.base
, "for so long", 11);
2827 ok(ret
== 11, "expected 11 got %d\n", ret
);
2828 os1
.base_ios
.state
= IOSTATE_badbit
;
2829 os1
.base_ios
.width
= 2;
2830 pos
= call_func2(p_ostream_put_char
, &os1
, 'a');
2831 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2832 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
2833 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2834 ok(os1
.base_ios
.width
== 2, "expected 2 got %d\n", os1
.base_ios
.width
);
2835 ok(fb1
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb1
.base
.pbase
);
2836 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
2837 ok(fb2
.base
.pbase
== fb2
.base
.base
, "wrong put base, expected %p got %p\n", fb2
.base
.base
, fb2
.base
.pbase
);
2838 ok(fb2
.base
.pptr
== fb2
.base
.base
+ 11, "wrong put pointer, expected %p got %p\n", fb2
.base
.base
+ 11, fb2
.base
.pptr
);
2839 os1
.base_ios
.state
= IOSTATE_goodbit
;
2840 pos
= call_func2(p_ostream_put_char
, &os1
, 'a');
2841 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2842 ok(os1
.base_ios
.state
== IOSTATE_goodbit
, "expected %d got %d\n", IOSTATE_goodbit
, os1
.base_ios
.state
);
2843 ok(os1
.base_ios
.width
== 0, "expected 0 got %d\n", os1
.base_ios
.width
);
2844 ok(fb1
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb1
.base
.pbase
);
2845 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
2846 ok(fb2
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb2
.base
.pbase
);
2847 ok(fb2
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb2
.base
.pptr
);
2848 os1
.base_ios
.flags
= 0;
2849 pos
= call_func2(p_ostream_put_char
, &os1
, 'b');
2850 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2851 ok(os1
.base_ios
.state
== IOSTATE_goodbit
, "expected %d got %d\n", IOSTATE_goodbit
, os1
.base_ios
.state
);
2852 ok(fb1
.base
.pbase
== fb1
.base
.base
, "wrong put base, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.pbase
);
2853 ok(fb1
.base
.pptr
== fb1
.base
.base
+ 1, "wrong put pointer, expected %p got %p\n", fb1
.base
.base
+ 1, fb1
.base
.pptr
);
2854 os1
.base_ios
.sb
= NULL
;
2855 if (0) /* crashes on native */
2856 pos
= call_func2(p_ostream_put_char
, &os1
, 'c');
2857 os1
.base_ios
.sb
= (streambuf
*) &fb1
;
2858 os1
.base_ios
.width
= 5;
2859 call_func1(p_filebuf_sync
, &fb1
);
2862 pos
= call_func2(p_ostream_put_char
, &os1
, 'c');
2863 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2864 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
2865 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2866 ok(os1
.base_ios
.width
== 0, "expected 0 got %d\n", os1
.base_ios
.width
);
2867 ok(fb1
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb1
.base
.pbase
);
2868 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
2872 pos
= call_func3(p_ostream_write_char
, &os1
, "Your", 4);
2873 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2874 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
2875 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2876 ok(fb1
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb1
.base
.pbase
);
2877 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
2878 os1
.base_ios
.state
= IOSTATE_goodbit
;
2879 os1
.base_ios
.width
= 1;
2880 pos
= call_func3(p_ostream_write_char
, &os1
, "heart's", 7);
2881 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2882 ok(os1
.base_ios
.state
== IOSTATE_goodbit
, "expected %d got %d\n", IOSTATE_goodbit
, os1
.base_ios
.state
);
2883 ok(os1
.base_ios
.width
== 0, "expected 0 got %d\n", os1
.base_ios
.width
);
2884 ok(fb1
.base
.pbase
== fb1
.base
.base
, "wrong put base, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.pbase
);
2885 ok(fb1
.base
.pptr
== fb1
.base
.base
+ 7, "wrong put pointer, expected %p got %p\n", fb1
.base
.base
+ 7, fb1
.base
.pptr
);
2886 os1
.base_ios
.sb
= NULL
;
2887 if (0) /* crashes on native */
2888 pos
= call_func3(p_ostream_write_char
, &os1
, "been", 4);
2889 os1
.base_ios
.sb
= (streambuf
*) &fb1
;
2890 os1
.base_ios
.width
= 5;
2891 call_func1(p_filebuf_sync
, &fb1
);
2894 pos
= call_func3(p_ostream_write_char
, &os1
, "aching,", 7);
2895 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2896 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
2897 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2898 ok(os1
.base_ios
.width
== 0, "expected 0 got %d\n", os1
.base_ios
.width
);
2899 ok(fb1
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb1
.base
.pbase
);
2900 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
2904 os1
.base_ios
.state
= IOSTATE_eofbit
;
2905 pos
= call_func3(p_ostream_seekp_offset
, &os1
, 0, SEEKDIR_beg
);
2906 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2907 ok(os1
.base_ios
.state
== IOSTATE_eofbit
, "expected %d got %d\n", IOSTATE_eofbit
, os1
.base_ios
.state
);
2908 ret
= (int) call_func3(p_streambuf_xsputn
, &fb1
.base
, "but", 3);
2909 ok(ret
== 3, "expected 3 got %d\n", ret
);
2910 ok(fb1
.base
.pbase
== fb1
.base
.base
, "wrong put base, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.pbase
);
2911 ok(fb1
.base
.pptr
== fb1
.base
.base
+ 3, "wrong put pointer, expected %p got %p\n", fb1
.base
.base
+ 3, fb1
.base
.pptr
);
2912 pos
= call_func3(p_ostream_seekp_offset
, &os1
, 0, SEEKDIR_end
);
2913 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2914 ok(os1
.base_ios
.state
== IOSTATE_eofbit
, "expected %d got %d\n", IOSTATE_eofbit
, os1
.base_ios
.state
);
2915 ok(fb1
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb1
.base
.pbase
);
2916 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
2917 pos
= call_func3(p_ostream_seekp_offset
, &os1
, -1, SEEKDIR_beg
);
2918 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2919 ok(os1
.base_ios
.state
== (IOSTATE_eofbit
|IOSTATE_failbit
), "expected %d got %d\n",
2920 IOSTATE_eofbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2921 ret
= (int) call_func3(p_streambuf_xsputn
, &fb1
.base
, "You're too shy", 14);
2922 ok(ret
== 14, "expected 14 got %d\n", ret
);
2923 ok(fb1
.base
.pbase
== fb1
.base
.base
, "wrong put base, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.pbase
);
2924 ok(fb1
.base
.pptr
== fb1
.base
.base
+ 14, "wrong put pointer, expected %p got %p\n", fb1
.base
.base
+ 14, fb1
.base
.pptr
);
2925 pos
= call_func2(p_ostream_seekp
, &os1
, 0);
2926 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2927 ok(os1
.base_ios
.state
== (IOSTATE_eofbit
|IOSTATE_failbit
), "expected %d got %d\n",
2928 IOSTATE_eofbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2929 ok(fb1
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb1
.base
.pbase
);
2930 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
2931 os1
.base_ios
.state
= IOSTATE_badbit
;
2932 pos
= call_func2(p_ostream_seekp
, &os1
, -1);
2933 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2934 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
2935 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2938 ret
= (int) call_func1(p_ostream_tellp
, &os1
);
2939 ok(ret
== 0, "wrong return, expected 0 got %d\n", ret
);
2940 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
2941 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2942 ret
= (int) call_func3(p_streambuf_xsputn
, &fb1
.base
, "to say it", 9);
2943 ok(ret
== 9, "expected 9 got %d\n", ret
);
2944 ok(fb1
.base
.pbase
== fb1
.base
.base
, "wrong put base, expected %p got %p\n", fb1
.base
.base
, fb1
.base
.pbase
);
2945 ok(fb1
.base
.pptr
== fb1
.base
.base
+ 9, "wrong put pointer, expected %p got %p\n", fb1
.base
.base
+ 9, fb1
.base
.pptr
);
2946 ret
= (int) call_func1(p_ostream_tellp
, &os1
);
2947 ok(ret
== 9, "wrong return, expected 9 got %d\n", ret
);
2948 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
2949 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2950 ok(fb1
.base
.pbase
== NULL
, "wrong put base, expected %p got %p\n", NULL
, fb1
.base
.pbase
);
2951 ok(fb1
.base
.pptr
== NULL
, "wrong put pointer, expected %p got %p\n", NULL
, fb1
.base
.pptr
);
2952 os1
.base_ios
.state
= IOSTATE_eofbit
;
2955 ret
= (int) call_func1(p_ostream_tellp
, &os1
);
2956 ok(ret
== EOF
, "wrong return, expected EOF got %d\n", ret
);
2957 ok(os1
.base_ios
.state
== (IOSTATE_eofbit
|IOSTATE_failbit
), "expected %d got %d\n",
2958 IOSTATE_eofbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
2962 os1
.base_ios
.state
= IOSTATE_eofbit
;
2963 os1
.base_ios
.flags
=
2964 FLAGS_right
|FLAGS_hex
|FLAGS_showbase
|FLAGS_showpoint
|FLAGS_showpos
|FLAGS_uppercase
|FLAGS_fixed
;
2965 os1
.base_ios
.fill
= 'z';
2966 os1
.base_ios
.width
= 9;
2967 pos
= call_func3(p_ostream_writepad
, &os1
, "a", "b");
2968 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2969 ok(!strncmp(fb1
.base
.pptr
- 9, "zzzzzzzab", 9), "expected 'zzzzzzzab' got '%s'\n", fb1
.base
.pptr
- 9);
2970 pos
= call_func3(p_ostream_writepad
, &os1
, "aa", "bb");
2971 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2972 ok(!strncmp(fb1
.base
.pptr
- 9, "zzzzzaabb", 9), "expected 'zzzzzaabb' got '%s'\n", fb1
.base
.pptr
- 9);
2973 pos
= call_func3(p_ostream_writepad
, &os1
, "aaaaa", "bbbbb");
2974 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2975 ok(!strncmp(fb1
.base
.pptr
- 10, "aaaaabbbbb", 10), "expected 'aaaaabbbbb' got '%s'\n", fb1
.base
.pptr
- 10);
2976 os1
.base_ios
.flags
|= FLAGS_internal
;
2977 pos
= call_func3(p_ostream_writepad
, &os1
, "aa", "bb");
2978 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2979 ok(!strncmp(fb1
.base
.pptr
- 9, "aazzzzzbb", 9), "expected 'aazzzzzbb' got '%s'\n", fb1
.base
.pptr
- 9);
2980 os1
.base_ios
.flags
&= ~FLAGS_right
;
2981 pos
= call_func3(p_ostream_writepad
, &os1
, "a", "b");
2982 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2983 ok(!strncmp(fb1
.base
.pptr
- 9, "azzzzzzzb", 9), "expected 'azzzzzzzb' got '%s'\n", fb1
.base
.pptr
- 9);
2984 os1
.base_ios
.width
= 6;
2985 pos
= call_func3(p_ostream_writepad
, &os1
, "1", "2");
2986 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2987 ok(!strncmp(fb1
.base
.pptr
- 6, "1zzzz2", 6), "expected '1zzzz2' got '%s'\n", fb1
.base
.pptr
- 6);
2988 pos
= call_func3(p_ostream_writepad
, &os1
, "12345678", "");
2989 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2990 ok(!strncmp(fb1
.base
.pptr
- 8, "12345678", 8), "expected '12345678' got '%s'\n", fb1
.base
.pptr
- 8);
2991 os1
.base_ios
.flags
|= FLAGS_left
;
2992 pos
= call_func3(p_ostream_writepad
, &os1
, "z1", "2z");
2993 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2994 ok(!strncmp(fb1
.base
.pptr
- 6, "z1zz2z", 6), "expected 'z1zz2z' got '%s'\n", fb1
.base
.pptr
- 6);
2995 os1
.base_ios
.flags
&= ~FLAGS_internal
;
2996 pos
= call_func3(p_ostream_writepad
, &os1
, "hell", "o");
2997 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
2998 ok(!strncmp(fb1
.base
.pptr
- 6, "helloz", 6), "expected 'helloz' got '%s'\n", fb1
.base
.pptr
- 6);
2999 os1
.base_ios
.flags
|= FLAGS_right
;
3000 pos
= call_func3(p_ostream_writepad
, &os1
, "a", "b");
3001 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
3002 ok(!strncmp(fb1
.base
.pptr
- 6, "abzzzz", 6), "expected 'abzzzz' got '%s'\n", fb1
.base
.pptr
- 6);
3003 if (0) /* crashes on native */
3004 pos
= call_func3(p_ostream_writepad
, &os1
, NULL
, "o");
3005 pos
= call_func3(p_ostream_writepad
, &os1
, "", "hello");
3006 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
3007 ok(!strncmp(fb1
.base
.pptr
- 6, "helloz", 6), "expected 'helloz' got '%s'\n", fb1
.base
.pptr
- 6);
3008 os1
.base_ios
.fill
= '*';
3009 pos
= call_func3(p_ostream_writepad
, &os1
, "", "");
3010 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
3011 ok(!strncmp(fb1
.base
.pptr
- 6, "******", 6), "expected '******' got '%s'\n", fb1
.base
.pptr
- 6);
3012 pos
= call_func3(p_ostream_writepad
, &os1
, "aa", "");
3013 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
3014 ok(!strncmp(fb1
.base
.pptr
- 6, "aa****", 6), "expected 'aa****' got '%s'\n", fb1
.base
.pptr
- 6);
3015 os1
.base_ios
.flags
= 0;
3016 pos
= call_func3(p_ostream_writepad
, &os1
, "a", "b");
3017 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
3018 ok(!strncmp(fb1
.base
.pptr
- 6, "****ab", 6), "expected '****ab' got '%s'\n", fb1
.base
.pptr
- 6);
3019 call_func1(p_filebuf_sync
, &fb1
);
3021 pos
= call_func3(p_ostream_writepad
, &os1
, "aa", "bb");
3022 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
3023 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
|IOSTATE_eofbit
), "expected %d got %d\n",
3024 IOSTATE_badbit
|IOSTATE_failbit
|IOSTATE_eofbit
, os1
.base_ios
.state
);
3025 os1
.base_ios
.state
= IOSTATE_goodbit
;
3026 pos
= call_func3(p_ostream_writepad
, &os1
, "", "");
3027 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
3028 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
3029 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
3030 os1
.base_ios
.state
= IOSTATE_goodbit
;
3031 os1
.base_ios
.width
= 0;
3032 pos
= call_func3(p_ostream_writepad
, &os1
, "", "");
3033 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
3034 ok(os1
.base_ios
.state
== IOSTATE_goodbit
, "expected %d got %d\n", IOSTATE_goodbit
, os1
.base_ios
.state
);
3035 pos
= call_func3(p_ostream_writepad
, &os1
, "a", "");
3036 ok(pos
== &os1
, "wrong return, expected %p got %p\n", &os1
, pos
);
3037 ok(os1
.base_ios
.state
== (IOSTATE_badbit
|IOSTATE_failbit
), "expected %d got %d\n",
3038 IOSTATE_badbit
|IOSTATE_failbit
, os1
.base_ios
.state
);
3041 call_func1(p_ostream_vbase_dtor
, &os1
);
3042 call_func1(p_ostream_vbase_dtor
, &os2
);
3043 call_func1(p_filebuf_dtor
, &fb1
);
3044 call_func1(p_filebuf_dtor
, &fb2
);
3045 ok(_unlink(filename1
) == 0, "Couldn't unlink file named '%s'\n", filename1
);
3046 ok(_unlink(filename2
) == 0, "Couldn't unlink file named '%s'\n", filename2
);
3049 static void test_ostream_print(void)
3051 const BOOL is_64
= (sizeof(void*) == 8);
3053 strstreambuf ssb
, ssb_test1
, ssb_test2
, ssb_test3
, *pssb
;
3054 LONG length
, expected_length
;
3057 char param_char
[] = {'a', '9', 'e'};
3058 const char* param_str
[] = {"Test", "800", "3.14159", " Test"};
3059 int param_int
[] = {0, 7, 10, 24 ,55, 1024, 1023, 65536, 2147483647, 2147483648u, 4294967295u, -20};
3060 float param_float
[] = {1.0f
, 0.0f
, 4.25f
, 3.999f
, 12.0005f
, 15.33582f
, 15.0f
, 15.22f
, 21.123f
, 0.1f
,
3061 13.14159f
, 0.00013f
, 0.000013f
, INFINITY
, -INFINITY
, NAN
};
3062 double param_double
[] = {1.0, 3.141592653589793238, 314.1592653589793238, 314.159265358979,
3063 1231314.269811862199, 9.961472e6
, 8.98846567431e307
, DBL_MAX
};
3064 void* param_ptr
[] = {NULL
, (void*) 0xdeadbeef, (void*) 0x1234cdef, (void*) 0x1, (void*) 0xffffffff};
3065 streambuf
* param_streambuf
[] = {NULL
, &ssb_test1
.base
, &ssb_test2
.base
, &ssb_test3
.base
};
3066 struct ostream_print_test
{
3067 enum { type_chr
, type_str
, type_int
, type_flt
, type_dbl
, type_ptr
, type_sbf
} type
;
3074 const char *expected_text
;
3075 ios_io_state expected_flags
;
3078 {type_chr
, /* 'a' */ 0, IOSTATE_badbit
, 0, 6, ' ', 0, "", IOSTATE_badbit
|IOSTATE_failbit
},
3079 {type_chr
, /* 'a' */ 0, IOSTATE_eofbit
, 0, 6, ' ', 0, "", IOSTATE_eofbit
|IOSTATE_failbit
},
3080 {type_chr
, /* 'a' */ 0, IOSTATE_goodbit
, 0, 6, ' ', 0, "a", IOSTATE_goodbit
},
3081 {type_chr
, /* 'a' */ 0, IOSTATE_goodbit
, 0, 6, ' ', 4, " a", IOSTATE_goodbit
},
3082 {type_chr
, /* 'a' */ 0, IOSTATE_goodbit
, 0, 6, 'x', 3, "xxa", IOSTATE_goodbit
},
3083 {type_chr
, /* 'a' */ 0, IOSTATE_goodbit
, FLAGS_left
, 6, ' ', 4, "a ", IOSTATE_goodbit
},
3084 {type_chr
, /* 'a' */ 0, IOSTATE_goodbit
, FLAGS_left
|FLAGS_internal
, 6, ' ', 4, " a", IOSTATE_goodbit
},
3085 {type_chr
, /* 'a' */ 0, IOSTATE_goodbit
, FLAGS_internal
|FLAGS_hex
|FLAGS_showbase
, 6, ' ', 4, " a", IOSTATE_goodbit
},
3086 {type_chr
, /* '9' */ 1, IOSTATE_goodbit
, FLAGS_oct
|FLAGS_showbase
|FLAGS_uppercase
, 6, 'i', 2, "i9", IOSTATE_goodbit
},
3087 {type_chr
, /* '9' */ 1, IOSTATE_goodbit
, FLAGS_showpos
|FLAGS_scientific
, 0, 'i', 2, "i9", IOSTATE_goodbit
},
3088 {type_chr
, /* 'e' */ 2, IOSTATE_goodbit
, FLAGS_left
|FLAGS_right
|FLAGS_uppercase
, 0, '*', 8, "e*******", IOSTATE_goodbit
},
3090 {type_str
, /* "Test" */ 0, IOSTATE_badbit
, 0, 6, ' ', 0, "", IOSTATE_badbit
|IOSTATE_failbit
},
3091 {type_str
, /* "Test" */ 0, IOSTATE_eofbit
, 0, 6, ' ', 0, "", IOSTATE_eofbit
|IOSTATE_failbit
},
3092 {type_str
, /* "Test" */ 0, IOSTATE_goodbit
, 0, 6, ' ', 0, "Test", IOSTATE_goodbit
},
3093 {type_str
, /* "Test" */ 0, IOSTATE_goodbit
, 0, 6, ' ', 6, " Test", IOSTATE_goodbit
},
3094 {type_str
, /* "Test" */ 0, IOSTATE_goodbit
, FLAGS_internal
, 6, 'x', 6, "xxTest", IOSTATE_goodbit
},
3095 {type_str
, /* "Test" */ 0, IOSTATE_goodbit
, FLAGS_left
, 6, ' ', 5, "Test ", IOSTATE_goodbit
},
3096 {type_str
, /* "Test" */ 0, IOSTATE_goodbit
, FLAGS_left
|FLAGS_hex
|FLAGS_showpoint
, 6, '?', 6, "Test??", IOSTATE_goodbit
},
3097 {type_str
, /* "800" */ 1, IOSTATE_goodbit
, FLAGS_showbase
|FLAGS_showpos
, 6, ' ', 4, " 800", IOSTATE_goodbit
},
3098 {type_str
, /* "3.14159" */ 2, IOSTATE_goodbit
, FLAGS_scientific
, 2, 'x', 2, "3.14159", IOSTATE_goodbit
},
3099 {type_str
, /* " Test" */ 3, IOSTATE_goodbit
, FLAGS_skipws
, 6, 'x', 2, " Test", IOSTATE_goodbit
},
3101 {type_int
, /* 0 */ 0, IOSTATE_badbit
, 0, 6, ' ', 0, "", IOSTATE_badbit
|IOSTATE_failbit
},
3102 {type_int
, /* 0 */ 0, IOSTATE_eofbit
, 0, 6, ' ', 0, "", IOSTATE_eofbit
|IOSTATE_failbit
},
3103 {type_int
, /* 0 */ 0, IOSTATE_goodbit
, 0, 6, ' ', 4, " 0", IOSTATE_goodbit
},
3104 {type_int
, /* 7 */ 1, IOSTATE_goodbit
, 0, 6, '0', 3, "007", IOSTATE_goodbit
},
3105 {type_int
, /* 10 */ 2, IOSTATE_goodbit
, FLAGS_left
, 6, ' ', 5, "10 ", IOSTATE_goodbit
},
3106 {type_int
, /* 24 */ 3, IOSTATE_goodbit
, FLAGS_left
|FLAGS_hex
, 6, ' ', 0, "18", IOSTATE_goodbit
},
3107 {type_int
, /* 24 */ 3, IOSTATE_goodbit
, FLAGS_left
|FLAGS_hex
|FLAGS_showbase
, 6, ' ', 0, "0x18", IOSTATE_goodbit
},
3108 {type_int
, /* 24 */ 3, IOSTATE_goodbit
, FLAGS_internal
|FLAGS_hex
|FLAGS_showbase
, 6, '*', 8, "0x****18", IOSTATE_goodbit
},
3109 {type_int
, /* 24 */ 3, IOSTATE_goodbit
, FLAGS_oct
|FLAGS_showbase
, 6, '*', 4, "*030", IOSTATE_goodbit
},
3110 {type_int
, /* 24 */ 3, IOSTATE_goodbit
, FLAGS_oct
|FLAGS_dec
|FLAGS_showbase
, 6, ' ', 0, "030", IOSTATE_goodbit
},
3111 {type_int
, /* 24 */ 3, IOSTATE_goodbit
, FLAGS_oct
|FLAGS_dec
|FLAGS_hex
|FLAGS_showbase
, 6, ' ', 0, "0x18", IOSTATE_goodbit
},
3112 {type_int
, /* 24 */ 3, IOSTATE_goodbit
, FLAGS_left
|FLAGS_oct
|FLAGS_hex
, 6, ' ', 5, "18 ", IOSTATE_goodbit
},
3113 {type_int
, /* 24 */ 3, IOSTATE_goodbit
, FLAGS_dec
|FLAGS_hex
|FLAGS_showbase
, 6, ' ', 0, "0x18", IOSTATE_goodbit
},
3114 {type_int
, /* 24 */ 3, IOSTATE_goodbit
, FLAGS_dec
|FLAGS_showbase
, 6, ' ', 0, "24", IOSTATE_goodbit
},
3115 {type_int
, /* 55 */ 4, IOSTATE_goodbit
, FLAGS_hex
|FLAGS_showbase
|FLAGS_uppercase
, 6, ' ', 0, "0X37", IOSTATE_goodbit
},
3116 {type_int
, /* 1024 */ 5, IOSTATE_goodbit
, FLAGS_hex
|FLAGS_showbase
|FLAGS_showpoint
|FLAGS_uppercase
, 6, ' ', 0, "0X400", IOSTATE_goodbit
},
3117 {type_int
, /* 1024 */ 5, IOSTATE_goodbit
, FLAGS_hex
|FLAGS_showbase
|FLAGS_showpos
, 6, ' ', 0, "0x400", IOSTATE_goodbit
},
3118 {type_int
, /* 1024 */ 5, IOSTATE_goodbit
, FLAGS_hex
|FLAGS_showpos
, 6, ' ', 0, "400", IOSTATE_goodbit
},
3119 {type_int
, /* 1024 */ 5, IOSTATE_goodbit
, FLAGS_oct
|FLAGS_showpos
, 6, ' ', 0, "2000", IOSTATE_goodbit
},
3120 {type_int
, /* 1024 */ 5, IOSTATE_goodbit
, FLAGS_internal
|FLAGS_oct
|FLAGS_showbase
, 6, 'x', 8, "0xxx2000", IOSTATE_goodbit
},
3121 {type_int
, /* 1024 */ 5, IOSTATE_goodbit
, FLAGS_showbase
|FLAGS_showpoint
|FLAGS_showpos
, 6, ' ', 0, "+1024", IOSTATE_goodbit
},
3122 {type_int
, /* 1024 */ 5, IOSTATE_goodbit
, FLAGS_dec
|FLAGS_showbase
|FLAGS_showpos
, 6, 'a', 6, "a+1024", IOSTATE_goodbit
},
3123 {type_int
, /* 1024 */ 5, IOSTATE_goodbit
, FLAGS_internal
|FLAGS_showbase
|FLAGS_showpos
, 6, ' ', 8, "+ 1024", IOSTATE_goodbit
},
3124 {type_int
, /* 1023 */ 6, IOSTATE_goodbit
, FLAGS_hex
|FLAGS_showbase
|FLAGS_uppercase
, 6, ' ', 0, "0X3FF", IOSTATE_goodbit
},
3125 {type_int
, /* 1023 */ 6, IOSTATE_goodbit
, FLAGS_hex
|FLAGS_showbase
|FLAGS_scientific
, 6, ' ', 0, "0x3ff", IOSTATE_goodbit
},
3126 {type_int
, /* 65536 */ 7, IOSTATE_goodbit
, FLAGS_right
|FLAGS_showpos
|FLAGS_fixed
, 6, ' ', 8, " +65536", IOSTATE_goodbit
},
3127 {type_int
, /* 2147483647 */ 8, IOSTATE_goodbit
, FLAGS_hex
|FLAGS_showbase
, 6, ' ', 0, "0x7fffffff", IOSTATE_goodbit
},
3128 {type_int
, /* 2147483648 */ 9, IOSTATE_goodbit
, FLAGS_dec
, 6, ' ', 0, "-2147483648", IOSTATE_goodbit
},
3129 {type_int
, /* 4294967295 */ 10, IOSTATE_goodbit
, FLAGS_internal
, 6, ' ', 8, " -1", IOSTATE_goodbit
},
3130 {type_int
, /* -20 */ 11, IOSTATE_goodbit
, FLAGS_internal
|FLAGS_oct
|FLAGS_showbase
, 6, ' ', 8, "037777777754", IOSTATE_goodbit
},
3131 {type_int
, /* -20 */ 11, IOSTATE_goodbit
, FLAGS_dec
|FLAGS_showpos
, 6, ' ', 0, "-20", IOSTATE_goodbit
},
3132 {type_int
, /* 0 */ 0, IOSTATE_goodbit
, FLAGS_internal
|FLAGS_showpos
, 6, ' ', 8, " 0", IOSTATE_goodbit
},
3134 {type_flt
, /* 1.0f */ 0, IOSTATE_badbit
, 0, 6, ' ', 0, "", IOSTATE_badbit
|IOSTATE_failbit
},
3135 {type_flt
, /* 1.0f */ 0, IOSTATE_eofbit
, 0, 6, ' ', 0, "", IOSTATE_eofbit
|IOSTATE_failbit
},
3136 {type_flt
, /* 1.0f */ 0, IOSTATE_goodbit
, 0, 6, ' ', 0, "1", IOSTATE_goodbit
},
3137 {type_flt
, /* 0.0f */ 1, IOSTATE_goodbit
, 0, 6, ' ', 0, "0", IOSTATE_goodbit
},
3138 {type_flt
, /* 4.25f */ 2, IOSTATE_goodbit
, 0, 6, ' ', 0, "4.25", IOSTATE_goodbit
},
3139 {type_flt
, /* 3.999f */ 3, IOSTATE_goodbit
, 0, 6, ' ', 0, "3.999", IOSTATE_goodbit
},
3140 {type_flt
, /* 3.999f */ 3, IOSTATE_goodbit
, 0, 3, ' ', 0, "4", IOSTATE_goodbit
},
3141 {type_flt
, /* 12.0005f */ 4, IOSTATE_goodbit
, 0, 6, ' ', 0, "12.0005", IOSTATE_goodbit
},
3142 {type_flt
, /* 12.0005f */ 4, IOSTATE_goodbit
, 0, 5, ' ', 0, "12", IOSTATE_goodbit
},
3143 {type_flt
, /* 15.33582f */ 5, IOSTATE_goodbit
, 0, 4, ' ', 0, "15.34", IOSTATE_goodbit
},
3144 {type_flt
, /* 15.0f */ 6, IOSTATE_goodbit
, FLAGS_internal
|FLAGS_hex
|FLAGS_showbase
, 6, ' ', 4, " 15", IOSTATE_goodbit
},
3145 {type_flt
, /* 15.22f */ 7, IOSTATE_goodbit
, FLAGS_left
|FLAGS_hex
|FLAGS_showbase
, 3, ' ', 6, "15.2 ", IOSTATE_goodbit
},
3146 {type_flt
, /* 15.22 */ 7, IOSTATE_goodbit
, FLAGS_internal
, 3, 'x', 6, "xx15.2", IOSTATE_goodbit
},
3147 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, FLAGS_showpoint
, 9, ' ', 0, "21.1230", IOSTATE_goodbit
},
3148 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, FLAGS_showpos
, 9, ' ', 0, "+21.123", IOSTATE_goodbit
},
3149 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, FLAGS_internal
|FLAGS_showpos
, 9, ' ', 8, "+ 21.123", IOSTATE_goodbit
},
3150 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, FLAGS_showpos
, 0, ' ', 0, "+2e+001", IOSTATE_goodbit
},
3151 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, 0, 1, ' ', 0, "2e+001", IOSTATE_goodbit
},
3152 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, FLAGS_showpos
, 2, ' ', 0, "+21", IOSTATE_goodbit
},
3153 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, 0, 4, ' ', 0, "21.12", IOSTATE_goodbit
},
3154 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, FLAGS_scientific
, 2, ' ', 0, "2.11e+001", IOSTATE_goodbit
},
3155 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, FLAGS_scientific
, 4, ' ', 0, "2.1123e+001", IOSTATE_goodbit
},
3156 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, FLAGS_scientific
, 6, ' ', 0, "2.112300e+001", IOSTATE_goodbit
},
3157 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, FLAGS_scientific
|FLAGS_uppercase
, 2, ' ', 0, "2.11E+001", IOSTATE_goodbit
},
3158 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, FLAGS_scientific
|FLAGS_uppercase
, 2, '*', 10, "*2.11E+001", IOSTATE_goodbit
},
3159 {type_flt
, /* 21.123f */ 8, IOSTATE_goodbit
, FLAGS_fixed
, 6, ' ', 0, "21.122999", IOSTATE_goodbit
},
3160 {type_flt
, /* 0.1f */ 9, IOSTATE_goodbit
, FLAGS_fixed
, 6, ' ', 0, "0.100000", IOSTATE_goodbit
},
3161 {type_flt
, /* 0.1f */ 9, IOSTATE_goodbit
, FLAGS_scientific
, 6, ' ', 0, "1.000000e-001", IOSTATE_goodbit
},
3162 {type_flt
, /* 13.14159f */ 10, IOSTATE_goodbit
, FLAGS_fixed
, 3, ' ', 0, "13.142", IOSTATE_goodbit
},
3163 {type_flt
, /* 13.14159f */ 10, IOSTATE_goodbit
, FLAGS_fixed
, 8, ' ', 0, "13.141590", IOSTATE_goodbit
},
3164 {type_flt
, /* 13.14159f */ 10, IOSTATE_goodbit
, FLAGS_fixed
|FLAGS_showpoint
, 8, ' ', 0, "13.141590", IOSTATE_goodbit
},
3165 {type_flt
, /* 13.14159f */ 10, IOSTATE_goodbit
, FLAGS_scientific
|FLAGS_fixed
, 8, ' ', 0, "13.1416", IOSTATE_goodbit
},
3166 {type_flt
, /* 13.14159f */ 10, IOSTATE_goodbit
, FLAGS_scientific
|FLAGS_fixed
, 2, ' ', 0, "13", IOSTATE_goodbit
},
3167 {type_flt
, /* 0.00013f */ 11, IOSTATE_goodbit
, 0, -1, ' ', 0, "0.00013", IOSTATE_goodbit
},
3168 {type_flt
, /* 0.00013f */ 11, IOSTATE_goodbit
, 0, -1, ' ', 0, "0.00013", IOSTATE_goodbit
},
3169 {type_flt
, /* 0.00013f */ 11, IOSTATE_goodbit
, 0, -1, ' ', 0, "0.00013", IOSTATE_goodbit
},
3170 {type_flt
, /* 0.000013f */ 12, IOSTATE_goodbit
, 0, 4, ' ', 0, "1.3e-005", IOSTATE_goodbit
},
3171 {type_flt
, /* 0.000013f */ 12, IOSTATE_goodbit
, FLAGS_showpoint
, 4, ' ', 0, "1.300e-005", IOSTATE_goodbit
},
3172 {type_flt
, /* 0.000013f */ 12, IOSTATE_goodbit
, FLAGS_showpoint
, 6, ' ', 0, "1.30000e-005", IOSTATE_goodbit
},
3173 {type_flt
, /* INFINITY */ 13, IOSTATE_goodbit
, 0, 6, ' ', 0, "1.#INF", IOSTATE_goodbit
},
3174 {type_flt
, /* INFINITY */ 13, IOSTATE_goodbit
, 0, 4, ' ', 0, "1.#IO", IOSTATE_goodbit
},
3175 {type_flt
, /* -INFINITY */ 14, IOSTATE_goodbit
, 0, 6, ' ', 0, "-1.#INF", IOSTATE_goodbit
},
3176 {type_flt
, /* NAN */ 15, IOSTATE_goodbit
, 0, 6, ' ', 0, "1.#QNAN", IOSTATE_goodbit
},
3178 {type_dbl
, /* 1.0 */ 0, IOSTATE_goodbit
, 0, 6, ' ', 0, "1", IOSTATE_goodbit
},
3179 {type_dbl
, /* 3.141592653589793238 */ 1, IOSTATE_goodbit
, 0, 6, ' ', 0, "3.14159", IOSTATE_goodbit
},
3180 {type_dbl
, /* 3.141592653589793238 */ 1, IOSTATE_goodbit
, 0, 9, ' ', 0, "3.14159265", IOSTATE_goodbit
},
3181 {type_dbl
, /* 3.141592653589793238 */ 1, IOSTATE_goodbit
, 0, 12, ' ', 0, "3.14159265359", IOSTATE_goodbit
},
3182 {type_dbl
, /* 3.141592653589793238 */ 1, IOSTATE_goodbit
, 0, 15, ' ', 0, "3.14159265358979", IOSTATE_goodbit
},
3183 {type_dbl
, /* 3.141592653589793238 */ 1, IOSTATE_goodbit
, 0, 16, ' ', 0, "3.14159265358979", IOSTATE_goodbit
},
3184 {type_dbl
, /* 314.1592653589793238 */ 2, IOSTATE_goodbit
, 0, 16, ' ', 0, "314.159265358979", IOSTATE_goodbit
},
3185 {type_dbl
, /* 3.141592653589793238 */ 1, IOSTATE_goodbit
, FLAGS_scientific
, 16, ' ', 0, "3.141592653589793e+000", IOSTATE_goodbit
},
3186 {type_dbl
, /* 314.1592653589793238 */ 2, IOSTATE_goodbit
, FLAGS_scientific
, 16, ' ', 0, "3.141592653589793e+002", IOSTATE_goodbit
},
3187 {type_dbl
, /* 3.141592653589793238 */ 1, IOSTATE_goodbit
, FLAGS_fixed
, -1, ' ', 0, "3.141592653589793", IOSTATE_goodbit
},
3188 {type_dbl
, /* 314.159265358979 */ 3, IOSTATE_goodbit
, FLAGS_fixed
, 12, ' ', 0, "314.159265358979", IOSTATE_goodbit
},
3189 {type_dbl
, /* 1231314.269811862199 */ 4, IOSTATE_goodbit
, FLAGS_fixed
, 10, ' ', 0, "1231314.2698118621", IOSTATE_goodbit
},
3190 {type_dbl
, /* 9.961472e6 */ 5, IOSTATE_goodbit
, FLAGS_fixed
, 500, ' ', 0, "9961472.000000000000000", IOSTATE_goodbit
},
3191 /* crashes on XP/2k3 {type_dbl, 8.98846567431e307 6, IOSTATE_goodbit, FLAGS_fixed, 500, ' ', 0, "", IOSTATE_goodbit}, */
3192 /* crashes on XP/2k3 {type_dbl, DBL_MAX 7, IOSTATE_goodbit, FLAGS_fixed|FLAGS_showpos, 500, ' ', 5, " ", IOSTATE_goodbit}, */
3193 {type_dbl
, /* DBL_MAX */ 7, IOSTATE_goodbit
, FLAGS_showpoint
, 500, ' ', 0, "1.79769313486232e+308", IOSTATE_goodbit
},
3195 {type_ptr
, /* NULL */ 0, IOSTATE_badbit
, 0, 6, ' ', 0, "", IOSTATE_badbit
|IOSTATE_failbit
},
3196 {type_ptr
, /* NULL */ 0, IOSTATE_eofbit
, 0, 6, ' ', 0, "", IOSTATE_eofbit
|IOSTATE_failbit
},
3197 {type_ptr
, /* NULL */ 0, IOSTATE_goodbit
, 0, 6, ' ', 0,
3198 is_64
? "0x0000000000000000" : "0x00000000", IOSTATE_goodbit
},
3199 {type_ptr
, /* 0xdeadbeef */ 1, IOSTATE_goodbit
, 0, 6, ' ', 0,
3200 is_64
? "0x00000000DEADBEEF" : "0xDEADBEEF", IOSTATE_goodbit
},
3201 {type_ptr
, /* 0xdeadbeef */ 1, IOSTATE_goodbit
, 0, 6, '*', 12,
3202 is_64
? "0x00000000DEADBEEF" : "**0xDEADBEEF", IOSTATE_goodbit
},
3203 {type_ptr
, /* 0xdeadbeef */ 1, IOSTATE_goodbit
, FLAGS_internal
, 6, ' ', 14,
3204 is_64
? "0x00000000DEADBEEF" : "0x DEADBEEF", IOSTATE_goodbit
},
3205 {type_ptr
, /* 0xdeadbeef */ 1, IOSTATE_goodbit
, FLAGS_left
, 6, 'x', 11,
3206 is_64
? "0x00000000DEADBEEF" : "0xDEADBEEFx", IOSTATE_goodbit
},
3207 {type_ptr
, /* 0x1234cdef */ 2, IOSTATE_goodbit
, FLAGS_dec
|FLAGS_showpos
, 6, ' ', 0,
3208 is_64
? "0x000000001234CDEF" : "0x1234CDEF", IOSTATE_goodbit
},
3209 {type_ptr
, /* 0x1 */ 3, IOSTATE_goodbit
, FLAGS_oct
|FLAGS_showbase
, 6, ' ', 0,
3210 is_64
? "0x0000000000000001" : "0x00000001", IOSTATE_goodbit
},
3211 {type_ptr
, /* 0xffffffff */ 4, IOSTATE_goodbit
, FLAGS_hex
|FLAGS_showpoint
, 6, ' ', 0,
3212 is_64
? "0x00000000FFFFFFFF" : "0xFFFFFFFF", IOSTATE_goodbit
},
3213 {type_ptr
, /* 0xffffffff */ 4, IOSTATE_goodbit
, FLAGS_uppercase
|FLAGS_fixed
, 6, ' ', 0,
3214 is_64
? "0X00000000FFFFFFFF" : "0XFFFFFFFF", IOSTATE_goodbit
},
3215 {type_ptr
, /* 0x1 */ 3, IOSTATE_goodbit
, FLAGS_uppercase
, 6, ' ', 0,
3216 is_64
? "0X0000000000000001" : "0X00000001", IOSTATE_goodbit
},
3217 {type_ptr
, /* NULL */ 0, IOSTATE_goodbit
, FLAGS_uppercase
, 6, ' ', 0,
3218 is_64
? "0x0000000000000000" : "0x00000000", IOSTATE_goodbit
},
3219 {type_ptr
, /* NULL */ 0, IOSTATE_goodbit
, FLAGS_uppercase
|FLAGS_showbase
, 12, 'x', 12,
3220 is_64
? "0x0000000000000000" : "xx0x00000000", IOSTATE_goodbit
},
3221 {type_ptr
, /* NULL */ 0, IOSTATE_goodbit
, FLAGS_internal
|FLAGS_uppercase
|FLAGS_showbase
, 6, '?', 20,
3222 is_64
? "0x??0000000000000000" : "0x??????????00000000", IOSTATE_goodbit
},
3224 {type_sbf
, /* NULL */ 0, IOSTATE_badbit
, 0, 6, ' ', 0, "", IOSTATE_badbit
|IOSTATE_failbit
},
3225 {type_sbf
, /* NULL */ 0, IOSTATE_eofbit
, 0, 6, ' ', 0, "", IOSTATE_eofbit
|IOSTATE_failbit
},
3226 /* crashes on native {STREAMBUF, NULL 0, IOSTATE_goodbit, 0, 6, ' ', 0, "", IOSTATE_goodbit}, */
3227 {type_sbf
, /* &ssb_test1.base */ 1, IOSTATE_goodbit
, FLAGS_skipws
|FLAGS_showpos
|FLAGS_uppercase
,
3228 6, ' ', 0, " we both know what's been going on ", IOSTATE_goodbit
},
3229 {type_sbf
, /* &ssb_test1.base */ 2, IOSTATE_goodbit
, FLAGS_left
|FLAGS_hex
|FLAGS_showbase
,
3230 6, '*', 50, "123 We know the game and", IOSTATE_goodbit
},
3231 {type_sbf
, /* &ssb_test1.base */ 3, IOSTATE_goodbit
, FLAGS_internal
|FLAGS_scientific
|FLAGS_showpoint
,
3232 6, '*', 50, "we're gonna play it 3.14159", IOSTATE_goodbit
}
3235 pssb
= call_func1(p_strstreambuf_ctor
, &ssb
);
3236 ok(pssb
== &ssb
, "wrong return, expected %p got %p\n", &ssb
, pssb
);
3237 pos
= call_func3(p_ostream_sb_ctor
, &os
, &ssb
.base
, TRUE
);
3238 ok(pos
== &os
, "wrong return, expected %p got %p\n", &os
, pos
);
3239 pssb
= call_func1(p_strstreambuf_ctor
, &ssb_test1
);
3240 ok(pssb
== &ssb_test1
, "wrong return, expected %p got %p\n", &ssb_test1
, pssb
);
3241 ret
= (int) call_func3(p_streambuf_xsputn
, &ssb_test1
.base
, " we both know what's been going on ", 36);
3242 ok(ret
== 36, "expected 36 got %d\n", ret
);
3243 pssb
= call_func1(p_strstreambuf_ctor
, &ssb_test2
);
3244 ok(pssb
== &ssb_test2
, "wrong return, expected %p got %p\n", &ssb_test2
, pssb
);
3245 ret
= (int) call_func3(p_streambuf_xsputn
, &ssb_test2
.base
, "123 We know the game and", 24);
3246 ok(ret
== 24, "expected 24 got %d\n", ret
);
3247 pssb
= call_func1(p_strstreambuf_ctor
, &ssb_test3
);
3248 ok(pssb
== &ssb_test3
, "wrong return, expected %p got %p\n", &ssb_test3
, pssb
);
3249 ret
= (int) call_func3(p_streambuf_xsputn
, &ssb_test3
.base
, "we're gonna play it 3.14159", 27);
3250 ok(ret
== 27, "expected 27 got %d\n", ret
);
3252 for (i
= 0; i
< sizeof(tests
) / sizeof(tests
[0]); i
++) {
3253 os
.base_ios
.state
= tests
[i
].state
;
3254 os
.base_ios
.flags
= tests
[i
].flags
;
3255 os
.base_ios
.precision
= tests
[i
].precision
;
3256 os
.base_ios
.fill
= tests
[i
].fill
;
3257 os
.base_ios
.width
= tests
[i
].width
;
3258 ssb
.base
.pptr
= ssb
.base
.pbase
;
3260 switch (tests
[i
].type
) {
3262 pos
= call_func2(p_ostream_print_char
, &os
, (int) param_char
[tests
[i
].param_index
]); break;
3264 pos
= call_func2(p_ostream_print_str
, &os
, param_str
[tests
[i
].param_index
]); break;
3266 pos
= call_func2(p_ostream_print_int
, &os
, param_int
[tests
[i
].param_index
]); break;
3268 pos
= call_func2_ptr_flt(p_ostream_print_float
, &os
, param_float
[tests
[i
].param_index
]); break;
3270 pos
= call_func2_ptr_dbl(p_ostream_print_double
, &os
, param_double
[tests
[i
].param_index
]); break;
3272 pos
= call_func2(p_ostream_print_ptr
, &os
, param_ptr
[tests
[i
].param_index
]); break;
3274 pos
= call_func2(p_ostream_print_streambuf
, &os
, param_streambuf
[tests
[i
].param_index
]); break;
3277 length
= ssb
.base
.pptr
- ssb
.base
.pbase
;
3278 expected_length
= strlen(tests
[i
].expected_text
);
3279 ok(pos
== &os
, "Test %d: wrong return, expected %p got %p\n", i
, &os
, pos
);
3280 ok(os
.base_ios
.state
== tests
[i
].expected_flags
, "Test %d: expected %d got %d\n", i
,
3281 tests
[i
].expected_flags
, os
.base_ios
.state
);
3282 ok(os
.base_ios
.width
== 0, "Test %d: expected 0 got %d\n", i
, os
.base_ios
.width
);
3283 ok(expected_length
== length
, "Test %d: wrong output length, expected %d got %d\n", i
, expected_length
, length
);
3284 ok(!strncmp(tests
[i
].expected_text
, ssb
.base
.pbase
, length
),
3285 "Test %d: wrong output, expected '%s' got '%s'\n", i
, tests
[i
].expected_text
, ssb
.base
.pbase
);
3288 call_func1(p_ostream_vbase_dtor
, &os
);
3289 call_func1(p_strstreambuf_dtor
, &ssb
);
3290 call_func1(p_strstreambuf_dtor
, &ssb_test1
);
3291 call_func1(p_strstreambuf_dtor
, &ssb_test2
);
3292 call_func1(p_strstreambuf_dtor
, &ssb_test3
);
3302 test_strstreambuf();
3306 test_ostream_print();
3308 FreeLibrary(msvcrt
);
3309 FreeLibrary(msvcirt
);