Reactos
at master 98 lines 2.4 kB view raw
1// 2// fputc.cpp 3// 4// Copyright (c) Microsoft Corporation. All rights reserved. 5// 6// Defines the fputc() family of functions, which write a character to a stream. 7// 8#include <corecrt_internal_stdio.h> 9#include <corecrt_internal_ptd_propagation.h> 10 11 12extern "C" int __cdecl _fputc_nolock_internal(int const c, FILE* const public_stream, __crt_cached_ptd_host& ptd) 13{ 14 __crt_stdio_stream const stream(public_stream); 15 16 --stream->_cnt; 17 18 // If there is no room for the character in the buffer, flush the buffer and 19 // write the character: 20 if (stream->_cnt < 0) 21 { 22 return __acrt_stdio_flush_and_write_narrow_nolock(c, stream.public_stream(), ptd); 23 } 24 25 // Otherwise, there is sufficient room, so we can write directly to the buffer: 26 char const char_value = static_cast<char>(c); 27 *stream->_ptr++ = char_value; 28 return char_value & 0xff; 29} 30 31extern "C" int __cdecl _fputc_nolock(int const c, FILE* const public_stream) 32{ 33 __crt_cached_ptd_host ptd; 34 return _fputc_nolock_internal(c, public_stream, ptd); 35} 36 37extern "C" int __cdecl _putc_nolock(int const c, FILE* const stream) 38{ 39 return _fputc_nolock(c, stream); 40} 41 42 43 44// Writes a character to a stream. Returns the character on success; returns 45// EOF on failure. 46static int __cdecl _fputc_internal(int const c, FILE* const stream, __crt_cached_ptd_host& ptd) 47{ 48 _UCRT_VALIDATE_RETURN(ptd, stream != nullptr, EINVAL, EOF); 49 50 int return_value = 0; 51 52 _lock_file(stream); 53 __try 54 { 55 _UCRT_VALIDATE_STREAM_ANSI_RETURN(ptd, stream, EINVAL, EOF); 56 57 return_value = _fputc_nolock_internal(c, stream, ptd); 58 } 59 __finally 60 { 61 _unlock_file(stream); 62 } 63 __endtry 64 65 return return_value; 66} 67 68// Writes a character to a stream. Returns the character on success; returns 69// EOF on failure. 70extern "C" int __cdecl fputc(int const c, FILE* const stream) 71{ 72 __crt_cached_ptd_host ptd; 73 return _fputc_internal(c, stream, ptd); 74} 75 76 77 78// Writes a character to a stream. See fputc() for details. 79extern "C" int __cdecl putc(int const c, FILE* const stream) 80{ 81 return fputc(c, stream); 82} 83 84 85 86// Writes a character to stdout. See fputc() for details. 87extern "C" int __cdecl _fputchar(int const c) 88{ 89 return fputc(c, stdout); 90} 91 92 93 94// Writes a character to stdout. See fputc() for details. 95extern "C" int __cdecl putchar(int const c) 96{ 97 return _fputchar(c); 98}