| // 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); | |
| } | |
| } |