aboutsummaryrefslogtreecommitdiff
path: root/libcody/fatal.cc
blob: c1bc8ab8a79a33d56861402174b4bd87fb4af609 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// 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!
  // A useful place for a breakpoint to land.
  //__asm__ volatile ("nop");  // 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);
}

void BuildNote (FILE *stream) noexcept
{
  fprintf (stream, "Version %s.\n", PACKAGE_NAME " " PACKAGE_VERSION);
  fprintf (stream, "Report bugs to %s.\n", BUGURL[0] ? BUGURL : "you");
  if (PACKAGE_URL[0])
    fprintf (stream, "See %s for more information.\n", PACKAGE_URL);
  if (REVISION[0])
    fprintf (stream, "Source %s.\n", REVISION);

  fprintf (stream, "Build is %s & %s.\n",
#if !NMS_CHECKING
	   "un"
#endif
	   "checked",
#if !__OPTIMIZE__
	   "un"
#endif
	   "optimized");
}

}