thesis/paper/artifacts/include/debug.h
2025-02-19 17:58:57 +01:00

143 lines
No EOL
3.6 KiB
C

#pragma once
#include <stdio.h>
#include <string.h>
#include <errno.h>
enum AnsiColor
{
Ansi_Red = 31,
Ansi_Green = 32,
Ansi_Yellow = 33,
Ansi_Blue = 34,
Ansi_Magenta = 35,
Ansi_Cyan = 36,
Ansi_White = 37,
};
size_t DEBUG = 0;
size_t INFO = 1;
size_t SUCCESS = 1;
size_t ERROR = 1;
#define DEBUG_NO_COLOR
#ifndef DEBUG_NO_COLOR
#define DEBUG_FORMAT_STRING "\033[1;%zum[%-1s]\033[0;39m "
#define PRINTF_INFO(x) DEBUG_FORMAT_STRING, debug_colors[x], debug_labels[x]
#define PRINTF_DEBUG(x) DEBUG_FORMAT_STRING "[%6d] ", debug_colors[x], debug_labels[x], gettid()
#else
#define DEBUG_FORMAT_STRING "[%-1s] "
#define PRINTF_INFO(x) DEBUG_FORMAT_STRING, debug_labels[x]
#define PRINTF_DEBUG(x) DEBUG_FORMAT_STRING "[%6d] ", debug_labels[x], gettid()
#endif
#define debug_debug(...) do { if (DEBUG) { printf(PRINTF_DEBUG(0)); printf(__VA_ARGS__); } } while (0)
#define debug_info(...) do { if (INFO) { printf(PRINTF_INFO(0)); printf(__VA_ARGS__); } } while (0)
#define debug_success(...) do { if (SUCCESS) { printf(PRINTF_INFO(1)); printf(__VA_ARGS__); } } while (0)
#define debug_error(...) do { if (ERROR) { printf(PRINTF_INFO(2)); printf(__VA_ARGS__); exit(-1); } } while (0)
#define debug_print(...) do { printf(PRINTF_INFO(0)); printf(__VA_ARGS__); } while (0)
// static int current_stage = 0;
// __attribute__((unused))static void next_stage(void)
// {
// current_stage++;
// }
static const char* debug_labels[] =
{
"*", "+", "!"
};
static const size_t debug_colors[] =
{
Ansi_Cyan, Ansi_Green, Ansi_Red
};
__attribute__((unused))static void hex_dump(size_t* addresses, size_t length)
{
for (size_t i = 0; i < length; ++i)
{
debug_info("0x%016lx\n", addresses[i]);
}
}
void wait_input(void)
{
debug_print("> ");
getchar();
}
#define MAX_TIME 4096
#define RATIO 2
#define MAX_TIME_VAL 128
void print_ptrs_times(size_t *ptrs, size_t *times, size_t size)
{
size_t max = 0;
size_t min = -1;
size_t adjusted_time;
for (size_t i = 0; i < size; ++i) {
if (times[i] > max && times[i] < 4000 + max)
max = times[i];
if (times[i] < min)
min = times[i];
}
for (size_t i = 0; i < size; ++i) {
adjusted_time = (times[i] - min) * MAX_TIME_VAL / max;
printf("% 5ld:% 7ld:%016zx:", i, times[i], ptrs[i]);
for (size_t j = 0; j < adjusted_time; ++j)
printf("#");
printf("\n");
}
}
void print_times(size_t *times, size_t size)
{
size_t max = 0;
size_t min = -1;
size_t adjusted_time;
for (size_t i = 0; i < size; ++i) {
if (times[i] > max && times[i] < 4000 + max)
max = times[i];
if (times[i] < min)
min = times[i];
}
for (size_t i = 0; i < size; ++i) {
adjusted_time = (times[i] - min) * MAX_TIME_VAL / max;
printf("% 5ld:% 7ld:", i, times[i]);
for (size_t j = 0; j < adjusted_time; ++j)
printf("#");
printf("\n");
}
}
void print_hist(size_t *times, size_t size)
{
size_t start_time = 0;
size_t end_time = MAX_TIME;
size_t hist[MAX_TIME];
memset(hist, 0, sizeof(hist));
for (size_t i = 0; i < size; ++i)
if (times[i]/RATIO < MAX_TIME)
++hist[times[i]/RATIO];
for (size_t i = 0; i < MAX_TIME; ++i) {
if (hist[i] > 3) {
start_time = i;
break;
}
}
for (ssize_t i = MAX_TIME; i >= 0; --i) {
if (hist[i] > 3) {
end_time = i;
break;
}
}
for (size_t i = start_time; i < end_time; ++i) {
printf("% 5ld:", i*RATIO);
for (size_t j = 0; j < hist[i]; ++j)
printf("#");
printf("\n");
}
}