Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | pmbaty | 1 | /* |
2 | * Portions of this file are copyright Rebirth contributors and licensed as |
||
3 | * described in COPYING.txt. |
||
4 | * Portions of this file are copyright Parallax Software and licensed |
||
5 | * according to the Parallax license below. |
||
6 | * See COPYING.txt for license details. |
||
7 | |||
8 | THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX |
||
9 | SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO |
||
10 | END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A |
||
11 | ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS |
||
12 | IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS |
||
13 | SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE |
||
14 | FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE |
||
15 | CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS |
||
16 | AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. |
||
17 | COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. |
||
18 | */ |
||
19 | /* |
||
20 | * |
||
21 | * Error handling/printing/exiting code |
||
22 | * |
||
23 | */ |
||
24 | |||
25 | #include <cstdlib> |
||
26 | #include <stdio.h> |
||
27 | #include <stdarg.h> |
||
28 | #include <string.h> |
||
29 | |||
30 | #include "messagebox.h" |
||
31 | #include "pstypes.h" |
||
32 | #include "console.h" |
||
33 | #include "dxxerror.h" |
||
34 | |||
35 | namespace dcx { |
||
36 | |||
37 | #define MAX_MSG_LEN 2048 |
||
38 | |||
39 | static void warn_printf(const char *s) |
||
40 | { |
||
41 | con_puts(CON_URGENT,s); |
||
42 | } |
||
43 | |||
44 | #if DXX_USE_EDITOR |
||
45 | static void (*warn_func)(const char *s)=warn_printf; |
||
46 | |||
47 | //provides a function to call with warning messages |
||
48 | void set_warn_func(void (*f)(const char *s)) |
||
49 | { |
||
50 | warn_func = f; |
||
51 | } |
||
52 | |||
53 | //uninstall warning function - install default printf |
||
54 | void clear_warn_func() |
||
55 | { |
||
56 | warn_func = warn_printf; |
||
57 | } |
||
58 | #else |
||
59 | constexpr auto warn_func = &warn_printf; |
||
60 | #endif |
||
61 | |||
62 | static void print_exit_message(const char *exit_message, size_t len) |
||
63 | { |
||
64 | con_puts(CON_CRITICAL, exit_message, len); |
||
65 | msgbox_error(exit_message); |
||
66 | } |
||
67 | |||
68 | __noreturn |
||
69 | static void abort_print_exit_message(const char *exit_message, size_t len) |
||
70 | { |
||
71 | print_exit_message(exit_message, len); |
||
72 | d_debugbreak(); |
||
73 | std::abort(); |
||
74 | } |
||
75 | |||
76 | __noreturn |
||
77 | static void graceful_print_exit_message(const char *exit_message, size_t len) |
||
78 | { |
||
79 | print_exit_message(exit_message, len); |
||
80 | exit(1); |
||
81 | } |
||
82 | |||
83 | void (Error_puts)(const char *filename, const unsigned line, const char *func, const char *str) |
||
84 | { |
||
85 | char exit_message[MAX_MSG_LEN]; // don't put the new line in for dialog output |
||
86 | int len = snprintf(exit_message, sizeof(exit_message), "%s:%u: %s: error: %s", filename, line, func, str); |
||
87 | abort_print_exit_message(exit_message, len); |
||
88 | } |
||
89 | |||
90 | void (UserError_puts)(const char *str, std::size_t len) |
||
91 | { |
||
92 | graceful_print_exit_message(str, len); |
||
93 | } |
||
94 | |||
95 | //terminates with error code 1, printing message |
||
96 | void (Error)(const char *filename, const unsigned line, const char *func, const char *fmt,...) |
||
97 | { |
||
98 | char exit_message[MAX_MSG_LEN]; // don't put the new line in for dialog output |
||
99 | va_list arglist; |
||
100 | |||
101 | int leader = snprintf(exit_message, sizeof(exit_message), "%s:%u: %s: error: ", filename, line, func); |
||
102 | va_start(arglist,fmt); |
||
103 | int len = vsnprintf(exit_message+leader,sizeof(exit_message)-leader,fmt,arglist); |
||
104 | va_end(arglist); |
||
105 | abort_print_exit_message(exit_message, len); |
||
106 | } |
||
107 | |||
108 | void (UserError)(const char *fmt,...) |
||
109 | { |
||
110 | char exit_message[MAX_MSG_LEN]; // don't put the new line in for dialog output |
||
111 | va_list arglist; |
||
112 | va_start(arglist,fmt); |
||
113 | int len = vsnprintf(exit_message, sizeof(exit_message), fmt, arglist); |
||
114 | va_end(arglist); |
||
115 | graceful_print_exit_message(exit_message, len); |
||
116 | } |
||
117 | |||
118 | void Warning_puts(const char *str) |
||
119 | { |
||
120 | const auto warn = warn_func; |
||
121 | #if DXX_USE_EDITOR |
||
122 | if (warn == NULL) |
||
123 | return; |
||
124 | #endif |
||
125 | char warn_message[MAX_MSG_LEN]; |
||
126 | snprintf(warn_message, sizeof(warn_message), "Warning: %s", str); |
||
127 | (*warn)(warn_message); |
||
128 | } |
||
129 | |||
130 | //print out warning message to user |
||
131 | void (Warning)(const char *fmt,...) |
||
132 | { |
||
133 | va_list arglist; |
||
134 | |||
135 | const auto warn = warn_func; |
||
136 | #if DXX_USE_EDITOR |
||
137 | if (warn == NULL) |
||
138 | return; |
||
139 | #endif |
||
140 | |||
141 | char warn_message[MAX_MSG_LEN]; |
||
142 | strcpy(warn_message,"Warning: "); |
||
143 | |||
144 | va_start(arglist,fmt); |
||
145 | vsnprintf(warn_message+9,sizeof(warn_message)-9,fmt,arglist); |
||
146 | va_end(arglist); |
||
147 | |||
148 | (*warn)(warn_message); |
||
149 | } |
||
150 | |||
151 | } |