#include <string.h>
#include <tchar.h>
#include <errno.h>
#include "util.h"
#include "out.h"
#include "file.h"
#define ENOTSUP_STR "Operation not supported"
#define ECANCELED_STR "Operation canceled"
#define ENOERROR 0
#define ENOERROR_STR "Success"
#define UNMAPPED_STR "Unmapped error"
void
util_strerror(int errnum, char *buff, size_t bufflen)
{
switch (errnum) {
case ENOERROR:
strcpy_s(buff, bufflen, ENOERROR_STR);
break;
case ENOTSUP:
strcpy_s(buff, bufflen, ENOTSUP_STR);
break;
case ECANCELED:
strcpy_s(buff, bufflen, ECANCELED_STR);
break;
default:
if (strerror_s(buff, bufflen, errnum))
strcpy_s(buff, bufflen, UNMAPPED_STR);
}
}
char *
util_part_realpath(const char *path)
{
return strdup(path);
}
int
util_compare_file_inodes(const char *path1, const char *path2)
{
return strcmp(path1, path2) != 0;
}
void *
util_aligned_malloc(size_t alignment, size_t size)
{
return _aligned_malloc(size, alignment);
}
void
util_aligned_free(void *ptr)
{
_aligned_free(ptr);
}
char *
util_toUTF8(const wchar_t *wstr)
{
int size = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, wstr, -1,
NULL, 0, NULL, NULL);
if (size == 0)
goto err;
char *str = Malloc(size * sizeof(char));
if (str == NULL)
goto out;
if (WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, wstr, -1, str,
size, NULL, NULL) == 0) {
Free(str);
goto err;
}
out:
return str;
err:
errno = EINVAL;
return NULL;
}
void util_free_UTF8(char *str) {
Free(str);
}
wchar_t *
util_toUTF16(const char *str)
{
int size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, -1,
NULL, 0);
if (size == 0)
goto err;
wchar_t *wstr = Malloc(size * sizeof(wchar_t));
if (wstr == NULL)
goto out;
if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, -1, wstr,
size) == 0) {
Free(wstr);
goto err;
}
out:
return wstr;
err:
errno = EINVAL;
return NULL;
}
void
util_free_UTF16(wchar_t *wstr)
{
Free(wstr);
}
int
util_toUTF16_buff(const char *in, wchar_t *out, size_t out_size)
{
ASSERT(out != NULL);
int size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, in,
-1, NULL, 0);
if (size == 0 || out_size < size)
goto err;
if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, in, -1,
out, size) == 0)
goto err;
return 0;
err:
errno = EINVAL;
return -1;
}
int
util_toUTF8_buff(const wchar_t *in, char *out, size_t out_size)
{
ASSERT(out != NULL);
int size = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, in, -1,
NULL, 0, NULL, NULL);
if (size == 0 || out_size < size)
goto err;
if (WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, in, -1,
out, size, NULL, NULL) == 0)
goto err;
return 0;
err:
errno = EINVAL;
return -1;
}
char *
util_getexecname(char *path, size_t pathlen)
{
ssize_t cc;
if ((cc = GetModuleFileNameA(NULL, path, (DWORD)pathlen)) == 0)
strcpy(path, "unknown");
else
path[cc] = '\0';
return path;
}