1*b1e83836Smrg // CODYlib -*- mode:c++ -*- 2*b1e83836Smrg // Copyright (C) 2019-2020 Nathan Sidwell, nathan@acm.org 3*b1e83836Smrg // License: Apache v2.0 4*b1e83836Smrg 5*b1e83836Smrg // Cody 6*b1e83836Smrg #include "internal.hh" 7*b1e83836Smrg // C 8*b1e83836Smrg #include <csignal> 9*b1e83836Smrg #include <cstdint> 10*b1e83836Smrg #include <cstdio> 11*b1e83836Smrg #include <cstdlib> 12*b1e83836Smrg #include <cstring> 13*b1e83836Smrg 14*b1e83836Smrg namespace Cody { 15*b1e83836Smrg 16*b1e83836Smrg #if NMS_CHECKING 17*b1e83836Smrg void (AssertFailed) (Location loc) noexcept 18*b1e83836Smrg { 19*b1e83836Smrg (HCF) ("assertion failed", loc); 20*b1e83836Smrg } 21*b1e83836Smrg void (Unreachable) (Location loc) noexcept 22*b1e83836Smrg { 23*b1e83836Smrg (HCF) ("unreachable reached", loc); 24*b1e83836Smrg } 25*b1e83836Smrg #endif 26*b1e83836Smrg 27*b1e83836Smrg void (HCF) (char const *msg 28*b1e83836Smrg #if NMS_CHECKING 29*b1e83836Smrg , Location const loc 30*b1e83836Smrg #endif 31*b1e83836Smrg ) noexcept 32*b1e83836Smrg { // HCF - you goofed! 33*b1e83836Smrg 34*b1e83836Smrg #if !NMS_CHECKING 35*b1e83836Smrg constexpr Location loc (nullptr, 0); 36*b1e83836Smrg #endif 37*b1e83836Smrg 38*b1e83836Smrg fprintf (stderr, "CODYlib: %s", msg ? msg : "internal error"); 39*b1e83836Smrg if (char const *file = loc.File ()) 40*b1e83836Smrg { 41*b1e83836Smrg char const *src = SRCDIR; 42*b1e83836Smrg 43*b1e83836Smrg if (src[0]) 44*b1e83836Smrg { 45*b1e83836Smrg size_t l = strlen (src); 46*b1e83836Smrg 47*b1e83836Smrg if (!strncmp (src, file, l) && file[l] == '/') 48*b1e83836Smrg file += l + 1; 49*b1e83836Smrg } 50*b1e83836Smrg fprintf (stderr, " at %s:%u", file, loc.Line ()); 51*b1e83836Smrg } 52*b1e83836Smrg fprintf (stderr, "\n"); 53*b1e83836Smrg raise (SIGABRT); 54*b1e83836Smrg exit (2); 55*b1e83836Smrg } 56*b1e83836Smrg 57*b1e83836Smrg } 58