/* vim: set expandtab ts=4 sw=4: */
/*
* You may redistribute this program and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "util/log/WriterLog.h"
#include "util/log/Log_impl.h"
#include "util/CString.h"
#include "io/Writer.h"
#include
#include
#include
#include
#include
struct WriterLog
{
struct Log pub;
struct Writer* writer;
};
static void print(struct Log* genericLog,
enum Log_Level logLevel,
const char* file,
int line,
const char* format,
va_list args)
{
struct WriterLog* log = (struct WriterLog*) genericLog;
char timeAndLevelBuff[64];
time_t now;
time(&now);
snprintf(timeAndLevelBuff, 64, "%u %s ", (uint32_t) now, Log_nameForLevel(logLevel));
Writer_write(log->writer, timeAndLevelBuff, CString_strlen(timeAndLevelBuff));
// Strip the path to make log lines shorter.
//char* lastSlash = CString_strrchr(file, '/');
Writer_write(log->writer, file, CString_strlen(file));
#define Log_BUFFER_SZ 1024
char buff[Log_BUFFER_SZ];
snprintf(buff, Log_BUFFER_SZ, ":%u ", line);
Writer_write(log->writer, buff, CString_strlen(buff));
vsnprintf(buff, Log_BUFFER_SZ, format, args);
size_t length = CString_strlen(buff);
// Some log lines end in \n, others don't.
if (length < Log_BUFFER_SZ && buff[length - 1] != '\n') {
buff[length++] = '\n';
}
Writer_write(log->writer, buff, length > Log_BUFFER_SZ ? Log_BUFFER_SZ : length);
#undef Log_BUFFER_SZ
}
struct Log* WriterLog_new(struct Writer* w, struct Allocator* alloc)
{
return Allocator_clone(alloc, (&(struct WriterLog) {
.pub = {
.print = print
},
.writer = w
}));
}