Skip to content

Commit

Permalink
noexcept (#336)
Browse files Browse the repository at this point in the history
  • Loading branch information
flagarde committed Nov 28, 2023
1 parent 5824c8f commit 5aa2580
Show file tree
Hide file tree
Showing 12 changed files with 192 additions and 81 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ jobs:

- name: 🟨 Install LaTeX packages
run: |
tlmgr install latex-bin newunicodechar latex-tools-dev courier dvips wasy epstopdf-pkg helvetic etoc caption pdftexcmds hyperref tocloft natbib fancyhdr changepage geometry psnfss ec ulem intcalc alphalph enumitem etoolbox stackengine amsfonts adjustbox iftex hanging pmboxdraw ltxcmds kvsetkeys kvdefinekeys infwarerr kvoptions float xcolor colortbl varwidth fancyvrb multirow epstopdf
tlmgr install latex-bin newunicodechar latex-tools-dev pgf twemojis courier dvips wasy epstopdf-pkg helvetic etoc caption pdftexcmds hyperref tocloft natbib fancyhdr changepage geometry psnfss ec ulem intcalc alphalph enumitem etoolbox stackengine amsfonts adjustbox iftex hanging pmboxdraw ltxcmds kvsetkeys kvdefinekeys infwarerr kvoptions float xcolor colortbl varwidth fancyvrb multirow epstopdf
tlmgr list --only-installed
- name: 🐍 Install Conda environment
Expand Down
14 changes: 5 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
[//]: {#mainpage}

<p align="center">
<img src="docs/imgs/logo.svg" alt="CPP-Terminal logo"/>
</p>

[![Linux CI](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/linux.yml/badge.svg)](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/linux.yml)
[![Windows CI](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/windows.yml/badge.svg)](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/windows.yml)
[![MacOS CI](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/macOS.yml/badge.svg)](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/macOS.yml)
[![docs](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/docs.yml/badge.svg)](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/docs.yml)
[![CodeQL](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/codeql-analysis.yml)
[![pre-commit](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/pre-commit-check.yml/badge.svg)](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/pre-commit-check.yml)
[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/jupyter-xeus/cpp-terminal/master.svg)](https://results.pre-commit.ci/latest/github/jupyter-xeus/cpp-terminal/maset)
Expand Down Expand Up @@ -92,22 +95,15 @@ We have created serval examples to show possible use cases of CPP-Terminal and t
Adding CPP-Terminal to your own project is really easy. We have collected various ways with easy
how-to's [in our documentation](https://github.com/jupyter-xeus/cpp-terminal/wiki/Adding-CPP-Terminal-to-your-ptoject).
## Documentation [![docs](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/docs.yml/badge.svg)](https://github.com/jupyter-xeus/cpp-terminal/actions/workflows/docs.yml)
## Documentation
<h1 align="center">
<a href="https://jupyter-xeus.github.io/cpp-terminal/">
```markdown
🌍 Online
```

</a>
<a href="https://jupyter-xeus.github.io/cpp-terminal/cpp-terminal_Manual.pdf">
```markdown
<a href="https://jupyter-xeus.github.io/cpp-terminal/cpp-terminal_Manual.pdf">
📖 PDF
```

</a>
</h1>
Expand Down
6 changes: 1 addition & 5 deletions cpp-terminal/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
# configure version information
configure_file(version.cpp.in version.cpp)

add_subdirectory(private)

set(CPP_TERMINAL_PUBLIC_HEADERS
Expand Down Expand Up @@ -48,8 +45,7 @@ set(CPP_TERMINAL_SRC
screen.cpp
options.cpp
cursor.cpp
style.cpp
"${CMAKE_CURRENT_BINARY_DIR}/version.cpp")
style.cpp)

# create and configure library target
add_library(cpp-terminal "${CPP_TERMINAL_SRC}")
Expand Down
2 changes: 1 addition & 1 deletion cpp-terminal/exception.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class Exception : public std::exception
virtual void build_what() const noexcept;
void setMessage(const std::string& message) noexcept;
void setContext(const std::string& context) noexcept;
void setWhat(const std::string& what) noexcept;
void setWhat(const std::string& what) const noexcept;
static const constexpr std::size_t m_maxSize{256};

Check warning on line 41 in cpp-terminal/exception.hpp

View workflow job for this annotation

GitHub Actions / cpp-linter

/cpp-terminal/exception.hpp:41:31 [misc-include-cleaner]

no header providing "std::size_t" is directly included

private:
Expand Down
6 changes: 5 additions & 1 deletion cpp-terminal/private/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads)
add_library(cpp-terminal-private STATIC return_code.cpp file_initializer.cpp exception.cpp unicode.cpp conversion.cpp args.cpp terminal.cpp tty.cpp terminfo.cpp input.cpp screen.cpp cursor.cpp file.cpp env.cpp blocking_queue.cpp sigwinch.cpp)

# configure version information
configure_file(version.cpp.in version.cpp)

add_library(cpp-terminal-private STATIC "${CMAKE_CURRENT_BINARY_DIR}/version.cpp" return_code.cpp file_initializer.cpp exception.cpp unicode.cpp conversion.cpp args.cpp terminal.cpp tty.cpp terminfo.cpp input.cpp screen.cpp cursor.cpp file.cpp env.cpp blocking_queue.cpp sigwinch.cpp)
target_link_libraries(cpp-terminal-private PRIVATE Warnings::Warnings PUBLIC Threads::Threads)
target_compile_options(cpp-terminal-private PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/utf-8 /wd4668 /wd4514>)
target_include_directories(cpp-terminal-private PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}> $<INSTALL_INTERFACE:include>)
Expand Down
86 changes: 83 additions & 3 deletions cpp-terminal/private/exception.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,27 @@

#include "cpp-terminal/private/exception.hpp"

#include "cpp-terminal/exception.hpp"
#include "cpp-terminal/version.hpp"
#include "return_code.hpp"

#include <atomic>

Check warning on line 16 in cpp-terminal/private/exception.cpp

View workflow job for this annotation

GitHub Actions / cpp-linter

/cpp-terminal/private/exception.cpp:16:1 [misc-include-cleaner]

included header atomic is not used directly
#include <exception>

#if defined(_WIN32)
#include "cpp-terminal/private/unicode.hpp"

#include <memory>
#include <windows.h>
#if defined(MessageBox)
#undef MessageBox
#endif
#else
#include <cstring>

Check warning on line 28 in cpp-terminal/private/exception.cpp

View workflow job for this annotation

GitHub Actions / cpp-linter

/cpp-terminal/private/exception.cpp:28:3 [misc-include-cleaner]

included header cstring is not used directly
#endif

#include <cerrno>
#include <cstdio>
#include <string>

Term::Exception::Exception(const std::string& message) noexcept : m_message(message) {}
Expand Down Expand Up @@ -49,7 +60,7 @@ void Term::Exception::setMessage(const std::string& message) noexcept { m_messag

void Term::Exception::setContext(const std::string& context) noexcept { m_context = context; }

void Term::Exception::setWhat(const std::string& what) noexcept { m_what = what; }
void Term::Exception::setWhat(const std::string& what) const noexcept { m_what = what; }

#if defined(_WIN32)

Expand Down Expand Up @@ -92,6 +103,7 @@ void Term::Private::WindowsException::build_what() const noexcept
{
std::string what{"windows error " + std::to_string(code()) + ": " + message()};
if(!context().empty()) what += " [" + context() + "]";
setWhat(what);
}

#endif
Expand Down Expand Up @@ -140,11 +152,11 @@ Term::Private::ErrnoException::ErrnoException(const std::int64_t& error, const s
setContext(context);
#if defined(_WIN32)
std::wstring message(m_maxSize, L'\0');
_wcserror_s(&message[0], message.size(), static_cast<int>(error));
message = _wcserror_s(&message[0], message.size(), static_cast<int>(error));

Check warning on line 155 in cpp-terminal/private/exception.cpp

View workflow job for this annotation

GitHub Actions / msvc2022 win32 (c++11)

'argument': conversion from 'errno_t' to 'const _Elem with [_Elem=wchar_t]', possible loss of data [D:\a\cpp-terminal\cpp-terminal\build\cpp-terminal\private\cpp-terminal-private.vcxproj]

Check warning on line 155 in cpp-terminal/private/exception.cpp

View workflow job for this annotation

GitHub Actions / msvc2022 win32 (c++11)

'argument': conversion from 'errno_t' to 'const _Elem with [_Elem=wchar_t]', signed/unsigned mismatch [D:\a\cpp-terminal\cpp-terminal\build\cpp-terminal\private\cpp-terminal-private.vcxproj]

Check warning on line 155 in cpp-terminal/private/exception.cpp

View workflow job for this annotation

GitHub Actions / msvc2022 win32 (c++17)

'argument': conversion from 'errno_t' to 'const _Elem with [_Elem=wchar_t]', possible loss of data [D:\a\cpp-terminal\cpp-terminal\build\cpp-terminal\private\cpp-terminal-private.vcxproj]

Check warning on line 155 in cpp-terminal/private/exception.cpp

View workflow job for this annotation

GitHub Actions / msvc2022 win32 (c++17)

'argument': conversion from 'errno_t' to 'const _Elem with [_Elem=wchar_t]', signed/unsigned mismatch [D:\a\cpp-terminal\cpp-terminal\build\cpp-terminal\private\cpp-terminal-private.vcxproj]
setMessage(Term::Private::to_narrow(message.c_str()));
#else
std::string message(m_maxSize, '\0');
::strerror_r(static_cast<std::int32_t>(error), &message[0], message.size()); // NOLINT(readability-container-data-pointer)
message = ::strerror_r(static_cast<std::int32_t>(error), &message[0], message.size()); // NOLINT(readability-container-data-pointer)
setMessage(message);
#endif
}
Expand All @@ -153,4 +165,72 @@ void Term::Private::ErrnoException::build_what() const noexcept
{
std::string what{"errno " + std::to_string(code()) + ": " + message()};
if(!context().empty()) { what += +" [" + context() + "]"; }
setWhat(what);
}

void Term::Private::ExceptionHandler(const ExceptionDestination& destination) noexcept
{
try
{
std::exception_ptr exception{std::current_exception()};
if(exception != nullptr) { std::rethrow_exception(exception); }
}
catch(const Term::Exception& exception)
{
switch(destination)
{
case ExceptionDestination::MessageBox:
#if defined(_WIN32)
MessageBoxW(nullptr, Term::Private::to_wide(exception.what()).c_str(), Term::Private::to_wide("cpp-terminal v" + Term::Version::string()).c_str(), MB_OK | MB_ICONERROR);
break;
#endif
case ExceptionDestination::StdErr:
#if defined(_WIN32)
(void)(fputws(Term::Private::to_wide(std::string("cpp-terminal v" + Term::Version::string() + "\n" + exception.what() + "\n")).c_str(), stderr));
#else
(void)(fputs(std::string("cpp-terminal v" + Term::Version::string() + "\n" + exception.what() + "\n").c_str(), stderr));
#endif
break;
default: break;
}
}
catch(const std::exception& exception)
{
switch(destination)
{
case ExceptionDestination::MessageBox:
#if defined(_WIN32)
MessageBoxW(nullptr, Term::Private::to_wide(exception.what()).c_str(), Term::Private::to_wide("cpp-terminal v" + Term::Version::string()).c_str(), MB_OK | MB_ICONERROR);
break;
#endif
case ExceptionDestination::StdErr:
#if defined(_WIN32)
(void)(fputws(Term::Private::to_wide(std::string("cpp-terminal v" + Term::Version::string() + "\n" + exception.what() + "\n")).c_str(), stderr));
#else
(void)(fputs(std::string("cpp-terminal v" + Term::Version::string() + "\n" + exception.what() + "\n").c_str(), stderr));
#endif
break;
default: break;
}
}
catch(...)
{
switch(destination)
{
case ExceptionDestination::MessageBox:
#if defined(_WIN32)
MessageBoxW(nullptr, Term::Private::to_wide("cpp-terminal v" + Term::Version::string() + "Unknown error").c_str(), Term::Private::to_wide("cpp-terminal v" + Term::Version::string()).c_str(), MB_OK | MB_ICONERROR);
break;
#endif
case ExceptionDestination::StdErr:
#if defined(_WIN32)
(void)(fputws(Term::Private::to_wide("cpp-terminal v" + Term::Version::string() + ": Unknown error\n").c_str(), stderr));
#else
(void)(fputs(("cpp-terminal v" + Term::Version::string() + ": Unknown error\n").c_str(), stderr));
#endif
default: break;

Check warning on line 231 in cpp-terminal/private/exception.cpp

View workflow job for this annotation

GitHub Actions / msvc2022 win32 (c++17)

implicit fall-through occurs here; are you missing a break statement? Use [[fallthrough]] when a break statement is intentionally omitted between casesD:\a\cpp-terminal\cpp-terminal\cpp-terminal\private\exception.cpp(227,9): note: statement that may fall through is here [D:\a\cpp-terminal\cpp-terminal\build\cpp-terminal\private\cpp-terminal-private.vcxproj]
}
}
(void)(std::fflush(stderr));
std::_Exit(Term::returnCode());
}
8 changes: 8 additions & 0 deletions cpp-terminal/private/exception.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,14 @@ class ErrnoException : public Term::Exception
void build_what() const noexcept final;
};

enum class ExceptionDestination : std::uint8_t
{
MessageBox = 0,
StdErr,
};

void ExceptionHandler(const ExceptionDestination& destination = ExceptionDestination::StdErr) noexcept;

} // namespace Private

} // namespace Term
110 changes: 54 additions & 56 deletions cpp-terminal/private/file_initializer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,15 @@

#include "cpp-terminal/private/exception.hpp"
#include "cpp-terminal/private/file.hpp"
#include "cpp-terminal/private/return_code.hpp"

#include <iostream>
#include <ostream>

#if defined(_WIN32)
#include "cpp-terminal/private/unicode.hpp"

#include <io.h>
#include <windows.h>
#if defined(MessageBox)
#undef MessageBox
#endif
#else
#include <sys/stat.h>
#endif
Expand All @@ -29,13 +28,7 @@ bool Term::Private::FileInitializer::m_consoleCreated = {false};

std::size_t Term::Private::FileInitializer::m_counter = {0};

///
///@brief Attach the console
///
/// Check if a console is attached to the process. If not, try to attach to the console. If there is no console, then create one. \b stdin, \b stdout, \b stderr are check and opened if necessary.
/// On error, on window, a message box is raised.
///
void Term::Private::FileInitializer::attachConsole()
void Term::Private::FileInitializer::attachConsole() noexcept
try
{
#if defined(_WIN32)
Expand All @@ -54,71 +47,76 @@ try
Term::Private::WindowsError().check_if(AllocConsole() == 0).throw_exception("AllocConsole()");
m_consoleCreated = true;
}
FILE* fDummy{nullptr};
if(_fileno(stdout) < 0 || _get_osfhandle(_fileno(stdout)) < 0) Term::Private::WindowsError().check_if(freopen_s(&fDummy, "CONOUT$", "w", stdout) != 0).throw_exception("freopen_s(&fDummy, \"CONOUT$\", \"w\", stdout)");
if(_fileno(stderr) < 0 || _get_osfhandle(_fileno(stderr)) < 0) Term::Private::WindowsError().check_if(freopen_s(&fDummy, "CONOUT$", "w", stderr) != 0).throw_exception("freopen_s(&fDummy, \"CONOUT$\", \"w\", stderr)");
if(_fileno(stdin) < 0 || _get_osfhandle(_fileno(stdin)) < 0) Term::Private::WindowsError().check_if(freopen_s(&fDummy, "CONIN$", "r", stdin) != 0).throw_exception("freopen_s(&fDummy, \"CONIN$\", \"r\", stdin)");
const std::size_t bestSize{BUFSIZ > 4096 ? BUFSIZ : 4096};
#else
const struct stat stats
{
};
const std::size_t bestSize{static_cast<size_t>(stats.st_blksize)};
#endif
Term::Private::Errno().check_if(std::setvbuf(stdin, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stdin, nullptr, _IOLBF, bestSize)");
Term::Private::Errno().check_if(std::setvbuf(stdout, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stdout, nullptr, _IOLBF, bestSize)");
Term::Private::Errno().check_if(std::setvbuf(stderr, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stderr, nullptr, _IOLBF, bestSize)");
}
catch(const Term::Exception& exception)
catch(...)
{
detachConsole();
#if defined(_WIN32)
MessageBoxW(nullptr, Term::Private::to_wide(exception.what()).c_str(), Term::Private::to_wide("cpp-terminal").c_str(), MB_OK | MB_ICONERROR | MB_DEFBUTTON1);
#else
(void)(exception);
#endif
ExceptionHandler(ExceptionDestination::MessageBox);
}

void Term::Private::FileInitializer::detachConsole()
void Term::Private::FileInitializer::detachConsole() noexcept
try
{
#if defined(_WIN32)
if(m_consoleCreated) FreeConsole();
if(m_consoleCreated) { Term::Private::WindowsError().check_if(0 == FreeConsole()).throw_exception("FreeConsole()"); }
#endif
}
catch(...)
{
ExceptionHandler(ExceptionDestination::MessageBox);
}

Term::Private::FileInitializer::FileInitializer()
Term::Private::FileInitializer::FileInitializer() noexcept
try
{
try
{
// MacOS was not happy wish a static mutex in the class so we create it and pass to each class;
static std::recursive_mutex ioMutex;
if(0 == m_counter)
{
attachConsole();
if(new(&Term::Private::in) InputFileHandler(ioMutex) == nullptr) { throw Term::Exception("new(&Term::Private::in) InputFileHandler(ioMutex)"); }
if(new(&Term::Private::out) OutputFileHandler(ioMutex) == nullptr) { throw Term::Exception("new(&Term::Private::out) OutputFileHandler(ioMutex)"); }
}
++m_counter;
}
catch(const Term::Exception& exception)
{
std::cerr << "Error in cpp-terminal: " << exception.what() << '\n' << std::flush;
std::exit(Term::returnCode());
}
catch(...)
// MacOS was not happy wish a static mutex in the class so we create it and pass to each class;
static std::recursive_mutex ioMutex;
if(0 == m_counter)
{
std::cerr << "Undefined error in cpp-terminal [Term::Private::FileInitializer::init()]" << '\n' << std::flush;
std::exit(Term::returnCode());
attachConsole();
openStandardStreams();
if(new(&Term::Private::in) InputFileHandler(ioMutex) == nullptr) { throw Term::Exception("new(&Term::Private::in) InputFileHandler(ioMutex)"); }
if(new(&Term::Private::out) OutputFileHandler(ioMutex) == nullptr) { throw Term::Exception("new(&Term::Private::out) OutputFileHandler(ioMutex)"); }
}
++m_counter;
}
catch(...)
{
ExceptionHandler(ExceptionDestination::StdErr);
}

Check warning on line 87 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / msvc2022 win32 (c++11)

'Term::Private::FileInitializer::FileInitializer': function assumed not to throw an exception but doesD:\a\cpp-terminal\cpp-terminal\cpp-terminal\private\file_initializer.cpp(87,1): note: __declspec(nothrow), throw(), noexcept(true), or noexcept was specified on the function [D:\a\cpp-terminal\cpp-terminal\build\cpp-terminal\private\cpp-terminal-private.vcxproj]

Check warning on line 87 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / msvc2022 win32 (c++17)

'Term::Private::FileInitializer::FileInitializer': function assumed not to throw an exception but doesD:\a\cpp-terminal\cpp-terminal\cpp-terminal\private\file_initializer.cpp(87,1): note: __declspec(nothrow), throw(), noexcept(true), or noexcept was specified on the function [D:\a\cpp-terminal\cpp-terminal\build\cpp-terminal\private\cpp-terminal-private.vcxproj]

Term::Private::FileInitializer::~FileInitializer()
Term::Private::FileInitializer::~FileInitializer() noexcept
try
{
if(0 == m_counter)
{
(&Term::Private::in)->~InputFileHandler();
(&Term::Private::out)->~OutputFileHandler();
(&Term::Private::in)->~InputFileHandler(); //NOSONAR(S3432)
(&Term::Private::out)->~OutputFileHandler(); //NOSONAR(S3432)
detachConsole();
}
--m_counter;
}
catch(...)
{
ExceptionHandler(ExceptionDestination::StdErr);
}

Check warning on line 103 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / msvc2022 win32 (c++11)

'Term::Private::FileInitializer::~FileInitializer': function assumed not to throw an exception but doesD:\a\cpp-terminal\cpp-terminal\cpp-terminal\private\file_initializer.cpp(103,1): note: destructor or deallocator has a (possibly implicit) non-throwing exception specification [D:\a\cpp-terminal\cpp-terminal\build\cpp-terminal\private\cpp-terminal-private.vcxproj]

Check warning on line 103 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / msvc2022 win32 (c++17)

'Term::Private::FileInitializer::~FileInitializer': function assumed not to throw an exception but doesD:\a\cpp-terminal\cpp-terminal\cpp-terminal\private\file_initializer.cpp(103,1): note: destructor or deallocator has a (possibly implicit) non-throwing exception specification [D:\a\cpp-terminal\cpp-terminal\build\cpp-terminal\private\cpp-terminal-private.vcxproj]

void Term::Private::FileInitializer::openStandardStreams()
{
#if defined(_WIN32)
FILE* fDummy{nullptr};
if(_fileno(stdout) < 0 || _get_osfhandle(_fileno(stdout)) < 0) { Term::Private::WindowsError().check_if(_wfreopen_s(&fDummy, L"CONOUT$", L"w", stdout) != 0).throw_exception(R"(_wfreopen_s(&fDummy, L"CONOUT$", L"w", stdout))"); }
if(_fileno(stderr) < 0 || _get_osfhandle(_fileno(stderr)) < 0) { Term::Private::WindowsError().check_if(_wfreopen_s(&fDummy, L"CONOUT$", L"w", stderr) != 0).throw_exception(R"(_wfreopen_s(&fDummy, L"CONOUT$", L"w", stderr))"); }
if(_fileno(stdin) < 0 || _get_osfhandle(_fileno(stdin)) < 0) { Term::Private::WindowsError().check_if(_wfreopen_s(&fDummy, L"CONIN$", L"r", stdin) != 0).throw_exception(R"(_wfreopen_s(&fDummy, L"CONIN$", L"r", stdin))"); }
const std::size_t bestSize{BUFSIZ > 4096 ? BUFSIZ : 4096};
#else
const struct stat stats
{
};

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++11)

missing initializer for member 'stat::st_dev' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++11)

missing initializer for member 'stat::st_ino' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++11)

missing initializer for member 'stat::st_nlink' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++11)

missing initializer for member 'stat::st_mode' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++11)

missing initializer for member 'stat::st_uid' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++11)

missing initializer for member 'stat::st_gid' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++11)

missing initializer for member 'stat::__pad0' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++11)

missing initializer for member 'stat::st_rdev' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++11)

missing initializer for member 'stat::st_size' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++11)

missing initializer for member 'stat::st_blksize' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.7 (c++11)

missing initializer for member 'stat::st_dev' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.7 (c++11)

missing initializer for member 'stat::st_ino' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.7 (c++11)

missing initializer for member 'stat::st_nlink' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.7 (c++11)

missing initializer for member 'stat::st_mode' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.7 (c++11)

missing initializer for member 'stat::st_uid' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.7 (c++11)

missing initializer for member 'stat::st_gid' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.7 (c++11)

missing initializer for member 'stat::__pad0' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.7 (c++11)

missing initializer for member 'stat::st_rdev' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.7 (c++11)

missing initializer for member 'stat::st_size' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.7 (c++11)

missing initializer for member 'stat::st_blksize' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++14)

missing initializer for member 'stat::st_dev' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++14)

missing initializer for member 'stat::st_ino' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++14)

missing initializer for member 'stat::st_nlink' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++14)

missing initializer for member 'stat::st_mode' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++14)

missing initializer for member 'stat::st_uid' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++14)

missing initializer for member 'stat::st_gid' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++14)

missing initializer for member 'stat::__pad0' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++14)

missing initializer for member 'stat::st_rdev' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++14)

missing initializer for member 'stat::st_size' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.8 (c++14)

missing initializer for member 'stat::st_blksize' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++11)

missing initializer for member 'stat::st_dev' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++11)

missing initializer for member 'stat::st_ino' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++11)

missing initializer for member 'stat::st_nlink' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++11)

missing initializer for member 'stat::st_mode' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++11)

missing initializer for member 'stat::st_uid' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++11)

missing initializer for member 'stat::st_gid' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++11)

missing initializer for member 'stat::__pad0' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++11)

missing initializer for member 'stat::st_rdev' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++11)

missing initializer for member 'stat::st_size' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++11)

missing initializer for member 'stat::st_blksize' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++14)

missing initializer for member 'stat::st_dev' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++14)

missing initializer for member 'stat::st_ino' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++14)

missing initializer for member 'stat::st_nlink' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++14)

missing initializer for member 'stat::st_mode' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++14)

missing initializer for member 'stat::st_uid' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++14)

missing initializer for member 'stat::st_gid' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++14)

missing initializer for member 'stat::__pad0' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++14)

missing initializer for member 'stat::st_rdev' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++14)

missing initializer for member 'stat::st_size' [-Wmissing-field-initializers]

Check warning on line 116 in cpp-terminal/private/file_initializer.cpp

View workflow job for this annotation

GitHub Actions / gcc4.9 (c++14)

missing initializer for member 'stat::st_blksize' [-Wmissing-field-initializers]
const std::size_t bestSize{static_cast<size_t>(stats.st_blksize)};
#endif
Term::Private::Errno().check_if(std::setvbuf(stdin, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stdin, nullptr, _IOLBF, bestSize)");
Term::Private::Errno().check_if(std::setvbuf(stdout, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stdout, nullptr, _IOLBF, bestSize)");
Term::Private::Errno().check_if(std::setvbuf(stderr, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stderr, nullptr, _IOLBF, bestSize)");
}
Loading

1 comment on commit 5aa2580

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cpp-Linter Report ⚠️

Some files did not pass the configured checks!

clang-tidy reports: 31 concern(s)
  • cpp-terminal/exception.hpp

    /cpp-terminal/exception.hpp:1:1: warning: [llvm-header-guard]

    header is missing header guard

        1 | /*
          | ^

    /cpp-terminal/exception.hpp:41:31: warning: [misc-include-cleaner]

    no header providing "std::size_t" is directly included

       12 |   static const constexpr std::size_t m_maxSize{256};
          |                               ^
  • cpp-terminal/private/exception.cpp

    /cpp-terminal/private/exception.cpp:16:1: warning: [misc-include-cleaner]

    included header atomic is not used directly

       16 | #include <atomic>
          | ^~~~~~~~~~~~~~~~~
       17 | #include <exception>

    /cpp-terminal/private/exception.cpp:28:3: warning: [misc-include-cleaner]

    included header cstring is not used directly

       28 |   #include <cstring>
          |   ^~~~~~~~~~~~~~~~~~
       29 | #endif

    /cpp-terminal/private/exception.cpp:37:39: warning: [misc-include-cleaner]

    no header providing "std::int64_t" is directly included

       17 | Term::Exception::Exception(const std::int64_t& code, const std::string& message) noexcept : m_code(code), m_message(message) {}
          |                                       ^

    /cpp-terminal/private/exception.cpp:45:6: warning: [misc-include-cleaner]

    no header providing "std::int64_t" is directly included

       17 | std::int64_t Term::Exception::code() const noexcept { return m_code; }
          |      ^

    /cpp-terminal/private/exception.cpp:51:39: warning: [misc-include-cleaner]

    no header providing "std::int64_t" is directly included

       17 | Term::Exception::Exception(const std::int64_t& code) noexcept : m_code(code) {}
          |                                       ^

    /cpp-terminal/private/exception.cpp:129:6: warning: [misc-include-cleaner]

    no header providing "std::int64_t" is directly included

       17 | std::int64_t Term::Private::Errno::error() const noexcept { return m_errno; }
          |      ^

    /cpp-terminal/private/exception.cpp:139:30: warning: [misc-include-cleaner]

    no header providing "std::uint32_t" is directly included

       17 |   m_errno = static_cast<std::uint32_t>(errno);  //NOSONAR
          |                              ^

    /cpp-terminal/private/exception.cpp:150:58: warning: [misc-include-cleaner]

    no header providing "std::int64_t" is directly included

       17 | Term::Private::ErrnoException::ErrnoException(const std::int64_t& error, const std::string& context) : Term::Exception(error)
          |                                                          ^

    /cpp-terminal/private/exception.cpp:159:15: warning: [misc-include-cleaner]

    no header providing "strerror_r" is directly included

       18 |   message = ::strerror_r(static_cast<std::int32_t>(error), &message[0], message.size());  // NOLINT(readability-container-data-pointer)
          |               ^

    /cpp-terminal/private/exception.cpp:159:43: warning: [misc-include-cleaner]

    no header providing "std::int32_t" is directly included

       17 |   message = ::strerror_r(static_cast<std::int32_t>(error), &message[0], message.size());  // NOLINT(readability-container-data-pointer)
          |                                           ^

    /cpp-terminal/private/exception.cpp:175:5: warning: [misc-const-correctness]

    variable 'exception' of type 'std::exception_ptr' can be declared 'const'

      175 |     std::exception_ptr exception{std::current_exception()};
          |     ^
          |                        const 

    /cpp-terminal/private/exception.cpp:235:8: warning: [misc-include-cleaner]

    no header providing "std::_Exit" is directly included

       17 |   std::_Exit(Term::returnCode());
          |        ^
  • cpp-terminal/private/exception.hpp

    /cpp-terminal/private/exception.hpp:1:1: warning: [llvm-header-guard]

    header is missing header guard

        1 | /*
          | ^
  • cpp-terminal/private/file_initializer.cpp

    /cpp-terminal/private/file_initializer.cpp:29:6: warning: [misc-include-cleaner]

    no header providing "std::size_t" is directly included

       14 | 
       15 | #if defined(_WIN32)
       16 |   #include "cpp-terminal/private/unicode.hpp"
       17 | 
       18 |   #include <io.h>
       19 |   #include <windows.h>
       20 |   #if defined(MessageBox)
       21 |     #undef MessageBox
       22 |   #endif
       23 | #else
       24 |   #include <sys/stat.h>
       25 | #endif
       26 | 
       27 | bool Term::Private::FileInitializer::m_consoleCreated = {false};
       28 | 
       29 | std::size_t Term::Private::FileInitializer::m_counter = {0};
          |      ^

    /cpp-terminal/private/file_initializer.cpp:74:15: warning: [misc-include-cleaner]

    no header providing "std::recursive_mutex" is directly included

       14 |   static std::recursive_mutex ioMutex;
          |               ^

    /cpp-terminal/private/file_initializer.cpp:79:84: warning: [misc-include-cleaner]

    no header providing "Term::Exception" is directly included

       12 |     if(new(&Term::Private::in) InputFileHandler(ioMutex) == nullptr) { throw Term::Exception("new(&Term::Private::in) InputFileHandler(ioMutex)"); }
          |                                                                                    ^

    /cpp-terminal/private/file_initializer.cpp:80:86: warning: [misc-include-cleaner]

    no header providing "Term::Exception" is directly included

       12 |     if(new(&Term::Private::out) OutputFileHandler(ioMutex) == nullptr) { throw Term::Exception("new(&Term::Private::out) OutputFileHandler(ioMutex)"); }
          |                                                                                      ^

    /cpp-terminal/private/file_initializer.cpp:117:14: warning: [misc-include-cleaner]

    no header providing "std::size_t" is directly included

       14 |   const std::size_t bestSize{static_cast<size_t>(stats.st_blksize)};
          |              ^

    /cpp-terminal/private/file_initializer.cpp:117:42: warning: [misc-include-cleaner]

    no header providing "size_t" is directly included

       14 |   const std::size_t bestSize{static_cast<size_t>(stats.st_blksize)};
          |                                          ^

    /cpp-terminal/private/file_initializer.cpp:119:40: warning: [misc-include-cleaner]

    no header providing "std::setvbuf" is directly included

       14 |   Term::Private::Errno().check_if(std::setvbuf(stdin, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stdin, nullptr, _IOLBF, bestSize)");
          |                                        ^

    /cpp-terminal/private/file_initializer.cpp:119:48: warning: [misc-include-cleaner]

    no header providing "stdin" is directly included

       14 |   Term::Private::Errno().check_if(std::setvbuf(stdin, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stdin, nullptr, _IOLBF, bestSize)");
          |                                                ^

    /cpp-terminal/private/file_initializer.cpp:119:64: warning: [misc-include-cleaner]

    no header providing "_IOLBF" is directly included

       14 |   Term::Private::Errno().check_if(std::setvbuf(stdin, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stdin, nullptr, _IOLBF, bestSize)");
          |                                                                ^

    /cpp-terminal/private/file_initializer.cpp:120:40: warning: [misc-include-cleaner]

    no header providing "std::setvbuf" is directly included

       14 |   Term::Private::Errno().check_if(std::setvbuf(stdout, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stdout, nullptr, _IOLBF, bestSize)");
          |                                        ^

    /cpp-terminal/private/file_initializer.cpp:120:48: warning: [misc-include-cleaner]

    no header providing "stdout" is directly included

       14 |   Term::Private::Errno().check_if(std::setvbuf(stdout, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stdout, nullptr, _IOLBF, bestSize)");
          |                                                ^

    /cpp-terminal/private/file_initializer.cpp:120:65: warning: [misc-include-cleaner]

    no header providing "_IOLBF" is directly included

       14 |   Term::Private::Errno().check_if(std::setvbuf(stdout, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stdout, nullptr, _IOLBF, bestSize)");
          |                                                                 ^

    /cpp-terminal/private/file_initializer.cpp:121:40: warning: [misc-include-cleaner]

    no header providing "std::setvbuf" is directly included

       14 |   Term::Private::Errno().check_if(std::setvbuf(stderr, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stderr, nullptr, _IOLBF, bestSize)");
          |                                        ^

    /cpp-terminal/private/file_initializer.cpp:121:48: warning: [misc-include-cleaner]

    no header providing "stderr" is directly included

       14 |   Term::Private::Errno().check_if(std::setvbuf(stderr, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stderr, nullptr, _IOLBF, bestSize)");
          |                                                ^

    /cpp-terminal/private/file_initializer.cpp:121:65: warning: [misc-include-cleaner]

    no header providing "_IOLBF" is directly included

       14 |   Term::Private::Errno().check_if(std::setvbuf(stderr, nullptr, _IOLBF, bestSize) != 0).throw_exception("std::setvbuf(stderr, nullptr, _IOLBF, bestSize)");
          |                                                                 ^
  • cpp-terminal/private/file_initializer.hpp

    /cpp-terminal/private/file_initializer.hpp:1:1: warning: [llvm-header-guard]

    header is missing header guard

        1 | /*
          | ^

Have any feedback or feature suggestions? Share it here.

Please sign in to comment.