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); }