36 #define LOG_CATEGORY(category) #category ,
42 #define LOG_TYPE(category, type, enabled, str) { enabled, LOG_ ##category, #category "__" #type, str },
51 void log_hex(
LogType type,
const void *data,
unsigned long length,
unsigned char padding) {
54 for(offset=0;offset<length;offset+=16) {
60 void log_phex(
LogType type,
const void *data,
unsigned long length,
unsigned char padding) {
62 log_hex(type, data, length, padding);
65 log_hex(type, data, 1024-32, padding);
87 size_t log_msg_size = 0x400;
88 size_t log_msg_index = 0;
89 char* log_msg = (
char*)malloc(log_msg_size);
96 int va_size =
snprintf(&log_msg[log_msg_index], log_msg_size,
"%02u:%02u:%02u [%s] ", t.tm_hour, t.tm_min, t.tm_sec, log_type_info[type].
display_name );
99 log_msg_size-=va_size;
100 log_msg_index+=va_size;
103 for (
uint32 i = 0; i < iden; i++)
104 log_msg[log_msg_index++] =
' ';
110 va_size =
vsnprintf(&log_msg[log_msg_index], log_msg_size, fmt, args);
111 log_msg_index+=va_size;
114 log_msg[log_msg_index++] =
'\n';
115 log_msg[log_msg_index++] =
'\0';
119 fputs(log_msg, stdout);
136 real_log_type_info[t].
enabled =
true;
141 real_log_type_info[t].
enabled =
false;
170 FILE *f = fopen(filename,
"r");
173 char linebuf[512], type_name[256], value[256];
177 if (fgets(linebuf, 512, f) ==
nullptr)
179 if (sscanf(linebuf,
"%[^=]=%[^\r\n]\n", type_name, value) != 2)
182 if (type_name[0] ==
'\0' || type_name[0] ==
'#')
192 printf(
"Unable to parse value '%s' from %s around line %u. Skipping.\n", value, filename, i);
202 if (r != NUMBER_OF_LOG_CATEGORIES) {
206 if (log_type_info[k].category != r)
217 if (!
strcasecmp(log_type_info[r].name, type_name))
220 if (r == NUMBER_OF_LOG_TYPES) {
221 printf(
"Unable to locate log type %s from file %s around line %u. Skipping.\n", type_name, filename, i);
tm * localtime_r(const time_t *timep, tm *result)
bool load_log_settings(const char *filename)
A lock for a Lockable object.
void build_hex_line(const uint8 *buffer, size_t length, size_t offset, char *ret, unsigned int padding)
Build a printable line suitable for hex dump.
bool log_open_logfile(const char *filename)
Common wrapper for platform-specific mutexes.
void log_hex(LogType type, const void *data, unsigned long length, unsigned char padding)
const char * display_name
const LogTypeStatus * log_type_info
static LogTypeStatus real_log_type_info[NUMBER_OF_LOG_TYPES+1]
void log_toggle(LogType t)
void log_enable(LogType t)
void log_disable(LogType t)
void log_phex(LogType type, const void *data, unsigned long length, unsigned char padding)
void Unlock()
Unlocks the object.
void log_message(LogType type, const char *fmt,...)
FILE * logsys_log_file(nullptr)
void log_messageVA(LogType type, const char *fmt, va_list args)
const char * log_category_names[NUMBER_OF_LOG_CATEGORIES]