From f925e31f7b88f7db931cb6e1b44c939acae51fca Mon Sep 17 00:00:00 2001 From: fabienfl Date: Mon, 25 Jan 2021 19:30:40 +0100 Subject: [PATCH] OrcLib: add enum class FileDisposition --- src/OrcLib/CMakeLists.txt | 2 + src/OrcLib/FileDisposition.cpp | 67 ++++++++++++++++++++++++++++++++++ src/OrcLib/FileDisposition.h | 30 +++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 src/OrcLib/FileDisposition.cpp create mode 100644 src/OrcLib/FileDisposition.h diff --git a/src/OrcLib/CMakeLists.txt b/src/OrcLib/CMakeLists.txt index c392e3b0..08f2d686 100644 --- a/src/OrcLib/CMakeLists.txt +++ b/src/OrcLib/CMakeLists.txt @@ -254,6 +254,8 @@ source_group(ExtensionLibraries\\Yara FILES ${SRC_EXTENSIONLIBRARIES_YARA}) set(SRC_INOUT "LocationOutput.h" "OutputWriter.h" + "FileDisposition.h" + "FileDisposition.cpp" ) source_group(In&Out FILES ${SRC_INOUT}) diff --git a/src/OrcLib/FileDisposition.cpp b/src/OrcLib/FileDisposition.cpp new file mode 100644 index 00000000..1034f8c2 --- /dev/null +++ b/src/OrcLib/FileDisposition.cpp @@ -0,0 +1,67 @@ +// +// SPDX-License-Identifier: LGPL-2.1-or-later +// +// Copyright © 2021 ANSSI. All Rights Reserved. +// +// Author(s): fabienfl +// + +#include "FileDisposition.h" + +#include + +namespace Orc { + +constexpr std::wstring_view kAppend = L"append"; +constexpr std::wstring_view kTruncate = L"truncate"; +constexpr std::wstring_view kCreateNew = L"create_new"; +constexpr std::wstring_view kUnknown = L"unknown"; + +std::wstring_view ToString(FileDisposition disposition) +{ + switch (disposition) + { + case FileDisposition::Append: + return kAppend; + case FileDisposition::Truncate: + return kTruncate; + case FileDisposition::CreateNew: + return kCreateNew; + default: + return kUnknown; + } +} + +FileDisposition ToFileDisposition(const std::wstring& disposition, std::error_code& ec) +{ + const std::map map = { + {kAppend, FileDisposition::Append}, + {kTruncate, FileDisposition::Truncate}, + {kCreateNew, FileDisposition::CreateNew}}; + + auto it = map.find(disposition); + if (it == std::cend(map)) + { + ec = std::make_error_code(std::errc::invalid_argument); + return FileDisposition::Unknown; + } + + return it->second; +} + +std::ios_base::openmode ToOpenMode(FileDisposition disposition) +{ + switch (disposition) + { + case FileDisposition::Append: + return std::ios::app; + case FileDisposition::CreateNew: + case FileDisposition::Truncate: + return std::ios_base::trunc; + default: + assert(nullptr); + return std::ios_base::ate; + } +} + +} // namespace Orc diff --git a/src/OrcLib/FileDisposition.h b/src/OrcLib/FileDisposition.h new file mode 100644 index 00000000..6af66564 --- /dev/null +++ b/src/OrcLib/FileDisposition.h @@ -0,0 +1,30 @@ +// +// SPDX-License-Identifier: LGPL-2.1-or-later +// +// Copyright © 2021 ANSSI. All Rights Reserved. +// +// Author(s): fabienfl +// + +#pragma once + +#include +#include +#include + +namespace Orc { + +enum class FileDisposition +{ + Unknown, + Append, + Truncate, + CreateNew +}; + +std::wstring_view ToString(FileDisposition disposition); +FileDisposition ToFileDisposition(const std::wstring& disposition, std::error_code& ec = std::error_code()); + +std::ios_base::openmode ToOpenMode(FileDisposition disposition); + +} // namespace Orc