home · contact · privacy
facf63fffc71a53a9ffd9c0581383f9954bde4f1
[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(), EXIT_FAILURE */
8 #include <string.h> /* strlen() */
9
10
11
12 void (* cleanup_func) ();
13
14
15
16 extern void set_cleanup_func(void (* f)())
17 {
18     cleanup_func = f;
19 }
20
21
22
23 extern void exit_err(int err, char * msg)
24 {
25     if (0 == err)
26     {
27         return;
28     }
29     cleanup_func();
30     if (NULL == msg)
31     {
32         msg = "Details unknown.";
33     }
34     printf("Aborted program due to error. %s\n", msg);
35     if (0 != errno)
36     {
37         perror("errno states");
38     }
39     exit(EXIT_FAILURE);
40 }
41
42
43
44 extern void exit_trouble(int err, char * parent, char * child)
45 {
46     char * p1 = "Trouble in ";
47     char * p2 = " with ";
48     char * p3 = ".";
49     uint16_t size = strlen(p1) + strlen(parent) + strlen(p2) + strlen(child)
50                     + strlen(p3) + 1;
51     char msg[size];
52     sprintf(msg, "%s%s%s%s%s", p1, parent, p2, child, p3);
53     exit_err(err, msg);
54 }