ReactOS 0.4.16-dev-319-g6cf4263
_flsbuf.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: GNU GPL, see COPYING in the top level directory
3 * PROJECT: ReactOS crt library
4 * FILE: lib/sdk/crt/stdio/_flsbuf.c
5 * PURPOSE: Implementation of _flsbuf / _flswbuf
6 * PROGRAMMER: Timo Kreuzer
7 */
8
9#include <precomp.h>
10
12
13int __cdecl
15{
16 int count, written;
17
18 /* Check if the stream supports flushing */
19 if ((stream->_flag & _IOSTRG) || !(stream->_flag & (_IORW|_IOWRT)))
20 {
21 stream->_flag |= _IOERR;
22 return EOF;
23 }
24
25 /* Always reset _cnt */
26 stream->_cnt = 0;
27
28 /* Check if this was a read buffer */
29 if (stream->_flag & _IOREAD)
30 {
31 /* Must be at the end of the file */
32 if (!(stream->_flag & _IOEOF))
33 {
34 stream->_flag |= _IOERR;
35 return EOF;
36 }
37
38 /* Reset buffer */
39 stream->_ptr = stream->_base;
40 }
41
42 /* Fixup flags */
43 stream->_flag &= ~(_IOREAD|_IOEOF);
44 stream->_flag |= _IOWRT;
45
46 /* Check if should get a buffer */
47 if (!(stream->_flag & _IONBF) && stream != stdout && stream != stderr)
48 {
49 /* If we have no buffer, try to allocate one */
50 if (!stream->_base) msvcrt_alloc_buffer(stream);
51 }
52
53 /* Check if we can use a buffer now */
54 if (stream->_base && !(stream->_flag & _IONBF))
55 {
56 /* We can, check if there is something to write */
57 count = (int)(stream->_ptr - stream->_base);
58 if (count > 0)
59 written = _write(stream->_file, stream->_base, count);
60 else
61 written = 0;
62
63 /* Reset buffer and put the char into it */
64 stream->_ptr = stream->_base + sizeof(TCHAR);
65 stream->_cnt = stream->_bufsiz - sizeof(TCHAR);
66 *(TCHAR*)stream->_base = ch;
67 }
68 else
69 {
70 /* There is no buffer, write the char directly */
71 count = sizeof(TCHAR);
72 written = _write(stream->_file, &ch, sizeof(TCHAR));
73 }
74
75 /* Check for failure */
76 if (written != count)
77 {
78 stream->_flag |= _IOERR;
79 return EOF;
80 }
81
82 return ch & (sizeof(TCHAR) > sizeof(char) ? 0xffff : 0xff);
83}
BOOL __cdecl msvcrt_alloc_buffer(FILE *stream)
Definition: file.c:572
#define _flsbuf
Definition: _flswbuf.c:10
#define __cdecl
Definition: accygwin.h:79
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define stdout
Definition: stdio.h:99
#define _IOWRT
Definition: stdio.h:125
#define EOF
Definition: stdio.h:24
#define stderr
Definition: stdio.h:100
#define _IOEOF
Definition: stdio.h:132
#define _IOREAD
Definition: stdio.h:124
#define _IORW
Definition: stdio.h:135
#define _IOSTRG
Definition: stdio.h:134
#define _IONBF
Definition: stdio.h:129
#define _IOERR
Definition: stdio.h:133
_CRTIMP int __cdecl _write(_In_ int _FileHandle, _In_reads_bytes_(_MaxCharCount) const void *_Buf, _In_ unsigned int _MaxCharCount)
Definition: parse.h:23
char TCHAR
Definition: xmlstorage.h:189