home · contact · privacy
b528975290ae7eaf78f9dcd6027b9be4afeefd4b
[plomrogue] / src / common / rexit.c
1 /* src/common/rexit.c */
2
3 #include "rexit.h"
4 #include <errno.h> /* global errno */
5 #include <stdint.h> /* uint16_t */
6 #include <stdio.h> /* printf(), perror(), sprintf() */
7 #include <stdlib.h> /* exit(), free(), EXIT_FAILURE */
8 #include <string.h> /* strlen() */
9 #include "try_malloc.h" /* try_malloc() */
10
11
12
13 void (* cleanup_func) ();
14
15
16
17 extern void set_cleanup_func(void (* f)())
18 {
19     cleanup_func = f;
20 }
21
22
23
24 extern void exit_err(int err, const char * msg)
25 {
26     if (0 == err)
27     {
28         return;
29     }
30     cleanup_func();
31     if (!msg)
32     {
33         msg = "Details unknown.";
34     }
35     printf("Aborted program due to error. %s\n", msg);
36     if (0 != errno)
37     {
38         perror("errno states");
39     }
40     exit(EXIT_FAILURE);
41 }
42
43
44
45 extern void exit_trouble(int err, const char * parent, const char * child)
46 {
47     char * p1 = "Trouble in ";
48     char * p2 = " with ";
49     char * p3 = ".";
50     uint16_t size = strlen(p1) + strlen(parent) + strlen(p2) + strlen(child)
51                     + strlen(p3) + 1;
52     char * msg = try_malloc(size, __func__);
53     int test = sprintf(msg, "%s%s%s%s%s", p1, parent, p2, child, p3);
54     exit_err(test < 0, "Trouble in exit_trouble with sprintf.");
55     exit_err(err, msg);
56     free(msg);
57 }