9 logger_init(logger_t
*logger
)
13 logger
->level
= LOGGER_INFO
;
14 logger
->callback
= NULL
;
18 logger_set_level(logger_t
*logger
, int level
)
22 logger
->level
= level
;
26 logger_set_callback(logger_t
*logger
, logger_callback_t callback
)
30 logger
->callback
= callback
;
34 logger_utf8_to_local(const char *str
)
38 /* FIXME: This is only implemented on Windows for now */
39 #if defined(_WIN32) || defined(_WIN64)
44 wclen
= MultiByteToWideChar(CP_UTF8
, 0, str
, -1, NULL
, 0);
45 wcstr
= malloc(sizeof(WCHAR
) * wclen
);
46 MultiByteToWideChar(CP_UTF8
, 0, str
, -1, wcstr
, wclen
);
48 mblen
= WideCharToMultiByte(CP_ACP
, 0, wcstr
, wclen
, NULL
, 0, NULL
, &failed
);
50 /* Invalid characters in input, conversion failed */
55 ret
= malloc(sizeof(CHAR
) * mblen
);
56 WideCharToMultiByte(CP_ACP
, 0, wcstr
, wclen
, ret
, mblen
, NULL
, NULL
);
64 logger_log(logger_t
*logger
, int level
, const char *fmt
, ...)
69 if (level
> logger
->level
)
72 buffer
[sizeof(buffer
)-1] = '\0';
74 vsnprintf(buffer
, sizeof(buffer
)-1, fmt
, ap
);
77 if (logger
->callback
) {
78 logger
->callback(level
, buffer
);
80 char *local
= logger_utf8_to_local(buffer
);
83 fprintf(stderr
, "%s", local
);
86 fprintf(stderr
, "%s", buffer
);