/* * libfud * Copyright 2024 Dominick Allen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "fud_c_file.hpp" namespace fud { CBinaryFileResult CBinaryFile::make(const String& filename, CFileMode mode) { auto modeResult{String::makeFromCString(CBinaryFileModeFromFlags(mode))}; if (modeResult.isError()) { return CBinaryFileResult::error(modeResult); } CBinaryFile binaryFile{}; auto copyStatus = binaryFile.m_filename.copy(filename); if (copyStatus != FudStatus::Success) { return CBinaryFileResult::error(copyStatus); } binaryFile.m_mode = modeResult.takeOkay(); binaryFile.m_modeFlags = mode; return CBinaryFileResult::okay(std::move(binaryFile)); } CBinaryFileResult CBinaryFile::make(const String& filename, CFileMode mode, const char* extraFlags) { auto modeResult{String::makeFromCStrings(CBinaryFileModeFromFlags(mode), extraFlags)}; if (modeResult.isError()) { return CBinaryFileResult::error(modeResult); } CBinaryFile binaryFile{}; auto copyStatus = binaryFile.m_filename.copy(filename); if (copyStatus != FudStatus::Success) { return CBinaryFileResult::error(copyStatus); } binaryFile.m_mode = modeResult.takeOkay(); binaryFile.m_modeFlags = mode; return CBinaryFileResult::okay(std::move(binaryFile)); } CBinaryFile::CBinaryFile(CBinaryFile&& rhs) noexcept : m_filename{std::move(rhs.m_filename)}, m_mode{std::move(rhs.m_mode)}, m_modeFlags{rhs.m_modeFlags}, m_file{rhs.m_file} { rhs.m_file = nullptr; } CBinaryFile::~CBinaryFile() { close(); } CBinaryFile& CBinaryFile::operator=(CBinaryFile&& rhs) noexcept { close(); m_filename = std::move(rhs.m_filename); m_mode = std::move(rhs.m_mode); m_modeFlags = rhs.m_modeFlags; m_file = rhs.m_file; rhs.m_file = nullptr; return *this; } CTextFileResult CTextFile::make(const String& filename, CFileMode mode) { auto modeResult{String::makeFromCString(CBinaryFileModeFromFlags(mode))}; if (modeResult.isError()) { return CTextFileResult::error(modeResult); } CTextFile textFile{}; auto copyStatus = textFile.m_filename.copy(filename); if (copyStatus != FudStatus::Success) { return CTextFileResult::error(copyStatus); } textFile.m_mode = modeResult.takeOkay(); textFile.m_modeFlags = mode; return CTextFileResult::okay(std::move(textFile)); } CTextFileResult CTextFile::make(const String& filename, CFileMode mode, const char* extraFlags) { auto modeResult{String::makeFromCStrings(CTextFileModeFromFlags(mode), extraFlags)}; if (modeResult.isError()) { return CTextFileResult::error(modeResult); } CTextFile textFile{}; auto copyStatus = textFile.m_filename.copy(filename); if (copyStatus != FudStatus::Success) { return CTextFileResult::error(copyStatus); } textFile.m_mode = modeResult.takeOkay(); textFile.m_modeFlags = mode; return CTextFileResult::okay(std::move(textFile)); } CTextFile::CTextFile(CTextFile&& rhs) noexcept : m_filename{std::move(rhs.m_filename)}, m_mode{std::move(rhs.m_mode)}, m_modeFlags{rhs.m_modeFlags}, m_file{rhs.m_file} { rhs.m_file = nullptr; } CTextFile::~CTextFile() { close(); } CTextFile& CTextFile::operator=(CTextFile&& rhs) noexcept { close(); m_filename = std::move(rhs.m_filename); m_mode = std::move(rhs.m_mode); m_modeFlags = rhs.m_modeFlags; m_file = rhs.m_file; rhs.m_file = nullptr; return *this; } } // namespace fud