57 lines
1,022 B
C++
57 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);
|
|
}
|
|
|
|
}
|