/******************************************************************************/ /* MCrypt, by LoRd_MuldeR */ /* This work has been released under the CC0 1.0 Universal license! */ /******************************************************************************/ #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN 1 #define _CRT_SECURE_NO_WARNINGS 1 #else #define _LARGEFILE64_SOURCE 1 #endif #include "utils.h" #include #include #ifdef _WIN32 #include #include #include #define S_IFMT _S_IFMT #define S_IFDIR _S_IFDIR #define S_IFIFO _S_IFIFO #endif void init_terminal(void) { #ifdef _WIN32 SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); _setmode(_fileno(stderr), _O_U8TEXT); #endif } char* CHR_to_utf8(const CHR*const input) { #ifdef _WIN32 char* buffer; DWORD buffer_size = 0U, result = 0U; buffer_size = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL); if (buffer_size < 1U) { return NULL; } buffer = (char*)malloc(sizeof(char) * buffer_size); if (!buffer) { return NULL; } result = WideCharToMultiByte(CP_UTF8, 0, input, -1, (LPSTR)buffer, buffer_size, NULL, NULL); if ((result > 0U) && (result <= buffer_size)) { return buffer; } free(buffer); return NULL; #else return strdup(input); #endif } uint64_t get_file_size(FILE* const file) { STAT64_T stat; if (FSTAT64(FILENO(file), &stat) != 0) { return UINT64_MAX; } uint16_t file_type = stat.st_mode & S_IFMT; if ((file_type != S_IFDIR) && (file_type != S_IFIFO)) { return (stat.st_size >= 0LL) ? ((uint64_t)stat.st_size) : 0U; } return 0U; } const CHR* get_file_name(const CHR* path) { const CHR* ptr; while (ptr = STRRCHR(path, T('/'))) { path = ptr + 1U; } while (ptr = STRRCHR(path, T('\\'))) { path = ptr + 1U; } return path; }