-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmessage.cpp
More file actions
128 lines (110 loc) · 4.14 KB
/
message.cpp
File metadata and controls
128 lines (110 loc) · 4.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "message.h"
#include <stdexcept>
#include <cstdio>
#include <ctime>
namespace simple_log {
/*Default Buffer size, 1 kb*/
static const size_t BUF_SIZE = 1024;
/* How many doubles before we call it a formatting error */
static const int MAX_REWRITES = 10;
/* Message method definitions */
Message::Message(Level::LoggingLevel lvl, const char * name)
: _buffer(NULL), _lvl(Level::LevelName(lvl)), _name(name),
_file(NULL), _line(-1), _function(NULL) { }
Message::Message(Level::LoggingLevel lvl, const char * file, int line,
const char * function) : _buffer(NULL), _lvl(Level::LevelName(lvl)),
_name(NULL), _file(file), _line(line), _function(function) { }
char * Message::getMessage() {
if (!messageProcessed()) {
size_t size = BUF_SIZE;
bool verbose = _name == NULL;
const char * fstr = verbose ?
"%-5s [%02i:%02i:%02i] Function %s (File %s : Line %03d): %s\n" :
"%-5s %s : %s\n";
do {
_buffer = new char[size];
const char * msg = makeMessage();
int res;
if (verbose) {
time_t t = time(NULL);
tm * time_info = localtime(&t);
res = snprintf(_buffer, size, fstr, _lvl,
time_info->tm_hour, time_info->tm_min, time_info->tm_sec,
_function, _file, _line, msg);
} else {
res = snprintf(_buffer, size, fstr, _lvl, _name, msg);
}
if (res < 0) {
size *= 2;
delete[] _buffer;
} else if (static_cast<size_t>(res) > size) {
size = res + 1;
delete[] _buffer;
} else {
return _buffer;
}
} while (true);
} else {
return _buffer;
}
}
bool Message::messageProcessed() const {
return _buffer != NULL;
}
Message::~Message() {
delete[] _buffer;
_buffer = NULL;
}
/* Simple Message method definitions */
SimpleMessage::SimpleMessage(Level::LoggingLevel lvl, const char * name,
const char * msg) : Message(lvl, name), _msg(msg) { }
SimpleMessage::SimpleMessage(Level::LoggingLevel lvl, const char * file,
int line, const char * func, const char * msg)
: Message(lvl, file, line, func), _msg(msg) { }
const char * SimpleMessage::makeMessage() {
return _msg;
}
/* Formatted Message method definitions */
FormattedMessage::FormattedMessage(Level::LoggingLevel lvl,
const char * name, const char * fstr, va_list args)
: Message(lvl, name), _msgbuf(NULL), _fstr(fstr)
{
va_copy(_args, args);
}
FormattedMessage::FormattedMessage(Level::LoggingLevel lvl,
const char * file, int line, const char * function,
const char * fstr, va_list args)
: Message(lvl, file, line, function), _msgbuf(NULL), _fstr(fstr)
{
va_copy(_args, args);
}
const char * FormattedMessage::makeMessage() {
if (_msgbuf == NULL) {
size_t size = BUF_SIZE;
int safety = 0;
do {
_msgbuf = new char[size];
int res = vsnprintf(_msgbuf, size, _fstr, _args);
if (res < 0) {
size *= 2;
++safety;
delete[] _msgbuf;
} else if (static_cast<size_t>(res) > size) {
size = res + 1;
delete[] _msgbuf;
} else {
return _msgbuf;
}
} while (safety < MAX_REWRITES);
throw std::runtime_error("Format message longer than "
"10kbs or has a formatting error.");
} else {
return _msgbuf;
}
}
FormattedMessage::~FormattedMessage() {
delete[] _msgbuf;
va_end(_args);
_msgbuf = NULL;
}
}