ReactOS  0.4.14-dev-991-g696cdc6
_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 
13 int __cdecl
14 _flsbuf(int ch, FILE *stream)
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 }
_CRTIMP int __cdecl _write(_In_ int _FileHandle, _In_reads_bytes_(_MaxCharCount) const void *_Buf, _In_ unsigned int _MaxCharCount)
#define __cdecl
Definition: accygwin.h:79
GLuint GLuint GLsizei count
Definition: gl.h:1545
BOOL __cdecl msvcrt_alloc_buffer(FILE *stream)
Definition: file.c:573
#define _IOSTRG
Definition: stdio.h:135
FILE * stdout
#define _IOERR
Definition: stdio.h:134
#define _IOREAD
Definition: stdio.h:125
unsigned int BOOL
Definition: ntddk_ex.h:94
#define _IOEOF
Definition: stdio.h:133
char TCHAR
Definition: xmlstorage.h:189
#define _IOWRT
Definition: stdio.h:126
int __cdecl _flsbuf(int ch, FILE *stream)
Definition: _flsbuf.c:14
Definition: parse.h:22
#define EOF
Definition: stdio.h:24
FILE * stderr
#define _IONBF
Definition: stdio.h:130
#define _IORW
Definition: stdio.h:136
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31