summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/fud_assert.cpp45
-rw-r--r--source/libfud.cpp4
2 files changed, 38 insertions, 11 deletions
diff --git a/source/fud_assert.cpp b/source/fud_assert.cpp
index f3358df..9c2ec77 100644
--- a/source/fud_assert.cpp
+++ b/source/fud_assert.cpp
@@ -1,26 +1,53 @@
#include "fud_assert.hpp"
#include "fud_array.hpp"
+#include "fud_string_view.hpp"
+#include <climits>
#include <cstdio>
-#include <stdexcept>
#include <format>
+#include <stdexcept>
namespace fud {
void assertFail(const char* assertion, const char* file, unsigned int line, const char* function) noexcept(false)
{
- constexpr size_t ASSERT_MSG_SIZE = 1024;
+ constexpr size_t MAX_FILE_CHARS = 256;
+ constexpr size_t MAX_FUNCTION_CHARS = 256;
+ constexpr size_t BITS_PER_OCTAL = 3;
+ constexpr auto MAX_LINE_CHARS = BITS_PER_OCTAL * sizeof(decltype(line)) + 3;
+ constexpr size_t MAX_ASSERT_CHARS = 512 - MAX_LINE_CHARS;
+ constexpr size_t ASSERT_MSG_SIZE = MAX_FILE_CHARS + MAX_LINE_CHARS + MAX_FUNCTION_CHARS + MAX_ASSERT_CHARS;
+
+ auto lengthResult = cStringLength(file);
+ size_t filenameLength = 0;
+ auto badLength = lengthResult < 1 || lengthResult > SSIZE_MAX;
+ if (!badLength) {
+ filenameLength = static_cast<size_t>(lengthResult);
+ }
+ const char* filename = nullptr;
+ if (badLength) {
+ constexpr const char invalidFile[] = "INVALID FILE";
+ static_assert(sizeof(invalidFile) < MAX_FILE_CHARS);
+ filenameLength = sizeof(invalidFile);
+ filename = invalidFile;
+ } else if (filenameLength > MAX_LINE_CHARS) {
+ filename = file + filenameLength - MAX_LINE_CHARS;
+ filenameLength = MAX_FILE_CHARS;
+ }
+
Array<char, ASSERT_MSG_SIZE> buffer{};
+ // clang-format off
static_cast<void>(std::format_to_n(
- buffer.data(),
- buffer.size() - 1U,
- "{}:{}: {}:Assertion `{}` failed",
- file,
+ buffer.data(), buffer.size() - 1U,
+ "{:.{}s}:{}: {:.{}s}: Assertion `{:.{}s}` failed",
+ filename, filenameLength,
line,
- function,
- assertion));
+ function, MAX_FUNCTION_CHARS,
+ assertion, MAX_ASSERT_CHARS));
+ // clang-format on
+
throw std::runtime_error(buffer.data());
}
-}
+} // namespace fud
diff --git a/source/libfud.cpp b/source/libfud.cpp
index 252eae0..8c962ba 100644
--- a/source/libfud.cpp
+++ b/source/libfud.cpp
@@ -18,7 +18,7 @@
#include "libfud.hpp"
#include "fud_assert.hpp"
-#include "git_version.hpp"
+#include "fud_version.hpp"
#include <cstdlib>
@@ -27,10 +27,10 @@ namespace fud {
FUD fud()
{
FUD fudInfo{};
+ static_assert(sizeof(GitHash) >= sizeof(fudInfo.revision));
fudInfo.major = FudVersionMajor;
fudInfo.minor = FudVersionMinor;
fudInfo.patch = FudVersionPatch;
- static_assert(sizeof(GitHash) >= sizeof(fudInfo.revision));
auto copyResult = copyMem(fudInfo.revision.data(), fudInfo.revision.size(), GitHash, fudInfo.revision.size() - 1);
fudAssert(copyResult == FudStatus::Success);
fudInfo.revision[fudInfo.revision.size() - 1] = '\0';