Fix dqn lib and misc bugs
This commit is contained in:
parent
650126f039
commit
20fc9cbbaf
@ -52,7 +52,7 @@ REM Zi enables debug data, Z7 combines the debug files into one.
|
|||||||
REM W4 warning level 4
|
REM W4 warning level 4
|
||||||
REM WX treat warnings as errors
|
REM WX treat warnings as errors
|
||||||
REM wd4201 ignore: nonstandard extension used: nameless struct/union
|
REM wd4201 ignore: nonstandard extension used: nameless struct/union
|
||||||
set CompileFlags=-EHsc -GR- -Oi -MT -Z7 -W4 -WX -wd4201 -FC -Od -wd4127
|
set CompileFlags=-EHsc -GR- -Oi -MT -Z7 -W4 -WX -wd4201 -FC -Od -wd4127 /P
|
||||||
|
|
||||||
REM Include directories
|
REM Include directories
|
||||||
set IncludeFlags=
|
set IncludeFlags=
|
||||||
|
208
dqn.h
208
dqn.h
@ -707,16 +707,22 @@ struct DqnDeferHelper_
|
|||||||
// implicitly swallows the trailing comma.
|
// implicitly swallows the trailing comma.
|
||||||
|
|
||||||
// Always assert are enabled in release mode.
|
// Always assert are enabled in release mode.
|
||||||
#define DQN_ALWAYS_ASSERT(expr) DQN_ASSERTM(expr, "");
|
#define DQN_ALWAYS_ASSERT(expr) DQN_ASSERTM(expr, "")
|
||||||
#define DQN_ALWAYS_ASSERTM(expr, msg, ...) DQN_ASSERTM(expr, msg, ## __VA_ARGS__)
|
#define DQN_ALWAYS_ASSERTM(expr, msg, ...) DQN_ASSERTM(expr, msg, ## __VA_ARGS__)
|
||||||
|
|
||||||
#define DQN_ASSERT(expr) DQN_ASSERTM(expr, "asserted.");
|
// Generate a DqnLogger::Context structure
|
||||||
|
#define DQN_LOGGER_MAKE_CONTEXT_ \
|
||||||
|
{ \
|
||||||
|
(char *)__FILE__, DQN_CHAR_COUNT(__FILE__), (char *)__func__, DQN_CHAR_COUNT(__func__), __LINE__ \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DQN_ASSERT(expr) DQN_ASSERTM(expr, "asserted.")
|
||||||
#define DQN_ASSERTM(expr, msg, ...) \
|
#define DQN_ASSERTM(expr, msg, ...) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
if (!(expr)) \
|
if (!(expr)) \
|
||||||
{ \
|
{ \
|
||||||
dqn_lib_context_->logger.Log(DqnLogger::Type::Error, {__FILE__, DQN_CHAR_COUNT(__FILE__), __func__, DQN_CHAR_COUNT(__func__), __LINE__}, "["#expr"] " msg, ## __VA_ARGS__); \
|
dqn_lib_context_.logger->Log(DqnLogger::Type::Error, DQN_LOGGER_MAKE_CONTEXT_, "[" #expr "] " msg, ##__VA_ARGS__); \
|
||||||
(*((int *)0)) = 0; \
|
(*((int *)0)) = 0; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
@ -725,7 +731,13 @@ struct DqnDeferHelper_
|
|||||||
#define DQN_COMPILE_ASSERT(expr) DQN_COMPILE_ASSERT_INTERNAL(expr, DQN_UNIQUE_NAME(DqnCompileAssertInternal_))
|
#define DQN_COMPILE_ASSERT(expr) DQN_COMPILE_ASSERT_INTERNAL(expr, DQN_UNIQUE_NAME(DqnCompileAssertInternal_))
|
||||||
#define DQN_COMPILE_ASSERT_INTERNAL(expr, name) typedef char name[((int)(expr)) * 2 - 1];
|
#define DQN_COMPILE_ASSERT_INTERNAL(expr, name) typedef char name[((int)(expr)) * 2 - 1];
|
||||||
|
|
||||||
extern struct DqnLibContext *dqn_lib_context_;
|
struct DqnLibContext
|
||||||
|
{
|
||||||
|
struct DqnAllocator *xallocator;
|
||||||
|
struct DqnAllocator *allocator;
|
||||||
|
struct DqnLogger *logger;
|
||||||
|
};
|
||||||
|
extern DqnLibContext dqn_lib_context_;
|
||||||
|
|
||||||
DQN_COMPILE_ASSERT(sizeof(isize) == sizeof(usize));
|
DQN_COMPILE_ASSERT(sizeof(isize) == sizeof(usize));
|
||||||
|
|
||||||
@ -736,7 +748,7 @@ struct DqnAllocator
|
|||||||
{
|
{
|
||||||
enum struct Type
|
enum struct Type
|
||||||
{
|
{
|
||||||
None, // Malloc, realloc, free
|
Default, // Malloc, realloc, free
|
||||||
XAllocator, // Malloc, realloc, free, crash on failure
|
XAllocator, // Malloc, realloc, free, crash on failure
|
||||||
VirtualMemory, // VirtualAlloc, VirtualFree, mmap, munmap
|
VirtualMemory, // VirtualAlloc, VirtualFree, mmap, munmap
|
||||||
DqnMemStack,
|
DqnMemStack,
|
||||||
@ -754,11 +766,6 @@ struct DqnAllocator
|
|||||||
void Free (void *ptr, size_t old_size);
|
void Free (void *ptr, size_t old_size);
|
||||||
};
|
};
|
||||||
|
|
||||||
DqnAllocator DQN_DEFAULT_ALLOCATOR_ = {};
|
|
||||||
DqnAllocator DQN_XALLOCATOR_(DqnAllocator::Type::XAllocator);
|
|
||||||
DqnAllocator *DQN_DEFAULT_ALLOCATOR = &DQN_DEFAULT_ALLOCATOR_;
|
|
||||||
DqnAllocator *DQN_XALLOCATOR = &DQN_XALLOCATOR_;
|
|
||||||
|
|
||||||
// #DqnSlice/#DqnBuffer
|
// #DqnSlice/#DqnBuffer
|
||||||
// =================================================================================================
|
// =================================================================================================
|
||||||
// NOTE: A slice and buffer is the same thing but, slices have the pre-existing concepts of being a
|
// NOTE: A slice and buffer is the same thing but, slices have the pre-existing concepts of being a
|
||||||
@ -791,7 +798,7 @@ DQN_FILE_SCOPE DqnBuffer<T> DqnBuffer_Copy(DqnAllocator *allocator, T const *dat
|
|||||||
DqnBuffer<T> result;
|
DqnBuffer<T> result;
|
||||||
result.len = len;
|
result.len = len;
|
||||||
result.data = static_cast<T *>(allocator->Malloc(len * sizeof(T), Dqn::ZeroMem::No));
|
result.data = static_cast<T *>(allocator->Malloc(len * sizeof(T), Dqn::ZeroMem::No));
|
||||||
DqnMem_Copy(result.data, data, len);
|
DqnMem_Copy(result.data, data, len * sizeof(T));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -801,13 +808,11 @@ DQN_FILE_SCOPE DqnBuffer<T> DqnBuffer_CopyAndNullTerminate(DqnAllocator *allocat
|
|||||||
DqnBuffer<T> result;
|
DqnBuffer<T> result;
|
||||||
result.len = len;
|
result.len = len;
|
||||||
result.data = static_cast<T *>(allocator->Malloc((len + 1) * sizeof(T), Dqn::ZeroMem::No));
|
result.data = static_cast<T *>(allocator->Malloc((len + 1) * sizeof(T), Dqn::ZeroMem::No));
|
||||||
DqnMem_Copy(result.data, data, len);
|
DqnMem_Copy(result.data, data, len * sizeof(T));
|
||||||
result.data[len] = 0;
|
result.data[len] = 0;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_FILE_SCOPE DqnBuffer<char> DqnBuffer_CopyString(struct DqnAllocator *allocator, void const *str, int len = -1);
|
|
||||||
|
|
||||||
// #DqnFixedString Public API - Fixed sized strings at compile time
|
// #DqnFixedString Public API - Fixed sized strings at compile time
|
||||||
// =================================================================================================
|
// =================================================================================================
|
||||||
FILE_SCOPE int DqnFixedString__Append (char *dest, int dest_size, char const *src, int len = -1);
|
FILE_SCOPE int DqnFixedString__Append (char *dest, int dest_size, char const *src, int len = -1);
|
||||||
@ -849,7 +854,7 @@ struct DqnFixedString
|
|||||||
|
|
||||||
int VSprintfAtOffset(char const *fmt, va_list va, int offset)
|
int VSprintfAtOffset(char const *fmt, va_list va, int offset)
|
||||||
{
|
{
|
||||||
if (Dqn::is_debug) DQN_ASSERT(Dqn_vsnprintf(nullptr, 0, fmt, va) < MAX);
|
if (Dqn::is_debug) { DQN_ASSERT(Dqn_vsnprintf(nullptr, 0, fmt, va) < MAX); }
|
||||||
char *start = str + offset;
|
char *start = str + offset;
|
||||||
int result = Dqn_vsnprintf(start, static_cast<int>((str + MAX) - start), fmt, va);
|
int result = Dqn_vsnprintf(start, static_cast<int>((str + MAX) - start), fmt, va);
|
||||||
len = (offset + result);
|
len = (offset + result);
|
||||||
@ -997,6 +1002,10 @@ struct DqnMemTracker
|
|||||||
#define DQN_MEMSTACK_PUSH_STRUCT(stack, Type) DQN_MEMSTACK_PUSH_ARRAY(stack, Type, 1)
|
#define DQN_MEMSTACK_PUSH_STRUCT(stack, Type) DQN_MEMSTACK_PUSH_ARRAY(stack, Type, 1)
|
||||||
#define DQN_MEMSTACK_PUSH_ARRAY(stack, Type, num) (Type *)(stack)->Push_(sizeof(Type) * (num)); DQN_MEMTRACKER_TAG_ALLOC(&(stack)->tracker, sizeof(Type) * num)
|
#define DQN_MEMSTACK_PUSH_ARRAY(stack, Type, num) (Type *)(stack)->Push_(sizeof(Type) * (num)); DQN_MEMTRACKER_TAG_ALLOC(&(stack)->tracker, sizeof(Type) * num)
|
||||||
|
|
||||||
|
#define DQN_MEMSTACK_PUSH_BACK(stack, size) DQN_MEMSTACK_PUSH_BACK_ARRAY(stack, char, size)
|
||||||
|
#define DQN_MEMSTACK_PUSH_BACK_STRUCT(stack, Type) DQN_MEMSTACK_PUSH_BACK_ARRAY(stack, Type, 1)
|
||||||
|
#define DQN_MEMSTACK_PUSH_BACK_ARRAY(stack, Type, num) (Type *)(stack)->Push_(sizeof(Type) * (num), DqnMemStack::PushType::Opposite); DQN_MEMTRACKER_TAG_ALLOC(&(stack)->tracker, sizeof(Type) * num)
|
||||||
|
|
||||||
struct DqnMemStack
|
struct DqnMemStack
|
||||||
{
|
{
|
||||||
static const i32 MINIMUM_BLOCK_SIZE = DQN_KILOBYTE(64);
|
static const i32 MINIMUM_BLOCK_SIZE = DQN_KILOBYTE(64);
|
||||||
@ -1041,8 +1050,8 @@ struct DqnMemStack
|
|||||||
DqnMemStack(void *mem, isize size, Dqn::ZeroMem clear, u32 flags_ = 0, DqnMemTracker::Flag flags = DqnMemTracker::Flag::Simple); // Use fixed memory from the given buffer. Assert after buffer is full.
|
DqnMemStack(void *mem, isize size, Dqn::ZeroMem clear, u32 flags_ = 0, DqnMemTracker::Flag flags = DqnMemTracker::Flag::Simple); // Use fixed memory from the given buffer. Assert after buffer is full.
|
||||||
|
|
||||||
// Init and alloc additional memory blocks when full, but only if NonExpandable flag is not set.
|
// Init and alloc additional memory blocks when full, but only if NonExpandable flag is not set.
|
||||||
DqnMemStack (isize size, Dqn::ZeroMem clear, u32 flags_ = 0, DqnMemTracker::Flag tracker_flags = DqnMemTracker::Simple, DqnAllocator *block_allocator_ = DQN_DEFAULT_ALLOCATOR) { LazyInit(size, clear, flags_, tracker_flags, block_allocator_); }
|
DqnMemStack (isize size, Dqn::ZeroMem clear, u32 flags_ = 0, DqnMemTracker::Flag tracker_flags = DqnMemTracker::Simple, DqnAllocator *block_allocator_ = dqn_lib_context_.allocator) { LazyInit(size, clear, flags_, tracker_flags, block_allocator_); }
|
||||||
void LazyInit(isize size, Dqn::ZeroMem clear, u32 flags_ = 0, DqnMemTracker::Flag tracker_flags = DqnMemTracker::Simple, DqnAllocator *block_allocator_ = DQN_DEFAULT_ALLOCATOR);
|
void LazyInit(isize size, Dqn::ZeroMem clear, u32 flags_ = 0, DqnMemTracker::Flag tracker_flags = DqnMemTracker::Simple, DqnAllocator *block_allocator_ = dqn_lib_context_.allocator);
|
||||||
|
|
||||||
// Allocation
|
// Allocation
|
||||||
// =============================================================================================
|
// =============================================================================================
|
||||||
@ -1156,12 +1165,12 @@ struct DqnLogger
|
|||||||
int line_num;
|
int line_num;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DQN_LOGGER_CONTEXT {__FILE__, DQN_CHAR_COUNT(__FILE__), __func__, DQN_CHAR_COUNT(__func__), __LINE__}
|
#define DQN_LOGGER(logger, type, fmt, ...) (logger)->Log(type, DQN_LOGGER_MAKE_CONTEXT_, fmt, ## __VA_ARGS__)
|
||||||
#define DQN_LOGGER_D(logger, fmt, ...) (logger)->Log(DqnLogger::Type::Debug, {__FILE__, DQN_CHAR_COUNT(__FILE__), __func__, DQN_CHAR_COUNT(__func__), __LINE__}, fmt, ## __VA_ARGS__)
|
#define DQN_LOGGER_E(logger, fmt, ...) (logger)->Log(DqnLogger::Type::Error, DQN_LOGGER_MAKE_CONTEXT_, fmt, ## __VA_ARGS__)
|
||||||
#define DQN_LOGGER_W(logger, fmt, ...) (logger)->Log(DqnLogger::Type::Warning, {__FILE__, DQN_CHAR_COUNT(__FILE__), __func__, DQN_CHAR_COUNT(__func__), __LINE__}, fmt, ## __VA_ARGS__)
|
#define DQN_LOGGER_E(logger, fmt, ...) (logger)->Log(DqnLogger::Type::Error, DQN_LOGGER_MAKE_CONTEXT_, fmt, ## __VA_ARGS__)
|
||||||
#define DQN_LOGGER_E(logger, fmt, ...) (logger)->Log(DqnLogger::Type::Error, {__FILE__, DQN_CHAR_COUNT(__FILE__), __func__, DQN_CHAR_COUNT(__func__), __LINE__}, fmt, ## __VA_ARGS__)
|
#define DQN_LOGGER_W(logger, fmt, ...) (logger)->Log(DqnLogger::Type::Warning, DQN_LOGGER_MAKE_CONTEXT_, fmt, ## __VA_ARGS__)
|
||||||
#define DQN_LOGGER_M(logger, fmt, ...) (logger)->Log(DqnLogger::Type::Message, {__FILE__, DQN_CHAR_COUNT(__FILE__), __func__, DQN_CHAR_COUNT(__func__), __LINE__}, fmt, ## __VA_ARGS__)
|
#define DQN_LOGGER_D(logger, fmt, ...) (logger)->Log(DqnLogger::Type::Debug, DQN_LOGGER_MAKE_CONTEXT_, fmt, ## __VA_ARGS__)
|
||||||
#define DQN_LOGGER(logger, type, fmt, ...) (logger)->Log(type, {__FILE__, DQN_CHAR_COUNT(__FILE__), __func__, DQN_CHAR_COUNT(__func__), __LINE__}, fmt, ## __VA_ARGS__)
|
#define DQN_LOGGER_M(logger, fmt, ...) (logger)->Log(DqnLogger::Type::Message, DQN_LOGGER_MAKE_CONTEXT_, fmt, ## __VA_ARGS__)
|
||||||
|
|
||||||
DqnMemStack allocator;
|
DqnMemStack allocator;
|
||||||
DqnFixedString1024 log_builder;
|
DqnFixedString1024 log_builder;
|
||||||
@ -1180,8 +1189,8 @@ struct DqnLogger
|
|||||||
|
|
||||||
// return: A static string whose lifetime persists until the next log call.
|
// return: A static string whose lifetime persists until the next log call.
|
||||||
char const *LogNoContext(Type type, char const *fmt, ...);
|
char const *LogNoContext(Type type, char const *fmt, ...);
|
||||||
char const *Log (Type type, Context const log_context, char const *fmt, ...);
|
char const *Log (Type type, Context log_context, char const *fmt, ...);
|
||||||
char const *LogVA (Type type, Context const log_context, char const *fmt, va_list va);
|
char const *LogVA (Type type, Context log_context, char const *fmt, va_list va);
|
||||||
};
|
};
|
||||||
|
|
||||||
// #DqnArray
|
// #DqnArray
|
||||||
@ -1189,7 +1198,7 @@ struct DqnLogger
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
struct DqnArray
|
struct DqnArray
|
||||||
{
|
{
|
||||||
DqnAllocator *allocator = DQN_DEFAULT_ALLOCATOR;
|
DqnAllocator *allocator = dqn_lib_context_.allocator;
|
||||||
isize len;
|
isize len;
|
||||||
isize max;
|
isize max;
|
||||||
T *data;
|
T *data;
|
||||||
@ -1354,7 +1363,7 @@ DQN_FILE_SCOPE void DqnWStr_Reverse (wchar_t *buf, i32 buf_size);
|
|||||||
// =================================================================================================
|
// =================================================================================================
|
||||||
struct DqnString
|
struct DqnString
|
||||||
{
|
{
|
||||||
DqnAllocator *allocator = DQN_DEFAULT_ALLOCATOR;
|
DqnAllocator *allocator = dqn_lib_context_.allocator;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
int max = 0;
|
int max = 0;
|
||||||
char *str = nullptr;
|
char *str = nullptr;
|
||||||
@ -1401,7 +1410,7 @@ struct DqnString
|
|||||||
// return: -1 if invalid, or if buf_size is 0 the required buffer length in wchar_t characters
|
// return: -1 if invalid, or if buf_size is 0 the required buffer length in wchar_t characters
|
||||||
i32 ToWChar(wchar_t *const buf, i32 const buf_size) const;
|
i32 ToWChar(wchar_t *const buf, i32 const buf_size) const;
|
||||||
// return: String allocated using api.
|
// return: String allocated using api.
|
||||||
wchar_t *ToWChar(DqnAllocator *allocator = DQN_DEFAULT_ALLOCATOR) const;
|
wchar_t *ToWChar(DqnAllocator *allocator = dqn_lib_context_.allocator) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2066,12 +2075,6 @@ DQN_FILE_SCOPE DqnJson DqnJson_Get (DqnJson const input, DqnSlice<ch
|
|||||||
// return: The array item.
|
// return: The array item.
|
||||||
DQN_FILE_SCOPE DqnJson DqnJson_GetNextArrayItem(DqnJson *iterator);
|
DQN_FILE_SCOPE DqnJson DqnJson_GetNextArrayItem(DqnJson *iterator);
|
||||||
|
|
||||||
struct DqnLibContext
|
|
||||||
{
|
|
||||||
DqnAllocator allocator = DqnAllocator(DqnAllocator::Type::XAllocator);
|
|
||||||
DqnLogger logger;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* DQN_H */
|
#endif /* DQN_H */
|
||||||
|
|
||||||
// #XPlatform (Win32 & Unix)
|
// #XPlatform (Win32 & Unix)
|
||||||
@ -2121,7 +2124,7 @@ struct DqnVArray
|
|||||||
T *Back () { return (len > 0) ? (data + (len - 1)) : nullptr; }
|
T *Back () { return (len > 0) ? (data + (len - 1)) : nullptr; }
|
||||||
T *Make (isize num = 1) { if (!data) LazyInit(1024); len += num; DQN_ASSERT(len <= max); return &data[len - num]; }
|
T *Make (isize num = 1) { if (!data) LazyInit(1024); len += num; DQN_ASSERT(len <= max); return &data[len - num]; }
|
||||||
T *Push (T const &v) { data[len++] = v; return data + (len - 1); }
|
T *Push (T const &v) { data[len++] = v; return data + (len - 1); }
|
||||||
T *Push (T const *v, isize v_len = 1) { T *result = data + len; for (isize i = 0; i < new_len; ++i) data[len++] = v[i]; return result; }
|
T *Push (T const *v, isize v_len = 1) { T *result = data + len; for (isize i = 0; i < v_len; ++i) data[len++] = v[i]; return result; }
|
||||||
void Pop () { if (len > 0) len--; }
|
void Pop () { if (len > 0) len--; }
|
||||||
void Erase (isize index) { if (!data) return; DQN_ASSERT(index >= 0 && index < len); data[index] = data[--len]; }
|
void Erase (isize index) { if (!data) return; DQN_ASSERT(index >= 0 && index < len); data[index] = data[--len]; }
|
||||||
void EraseStable(isize index);
|
void EraseStable(isize index);
|
||||||
@ -2494,8 +2497,8 @@ DQN_FILE_SCOPE bool DqnFile_ReadAll(wchar_t const *path, u8 *buf, usize buf_si
|
|||||||
|
|
||||||
// Buffer is null-terminated and should be freed when done with.
|
// Buffer is null-terminated and should be freed when done with.
|
||||||
// return: False if file access failure OR nullptr arguments.
|
// return: False if file access failure OR nullptr arguments.
|
||||||
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(char const *path, usize *buf_size, DqnAllocator *allocator = DQN_DEFAULT_ALLOCATOR);
|
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(char const *path, usize *buf_size, DqnAllocator *allocator = dqn_lib_context_.allocator);
|
||||||
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(wchar_t const *path, usize *buf_size, DqnAllocator *allocator = DQN_DEFAULT_ALLOCATOR);
|
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(wchar_t const *path, usize *buf_size, DqnAllocator *allocator = dqn_lib_context_.allocator);
|
||||||
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(wchar_t const *path, usize *buf_size, DqnMemStack *stack);
|
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(wchar_t const *path, usize *buf_size, DqnMemStack *stack);
|
||||||
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(char const *path, usize *buf_size, DqnMemStack *stack);
|
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(char const *path, usize *buf_size, DqnMemStack *stack);
|
||||||
|
|
||||||
@ -2524,8 +2527,8 @@ DQN_FILE_SCOPE bool DqnFile_Copy (wchar_t const *src, wchar_t const *dest);
|
|||||||
// num_files: Pass in a ref to a i32. The function fills it out with the number of entries.
|
// num_files: Pass in a ref to a i32. The function fills it out with the number of entries.
|
||||||
// return: An array of strings of the files in the directory in UTF-8. The directory lisiting is
|
// return: An array of strings of the files in the directory in UTF-8. The directory lisiting is
|
||||||
// allocated with malloc and must be freed using free() or the helper function ListDirFree()
|
// allocated with malloc and must be freed using free() or the helper function ListDirFree()
|
||||||
DQN_FILE_SCOPE char **DqnFile_ListDir (char const *dir, i32 *num_files, DqnAllocator *allocator = DQN_DEFAULT_ALLOCATOR);
|
DQN_FILE_SCOPE char **DqnFile_ListDir (char const *dir, i32 *num_files, DqnAllocator *allocator = dqn_lib_context_.allocator);
|
||||||
DQN_FILE_SCOPE void DqnFile_ListDirFree (char **file_list, i32 num_files, DqnAllocator *allocator = DQN_DEFAULT_ALLOCATOR);
|
DQN_FILE_SCOPE void DqnFile_ListDirFree (char **file_list, i32 num_files, DqnAllocator *allocator = dqn_lib_context_.allocator);
|
||||||
|
|
||||||
// XPlatform > #DqnCatalog
|
// XPlatform > #DqnCatalog
|
||||||
// =================================================================================================
|
// =================================================================================================
|
||||||
@ -2595,7 +2598,7 @@ DQN_CATALOG_TEMPLATE bool DQN_CATALOG_DECL::QueryAndUpdateAsset(DqnCatalogPath c
|
|||||||
DqnFileInfo info = {};
|
DqnFileInfo info = {};
|
||||||
if (!DqnFile_GetInfo(file.str, &info))
|
if (!DqnFile_GetInfo(file.str, &info))
|
||||||
{
|
{
|
||||||
DQN_LOGGER_W(&dqn_lib_context_->logger, "Catalog could not get file info for: %s\n", file.str);
|
DQN_LOGGER_W(dqn_lib_context_.logger, "Catalog could not get file info for: %s\n", file.str);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2611,7 +2614,7 @@ DQN_CATALOG_TEMPLATE bool DQN_CATALOG_DECL::QueryAndUpdateAsset(DqnCatalogPath c
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DQN_LOGGER_W(&dqn_lib_context_->logger, "Catalog could not load file: %s\n", file.str);
|
DQN_LOGGER_W(dqn_lib_context_.logger, "Catalog could not load file: %s\n", file.str);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2812,12 +2815,6 @@ DQN_FILE_SCOPE void DqnWin32_DisplayErrorCode (const DWORD error, const char *co
|
|||||||
// ...: Variable args alike printf, powered by stb_sprintf
|
// ...: Variable args alike printf, powered by stb_sprintf
|
||||||
DQN_FILE_SCOPE void DqnWin32_OutputDebugString(const char *const fmt_str, ...);
|
DQN_FILE_SCOPE void DqnWin32_OutputDebugString(const char *const fmt_str, ...);
|
||||||
|
|
||||||
// Get the full path of to the current processes executable, and return the char offset in the
|
|
||||||
// string to the last backslash, i.e. the directory.
|
|
||||||
// buf: Filled with the path to the executable file.
|
|
||||||
// return: The offset to the last backslash. -1 if buf_len was not large enough or buf is null. (i.e.
|
|
||||||
// buf + offsetToLastSlash + 1, gives C:/Path/)
|
|
||||||
DQN_FILE_SCOPE i32 DqnWin32_GetExeDirectory (wchar_t *const buf, const u32 buf_len);
|
|
||||||
DQN_FILE_SCOPE void DqnWin32_GetExeNameAndDirectory(DqnMemStack *allocator, DqnBuffer<wchar_t> *exe_name, DqnBuffer<wchar_t> *exe_directory);
|
DQN_FILE_SCOPE void DqnWin32_GetExeNameAndDirectory(DqnMemStack *allocator, DqnBuffer<wchar_t> *exe_name, DqnBuffer<wchar_t> *exe_directory);
|
||||||
DQN_FILE_SCOPE u64 DqnWin32_EpochTimeUTC ();
|
DQN_FILE_SCOPE u64 DqnWin32_EpochTimeUTC ();
|
||||||
DQN_FILE_SCOPE u64 DqnWin32_EpochTimeLocal ();
|
DQN_FILE_SCOPE u64 DqnWin32_EpochTimeLocal ();
|
||||||
@ -2833,8 +2830,10 @@ DQN_FILE_SCOPE u64 DqnWin32_EpochTimeLocal ();
|
|||||||
#include <stdlib.h> // For calloc, malloc, free
|
#include <stdlib.h> // For calloc, malloc, free
|
||||||
#include <stdio.h> // For printf
|
#include <stdio.h> // For printf
|
||||||
|
|
||||||
DqnLibContext dqn_lib_context__;
|
DqnAllocator xallocator_;
|
||||||
DqnLibContext *dqn_lib_context_ = &dqn_lib_context__;
|
DqnAllocator allocator_;
|
||||||
|
DqnLogger logger_;
|
||||||
|
DqnLibContext dqn_lib_context_ = {&xallocator_, &allocator_, &logger_};
|
||||||
|
|
||||||
// NOTE: STB_SPRINTF is included when DQN_IMPLEMENTATION defined
|
// NOTE: STB_SPRINTF is included when DQN_IMPLEMENTATION defined
|
||||||
// #define STB_SPRINTF_IMPLEMENTATION
|
// #define STB_SPRINTF_IMPLEMENTATION
|
||||||
@ -2940,7 +2939,7 @@ DQN_FILE_SCOPE void *DqnAllocator::Malloc(size_t size, Dqn::ZeroMem zero)
|
|||||||
void *result = nullptr;
|
void *result = nullptr;
|
||||||
switch(this->type)
|
switch(this->type)
|
||||||
{
|
{
|
||||||
case Type::None: (zero == Dqn::ZeroMem::Yes) ? result = DqnMem_Alloc(size) : result = DqnMem_Calloc(size); break;
|
case Type::Default: (zero == Dqn::ZeroMem::Yes) ? result = DqnMem_Alloc(size) : result = DqnMem_Calloc(size); break;
|
||||||
case Type::XAllocator:
|
case Type::XAllocator:
|
||||||
{
|
{
|
||||||
(zero == Dqn::ZeroMem::Yes) ? result = DqnMem_Alloc(size) : result = DqnMem_Calloc(size);
|
(zero == Dqn::ZeroMem::Yes) ? result = DqnMem_Alloc(size) : result = DqnMem_Calloc(size);
|
||||||
@ -2976,7 +2975,7 @@ DQN_FILE_SCOPE void *DqnAllocator::Realloc(void *ptr, size_t new_size)
|
|||||||
void *result = nullptr;
|
void *result = nullptr;
|
||||||
switch(this->type)
|
switch(this->type)
|
||||||
{
|
{
|
||||||
case Type::None: result = DqnMem_Realloc(ptr, new_size); break;
|
case Type::Default: result = DqnMem_Realloc(ptr, new_size); break;
|
||||||
case Type::XAllocator:
|
case Type::XAllocator:
|
||||||
{
|
{
|
||||||
result = DqnMem_Realloc(ptr, new_size);
|
result = DqnMem_Realloc(ptr, new_size);
|
||||||
@ -2990,7 +2989,7 @@ DQN_FILE_SCOPE void *DqnAllocator::Realloc(void *ptr, size_t new_size)
|
|||||||
DqnPtrHeader *ptr_header = mem_stack->tracker.PtrToHeader(static_cast<char *>(ptr));
|
DqnPtrHeader *ptr_header = mem_stack->tracker.PtrToHeader(static_cast<char *>(ptr));
|
||||||
result = DQN_MEMSTACK_PUSH(mem_stack, new_size);
|
result = DQN_MEMSTACK_PUSH(mem_stack, new_size);
|
||||||
DqnMem_Copy(result, ptr, ptr_header->alloc_amount);
|
DqnMem_Copy(result, ptr, ptr_header->alloc_amount);
|
||||||
DQN_LOGGER_W(&dqn_lib_context_->logger, "Memory stack used realloc and ptr: %p with: %zu bytes has been lost", ptr, ptr_header->alloc_amount);
|
DQN_LOGGER_W(dqn_lib_context_.logger, "Memory stack used realloc and ptr: %p with: %zu bytes has been lost", ptr, ptr_header->alloc_amount);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default: DQN_ASSERTM(DQN_INVALID_CODE_PATH, "New context type not handled."); break;
|
default: DQN_ASSERTM(DQN_INVALID_CODE_PATH, "New context type not handled."); break;
|
||||||
@ -3004,7 +3003,7 @@ DQN_FILE_SCOPE void DqnAllocator::Free(void *ptr, size_t old_size)
|
|||||||
switch(this->type)
|
switch(this->type)
|
||||||
{
|
{
|
||||||
case Type::XAllocator:
|
case Type::XAllocator:
|
||||||
case Type::None: DqnMem_Free(ptr); break;
|
case Type::Default: DqnMem_Free(ptr); break;
|
||||||
case Type::VirtualMemory:
|
case Type::VirtualMemory:
|
||||||
{
|
{
|
||||||
#if defined(DQN_PLATFORM_HEADER)
|
#if defined(DQN_PLATFORM_HEADER)
|
||||||
@ -3032,14 +3031,14 @@ void DqnMemTracker::Init(DqnMemTracker::Flag flag)
|
|||||||
if (flag & DqnMemTracker::TrackPtr)
|
if (flag & DqnMemTracker::TrackPtr)
|
||||||
{
|
{
|
||||||
this->ptrs_max = 8192;
|
this->ptrs_max = 8192;
|
||||||
this->ptrs = (void **)dqn_lib_context_->allocator.Malloc(this->ptrs_max * sizeof(this->ptrs));
|
this->ptrs = (void **)dqn_lib_context_.allocator->Malloc(this->ptrs_max * sizeof(this->ptrs));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flag & DqnMemTracker::TagAllocation)
|
if (flag & DqnMemTracker::TagAllocation)
|
||||||
{
|
{
|
||||||
this->tagged_allocs_max = 4096;
|
this->tagged_allocs_max = 4096;
|
||||||
this->tagged_allocs = (decltype(this->tagged_allocs))dqn_lib_context_->allocator.Malloc(this->tagged_allocs_max * sizeof(*this->tagged_allocs));
|
this->tagged_allocs = (decltype(this->tagged_allocs))dqn_lib_context_.allocator->Malloc(this->tagged_allocs_max * sizeof(*this->tagged_allocs));
|
||||||
this->tagged_allocs_used_list = (decltype(this->tagged_allocs_used_list))dqn_lib_context_->allocator.Malloc(this->tagged_allocs_max * sizeof(*this->tagged_allocs_used_list));
|
this->tagged_allocs_used_list = (decltype(this->tagged_allocs_used_list))dqn_lib_context_.allocator->Malloc(this->tagged_allocs_max * sizeof(*this->tagged_allocs_used_list));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3054,15 +3053,15 @@ void DqnMemTracker::Free()
|
|||||||
{
|
{
|
||||||
TaggedAllocation *tag_to_free = tagged_alloc;
|
TaggedAllocation *tag_to_free = tagged_alloc;
|
||||||
tagged_alloc = tagged_alloc->next;
|
tagged_alloc = tagged_alloc->next;
|
||||||
dqn_lib_context_->allocator.Free(tag_to_free->filename.str, tag_to_free->filename.len);
|
dqn_lib_context_.allocator->Free(tag_to_free->filename.str, tag_to_free->filename.len);
|
||||||
dqn_lib_context_->allocator.Free(tag_to_free->function.str, tag_to_free->function.len);
|
dqn_lib_context_.allocator->Free(tag_to_free->function.str, tag_to_free->function.len);
|
||||||
dqn_lib_context_->allocator.Free(tag_to_free, sizeof(tag_to_free));
|
dqn_lib_context_.allocator->Free(tag_to_free, sizeof(tag_to_free));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->IsTrackingPtrs())
|
if (this->IsTrackingPtrs())
|
||||||
dqn_lib_context_->allocator.Free(this->ptrs, sizeof(*this->ptrs) * ptrs_max);
|
dqn_lib_context_.allocator->Free(this->ptrs, sizeof(*this->ptrs) * ptrs_max);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DqnMemTracker::Tag_(DqnBuffer<const char> filename, DqnBuffer<const char> function, int line_num, DqnBuffer<const char> filename_line_num_data, isize bytes)
|
void DqnMemTracker::Tag_(DqnBuffer<const char> filename, DqnBuffer<const char> function, int line_num, DqnBuffer<const char> filename_line_num_data, isize bytes)
|
||||||
@ -3079,13 +3078,13 @@ void DqnMemTracker::Tag_(DqnBuffer<const char> filename, DqnBuffer<const char> f
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(*entry))
|
if (!(*entry))
|
||||||
*entry = (TaggedAllocation *)dqn_lib_context_->allocator.Malloc(sizeof(**entry), Dqn::ZeroMem::Yes);
|
*entry = (TaggedAllocation *)dqn_lib_context_.allocator->Malloc(sizeof(**entry), Dqn::ZeroMem::Yes);
|
||||||
|
|
||||||
if ((*entry)->filename.len == 0)
|
if ((*entry)->filename.len == 0)
|
||||||
{
|
{
|
||||||
this->tagged_allocs_used_list[this->tagged_allocs_used_index++] = index;
|
this->tagged_allocs_used_list[this->tagged_allocs_used_index++] = index;
|
||||||
(*entry)->filename = DqnBuffer_CopyAndNullTerminate(&dqn_lib_context_->allocator, filename.str, filename.len);
|
(*entry)->filename = DqnBuffer_CopyAndNullTerminate(dqn_lib_context_.allocator, filename.str, filename.len);
|
||||||
(*entry)->function = DqnBuffer_CopyAndNullTerminate(&dqn_lib_context_->allocator, function.str, function.len);
|
(*entry)->function = DqnBuffer_CopyAndNullTerminate(dqn_lib_context_.allocator, function.str, function.len);
|
||||||
(*entry)->line_num = line_num;
|
(*entry)->line_num = line_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3098,7 +3097,7 @@ void DqnMemTracker::Tag_(DqnBuffer<const char> filename, DqnBuffer<const char> f
|
|||||||
context.function = (*entry)->function.str;
|
context.function = (*entry)->function.str;
|
||||||
context.function_len = (*entry)->function.len;
|
context.function_len = (*entry)->function.len;
|
||||||
context.line_num = line_num;
|
context.line_num = line_num;
|
||||||
dqn_lib_context_->logger.Log(DqnLogger::Type::Memory, context, "Currently allocated: %zu bytes", (*entry)->bytes_allocated);
|
dqn_lib_context_.logger->Log(DqnLogger::Type::Memory, context, "Currently allocated: %zu bytes", (*entry)->bytes_allocated);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *DqnMemTracker::SetupPtr(void *ptr, isize size, u8 alignment)
|
void *DqnMemTracker::SetupPtr(void *ptr, isize size, u8 alignment)
|
||||||
@ -5375,20 +5374,6 @@ void DqnString::Append(char const *src, int len_)
|
|||||||
this->str[this->len] = 0;
|
this->str[this->len] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_FILE_SCOPE DqnBuffer<char> DqnBuffer_CopyString(DqnAllocator *allocator, char const *str, int len)
|
|
||||||
{
|
|
||||||
if (len == -1)
|
|
||||||
len = DqnStr_Len(str);
|
|
||||||
|
|
||||||
DqnBuffer<char> result;
|
|
||||||
result.len = len;
|
|
||||||
result.str = static_cast<char *>(allocator->Malloc((len + 1) * sizeof(*str), Dqn::ZeroMem::No));
|
|
||||||
DqnMem_Copy(result.str, str, len);
|
|
||||||
result.str[len] = 0;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// #DqnFixedString Implementation
|
// #DqnFixedString Implementation
|
||||||
// =================================================================================================
|
// =================================================================================================
|
||||||
// return: The number of bytes written to dest
|
// return: The number of bytes written to dest
|
||||||
@ -5431,7 +5416,7 @@ char const *DqnLogger::LogNoContext(Type type, char const *fmt, ...)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
char const *DqnLogger::Log(Type type, Context const log_context, char const *fmt, ...)
|
char const *DqnLogger::Log(Type type, Context log_context, char const *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list va;
|
va_list va;
|
||||||
va_start(va, fmt);
|
va_start(va, fmt);
|
||||||
@ -5440,7 +5425,7 @@ char const *DqnLogger::Log(Type type, Context const log_context, char const *fmt
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
char const *DqnLogger::LogVA(Type type, Context const log_context, char const *fmt, va_list va)
|
char const *DqnLogger::LogVA(Type type, Context log_context, char const *fmt, va_list va)
|
||||||
{
|
{
|
||||||
if (!this->allocator.block)
|
if (!this->allocator.block)
|
||||||
{
|
{
|
||||||
@ -7621,7 +7606,7 @@ DQN_FILE__LIST_DIR(DqnFile__PlatformListDir)
|
|||||||
|
|
||||||
if (!list)
|
if (!list)
|
||||||
{
|
{
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "Memory allocation failed, required: %$_d", sizeof(*list) * curr_num_files);
|
DQN_LOGGER_E(dqn_lib_context_.logger, "Memory allocation failed, required: %$_d", sizeof(*list) * curr_num_files);
|
||||||
*num_files = 0;
|
*num_files = 0;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -7636,7 +7621,7 @@ DQN_FILE__LIST_DIR(DqnFile__PlatformListDir)
|
|||||||
DQN_FOR_EACH(j, i)
|
DQN_FOR_EACH(j, i)
|
||||||
allocator->Free(list[j], bytes_required);
|
allocator->Free(list[j], bytes_required);
|
||||||
|
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "Memory allocation failed, required: %$_d", sizeof(**list) * MAX_PATH);
|
DQN_LOGGER_E(dqn_lib_context_.logger, "Memory allocation failed, required: %$_d", sizeof(**list) * MAX_PATH);
|
||||||
*num_files = 0;
|
*num_files = 0;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -7942,7 +7927,7 @@ DQN_FILE_SCOPE u8 *DqnFile_ReadAll(wchar_t const *path, usize *buf_size, DqnMemS
|
|||||||
DqnFile file = {};
|
DqnFile file = {};
|
||||||
if (!file.Open(path, DqnFile::Flag::FileRead, DqnFile::Action::OpenOnly))
|
if (!file.Open(path, DqnFile::Flag::FileRead, DqnFile::Action::OpenOnly))
|
||||||
{
|
{
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "Could not open file: %s", path);
|
DQN_LOGGER_E(dqn_lib_context_.logger, "Could not open file: %s", path);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
DQN_DEFER { file.Close(); };
|
DQN_DEFER { file.Close(); };
|
||||||
@ -7955,7 +7940,7 @@ DQN_FILE_SCOPE u8 *DqnFile_ReadAll(wchar_t const *path, usize *buf_size, DqnMemS
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "bytes_read != file.size", bytes_read, file.size);
|
DQN_LOGGER_E(dqn_lib_context_.logger, "bytes_read != file.size", bytes_read, file.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -7967,7 +7952,7 @@ DQN_FILE_SCOPE u8 *DqnFile_ReadAll(char const *path, usize *buf_size, DqnMemStac
|
|||||||
DqnFile file = {};
|
DqnFile file = {};
|
||||||
if (!file.Open(path, DqnFile::Flag::FileRead, DqnFile::Action::OpenOnly))
|
if (!file.Open(path, DqnFile::Flag::FileRead, DqnFile::Action::OpenOnly))
|
||||||
{
|
{
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "Could not open file: %s", path);
|
DQN_LOGGER_E(dqn_lib_context_.logger, "Could not open file: %s", path);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
DQN_DEFER { file.Close(); };
|
DQN_DEFER { file.Close(); };
|
||||||
@ -7980,7 +7965,7 @@ DQN_FILE_SCOPE u8 *DqnFile_ReadAll(char const *path, usize *buf_size, DqnMemStac
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "bytes_read != file.size", bytes_read, file.size);
|
DQN_LOGGER_E(dqn_lib_context_.logger, "bytes_read != file.size", bytes_read, file.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -7991,7 +7976,7 @@ DQN_FILE_SCOPE bool DqnFile_WriteAll(char const *path, u8 const *buf, usize cons
|
|||||||
DqnFile file = {};
|
DqnFile file = {};
|
||||||
if (!file.Open(path, DqnFile::Flag::FileReadWrite, DqnFile::Action::ForceCreate))
|
if (!file.Open(path, DqnFile::Flag::FileReadWrite, DqnFile::Action::ForceCreate))
|
||||||
{
|
{
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "Could not open file at: %s", path);
|
DQN_LOGGER_E(dqn_lib_context_.logger, "Could not open file at: %s", path);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7999,7 +7984,7 @@ DQN_FILE_SCOPE bool DqnFile_WriteAll(char const *path, u8 const *buf, usize cons
|
|||||||
usize bytes_written = file.Write(buf, buf_size);
|
usize bytes_written = file.Write(buf, buf_size);
|
||||||
if (bytes_written != buf_size)
|
if (bytes_written != buf_size)
|
||||||
{
|
{
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "Bytes written did not match the buffer size, %zu != %zu", bytes_written, buf_size);
|
DQN_LOGGER_E(dqn_lib_context_.logger, "Bytes written did not match the buffer size, %zu != %zu", bytes_written, buf_size);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8011,7 +7996,7 @@ DQN_FILE_SCOPE bool DqnFile_WriteAll(wchar_t const *path, u8 const *buf, usize c
|
|||||||
DqnFile file = {};
|
DqnFile file = {};
|
||||||
if (!file.Open(path, DqnFile::Flag::FileReadWrite, DqnFile::Action::ForceCreate))
|
if (!file.Open(path, DqnFile::Flag::FileReadWrite, DqnFile::Action::ForceCreate))
|
||||||
{
|
{
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "Could not open file at: %s", path);
|
DQN_LOGGER_E(dqn_lib_context_.logger, "Could not open file at: %s", path);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8019,7 +8004,7 @@ DQN_FILE_SCOPE bool DqnFile_WriteAll(wchar_t const *path, u8 const *buf, usize c
|
|||||||
usize bytes_written = file.Write(buf, buf_size);
|
usize bytes_written = file.Write(buf, buf_size);
|
||||||
if (bytes_written != buf_size)
|
if (bytes_written != buf_size)
|
||||||
{
|
{
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "Bytes written did not match the buffer size, %zu != %zu", bytes_written, buf_size);
|
DQN_LOGGER_E(dqn_lib_context_.logger, "Bytes written did not match the buffer size, %zu != %zu", bytes_written, buf_size);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8035,7 +8020,7 @@ DQN_FILE_SCOPE bool DqnFile_ReadAll(wchar_t const *path, u8 *buf, usize buf_size
|
|||||||
// TODO(doyle): Logging
|
// TODO(doyle): Logging
|
||||||
if (file.size > buf_size || !result)
|
if (file.size > buf_size || !result)
|
||||||
{
|
{
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "Insufficient buffer size given: %zu, required: %zu\n", buf_size, file.size);
|
DQN_LOGGER_E(dqn_lib_context_.logger, "Insufficient buffer size given: %zu, required: %zu\n", buf_size, file.size);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8701,7 +8686,7 @@ DQN_OS_GET_THREADS_AND_CORES(DqnOS_GetThreadsAndCores)
|
|||||||
auto *raw_proc_info_array = (u8 *)DqnMem_Calloc(required_size);
|
auto *raw_proc_info_array = (u8 *)DqnMem_Calloc(required_size);
|
||||||
if (!raw_proc_info_array)
|
if (!raw_proc_info_array)
|
||||||
{
|
{
|
||||||
DQN_LOGGER_E(&dqn_lib_context_->logger, "Could not allocate memory for array required: %$d\n");
|
DQN_LOGGER_E(dqn_lib_context_.logger, "Could not allocate memory for array required: %$d\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8840,49 +8825,40 @@ DQN_FILE_SCOPE void DqnWin32_GetExeNameAndDirectory(DqnMemStack *mem_stack, DqnB
|
|||||||
{
|
{
|
||||||
if (!exe_name && !exe_directory) return;
|
if (!exe_name && !exe_directory) return;
|
||||||
|
|
||||||
i32 offset_to_last_backslash = -1;
|
|
||||||
int exe_buf_len = 512;
|
int exe_buf_len = 512;
|
||||||
wchar_t *exe_buf = nullptr;
|
wchar_t *exe_buf = nullptr;
|
||||||
while(offset_to_last_backslash == -1)
|
int exe_len = exe_buf_len;
|
||||||
|
while(exe_buf_len == exe_len)
|
||||||
{
|
{
|
||||||
if (exe_buf)
|
if (exe_buf)
|
||||||
{
|
|
||||||
exe_buf_len += 128;
|
exe_buf_len += 128;
|
||||||
}
|
|
||||||
|
|
||||||
exe_buf = DQN_MEMSTACK_PUSH_ARRAY(mem_stack, wchar_t, exe_buf_len);
|
exe_buf = DQN_MEMSTACK_PUSH_BACK_ARRAY(mem_stack, wchar_t, exe_buf_len);
|
||||||
DQN_DEFER { mem_stack->Pop(exe_buf); };
|
DQN_DEFER { mem_stack->Pop(exe_buf); };
|
||||||
offset_to_last_backslash = DqnWin32_GetExeDirectory(exe_buf, exe_buf_len);
|
exe_len = GetModuleFileNameW(nullptr, exe_buf, exe_buf_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
DqnAllocator allocator(mem_stack);
|
DqnAllocator allocator(mem_stack);
|
||||||
|
|
||||||
if (exe_name)
|
|
||||||
*exe_name = DqnBuffer_CopyAndNullTerminate(&allocator, exe_buf, offset_to_last_backslash + 1);
|
|
||||||
|
|
||||||
if (exe_directory)
|
|
||||||
*exe_directory = DqnBuffer_CopyAndNullTerminate(&allocator, exe_buf, offset_to_last_backslash);
|
|
||||||
}
|
|
||||||
|
|
||||||
DQN_FILE_SCOPE i32 DqnWin32_GetExeDirectory(wchar_t *buf, u32 buf_len)
|
|
||||||
{
|
|
||||||
if (!buf || buf_len == 0) return -1;
|
|
||||||
u32 copied_len = GetModuleFileNameW(nullptr, buf, buf_len);
|
|
||||||
if (copied_len == buf_len) return -1;
|
|
||||||
|
|
||||||
// NOTE: Should always work if GetModuleFileName works and we're running an
|
|
||||||
// executable.
|
|
||||||
i32 last_slash_index = 0;
|
i32 last_slash_index = 0;
|
||||||
for (i32 i = copied_len; i > 0; i--)
|
for (i32 i = (exe_len - 1); i >= 0; --i)
|
||||||
{
|
{
|
||||||
if (buf[i] == '\\')
|
if (exe_buf[i] == '\\')
|
||||||
{
|
{
|
||||||
last_slash_index = i;
|
last_slash_index = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return last_slash_index;
|
if (exe_name)
|
||||||
|
{
|
||||||
|
wchar_t *start_of_exe_name = exe_buf + last_slash_index + 1;
|
||||||
|
wchar_t *end = exe_buf + exe_len;
|
||||||
|
*exe_name = DqnBuffer_CopyAndNullTerminate(&allocator, start_of_exe_name, static_cast<int>(end - start_of_exe_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exe_directory)
|
||||||
|
*exe_directory = DqnBuffer_CopyAndNullTerminate(&allocator, exe_buf, last_slash_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE_SCOPE inline u64 DqnWin32__FileTimeToEpoch(FILETIME file_time)
|
FILE_SCOPE inline u64 DqnWin32__FileTimeToEpoch(FILETIME file_time)
|
||||||
|
Loading…
Reference in New Issue
Block a user