@@ -15,6 +15,38 @@ static LogCustomCallback log_custom_callback = DefaultLogCallback;
1515void setLogCustomCallback (LogCustomCallback callback) { log_custom_callback = callback; }
1616
1717
18+ LogInfo::LogInfo (const char * filename, const char * function, const char * message,
19+ const char * category, unsigned line, unsigned size, LogSeverity severity)
20+ : filename(filename),
21+ function (function),
22+ message(message),
23+ category(category),
24+ line(line),
25+ size(size),
26+ severity(severity) {
27+ for (const char * p = message; *p; p++)
28+ if (*p == ' {' ) {
29+ const char * q = p + 1 ;
30+ while (*q && *q != ' }' ) q++;
31+ if (*q == ' }' ) {
32+ names[std::string (p + 1 , q)] = names.size ();
33+ p = q;
34+ }
35+ }
36+ }
37+
38+
39+ constexpr size_t LogStreamMaxSize = 1024 * 1024 - 16 ;
40+
41+ struct DataBlock {
42+ size_t size = 0 ;
43+ DataBlock* next = nullptr ;
44+ char data[LogStreamMaxSize];
45+
46+ LogMessage* begin () { return (LogMessage*)data; }
47+ LogMessage* end () { return (LogMessage*)&data[size]; }
48+ };
49+
1850LogStream::LogStream () {
1951 first = last = new DataBlock ();
2052#ifndef ZEROERR_NO_THREAD_SAFE
@@ -63,7 +95,7 @@ void LogStream::flush() {
6395 }
6496 logger->flush (last);
6597 last->size = 0 ;
66- first = last;
98+ first = last;
6799}
68100
69101static LogMessage* moveBytes (LogMessage* p, unsigned size) {
@@ -74,53 +106,37 @@ static LogMessage* moveBytes(LogMessage* p, unsigned size) {
74106
75107void * LogStream::getRawLog (std::string func, unsigned line, std::string name) {
76108 for (DataBlock* p = first; p; p = p->next )
77- for (LogMessage* q = (LogMessage*)p->data ; q < (LogMessage*)&p->data [p->size ];
78- q = moveBytes (q, q->info ->size ))
79- if (line == q->info ->line && func == q->info ->function )
80- return q->getRawLog (name);
109+ for (auto q = p->begin (); q < p->end (); q = moveBytes (q, q->info ->size ))
110+ if (line == q->info ->line && func == q->info ->function ) return q->getRawLog (name);
81111 return nullptr ;
82112}
83113
84114class FileLogger : public Logger {
85115public:
86- FileLogger (std::string name, bool binary = true ) : binary(binary) {
87- if (binary) {
88- file = fopen (name.c_str (), " wb" );
89- } else {
90- file = fopen (name.c_str (), " w" );
91- }
92- }
116+ FileLogger (std::string name) { file = fopen (name.c_str (), " w" ); }
93117 ~FileLogger () {
94118 if (file) fclose (file);
95119 }
96120 void flush (DataBlock* msg) override {
97121 if (file) {
98- if (binary) {
99- // TODO: Design a binary format, currently, it can not work
100- fwrite (msg->data , msg->size , 1 , file);
101- } else {
102- for (LogMessage* p = (LogMessage*)msg->data ; p < (LogMessage*)&msg->data [msg->size ];
103- p = moveBytes (p, p->info ->size )) {
104- auto ss = log_custom_callback (*p, false );
105- fwrite (ss.c_str (), ss.size (), 1 , file);
106- }
122+ for (auto p = msg->begin (); p < msg->end (); p = moveBytes (p, p->info ->size )) {
123+ auto ss = log_custom_callback (*p, false );
124+ fwrite (ss.c_str (), ss.size (), 1 , file);
107125 }
108126 fflush (file);
109127 }
110128 }
111129
112130protected:
113131 FILE* file;
114- bool binary;
115132};
116133
117134class OStreamLogger : public Logger {
118135public:
119136 OStreamLogger (std::ostream& os) : os(os) {}
120137
121138 void flush (DataBlock* msg) override {
122- for (LogMessage* p = (LogMessage*)msg->data ; p < (LogMessage*)&msg->data [msg->size ];
123- p = moveBytes (p, p->info ->size )) {
139+ for (auto p = msg->begin (); p < msg->end (); p = moveBytes (p, p->info ->size )) {
124140 os << log_custom_callback (*p, true );
125141 }
126142 os.flush ();
@@ -136,14 +152,9 @@ LogStream& LogStream::getDefault() {
136152 return stream;
137153}
138154
139- void LogStream::setBinFileLogger (std::string name) {
140- if (logger) delete logger;
141- logger = new FileLogger (name);
142- }
143-
144155void LogStream::setFileLogger (std::string name) {
145156 if (logger) delete logger;
146- logger = new FileLogger (name, false );
157+ logger = new FileLogger (name);
147158}
148159
149160void LogStream::setStdoutLogger () {
@@ -183,7 +194,8 @@ void setLogCategory(const char* categories) {
183194}
184195
185196static LogStream::FlushMode saved_flush_mode;
186- void suspendLog () {
197+
198+ void suspendLog () {
187199 saved_flush_mode = LogStream::getDefault ().flush_mode ;
188200 LogStream::getDefault ().flush_mode = LogStream::FLUSH_MANUALLY;
189201}
@@ -221,6 +233,6 @@ static std::string DefaultLogCallback(const LogMessage& msg, bool colorful) {
221233 ss << std::endl;
222234 return ss.str ();
223235}
224-
236+ # undef zeroerr_color
225237
226238} // namespace zeroerr
0 commit comments