Cog/Frameworks/OpenMPT/OpenMPT/openmpt123/openmpt123_stdio.hpp
Christopher Snowhill bc8538cdd4 Updated libOpenMPT to version 0.8.0
And reordered all the source files in the projects according to name
sort. And removed all the deleted files, including some which were
forgotten in previous updates, but left as 0 byte files. Finally,
updated the project to use C23 / C++23 language standards.

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
2025-06-06 00:54:33 -07:00

141 lines
3.2 KiB
C++

/*
* openmpt123_stdio.hpp
* --------------------
* Purpose: libopenmpt command line player
* Notes : (currently none)
* Authors: OpenMPT Devs
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
*/
#ifndef OPENMPT123_STDIO_HPP
#define OPENMPT123_STDIO_HPP
#include "openmpt123_config.hpp"
#include "openmpt123_exception.hpp"
#include "mpt/base/detect.hpp"
#include "mpt/base/namespace.hpp"
#include "mpt/string/types.hpp"
#include <cstdio>
#if MPT_OS_DJGPP
#include <fcntl.h>
#include <io.h>
#elif MPT_OS_WINDOWS
#include <fcntl.h>
#include <io.h>
#endif
#include <stdio.h>
namespace openmpt123 {
enum class FILE_mode {
text,
binary,
};
#if MPT_OS_DJGPP
class FILE_mode_guard {
private:
FILE * file;
int old_mode;
public:
FILE_mode_guard( FILE * file, FILE_mode new_mode )
: file(file)
, old_mode(-1)
{
switch (new_mode) {
case FILE_mode::text:
fflush( file );
old_mode = setmode( fileno( file ), O_TEXT );
if ( old_mode == -1 ) {
throw exception( MPT_USTRING("failed to set TEXT mode on file descriptor") );
}
break;
case FILE_mode::binary:
fflush( file );
old_mode = setmode( fileno( file ), O_BINARY );
if ( old_mode == -1 ) {
throw exception( MPT_USTRING("failed to set binary mode on file descriptor") );
}
break;
}
}
FILE_mode_guard( const FILE_mode_guard & ) = delete;
FILE_mode_guard( FILE_mode_guard && ) = default;
FILE_mode_guard & operator=( const FILE_mode_guard & ) = delete;
FILE_mode_guard & operator=( FILE_mode_guard && ) = default;
~FILE_mode_guard() {
if ( old_mode != -1 ) {
fflush( file );
old_mode = setmode( fileno( file ), old_mode );
}
}
};
#elif MPT_OS_WINDOWS
class FILE_mode_guard {
private:
FILE * file;
int old_mode;
public:
FILE_mode_guard( FILE * file, FILE_mode new_mode )
: file(file)
, old_mode(-1)
{
switch (new_mode) {
case FILE_mode::text:
fflush( file );
#if defined(UNICODE)
old_mode = _setmode( _fileno( file ), _O_U8TEXT );
#else
old_mode = _setmode( _fileno( file ), _O_TEXT );
#endif
if ( old_mode == -1 ) {
throw exception( MPT_USTRING("failed to set TEXT mode on file descriptor") );
}
break;
case FILE_mode::binary:
fflush( file );
old_mode = _setmode( _fileno( file ), _O_BINARY );
if ( old_mode == -1 ) {
throw exception( MPT_USTRING("failed to set binary mode on file descriptor") );
}
break;
}
}
FILE_mode_guard( const FILE_mode_guard & ) = delete;
FILE_mode_guard( FILE_mode_guard && ) = default;
FILE_mode_guard & operator=( const FILE_mode_guard & ) = delete;
FILE_mode_guard & operator=( FILE_mode_guard && ) = default;
~FILE_mode_guard() {
if ( old_mode != -1 ) {
fflush( file );
old_mode = _setmode( _fileno( file ), old_mode );
}
}
};
#else
class FILE_mode_guard {
public:
FILE_mode_guard( FILE * /* file */, FILE_mode /* new_mode */ ) {
return;
}
FILE_mode_guard( const FILE_mode_guard & ) = delete;
FILE_mode_guard( FILE_mode_guard && ) = default;
FILE_mode_guard & operator=( const FILE_mode_guard & ) = delete;
FILE_mode_guard & operator=( FILE_mode_guard && ) = default;
~FILE_mode_guard() = default;
};
#endif
} // namespace openmpt123
#endif // OPENMPT123_STDIO_HPP