119 lines
3.2 KiB
C
119 lines
3.2 KiB
C
|
|
||
|
void log_sys(const char *msg, int length, int offset);
|
||
|
|
||
|
ulong tmr_rtime();
|
||
|
|
||
|
void log_out(const char *str) {
|
||
|
char c;
|
||
|
int pos = 0;
|
||
|
int last = 0;
|
||
|
uint color;
|
||
|
// fprintf(stderr, CON_DGRAY"["CON_GREEN"%s"CON_DGRAY"]["CON_LGRAY"%s"CON_DGRAY"][%s%s"CON_DGRAY"] %s",
|
||
|
// tm, prefix, log_concolor[level], log_levels[level], log_concolor[level]);
|
||
|
while(c = str[pos]) {
|
||
|
if(((c >= CHR_COLORS1) && (c <= CHR_COLORE1)) || ((c >= CHR_COLORS2) && (c <= CHR_COLORE2))) {
|
||
|
if(pos - last)
|
||
|
fwrite(&str[last], 1, pos - last, stderr);
|
||
|
color = (c >= CHR_COLORS2) && (c <= CHR_COLORE2) ? gdr.aux_colors[c - CHR_COLORS2] : text_colors[c - CHR_COLORS1];
|
||
|
fprintf(stderr, "\x1b[38;2;%d;%d;%dm", (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
|
||
|
last = ++pos;
|
||
|
continue;
|
||
|
}
|
||
|
else if(c == CHR_CRESET) {
|
||
|
if(pos - last)
|
||
|
fwrite(&str[last], 1, pos - last, stderr);
|
||
|
fprintf(stderr, "\x1b[0m");
|
||
|
last = ++pos;
|
||
|
continue;
|
||
|
}
|
||
|
else if(c == CHR_UNK) {
|
||
|
if(pos - last)
|
||
|
fwrite(&str[last], 1, pos - last, stderr);
|
||
|
fprintf(stderr, "?");
|
||
|
last = ++pos;
|
||
|
continue;
|
||
|
}
|
||
|
else if(c >= 0 && c < CHR_SPC && c != CHR_NLN) {
|
||
|
if(pos - last)
|
||
|
fwrite(&str[last], 1, pos - last, stderr);
|
||
|
last = ++pos;
|
||
|
continue;
|
||
|
}
|
||
|
pos++;
|
||
|
if(!str[pos] && (pos - last))
|
||
|
fwrite(&str[last], 1, pos - last, stderr);
|
||
|
}
|
||
|
fprintf(stderr, "\x1b[0m\n");
|
||
|
}
|
||
|
|
||
|
void log_msg(const char *prefix, byte level, const char *fmt, va_list ap) {
|
||
|
char tm[32];
|
||
|
int pos = 0;
|
||
|
int len;
|
||
|
if(level > sys.log_level)
|
||
|
return;
|
||
|
str_time(tm, tmr_rtime());
|
||
|
pos = sprintf(sys.log_buf, COL_DGRAY"["COL_GREEN"%s"COL_DGRAY"]["COL_LGRAY"%s"COL_DGRAY"][%s%s"COL_DGRAY"] %s",
|
||
|
tm, prefix, log_colors[level], log_levels[level], log_colors[level]);
|
||
|
len = pos + vsnprintf((sys.log_buf)+pos, LOG_BUF-pos, fmt, ap);
|
||
|
log_sys(sys.log_buf, len, pos - 1);
|
||
|
log_out(sys.log_buf);
|
||
|
}
|
||
|
|
||
|
void log_str(const char *prefix, byte level, const char *fmt, ...) {
|
||
|
va_list ap;
|
||
|
va_start(ap, fmt);
|
||
|
log_msg(prefix, level, fmt, ap);
|
||
|
va_end(ap);
|
||
|
}
|
||
|
|
||
|
LOG_FUNC(logu, LOG_USER)
|
||
|
LOG_FUNC(loge, LOG_ERROR)
|
||
|
LOG_FUNC(logw, LOG_WARN)
|
||
|
LOG_FUNC(logi, LOG_INFO)
|
||
|
LOG_FUNC(logp, LOG_PERF)
|
||
|
LOG_FUNC(logd, LOG_DEBUG)
|
||
|
LOG_FUNC(logt, LOG_TRACE)
|
||
|
|
||
|
void snd_log(byte level, const char *fmt, va_list ap) {
|
||
|
while(sgt.log_queue == SND_LOG) {
|
||
|
;
|
||
|
}
|
||
|
pthread_mutex_lock(&sgt.log_lock);
|
||
|
char *msg = &sgt.logs[sgt.log_push * SND_LOG_LEN];
|
||
|
msg[0] = (char)level;
|
||
|
vsnprintf(&msg[1], SND_LOG_LEN - 1, fmt, ap);
|
||
|
if(++(sgt.log_push) == SND_LOG)
|
||
|
sgt.log_push = 0;
|
||
|
sgt.log_queue += 1;
|
||
|
pthread_mutex_unlock(&sgt.log_lock);
|
||
|
}
|
||
|
|
||
|
SLOG_FUNC(snd_logu, LOG_USER)
|
||
|
SLOG_FUNC(snd_loge, LOG_ERROR)
|
||
|
SLOG_FUNC(snd_logw, LOG_WARN)
|
||
|
SLOG_FUNC(snd_logi, LOG_INFO)
|
||
|
SLOG_FUNC(snd_logp, LOG_PERF)
|
||
|
SLOG_FUNC(snd_logd, LOG_DEBUG)
|
||
|
SLOG_FUNC(snd_logt, LOG_TRACE)
|
||
|
SLOG_FUNC(snd_logx, SND_LOGX)
|
||
|
|
||
|
void plr_tlog(int type, const char *text);
|
||
|
|
||
|
void snd_log_flush() {
|
||
|
if(sgt.disabled)
|
||
|
return;
|
||
|
pthread_mutex_lock(&sgt.log_lock);
|
||
|
while(sgt.log_queue) {
|
||
|
char *msg = &sgt.logs[sgt.log_pop * SND_LOG_LEN];
|
||
|
if(msg[0] == SND_LOGX)
|
||
|
plr_tlog(msg[1] - '0', &msg[2]);
|
||
|
else
|
||
|
log_str(LOG_SND, msg[0], "%s", &msg[1]);
|
||
|
if(++(sgt.log_pop) == SND_LOG)
|
||
|
sgt.log_pop = 0;
|
||
|
sgt.log_queue -= 1;
|
||
|
}
|
||
|
pthread_mutex_unlock(&sgt.log_lock);
|
||
|
}
|