home · contact · privacy
7e16f12f7c8bce1aeed17635c9f73ef8f963a8c1
[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, char * msg)
25 {
26     if (0 == err)
27     {
28         return;
29     }
30     cleanup_func();
31     if (NULL == 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, char * parent, char * child)
46 {
47     char * f_name = "exit_trouble()";
48     char * p1 = "Trouble in ";
49     char * p2 = " with ";
50     char * p3 = ".";
51     uint16_t size = strlen(p1) + strlen(parent) + strlen(p2) + strlen(child)
52                     + strlen(p3) + 1;
53     char * msg = try_malloc(size, f_name);
54     int test = sprintf(msg, "%s%s%s%s%s", p1, parent, p2, child, p3);
55     exit_err(test < 0, "Trouble in exit_trouble() with sprintf()");
56     exit_err(err, msg);
57     free(msg);
58 }