// // Created by jedi on 18.11.21. // #include "log.h" #include constexpr unsigned syslog_buffer_size = 1024; char syslog_buf[syslog_buffer_size + 1]; volatile unsigned head = 0; volatile unsigned streams = 0; const char hex_lookup[] = "0123456789ABCDEF"; char str_i32[] = "00000000"; extern "C" void syslog_i32(const uint32_t val) { str_i32[7] = hex_lookup[val & 0xF]; str_i32[6] = hex_lookup[(val >> 4) & 0xF]; str_i32[5] = hex_lookup[(val >> 8) & 0xF]; str_i32[4] = hex_lookup[(val >> 12) & 0xF]; str_i32[3] = hex_lookup[(val >> 16) & 0xF]; str_i32[2] = hex_lookup[(val >> 20) & 0xF]; str_i32[1] = hex_lookup[(val >> 24) & 0xF]; str_i32[0] = hex_lookup[(val >> 28) & 0xF]; // syslog(str_i32); } extern "C" void syslog(const char *msg) { printf("%s", msg); while (char c = *msg++) { syslog_buf[head++ % syslog_buffer_size] = c; } syslog_buf[head] = 0; } unsigned syslog_current_tail() { if(head < syslog_buffer_size) return 0; return head + 1 - syslog_buffer_size; } unsigned syslog_data_after(unsigned local_tail) { if(local_tail > head) return 0; return (head % syslog_buffer_size) - (local_tail % syslog_buffer_size); } extern "C" int syslog_copy_out(char *out, unsigned len, unsigned local_tail) { unsigned cnt = 0; while (cnt < syslog_data_after(local_tail) && cnt < len) { out[cnt] = syslog_buf[local_tail % syslog_buffer_size + cnt]; cnt++; } return cnt; } extern "C" void syslog_attach() { streams++; } extern "C" void syslog_detach() { streams--; }