58 lines
1,022 B
C++
58 lines
1,022 B
C++
|
// CODYlib -*- mode:c++ -*-
|
||
|
// Copyright (C) 2019-2020 Nathan Sidwell, nathan@acm.org
|
||
|
// License: Apache v2.0
|
||
|
|
||
|
// Cody
|
||
|
#include "internal.hh"
|
||
|
// C
|
||
|
#include <csignal>
|
||
|
#include <cstdint>
|
||
|
#include <cstdio>
|
||
|
#include <cstdlib>
|
||
|
#include <cstring>
|
||
|
|
||
|
namespace Cody {
|
||
|
|
||
|
#if NMS_CHECKING
|
||
|
void (AssertFailed) (Location loc) noexcept
|
||
|
{
|
||
|
(HCF) ("assertion failed", loc);
|
||
|
}
|
||
|
void (Unreachable) (Location loc) noexcept
|
||
|
{
|
||
|
(HCF) ("unreachable reached", loc);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
void (HCF) (char const *msg
|
||
|
#if NMS_CHECKING
|
||
|
, Location const loc
|
||
|
#endif
|
||
|
) noexcept
|
||
|
{ // HCF - you goofed!
|
||
|
|
||
|
#if !NMS_CHECKING
|
||
|
constexpr Location loc (nullptr, 0);
|
||
|
#endif
|
||
|
|
||
|
fprintf (stderr, "CODYlib: %s", msg ? msg : "internal error");
|
||
|
if (char const *file = loc.File ())
|
||
|
{
|
||
|
char const *src = SRCDIR;
|
||
|
|
||
|
if (src[0])
|
||
|
{
|
||
|
size_t l = strlen (src);
|
||
|
|
||
|
if (!strncmp (src, file, l) && file[l] == '/')
|
||
|
file += l + 1;
|
||
|
}
|
||
|
fprintf (stderr, " at %s:%u", file, loc.Line ());
|
||
|
}
|
||
|
fprintf (stderr, "\n");
|
||
|
raise (SIGABRT);
|
||
|
exit (2);
|
||
|
}
|
||
|
|
||
|
}
|