53 const guint16 buffer_size,
58 guint16 buffer_len, expand, i, replace_len, replace_limit, template_len;
61 replace_limit = buffer_size - 1;
62 replace_len = strlen(replace);
63 template_len = strlen(buffer);
64 template = g_strdup(buffer);
68 for (i = 0; i <= template_len; i++) {
69 expand = buffer_len + replace_len < replace_limit ? replace_len : 1;
70 if (expand == 1 && buffer_len == replace_limit) {
73 if ((
template[i] != find) || ((expand == 1) && (replace_len > 1))) {
74 buffer[buffer_len++] =
template[i];
75 buffer[buffer_len] =
'\0';
77 strcat(buffer, replace);
78 buffer_len += replace_len;
88 gchar *dirname = g_path_get_dirname(filename);
89 int result = g_mkdir_with_parents(dirname, 0755);
95 const char *LogLevelTexts[] = {
96 "\x1b[34;1m" "DD" "\x1b[0m",
97 "\x1b[32;1m" "II" "\x1b[0m",
98 "\x1b[35;1m" "WW" "\x1b[0m",
99 "\x1b[31;1m" "EE" "\x1b[0m",
100 "\x1b[31;1m" "!!" "\x1b[0m",
101 "\x1b[30;1m" "??" "\x1b[0m",
111 void LOG(
LogLevel level,
const char *origin,
const char *format, ...) {
122 va_start(ap, format);
123 vsnprintf(buf,
sizeof(buf), format, ap);
125 if (strlen(buf) > 0) {