Subversion Repositories Games.Descent

Rev

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
}