Compare commits
6 Commits
3f8261fa0d
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| b39afa94ff | |||
| e06f9df22b | |||
| 10e7b4ae82 | |||
| 70aee42856 | |||
| 109cb3108a | |||
| 56c765e944 |
+437
-425
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
|||||||
// Generated by the DN single header generator 2026-07-19 16:12:36
|
// Generated by the DN single header generator 2026-07-31 22:40:42
|
||||||
|
|
||||||
#if !defined(DN_H)
|
#if !defined(DN_H)
|
||||||
#define DN_H
|
#define DN_H
|
||||||
@@ -302,6 +302,7 @@
|
|||||||
// NOTE: Platform identification
|
// NOTE: Platform identification
|
||||||
#if !defined(DN_PLATFORM_EMSCRIPTEN) && \
|
#if !defined(DN_PLATFORM_EMSCRIPTEN) && \
|
||||||
!defined(DN_PLATFORM_POSIX) && \
|
!defined(DN_PLATFORM_POSIX) && \
|
||||||
|
!defined(DN_PLATFORM_ARM64) && \
|
||||||
!defined(DN_PLATFORM_WIN32)
|
!defined(DN_PLATFORM_WIN32)
|
||||||
#if defined(__aarch64__) || defined(_M_ARM64)
|
#if defined(__aarch64__) || defined(_M_ARM64)
|
||||||
#define DN_PLATFORM_ARM64
|
#define DN_PLATFORM_ARM64
|
||||||
@@ -1504,6 +1505,25 @@ enum DN_Str8BuilderAdd
|
|||||||
DN_Str8BuilderAdd_Prepend,
|
DN_Str8BuilderAdd_Prepend,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if !defined(DN_OsPathSeperator)
|
||||||
|
#if defined(DN_PLATFORM_WIN32)
|
||||||
|
#define DN_OsPathSeperator "\\"
|
||||||
|
#else
|
||||||
|
#define DN_OsPathSeperator "/"
|
||||||
|
#endif
|
||||||
|
#define DN_OsPathSeperatorStr8 DN_Str8Lit(DN_OsPathSeperator)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct DN_Path DN_Path;
|
||||||
|
struct DN_Path
|
||||||
|
{
|
||||||
|
bool has_prefix_path_seperator;
|
||||||
|
DN_Str8Link *head;
|
||||||
|
DN_Str8Link *tail;
|
||||||
|
DN_USize string_size;
|
||||||
|
DN_U16 links_size;
|
||||||
|
};
|
||||||
|
|
||||||
typedef DN_U32 DN_AgeUnit;
|
typedef DN_U32 DN_AgeUnit;
|
||||||
enum DN_AgeUnit_
|
enum DN_AgeUnit_
|
||||||
{
|
{
|
||||||
@@ -4227,7 +4247,6 @@ enum DN_OSFileRotateFlags_
|
|||||||
DN_OSFileRotateFlags_KeepBaseFile = 1 << 0,
|
DN_OSFileRotateFlags_KeepBaseFile = 1 << 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum DN_OSPathInfoType
|
enum DN_OSPathInfoType
|
||||||
{
|
{
|
||||||
DN_OSPathInfoType_Unknown,
|
DN_OSPathInfoType_Unknown,
|
||||||
@@ -4286,34 +4305,6 @@ enum DN_OSFileAccess_
|
|||||||
DN_OSFileAccess_All = DN_OSFileAccess_ReadWrite | DN_OSFileAccess_Execute | DN_OSFileAccess_AppendOnly,
|
DN_OSFileAccess_All = DN_OSFileAccess_ReadWrite | DN_OSFileAccess_Execute | DN_OSFileAccess_AppendOnly,
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOTE: DN_OSPath
|
|
||||||
#if !defined(DN_OSPathSeparator)
|
|
||||||
#if defined(DN_PLATFORM_WIN32)
|
|
||||||
#define DN_OSPathSeparator "\\"
|
|
||||||
#else
|
|
||||||
#define DN_OSPathSeparator "/"
|
|
||||||
#endif
|
|
||||||
#define DN_OSPathSeparatorStr8 DN_Str8Lit(DN_OSPathSeparator)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct DN_OSPathLink DN_OSPathLink;
|
|
||||||
struct DN_OSPathLink
|
|
||||||
{
|
|
||||||
DN_Str8 string;
|
|
||||||
DN_OSPathLink *next;
|
|
||||||
DN_OSPathLink *prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct DN_OSPath DN_OSPath;
|
|
||||||
struct DN_OSPath
|
|
||||||
{
|
|
||||||
bool has_prefix_path_separator;
|
|
||||||
DN_OSPathLink *head;
|
|
||||||
DN_OSPathLink *tail;
|
|
||||||
DN_USize string_size;
|
|
||||||
DN_U16 links_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef DN_U32 DN_OSExecFlags;
|
typedef DN_U32 DN_OSExecFlags;
|
||||||
enum DN_OSExecFlags_
|
enum DN_OSExecFlags_
|
||||||
{
|
{
|
||||||
@@ -5028,7 +5019,7 @@ DN_API void DN_Str8x512AppendFmtV
|
|||||||
DN_API void DN_Str8x1024AppendFmt (DN_Str8x1024 *str, DN_FMT_ATTRIB char const *fmt, ...);
|
DN_API void DN_Str8x1024AppendFmt (DN_Str8x1024 *str, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
DN_API void DN_Str8x1024AppendFmtV (DN_Str8x1024 *str, DN_FMT_ATTRIB char const *fmt, va_list args);
|
DN_API void DN_Str8x1024AppendFmtV (DN_Str8x1024 *str, DN_FMT_ATTRIB char const *fmt, va_list args);
|
||||||
|
|
||||||
DN_API DN_Str8x32 DN_Str8x32FromU64 (DN_U64 val, char separator);
|
DN_API DN_Str8x32 DN_Str8x32FromU64 (DN_U64 val, char seperator);
|
||||||
DN_API bool DN_Str8Is (DN_Str8 string, DN_Str8IsFlags flags);
|
DN_API bool DN_Str8Is (DN_Str8 string, DN_Str8IsFlags flags);
|
||||||
DN_API char * DN_Str8End (DN_Str8 string);
|
DN_API char * DN_Str8End (DN_Str8 string);
|
||||||
DN_API DN_Str8 DN_Str8Subset (DN_Str8 string, DN_USize offset, DN_USize count);
|
DN_API DN_Str8 DN_Str8Subset (DN_Str8 string, DN_USize offset, DN_USize count);
|
||||||
@@ -5104,13 +5095,13 @@ DN_API DN_USize DN_Str8SplitAVX512F
|
|||||||
DN_API DN_Str8Slice DN_Str8SplitAllocAVX512F (DN_Arena *arena, DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitFlags flags);
|
DN_API DN_Str8Slice DN_Str8SplitAllocAVX512F (DN_Arena *arena, DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitFlags flags);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DN_API DN_Str8 DN_Str8SliceRender (DN_Str8Slice array, DN_Str8 separator, DN_Arena *arena);
|
DN_API DN_Str8 DN_Str8SliceRender (DN_Str8Slice array, DN_Str8 seperator, DN_Arena *arena);
|
||||||
DN_API DN_Str8 DN_Str8RenderSpaceSep (DN_Str8Slice array, DN_Arena *arena);
|
DN_API DN_Str8 DN_Str8RenderSpaceSep (DN_Str8Slice array, DN_Arena *arena);
|
||||||
DN_API int DN_Str8CompareNatural (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case);
|
DN_API int DN_Str8CompareNatural (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case);
|
||||||
DN_API int DN_Str8CompareLexicographic (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case);
|
DN_API int DN_Str8CompareLexicographic (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case);
|
||||||
|
|
||||||
DN_API bool DN_Str16Eq (DN_Str16 lhs, DN_Str16 rhs);
|
DN_API bool DN_Str16Eq (DN_Str16 lhs, DN_Str16 rhs);
|
||||||
DN_API DN_Str16 DN_Str16SliceRender (DN_Str16Slice array, DN_Str16 separator, DN_Arena *arena);
|
DN_API DN_Str16 DN_Str16SliceRender (DN_Str16Slice array, DN_Str16 seperator, DN_Arena *arena);
|
||||||
DN_API DN_Str16 DN_Str16RenderSpaceSep (DN_Str16Slice array, DN_Arena *arena);
|
DN_API DN_Str16 DN_Str16RenderSpaceSep (DN_Str16Slice array, DN_Arena *arena);
|
||||||
|
|
||||||
DN_API DN_Str8Builder DN_Str8BuilderFromArena (DN_Arena *arena);
|
DN_API DN_Str8Builder DN_Str8BuilderFromArena (DN_Arena *arena);
|
||||||
@@ -5146,6 +5137,18 @@ DN_API DN_Str8 DN_Str8FromStr8BuilderArena
|
|||||||
DN_API DN_Str8 DN_Str8FromStr8BuilderDelimitAllocator (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Allocator allocator);
|
DN_API DN_Str8 DN_Str8FromStr8BuilderDelimitAllocator (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Allocator allocator);
|
||||||
DN_API DN_Str8 DN_Str8FromStr8BuilderDelimitArena (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Arena *arena);
|
DN_API DN_Str8 DN_Str8FromStr8BuilderDelimitArena (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Arena *arena);
|
||||||
|
|
||||||
|
DN_API bool DN_PathAddRef (DN_Path *path, DN_Str8 add, DN_Arena *arena);
|
||||||
|
DN_API bool DN_PathAdd (DN_Path *path, DN_Str8 add, DN_Arena *arena);
|
||||||
|
DN_API bool DN_PathAddF (DN_Path *path, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
|
DN_API bool DN_PathPop (DN_Path *path);
|
||||||
|
DN_API DN_Str8 DN_Str8FromPath (DN_Path const *path, DN_Str8 path_seperator, DN_Allocator allocator);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtPathVArena (DN_Str8 path_seperator, DN_Arena *arena, char const *fmt, va_list args);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtPathArena (DN_Str8 path_seperator, DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtPathVPool (DN_Str8 path_seperator, DN_Pool *pool, char const *fmt, va_list args);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtPathPool (DN_Str8 path_seperator, DN_Pool *pool, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtOsPathArena (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtOsPathPool (DN_Pool *pool, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
|
|
||||||
DN_API int DN_UTF8Encode (DN_U8 utf8[4], DN_U32 codepoint);
|
DN_API int DN_UTF8Encode (DN_U8 utf8[4], DN_U32 codepoint);
|
||||||
DN_API int DN_UTF16Encode (DN_U16 utf16[2], DN_U32 codepoint);
|
DN_API int DN_UTF16Encode (DN_U16 utf16[2], DN_U32 codepoint);
|
||||||
DN_API DN_UTF8DecodeResult DN_UTF8Decode (DN_Str8 stream);
|
DN_API DN_UTF8DecodeResult DN_UTF8Decode (DN_Str8 stream);
|
||||||
@@ -5249,7 +5252,14 @@ DN_API void DN_ProfilerFmtToStdout
|
|||||||
DN_API DN_F64 DN_ProfilerSecFromTsc (DN_Profiler *profiler, DN_U64 duration_tsc);
|
DN_API DN_F64 DN_ProfilerSecFromTsc (DN_Profiler *profiler, DN_U64 duration_tsc);
|
||||||
DN_API DN_F64 DN_ProfilerMsFromTsc (DN_Profiler *profiler, DN_U64 duration_tsc);
|
DN_API DN_F64 DN_ProfilerMsFromTsc (DN_Profiler *profiler, DN_U64 duration_tsc);
|
||||||
|
|
||||||
DN_API void DN_QSort (void *array, DN_USize array_size, DN_USize elem_size, void *user_context, DN_QSortCompareFunc *compare);
|
DN_API void DN_QSort_ (void *array, DN_USize array_size, DN_USize elem_size, void *user_context, DN_QSortCompareFunc *compare);
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
template <typename T> void DN_QSortT (T *array, DN_USize array_size, void *user_context, DN_QSortCompareFunc *compare);
|
||||||
|
#define DN_QSort(array, array_size, user_context, compare) DN_QSortT(array, array_size, user_context, compare)
|
||||||
|
#else
|
||||||
|
#define DN_QSort(array, array_size, user_context, compare) DN_QSort_(array, array_size, sizeof(*array), user_context, compare)
|
||||||
|
#endif
|
||||||
|
|
||||||
DN_API bool DN_QSortCompareStr8NaturalAsc (void const* lhs, void const *rhs, void *user_context);
|
DN_API bool DN_QSortCompareStr8NaturalAsc (void const* lhs, void const *rhs, void *user_context);
|
||||||
DN_API bool DN_QSortCompareStr8NaturalDesc (void const* lhs, void const *rhs, void *user_context);
|
DN_API bool DN_QSortCompareStr8NaturalDesc (void const* lhs, void const *rhs, void *user_context);
|
||||||
DN_API bool DN_QSortCompareStr8LexicographicAsc (void const* lhs, void const *rhs, void *user_context);
|
DN_API bool DN_QSortCompareStr8LexicographicAsc (void const* lhs, void const *rhs, void *user_context);
|
||||||
@@ -5278,12 +5288,12 @@ DN_API DN_F32 DN_Pcg32NextF32
|
|||||||
DN_API DN_F64 DN_Pcg32NextF64 (DN_Pcg32 *rng);
|
DN_API DN_F64 DN_Pcg32NextF64 (DN_Pcg32 *rng);
|
||||||
DN_API void DN_Pcg32Advance (DN_Pcg32 *rng, DN_U64 delta);
|
DN_API void DN_Pcg32Advance (DN_Pcg32 *rng, DN_U64 delta);
|
||||||
|
|
||||||
#if !defined(DN_Fnv1a32_SEED)
|
#if !defined(DN_FNV1A32_SEED)
|
||||||
#define DN_Fnv1a32_SEED 2166136261U
|
#define DN_FNV1A32_SEED 2166136261U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(DN_Fnv1a64_SEED)
|
#if !defined(DN_FNV1A64_SEED)
|
||||||
#define DN_Fnv1a64_SEED 14695981039346656037ULL
|
#define DN_FNV1A64_SEED 14695981039346656037ULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DN_API DN_U32 DN_Fnv1aHashU32FromBytes (void const *bytes, DN_USize count, DN_U32 seed);
|
DN_API DN_U32 DN_Fnv1aHashU32FromBytes (void const *bytes, DN_USize count, DN_U32 seed);
|
||||||
@@ -5429,10 +5439,16 @@ DN_API DN_V2U16& operator/=
|
|||||||
DN_API DN_V2U16& operator-= (DN_V2U16& lhs, DN_V2U16 rhs);
|
DN_API DN_V2U16& operator-= (DN_V2U16& lhs, DN_V2U16 rhs);
|
||||||
DN_API DN_V2U16& operator+= (DN_V2U16& lhs, DN_V2U16 rhs);
|
DN_API DN_V2U16& operator+= (DN_V2U16& lhs, DN_V2U16 rhs);
|
||||||
|
|
||||||
#define DN_V2U32Zero DN_Literal(DN_V2U32){{(DN_U32)(0), (DN_U32)(0)}}
|
// NOTE: DN_V2F32
|
||||||
#define DN_V2U32One DN_Literal(DN_V2U32){{(DN_U32)(1), (DN_U32)(1)}}
|
// API
|
||||||
#define DN_V2U32From1N(x) DN_Literal(DN_V2U32){{(DN_U32)(x), (DN_U32)(x)}}
|
// DN_V2F32Rotate
|
||||||
#define DN_V2U32From2N(x, y) DN_Literal(DN_V2U32){{(DN_U32)(x), (DN_U32)(y)}}
|
// Rotate a vector using the precomputed cosine and sine value of the angle (e.g.
|
||||||
|
// `cos_a => cos(your_angle * 2.f * DN_PiF32)` and `sin_a => sinf(your_angle * 2.f * DN_PiF32)`)
|
||||||
|
#define DN_V2U32Zero DN_Literal(DN_V2U32){{(DN_U32)(0), (DN_U32)(0)}}
|
||||||
|
#define DN_V2U32One DN_Literal(DN_V2U32){{(DN_U32)(1), (DN_U32)(1)}}
|
||||||
|
#define DN_V2U32From1N(x) DN_Literal(DN_V2U32){{(DN_U32)(x), (DN_U32)(x)}}
|
||||||
|
#define DN_V2U32From2N(x, y) DN_Literal(DN_V2U32){{(DN_U32)(x), (DN_U32)(y)}}
|
||||||
|
#define DN_V2U32FromV2(v2) DN_Literal(DN_V2U32){{(DN_U32)(v2.x), (DN_U32)(v2.y)}}
|
||||||
|
|
||||||
#define DN_V2F32Zero DN_Literal(DN_V2F32){{(DN_F32)(0), (DN_F32)(0)}}
|
#define DN_V2F32Zero DN_Literal(DN_V2F32){{(DN_F32)(0), (DN_F32)(0)}}
|
||||||
#define DN_V2F32One DN_Literal(DN_V2F32){{(DN_F32)(1), (DN_F32)(1)}}
|
#define DN_V2F32One DN_Literal(DN_V2F32){{(DN_F32)(1), (DN_F32)(1)}}
|
||||||
@@ -5441,6 +5457,7 @@ DN_API DN_V2U16& operator+=
|
|||||||
#define DN_V2F32FromV2(xy) DN_Literal(DN_V2F32){{(DN_F32)(xy).x, (DN_F32)(xy).y}}
|
#define DN_V2F32FromV2(xy) DN_Literal(DN_V2F32){{(DN_F32)(xy).x, (DN_F32)(xy).y}}
|
||||||
|
|
||||||
DN_API DN_V2F32 DN_V2F32Lerp (DN_V2F32 a, DN_F32 t, DN_V2F32 b);
|
DN_API DN_V2F32 DN_V2F32Lerp (DN_V2F32 a, DN_F32 t, DN_V2F32 b);
|
||||||
|
DN_API DN_V2F32 DN_V2F32Rotate (DN_V2F32 v, DN_F32 cos_a, DN_F32 sin_a);
|
||||||
|
|
||||||
DN_API bool operator!= (DN_V2F32 lhs, DN_V2F32 rhs);
|
DN_API bool operator!= (DN_V2F32 lhs, DN_V2F32 rhs);
|
||||||
DN_API bool operator== (DN_V2F32 lhs, DN_V2F32 rhs);
|
DN_API bool operator== (DN_V2F32 lhs, DN_V2F32 rhs);
|
||||||
@@ -5510,7 +5527,7 @@ DN_API DN_F32 DN_V2F32Area
|
|||||||
|
|
||||||
// NOTE: Grayscale co-efficients from:
|
// NOTE: Grayscale co-efficients from:
|
||||||
// https://github.com/EpicGames/UnrealEngine/blob/260bb2e1c5610b31c63a36206eedd289409c5f11/Engine/Source/Runtime/Core/Private/Math/Color.cpp#L304
|
// https://github.com/EpicGames/UnrealEngine/blob/260bb2e1c5610b31c63a36206eedd289409c5f11/Engine/Source/Runtime/Core/Private/Math/Color.cpp#L304
|
||||||
DN_V3F32 static const DN_V3F32_Rgb_LUMINANCE = DN_V3F32From3N(0.3f, 0.59f, 0.11f);
|
DN_V3F32 static const DN_V3F32_RGB_LUMINANCE = DN_V3F32From3N(0.3f, 0.59f, 0.11f);
|
||||||
|
|
||||||
DN_API bool operator== (DN_V3F32 lhs, DN_V3F32 rhs);
|
DN_API bool operator== (DN_V3F32 lhs, DN_V3F32 rhs);
|
||||||
DN_API bool operator!= (DN_V3F32 lhs, DN_V3F32 rhs);
|
DN_API bool operator!= (DN_V3F32 lhs, DN_V3F32 rhs);
|
||||||
@@ -6526,8 +6543,8 @@ DN_API void * DN_OS_MemAlloc (D
|
|||||||
DN_API void DN_OS_MemDealloc (void *ptr);
|
DN_API void DN_OS_MemDealloc (void *ptr);
|
||||||
|
|
||||||
DN_API DN_Date DN_OS_DateLocalTimeNow ();
|
DN_API DN_Date DN_OS_DateLocalTimeNow ();
|
||||||
DN_API DN_Str8x32 DN_OS_DateLocalTimeStr8Now (char date_separator = '-', char hms_separator = ':');
|
DN_API DN_Str8x32 DN_OS_DateLocalTimeStr8Now (char date_seperator = '-', char hms_seperator = ':');
|
||||||
DN_API DN_Str8x32 DN_OS_DateLocalTimeStr8 (DN_Date time, char date_separator = '-', char hms_separator = ':');
|
DN_API DN_Str8x32 DN_OS_DateLocalTimeStr8 (DN_Date time, char date_seperator = '-', char hms_seperator = ':');
|
||||||
DN_API DN_U64 DN_OS_DateUnixTimeNs ();
|
DN_API DN_U64 DN_OS_DateUnixTimeNs ();
|
||||||
#define DN_OS_DateUnixTimeUs() (DN_OS_DateUnixTimeNs() / 1000)
|
#define DN_OS_DateUnixTimeUs() (DN_OS_DateUnixTimeNs() / 1000)
|
||||||
#define DN_OS_DateUnixTimeMs() (DN_OS_DateUnixTimeNs() / (1000 * 1000))
|
#define DN_OS_DateUnixTimeMs() (DN_OS_DateUnixTimeNs() / (1000 * 1000))
|
||||||
@@ -6626,24 +6643,6 @@ DN_API bool DN_OS_PathIsDir (D
|
|||||||
DN_API bool DN_OS_PathMakeDir (DN_Str8 path);
|
DN_API bool DN_OS_PathMakeDir (DN_Str8 path);
|
||||||
DN_API bool DN_OS_PathIterateDir (DN_Str8 path, DN_OSDirIterator *it);
|
DN_API bool DN_OS_PathIterateDir (DN_Str8 path, DN_OSDirIterator *it);
|
||||||
|
|
||||||
DN_API bool DN_OS_PathAddRef (DN_Arena *arena, DN_OSPath *fs_path, DN_Str8 path);
|
|
||||||
DN_API bool DN_OS_PathAdd (DN_Arena *arena, DN_OSPath *fs_path, DN_Str8 path);
|
|
||||||
DN_API bool DN_OS_PathAddF (DN_Arena *arena, DN_OSPath *fs_path, DN_FMT_ATTRIB char const *fmt, ...);
|
|
||||||
DN_API bool DN_OS_PathPop (DN_OSPath *fs_path);
|
|
||||||
DN_API DN_Str8 DN_OS_PathBuildWithSeparatorAllocator (DN_Allocator allocator, DN_OSPath const *fs_path, DN_Str8 path_separator);
|
|
||||||
DN_API DN_Str8 DN_OS_PathToArena (DN_Arena *arena, DN_Str8 path, DN_Str8 path_separtor);
|
|
||||||
DN_API DN_Str8 DN_OS_PathToPool (DN_Pool *pool, DN_Str8 path, DN_Str8 path_separtor);
|
|
||||||
DN_API DN_Str8 DN_OS_PathToFmtArena (DN_Arena *arena, DN_Str8 path_separator, DN_FMT_ATTRIB char const *fmt, ...);
|
|
||||||
DN_API DN_Str8 DN_OS_PathToFmtPool (DN_Pool *pool, DN_Str8 path_separator, DN_FMT_ATTRIB char const *fmt, ...);
|
|
||||||
DN_API DN_Str8 DN_OS_PathArena (DN_Arena *arena, DN_Str8 path);
|
|
||||||
DN_API DN_Str8 DN_OS_PathPool (DN_Pool *pool, DN_Str8 path);
|
|
||||||
DN_API DN_Str8 DN_OS_PathFmtArena (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...);
|
|
||||||
DN_API DN_Str8 DN_OS_PathFmtPool (DN_Pool *pool, DN_FMT_ATTRIB char const *fmt, ...);
|
|
||||||
|
|
||||||
#define DN_OS_PathBuildFwdSlash(allocator, fs_path) DN_OS_PathBuildWithSeparatorAllocator(allocator, fs_path, DN_Str8Lit("/"))
|
|
||||||
#define DN_OS_PathBuildBackSlash(allocator, fs_path) DN_OS_PathBuildWithSeparatorAllocator(allocator, fs_path, DN_Str8Lit("\\"))
|
|
||||||
#define DN_OS_PathBuild(allocator, fs_path) DN_OS_PathBuildWithSeparatorAllocator(allocator, fs_path, DN_OSPathSeparatorStr8)
|
|
||||||
|
|
||||||
DN_API void DN_OS_Exit (int32_t exit_code);
|
DN_API void DN_OS_Exit (int32_t exit_code);
|
||||||
DN_API DN_OSExecArgs DN_OS_ExecArgsDefault ();
|
DN_API DN_OSExecArgs DN_OS_ExecArgsDefault ();
|
||||||
DN_API DN_OSExecResult DN_OS_ExecPump (DN_OSExecAsyncHandle handle, char *stdout_buffer, size_t *stdout_size, char *stderr_buffer, size_t *stderr_size, DN_U32 timeout_ms, DN_ErrSink *err);
|
DN_API DN_OSExecResult DN_OS_ExecPump (DN_OSExecAsyncHandle handle, char *stdout_buffer, size_t *stdout_size, char *stderr_buffer, size_t *stderr_size, DN_U32 timeout_ms, DN_ErrSink *err);
|
||||||
|
|||||||
@@ -1414,25 +1414,25 @@ DN_API DN_OSPosixProcSelfStatus DN_OS_PosixProcSelfStatus()
|
|||||||
|
|
||||||
for (DN_ForItSize(line_it, DN_Str8, lines.data, lines.count)) {
|
for (DN_ForItSize(line_it, DN_Str8, lines.data, lines.count)) {
|
||||||
DN_Str8 line = DN_Str8TrimWhitespaceAround(*line_it.data);
|
DN_Str8 line = DN_Str8TrimWhitespaceAround(*line_it.data);
|
||||||
if (DN_Str8StartsWith(line, NAME, DN_Str8EqCase_Insensitive)) {
|
if (DN_Str8StartsWithInsensitive(line, NAME)) {
|
||||||
DN_Str8 str8 = DN_Str8TrimWhitespaceAround(DN_Str8Subset(line, NAME.count, line.count));
|
DN_Str8 str8 = DN_Str8TrimWhitespaceAround(DN_Str8Subset(line, NAME.count, line.count));
|
||||||
result.name_size = DN_Min(str8.count, sizeof(result.name));
|
result.name_size = DN_Min(str8.count, sizeof(result.name));
|
||||||
DN_Memcpy(result.name, str8.data, result.name_size);
|
DN_Memcpy(result.name, str8.data, result.name_size);
|
||||||
} else if (DN_Str8StartsWith(line, PID, DN_Str8EqCase_Insensitive)) {
|
} else if (DN_Str8StartsWithInsensitive(line, PID)) {
|
||||||
DN_Str8 str8 = DN_Str8TrimWhitespaceAround(DN_Str8Subset(line, PID.count, line.count));
|
DN_Str8 str8 = DN_Str8TrimWhitespaceAround(DN_Str8Subset(line, PID.count, line.count));
|
||||||
DN_U64FromResult to_u64 = DN_U64FromStr8(str8);
|
DN_U64FromResult to_u64 = DN_U64FromStr8(str8);
|
||||||
result.pid = to_u64.value;
|
result.pid = to_u64.value;
|
||||||
DN_Assert(to_u64.success);
|
DN_Assert(to_u64.success);
|
||||||
} else if (DN_Str8StartsWith(line, VM_SIZE, DN_Str8EqCase_Insensitive)) {
|
} else if (DN_Str8StartsWithInsensitive(line, VM_SIZE)) {
|
||||||
DN_Str8 size_with_kb = DN_Str8TrimWhitespaceAround(DN_Str8Subset(line, VM_SIZE.count, line.count));
|
DN_Str8 size_with_kb = DN_Str8TrimWhitespaceAround(DN_Str8Subset(line, VM_SIZE.count, line.count));
|
||||||
DN_Assert(DN_Str8EndsWith(size_with_kb, DN_Str8Lit("kB")));
|
DN_Assert(DN_Str8EndsWithSensitive(size_with_kb, DN_Str8Lit("kB")));
|
||||||
DN_Str8 vm_size = DN_Str8BSplit(size_with_kb, DN_Str8Lit(" ")).lhs;
|
DN_Str8 vm_size = DN_Str8BSplit(size_with_kb, DN_Str8Lit(" ")).lhs;
|
||||||
DN_U64FromResult to_u64 = DN_U64FromStr8(vm_size);
|
DN_U64FromResult to_u64 = DN_U64FromStr8(vm_size);
|
||||||
result.vm_size = DN_Kilobytes(to_u64.value);
|
result.vm_size = DN_Kilobytes(to_u64.value);
|
||||||
DN_Assert(to_u64.success);
|
DN_Assert(to_u64.success);
|
||||||
} else if (DN_Str8StartsWith(line, VM_PEAK, DN_Str8EqCase_Insensitive)) {
|
} else if (DN_Str8StartsWithInsensitive(line, VM_PEAK)) {
|
||||||
DN_Str8 size_with_kb = DN_Str8TrimWhitespaceAround(DN_Str8Subset(line, VM_PEAK.count, line.count));
|
DN_Str8 size_with_kb = DN_Str8TrimWhitespaceAround(DN_Str8Subset(line, VM_PEAK.count, line.count));
|
||||||
DN_Assert(DN_Str8EndsWith(size_with_kb, DN_Str8Lit("kB")));
|
DN_Assert(DN_Str8EndsWithSensitive(size_with_kb, DN_Str8Lit("kB")));
|
||||||
DN_Str8 vm_size = DN_Str8BSplit(size_with_kb, DN_Str8Lit(" ")).lhs;
|
DN_Str8 vm_size = DN_Str8BSplit(size_with_kb, DN_Str8Lit(" ")).lhs;
|
||||||
DN_U64FromResult to_u64 = DN_U64FromStr8(vm_size);
|
DN_U64FromResult to_u64 = DN_U64FromStr8(vm_size);
|
||||||
result.vm_peak = DN_Kilobytes(to_u64.value);
|
result.vm_peak = DN_Kilobytes(to_u64.value);
|
||||||
|
|||||||
+31
-16
@@ -1,5 +1,3 @@
|
|||||||
#define DN_OS_W32_CPP
|
|
||||||
|
|
||||||
#if defined(_CLANGD)
|
#if defined(_CLANGD)
|
||||||
#define DN_WITH_OS 1
|
#define DN_WITH_OS 1
|
||||||
#include "../dn.h"
|
#include "../dn.h"
|
||||||
@@ -649,9 +647,9 @@ DN_API bool DN_OS_PathIterateDir(DN_Str8 path, DN_OSDirIterator *it)
|
|||||||
// add those characters in this branch, so overwrite the null
|
// add those characters in this branch, so overwrite the null
|
||||||
// character, add the glob and re-null terminate the buffer.
|
// character, add the glob and re-null terminate the buffer.
|
||||||
if (needs_asterisks)
|
if (needs_asterisks)
|
||||||
adjusted_path = DN_OS_PathFmtArena(&scratch.arena, "%.*s*", DN_Str8PrintFmt(path));
|
adjusted_path = DN_Str8FmtOsPathArena(&scratch.arena, "%.*s*", DN_Str8PrintFmt(path));
|
||||||
else
|
else
|
||||||
adjusted_path = DN_OS_PathFmtArena(&scratch.arena, "%.*s/*", DN_Str8PrintFmt(path));
|
adjusted_path = DN_Str8FmtOsPathArena(&scratch.arena, "%.*s/*", DN_Str8PrintFmt(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
path16 = DN_OS_W32Str8ToStr16(&scratch.arena, adjusted_path);
|
path16 = DN_OS_W32Str8ToStr16(&scratch.arena, adjusted_path);
|
||||||
@@ -867,8 +865,10 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Str8Slice cmd_line, DN_OSExecArgs
|
|||||||
if (it.index)
|
if (it.index)
|
||||||
count_req += cmd_separator.count;
|
count_req += cmd_separator.count;
|
||||||
|
|
||||||
if (DN_Str8Find(*it.data, DN_Str8FindFlag_Whitespace).found)
|
if (!DN_Str8StartsWithSensitive(*it.data, DN_Str8Lit("\""))) {
|
||||||
count_req += 2; // If there's whitespace, we'll quote the string for the user
|
if (DN_Str8Find(*it.data, DN_Str8FindFlag_Whitespace).found)
|
||||||
|
count_req += 2; // If there's whitespace, we'll quote the string for the user
|
||||||
|
}
|
||||||
count_req += it.data->count;
|
count_req += it.data->count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -883,8 +883,11 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Str8Slice cmd_line, DN_OSExecArgs
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: Quote the string if needed
|
// NOTE: Quote the string if needed
|
||||||
DN_Str8 str8 = *it.data;
|
DN_Str8 str8 = *it.data;
|
||||||
bool needs_quotes = DN_Str8Find(str8, DN_Str8FindFlag_Whitespace).found;
|
bool needs_quotes = false;
|
||||||
|
if (!DN_Str8StartsWithSensitive(*it.data, DN_Str8Lit("\"")))
|
||||||
|
needs_quotes = DN_Str8Find(str8, DN_Str8FindFlag_Whitespace).found;
|
||||||
|
|
||||||
if (needs_quotes)
|
if (needs_quotes)
|
||||||
cmd.data[write_index++] = '\"';
|
cmd.data[write_index++] = '\"';
|
||||||
|
|
||||||
@@ -932,7 +935,7 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Str8Slice cmd_line, DN_OSExecArgs
|
|||||||
if (DN_BitIsSet(args.flags, DN_OSExecFlags_SaveStdout)) {
|
if (DN_BitIsSet(args.flags, DN_OSExecFlags_SaveStdout)) {
|
||||||
if (!CreatePipe(&stdout_read, &stdout_write, &save_std_security_attribs, /*nSize*/ 0)) {
|
if (!CreatePipe(&stdout_read, &stdout_write, &save_std_security_attribs, /*nSize*/ 0)) {
|
||||||
DN_OSW32Error win_error = DN_OS_W32LastError(&scratch.arena);
|
DN_OSW32Error win_error = DN_OS_W32LastError(&scratch.arena);
|
||||||
result.os_error_code = win_error.code;
|
result.os_error_code = win_error.code;
|
||||||
DN_ErrSinkAppendF(
|
DN_ErrSinkAppendF(
|
||||||
err,
|
err,
|
||||||
result.os_error_code,
|
result.os_error_code,
|
||||||
@@ -1001,14 +1004,23 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Str8Slice cmd_line, DN_OSExecArgs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: Create a null stdin pipe so child gets EOF on read
|
||||||
|
// TODO: Eventually we should let the caller optionally write to stdin
|
||||||
|
HANDLE stdin_read = {};
|
||||||
|
if (DN_BitIsSet(args.flags, DN_OSExecFlags_SaveStdout) || DN_BitIsSet(args.flags, DN_OSExecFlags_SaveStderr)) {
|
||||||
|
HANDLE stdin_write = {};
|
||||||
|
if (CreatePipe(&stdin_read, &stdin_write, &save_std_security_attribs, 0))
|
||||||
|
CloseHandle(stdin_write);
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: Execute command
|
// NOTE: Execute command
|
||||||
PROCESS_INFORMATION proc_info = {};
|
PROCESS_INFORMATION proc_info = {};
|
||||||
STARTUPINFOW startup_info = {};
|
STARTUPINFOW startup_info = {};
|
||||||
startup_info.cb = sizeof(STARTUPINFOW);
|
startup_info.cb = sizeof(STARTUPINFOW);
|
||||||
startup_info.hStdError = stderr_write ? stderr_write : GetStdHandle(STD_ERROR_HANDLE);
|
startup_info.hStdError = stderr_write ? stderr_write : GetStdHandle(STD_ERROR_HANDLE);
|
||||||
startup_info.hStdOutput = stdout_write ? stdout_write : GetStdHandle(STD_OUTPUT_HANDLE);
|
startup_info.hStdOutput = stdout_write ? stdout_write : GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
startup_info.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
|
startup_info.hStdInput = stdin_read ? stdin_read : GetStdHandle(STD_INPUT_HANDLE);
|
||||||
startup_info.dwFlags |= STARTF_USESTDHANDLES;
|
startup_info.dwFlags |= STARTF_USESTDHANDLES;
|
||||||
BOOL create_result = CreateProcessW(nullptr,
|
BOOL create_result = CreateProcessW(nullptr,
|
||||||
cmd16.data,
|
cmd16.data,
|
||||||
nullptr,
|
nullptr,
|
||||||
@@ -1019,6 +1031,9 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Str8Slice cmd_line, DN_OSExecArgs
|
|||||||
working_dir16.data,
|
working_dir16.data,
|
||||||
&startup_info,
|
&startup_info,
|
||||||
&proc_info);
|
&proc_info);
|
||||||
|
if (stdin_read)
|
||||||
|
CloseHandle(stdin_read);
|
||||||
|
|
||||||
if (!create_result) {
|
if (!create_result) {
|
||||||
DN_OSW32Error win_error = DN_OS_W32LastError(&scratch.arena);
|
DN_OSW32Error win_error = DN_OS_W32LastError(&scratch.arena);
|
||||||
result.os_error_code = win_error.code;
|
result.os_error_code = win_error.code;
|
||||||
|
|||||||
+399
-402
File diff suppressed because it is too large
Load Diff
+61
-62
@@ -300,6 +300,7 @@
|
|||||||
// NOTE: Platform identification
|
// NOTE: Platform identification
|
||||||
#if !defined(DN_PLATFORM_EMSCRIPTEN) && \
|
#if !defined(DN_PLATFORM_EMSCRIPTEN) && \
|
||||||
!defined(DN_PLATFORM_POSIX) && \
|
!defined(DN_PLATFORM_POSIX) && \
|
||||||
|
!defined(DN_PLATFORM_ARM64) && \
|
||||||
!defined(DN_PLATFORM_WIN32)
|
!defined(DN_PLATFORM_WIN32)
|
||||||
#if defined(__aarch64__) || defined(_M_ARM64)
|
#if defined(__aarch64__) || defined(_M_ARM64)
|
||||||
#define DN_PLATFORM_ARM64
|
#define DN_PLATFORM_ARM64
|
||||||
@@ -1502,6 +1503,25 @@ enum DN_Str8BuilderAdd
|
|||||||
DN_Str8BuilderAdd_Prepend,
|
DN_Str8BuilderAdd_Prepend,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if !defined(DN_OsPathSeperator)
|
||||||
|
#if defined(DN_PLATFORM_WIN32)
|
||||||
|
#define DN_OsPathSeperator "\\"
|
||||||
|
#else
|
||||||
|
#define DN_OsPathSeperator "/"
|
||||||
|
#endif
|
||||||
|
#define DN_OsPathSeperatorStr8 DN_Str8Lit(DN_OsPathSeperator)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct DN_Path DN_Path;
|
||||||
|
struct DN_Path
|
||||||
|
{
|
||||||
|
bool has_prefix_path_seperator;
|
||||||
|
DN_Str8Link *head;
|
||||||
|
DN_Str8Link *tail;
|
||||||
|
DN_USize string_size;
|
||||||
|
DN_U16 links_size;
|
||||||
|
};
|
||||||
|
|
||||||
typedef DN_U32 DN_AgeUnit;
|
typedef DN_U32 DN_AgeUnit;
|
||||||
enum DN_AgeUnit_
|
enum DN_AgeUnit_
|
||||||
{
|
{
|
||||||
@@ -2297,7 +2317,6 @@ enum DN_OSFileRotateFlags_
|
|||||||
DN_OSFileRotateFlags_KeepBaseFile = 1 << 0,
|
DN_OSFileRotateFlags_KeepBaseFile = 1 << 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum DN_OSPathInfoType
|
enum DN_OSPathInfoType
|
||||||
{
|
{
|
||||||
DN_OSPathInfoType_Unknown,
|
DN_OSPathInfoType_Unknown,
|
||||||
@@ -2356,34 +2375,6 @@ enum DN_OSFileAccess_
|
|||||||
DN_OSFileAccess_All = DN_OSFileAccess_ReadWrite | DN_OSFileAccess_Execute | DN_OSFileAccess_AppendOnly,
|
DN_OSFileAccess_All = DN_OSFileAccess_ReadWrite | DN_OSFileAccess_Execute | DN_OSFileAccess_AppendOnly,
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOTE: DN_OSPath
|
|
||||||
#if !defined(DN_OSPathSeparator)
|
|
||||||
#if defined(DN_PLATFORM_WIN32)
|
|
||||||
#define DN_OSPathSeparator "\\"
|
|
||||||
#else
|
|
||||||
#define DN_OSPathSeparator "/"
|
|
||||||
#endif
|
|
||||||
#define DN_OSPathSeparatorStr8 DN_Str8Lit(DN_OSPathSeparator)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct DN_OSPathLink DN_OSPathLink;
|
|
||||||
struct DN_OSPathLink
|
|
||||||
{
|
|
||||||
DN_Str8 string;
|
|
||||||
DN_OSPathLink *next;
|
|
||||||
DN_OSPathLink *prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct DN_OSPath DN_OSPath;
|
|
||||||
struct DN_OSPath
|
|
||||||
{
|
|
||||||
bool has_prefix_path_separator;
|
|
||||||
DN_OSPathLink *head;
|
|
||||||
DN_OSPathLink *tail;
|
|
||||||
DN_USize string_size;
|
|
||||||
DN_U16 links_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef DN_U32 DN_OSExecFlags;
|
typedef DN_U32 DN_OSExecFlags;
|
||||||
enum DN_OSExecFlags_
|
enum DN_OSExecFlags_
|
||||||
{
|
{
|
||||||
@@ -3098,7 +3089,7 @@ DN_API void DN_Str8x512AppendFmtV
|
|||||||
DN_API void DN_Str8x1024AppendFmt (DN_Str8x1024 *str, DN_FMT_ATTRIB char const *fmt, ...);
|
DN_API void DN_Str8x1024AppendFmt (DN_Str8x1024 *str, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
DN_API void DN_Str8x1024AppendFmtV (DN_Str8x1024 *str, DN_FMT_ATTRIB char const *fmt, va_list args);
|
DN_API void DN_Str8x1024AppendFmtV (DN_Str8x1024 *str, DN_FMT_ATTRIB char const *fmt, va_list args);
|
||||||
|
|
||||||
DN_API DN_Str8x32 DN_Str8x32FromU64 (DN_U64 val, char separator);
|
DN_API DN_Str8x32 DN_Str8x32FromU64 (DN_U64 val, char seperator);
|
||||||
DN_API bool DN_Str8Is (DN_Str8 string, DN_Str8IsFlags flags);
|
DN_API bool DN_Str8Is (DN_Str8 string, DN_Str8IsFlags flags);
|
||||||
DN_API char * DN_Str8End (DN_Str8 string);
|
DN_API char * DN_Str8End (DN_Str8 string);
|
||||||
DN_API DN_Str8 DN_Str8Subset (DN_Str8 string, DN_USize offset, DN_USize count);
|
DN_API DN_Str8 DN_Str8Subset (DN_Str8 string, DN_USize offset, DN_USize count);
|
||||||
@@ -3174,13 +3165,13 @@ DN_API DN_USize DN_Str8SplitAVX512F
|
|||||||
DN_API DN_Str8Slice DN_Str8SplitAllocAVX512F (DN_Arena *arena, DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitFlags flags);
|
DN_API DN_Str8Slice DN_Str8SplitAllocAVX512F (DN_Arena *arena, DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitFlags flags);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DN_API DN_Str8 DN_Str8SliceRender (DN_Str8Slice array, DN_Str8 separator, DN_Arena *arena);
|
DN_API DN_Str8 DN_Str8SliceRender (DN_Str8Slice array, DN_Str8 seperator, DN_Arena *arena);
|
||||||
DN_API DN_Str8 DN_Str8RenderSpaceSep (DN_Str8Slice array, DN_Arena *arena);
|
DN_API DN_Str8 DN_Str8RenderSpaceSep (DN_Str8Slice array, DN_Arena *arena);
|
||||||
DN_API int DN_Str8CompareNatural (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case);
|
DN_API int DN_Str8CompareNatural (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case);
|
||||||
DN_API int DN_Str8CompareLexicographic (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case);
|
DN_API int DN_Str8CompareLexicographic (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case);
|
||||||
|
|
||||||
DN_API bool DN_Str16Eq (DN_Str16 lhs, DN_Str16 rhs);
|
DN_API bool DN_Str16Eq (DN_Str16 lhs, DN_Str16 rhs);
|
||||||
DN_API DN_Str16 DN_Str16SliceRender (DN_Str16Slice array, DN_Str16 separator, DN_Arena *arena);
|
DN_API DN_Str16 DN_Str16SliceRender (DN_Str16Slice array, DN_Str16 seperator, DN_Arena *arena);
|
||||||
DN_API DN_Str16 DN_Str16RenderSpaceSep (DN_Str16Slice array, DN_Arena *arena);
|
DN_API DN_Str16 DN_Str16RenderSpaceSep (DN_Str16Slice array, DN_Arena *arena);
|
||||||
|
|
||||||
DN_API DN_Str8Builder DN_Str8BuilderFromArena (DN_Arena *arena);
|
DN_API DN_Str8Builder DN_Str8BuilderFromArena (DN_Arena *arena);
|
||||||
@@ -3216,6 +3207,18 @@ DN_API DN_Str8 DN_Str8FromStr8BuilderArena
|
|||||||
DN_API DN_Str8 DN_Str8FromStr8BuilderDelimitAllocator (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Allocator allocator);
|
DN_API DN_Str8 DN_Str8FromStr8BuilderDelimitAllocator (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Allocator allocator);
|
||||||
DN_API DN_Str8 DN_Str8FromStr8BuilderDelimitArena (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Arena *arena);
|
DN_API DN_Str8 DN_Str8FromStr8BuilderDelimitArena (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Arena *arena);
|
||||||
|
|
||||||
|
DN_API bool DN_PathAddRef (DN_Path *path, DN_Str8 add, DN_Arena *arena);
|
||||||
|
DN_API bool DN_PathAdd (DN_Path *path, DN_Str8 add, DN_Arena *arena);
|
||||||
|
DN_API bool DN_PathAddF (DN_Path *path, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
|
DN_API bool DN_PathPop (DN_Path *path);
|
||||||
|
DN_API DN_Str8 DN_Str8FromPath (DN_Path const *path, DN_Str8 path_seperator, DN_Allocator allocator);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtPathVArena (DN_Str8 path_seperator, DN_Arena *arena, char const *fmt, va_list args);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtPathArena (DN_Str8 path_seperator, DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtPathVPool (DN_Str8 path_seperator, DN_Pool *pool, char const *fmt, va_list args);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtPathPool (DN_Str8 path_seperator, DN_Pool *pool, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtOsPathArena (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
|
DN_API DN_Str8 DN_Str8FmtOsPathPool (DN_Pool *pool, DN_FMT_ATTRIB char const *fmt, ...);
|
||||||
|
|
||||||
DN_API int DN_UTF8Encode (DN_U8 utf8[4], DN_U32 codepoint);
|
DN_API int DN_UTF8Encode (DN_U8 utf8[4], DN_U32 codepoint);
|
||||||
DN_API int DN_UTF16Encode (DN_U16 utf16[2], DN_U32 codepoint);
|
DN_API int DN_UTF16Encode (DN_U16 utf16[2], DN_U32 codepoint);
|
||||||
DN_API DN_UTF8DecodeResult DN_UTF8Decode (DN_Str8 stream);
|
DN_API DN_UTF8DecodeResult DN_UTF8Decode (DN_Str8 stream);
|
||||||
@@ -3319,7 +3322,14 @@ DN_API void DN_ProfilerFmtToStdout
|
|||||||
DN_API DN_F64 DN_ProfilerSecFromTsc (DN_Profiler *profiler, DN_U64 duration_tsc);
|
DN_API DN_F64 DN_ProfilerSecFromTsc (DN_Profiler *profiler, DN_U64 duration_tsc);
|
||||||
DN_API DN_F64 DN_ProfilerMsFromTsc (DN_Profiler *profiler, DN_U64 duration_tsc);
|
DN_API DN_F64 DN_ProfilerMsFromTsc (DN_Profiler *profiler, DN_U64 duration_tsc);
|
||||||
|
|
||||||
DN_API void DN_QSort (void *array, DN_USize array_size, DN_USize elem_size, void *user_context, DN_QSortCompareFunc *compare);
|
DN_API void DN_QSort_ (void *array, DN_USize array_size, DN_USize elem_size, void *user_context, DN_QSortCompareFunc *compare);
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
template <typename T> void DN_QSortT (T *array, DN_USize array_size, void *user_context, DN_QSortCompareFunc *compare);
|
||||||
|
#define DN_QSort(array, array_size, user_context, compare) DN_QSortT(array, array_size, user_context, compare)
|
||||||
|
#else
|
||||||
|
#define DN_QSort(array, array_size, user_context, compare) DN_QSort_(array, array_size, sizeof(*array), user_context, compare)
|
||||||
|
#endif
|
||||||
|
|
||||||
DN_API bool DN_QSortCompareStr8NaturalAsc (void const* lhs, void const *rhs, void *user_context);
|
DN_API bool DN_QSortCompareStr8NaturalAsc (void const* lhs, void const *rhs, void *user_context);
|
||||||
DN_API bool DN_QSortCompareStr8NaturalDesc (void const* lhs, void const *rhs, void *user_context);
|
DN_API bool DN_QSortCompareStr8NaturalDesc (void const* lhs, void const *rhs, void *user_context);
|
||||||
DN_API bool DN_QSortCompareStr8LexicographicAsc (void const* lhs, void const *rhs, void *user_context);
|
DN_API bool DN_QSortCompareStr8LexicographicAsc (void const* lhs, void const *rhs, void *user_context);
|
||||||
@@ -3348,12 +3358,12 @@ DN_API DN_F32 DN_Pcg32NextF32
|
|||||||
DN_API DN_F64 DN_Pcg32NextF64 (DN_Pcg32 *rng);
|
DN_API DN_F64 DN_Pcg32NextF64 (DN_Pcg32 *rng);
|
||||||
DN_API void DN_Pcg32Advance (DN_Pcg32 *rng, DN_U64 delta);
|
DN_API void DN_Pcg32Advance (DN_Pcg32 *rng, DN_U64 delta);
|
||||||
|
|
||||||
#if !defined(DN_Fnv1a32_SEED)
|
#if !defined(DN_FNV1A32_SEED)
|
||||||
#define DN_Fnv1a32_SEED 2166136261U
|
#define DN_FNV1A32_SEED 2166136261U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(DN_Fnv1a64_SEED)
|
#if !defined(DN_FNV1A64_SEED)
|
||||||
#define DN_Fnv1a64_SEED 14695981039346656037ULL
|
#define DN_FNV1A64_SEED 14695981039346656037ULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DN_API DN_U32 DN_Fnv1aHashU32FromBytes (void const *bytes, DN_USize count, DN_U32 seed);
|
DN_API DN_U32 DN_Fnv1aHashU32FromBytes (void const *bytes, DN_USize count, DN_U32 seed);
|
||||||
@@ -3499,10 +3509,16 @@ DN_API DN_V2U16& operator/=
|
|||||||
DN_API DN_V2U16& operator-= (DN_V2U16& lhs, DN_V2U16 rhs);
|
DN_API DN_V2U16& operator-= (DN_V2U16& lhs, DN_V2U16 rhs);
|
||||||
DN_API DN_V2U16& operator+= (DN_V2U16& lhs, DN_V2U16 rhs);
|
DN_API DN_V2U16& operator+= (DN_V2U16& lhs, DN_V2U16 rhs);
|
||||||
|
|
||||||
#define DN_V2U32Zero DN_Literal(DN_V2U32){{(DN_U32)(0), (DN_U32)(0)}}
|
// NOTE: DN_V2F32
|
||||||
#define DN_V2U32One DN_Literal(DN_V2U32){{(DN_U32)(1), (DN_U32)(1)}}
|
// API
|
||||||
#define DN_V2U32From1N(x) DN_Literal(DN_V2U32){{(DN_U32)(x), (DN_U32)(x)}}
|
// DN_V2F32Rotate
|
||||||
#define DN_V2U32From2N(x, y) DN_Literal(DN_V2U32){{(DN_U32)(x), (DN_U32)(y)}}
|
// Rotate a vector using the precomputed cosine and sine value of the angle (e.g.
|
||||||
|
// `cos_a => cos(your_angle * 2.f * DN_PiF32)` and `sin_a => sinf(your_angle * 2.f * DN_PiF32)`)
|
||||||
|
#define DN_V2U32Zero DN_Literal(DN_V2U32){{(DN_U32)(0), (DN_U32)(0)}}
|
||||||
|
#define DN_V2U32One DN_Literal(DN_V2U32){{(DN_U32)(1), (DN_U32)(1)}}
|
||||||
|
#define DN_V2U32From1N(x) DN_Literal(DN_V2U32){{(DN_U32)(x), (DN_U32)(x)}}
|
||||||
|
#define DN_V2U32From2N(x, y) DN_Literal(DN_V2U32){{(DN_U32)(x), (DN_U32)(y)}}
|
||||||
|
#define DN_V2U32FromV2(v2) DN_Literal(DN_V2U32){{(DN_U32)(v2.x), (DN_U32)(v2.y)}}
|
||||||
|
|
||||||
#define DN_V2F32Zero DN_Literal(DN_V2F32){{(DN_F32)(0), (DN_F32)(0)}}
|
#define DN_V2F32Zero DN_Literal(DN_V2F32){{(DN_F32)(0), (DN_F32)(0)}}
|
||||||
#define DN_V2F32One DN_Literal(DN_V2F32){{(DN_F32)(1), (DN_F32)(1)}}
|
#define DN_V2F32One DN_Literal(DN_V2F32){{(DN_F32)(1), (DN_F32)(1)}}
|
||||||
@@ -3511,6 +3527,7 @@ DN_API DN_V2U16& operator+=
|
|||||||
#define DN_V2F32FromV2(xy) DN_Literal(DN_V2F32){{(DN_F32)(xy).x, (DN_F32)(xy).y}}
|
#define DN_V2F32FromV2(xy) DN_Literal(DN_V2F32){{(DN_F32)(xy).x, (DN_F32)(xy).y}}
|
||||||
|
|
||||||
DN_API DN_V2F32 DN_V2F32Lerp (DN_V2F32 a, DN_F32 t, DN_V2F32 b);
|
DN_API DN_V2F32 DN_V2F32Lerp (DN_V2F32 a, DN_F32 t, DN_V2F32 b);
|
||||||
|
DN_API DN_V2F32 DN_V2F32Rotate (DN_V2F32 v, DN_F32 cos_a, DN_F32 sin_a);
|
||||||
|
|
||||||
DN_API bool operator!= (DN_V2F32 lhs, DN_V2F32 rhs);
|
DN_API bool operator!= (DN_V2F32 lhs, DN_V2F32 rhs);
|
||||||
DN_API bool operator== (DN_V2F32 lhs, DN_V2F32 rhs);
|
DN_API bool operator== (DN_V2F32 lhs, DN_V2F32 rhs);
|
||||||
@@ -3580,7 +3597,7 @@ DN_API DN_F32 DN_V2F32Area
|
|||||||
|
|
||||||
// NOTE: Grayscale co-efficients from:
|
// NOTE: Grayscale co-efficients from:
|
||||||
// https://github.com/EpicGames/UnrealEngine/blob/260bb2e1c5610b31c63a36206eedd289409c5f11/Engine/Source/Runtime/Core/Private/Math/Color.cpp#L304
|
// https://github.com/EpicGames/UnrealEngine/blob/260bb2e1c5610b31c63a36206eedd289409c5f11/Engine/Source/Runtime/Core/Private/Math/Color.cpp#L304
|
||||||
DN_V3F32 static const DN_V3F32_Rgb_LUMINANCE = DN_V3F32From3N(0.3f, 0.59f, 0.11f);
|
DN_V3F32 static const DN_V3F32_RGB_LUMINANCE = DN_V3F32From3N(0.3f, 0.59f, 0.11f);
|
||||||
|
|
||||||
DN_API bool operator== (DN_V3F32 lhs, DN_V3F32 rhs);
|
DN_API bool operator== (DN_V3F32 lhs, DN_V3F32 rhs);
|
||||||
DN_API bool operator!= (DN_V3F32 lhs, DN_V3F32 rhs);
|
DN_API bool operator!= (DN_V3F32 lhs, DN_V3F32 rhs);
|
||||||
@@ -4596,8 +4613,8 @@ DN_API void * DN_OS_MemAlloc (D
|
|||||||
DN_API void DN_OS_MemDealloc (void *ptr);
|
DN_API void DN_OS_MemDealloc (void *ptr);
|
||||||
|
|
||||||
DN_API DN_Date DN_OS_DateLocalTimeNow ();
|
DN_API DN_Date DN_OS_DateLocalTimeNow ();
|
||||||
DN_API DN_Str8x32 DN_OS_DateLocalTimeStr8Now (char date_separator = '-', char hms_separator = ':');
|
DN_API DN_Str8x32 DN_OS_DateLocalTimeStr8Now (char date_seperator = '-', char hms_seperator = ':');
|
||||||
DN_API DN_Str8x32 DN_OS_DateLocalTimeStr8 (DN_Date time, char date_separator = '-', char hms_separator = ':');
|
DN_API DN_Str8x32 DN_OS_DateLocalTimeStr8 (DN_Date time, char date_seperator = '-', char hms_seperator = ':');
|
||||||
DN_API DN_U64 DN_OS_DateUnixTimeNs ();
|
DN_API DN_U64 DN_OS_DateUnixTimeNs ();
|
||||||
#define DN_OS_DateUnixTimeUs() (DN_OS_DateUnixTimeNs() / 1000)
|
#define DN_OS_DateUnixTimeUs() (DN_OS_DateUnixTimeNs() / 1000)
|
||||||
#define DN_OS_DateUnixTimeMs() (DN_OS_DateUnixTimeNs() / (1000 * 1000))
|
#define DN_OS_DateUnixTimeMs() (DN_OS_DateUnixTimeNs() / (1000 * 1000))
|
||||||
@@ -4696,24 +4713,6 @@ DN_API bool DN_OS_PathIsDir (D
|
|||||||
DN_API bool DN_OS_PathMakeDir (DN_Str8 path);
|
DN_API bool DN_OS_PathMakeDir (DN_Str8 path);
|
||||||
DN_API bool DN_OS_PathIterateDir (DN_Str8 path, DN_OSDirIterator *it);
|
DN_API bool DN_OS_PathIterateDir (DN_Str8 path, DN_OSDirIterator *it);
|
||||||
|
|
||||||
DN_API bool DN_OS_PathAddRef (DN_Arena *arena, DN_OSPath *fs_path, DN_Str8 path);
|
|
||||||
DN_API bool DN_OS_PathAdd (DN_Arena *arena, DN_OSPath *fs_path, DN_Str8 path);
|
|
||||||
DN_API bool DN_OS_PathAddF (DN_Arena *arena, DN_OSPath *fs_path, DN_FMT_ATTRIB char const *fmt, ...);
|
|
||||||
DN_API bool DN_OS_PathPop (DN_OSPath *fs_path);
|
|
||||||
DN_API DN_Str8 DN_OS_PathBuildWithSeparatorAllocator (DN_Allocator allocator, DN_OSPath const *fs_path, DN_Str8 path_separator);
|
|
||||||
DN_API DN_Str8 DN_OS_PathToArena (DN_Arena *arena, DN_Str8 path, DN_Str8 path_separtor);
|
|
||||||
DN_API DN_Str8 DN_OS_PathToPool (DN_Pool *pool, DN_Str8 path, DN_Str8 path_separtor);
|
|
||||||
DN_API DN_Str8 DN_OS_PathToFmtArena (DN_Arena *arena, DN_Str8 path_separator, DN_FMT_ATTRIB char const *fmt, ...);
|
|
||||||
DN_API DN_Str8 DN_OS_PathToFmtPool (DN_Pool *pool, DN_Str8 path_separator, DN_FMT_ATTRIB char const *fmt, ...);
|
|
||||||
DN_API DN_Str8 DN_OS_PathArena (DN_Arena *arena, DN_Str8 path);
|
|
||||||
DN_API DN_Str8 DN_OS_PathPool (DN_Pool *pool, DN_Str8 path);
|
|
||||||
DN_API DN_Str8 DN_OS_PathFmtArena (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...);
|
|
||||||
DN_API DN_Str8 DN_OS_PathFmtPool (DN_Pool *pool, DN_FMT_ATTRIB char const *fmt, ...);
|
|
||||||
|
|
||||||
#define DN_OS_PathBuildFwdSlash(allocator, fs_path) DN_OS_PathBuildWithSeparatorAllocator(allocator, fs_path, DN_Str8Lit("/"))
|
|
||||||
#define DN_OS_PathBuildBackSlash(allocator, fs_path) DN_OS_PathBuildWithSeparatorAllocator(allocator, fs_path, DN_Str8Lit("\\"))
|
|
||||||
#define DN_OS_PathBuild(allocator, fs_path) DN_OS_PathBuildWithSeparatorAllocator(allocator, fs_path, DN_OSPathSeparatorStr8)
|
|
||||||
|
|
||||||
DN_API void DN_OS_Exit (int32_t exit_code);
|
DN_API void DN_OS_Exit (int32_t exit_code);
|
||||||
DN_API DN_OSExecArgs DN_OS_ExecArgsDefault ();
|
DN_API DN_OSExecArgs DN_OS_ExecArgsDefault ();
|
||||||
DN_API DN_OSExecResult DN_OS_ExecPump (DN_OSExecAsyncHandle handle, char *stdout_buffer, size_t *stdout_size, char *stderr_buffer, size_t *stderr_size, DN_U32 timeout_ms, DN_ErrSink *err);
|
DN_API DN_OSExecResult DN_OS_ExecPump (DN_OSExecAsyncHandle handle, char *stdout_buffer, size_t *stdout_size, char *stderr_buffer, size_t *stderr_size, DN_U32 timeout_ms, DN_ErrSink *err);
|
||||||
|
|||||||
@@ -0,0 +1,301 @@
|
|||||||
|
#include "dn_seshc.h"
|
||||||
|
|
||||||
|
struct DN_SHMsgSendAsyncContext_
|
||||||
|
{
|
||||||
|
bool send_success;
|
||||||
|
DN_Arena* arena;
|
||||||
|
DN_SHCLIArgs args;
|
||||||
|
DN_SHMsgSendData send;
|
||||||
|
DN_Str8 msg;
|
||||||
|
bool detached;
|
||||||
|
};
|
||||||
|
|
||||||
|
DN_SHCLIArgs DN_SH_CLIArgsCopy(DN_SHCLIArgs const *src, DN_Arena *arena)
|
||||||
|
{
|
||||||
|
DN_SHCLIArgs result = {};
|
||||||
|
result = *src;
|
||||||
|
result.exe_path = DN_Str8FromStr8Arena(src->exe_path, arena);
|
||||||
|
result.ini_path = DN_Str8FromStr8Arena(src->ini_path, arena);
|
||||||
|
result.seed_node_url = DN_Str8FromStr8Arena(src->seed_node_url, arena);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
DN_Str8 DN_SH_CLIOptionsStr8()
|
||||||
|
{
|
||||||
|
DN_Str8 result = DN_Str8Lit(
|
||||||
|
"SESHC OPTIONS (note all options must be set to activate Seshc):\n"
|
||||||
|
" --seshc-exe-path <path> Path to the Seshc EXE file to invoke for sending messages\n"
|
||||||
|
" --seshc-ini-path <path> Path to the .ini file to load Seshc arguments from\n"
|
||||||
|
" (such as account secrets, display name, recipient...)\n"
|
||||||
|
" --seshc-seed-node <url> URL to the Session seed node for determining the nodes to\n"
|
||||||
|
" send the message to\n"
|
||||||
|
);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
DN_SHCLIEatArgResult DN_SH_CLIEatArg(DN_SHCLIArgs *args, char const **arg_ptr, int arg_count)
|
||||||
|
{
|
||||||
|
DN_SHCLIEatArgResult result = {};
|
||||||
|
result.arg_ptr = arg_ptr;
|
||||||
|
result.arg_count = arg_count;
|
||||||
|
|
||||||
|
DN_Str8 arg = {};
|
||||||
|
if (arg_count)
|
||||||
|
arg = DN_Str8FromCStr8(*result.arg_ptr);
|
||||||
|
|
||||||
|
// NOTE: Try handling the argument if we recognise it
|
||||||
|
{
|
||||||
|
if (!result.eaten && DN_Str8EqInsensitive(arg, DN_Str8Lit("--seshc-exe-path"))) {
|
||||||
|
(void)DN_ArgShift(result.arg_ptr, result.arg_count);
|
||||||
|
result.eaten = true;
|
||||||
|
args->exe_path = DN_Str8FromCStr8(DN_ArgShift(result.arg_ptr, result.arg_count));
|
||||||
|
|
||||||
|
if (DN_OS_PathInfo(args->exe_path).type != DN_OSPathInfoType_File) {
|
||||||
|
result.error_msg = DN_Str8Lit("Seshc executable path does not point to a file");
|
||||||
|
result.error_arg = args->exe_path;
|
||||||
|
args->exe_path = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!result.eaten && DN_Str8EqInsensitive(arg, DN_Str8Lit("--seshc-ini-path"))) {
|
||||||
|
(void)DN_ArgShift(result.arg_ptr, result.arg_count);
|
||||||
|
result.eaten = true;
|
||||||
|
args->ini_path = DN_Str8FromCStr8(DN_ArgShift(result.arg_ptr, result.arg_count));
|
||||||
|
|
||||||
|
if (DN_OS_PathInfo(args->ini_path).type != DN_OSPathInfoType_File) {
|
||||||
|
result.error_msg = DN_Str8Lit("Seshc ini path does not point to a file");
|
||||||
|
result.error_arg = args->ini_path;
|
||||||
|
args->ini_path = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!result.eaten && DN_Str8EqInsensitive(arg, DN_Str8Lit("--seshc-seed-node"))) {
|
||||||
|
(void)DN_ArgShift(result.arg_ptr, result.arg_count);
|
||||||
|
result.eaten = true;
|
||||||
|
args->seed_node_url = DN_Str8FromCStr8(DN_ArgShift(result.arg_ptr, result.arg_count));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args->seed_node_url.count && args->exe_path.count && args->ini_path.count)
|
||||||
|
args->valid = true;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DN_SH_MsgSendBlockingFmt(DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, char const *fmt, ...)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
if (cli_args->valid) {
|
||||||
|
DN_TcScratch scratch = DN_TcScratchBeginArena(nullptr, 0);
|
||||||
|
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
DN_Str8 msg = DN_Str8FmtVArena(&scratch.arena, fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
DN_Str8 account_secret_arg = DN_Str8Lit("--account-secret");
|
||||||
|
DN_Str8 seed_node_url_arg = DN_Str8Lit("--seed-node-url");
|
||||||
|
DN_Str8 display_name_arg = DN_Str8Lit("--display-name");
|
||||||
|
DN_Str8 ini_path_arg = DN_Str8Lit("--ini-path");
|
||||||
|
DN_Str8 send_arg = DN_Str8Lit("send");
|
||||||
|
|
||||||
|
DN_Str8 cmds[16] = {};
|
||||||
|
DN_USize cmds_count = 0;
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, cli_args->exe_path);
|
||||||
|
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, account_secret_arg);
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, send.account_secret);
|
||||||
|
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, seed_node_url_arg);
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, cli_args->seed_node_url);
|
||||||
|
|
||||||
|
if (send.display_name.count) {
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, display_name_arg);
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, send.display_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, ini_path_arg);
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, cli_args->ini_path);
|
||||||
|
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, send_arg);
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, send.recipient);
|
||||||
|
|
||||||
|
DN_LArrayAppend(cmds, &cmds_count, msg);
|
||||||
|
|
||||||
|
DN_Str8Slice cmd_line = {};
|
||||||
|
cmd_line.data = cmds;
|
||||||
|
cmd_line.count = cmds_count;
|
||||||
|
DN_OSExecResult exec = DN_OS_Exec(cmd_line, DN_OS_ExecArgsDefault(), &scratch.arena, nullptr);
|
||||||
|
result = exec.os_error_code == 0 && exec.exit_code == 0;
|
||||||
|
if (!result) {
|
||||||
|
DN_LogErrorF("Error sending message to %.*s (exit code: %d, os: %d): %.*s",
|
||||||
|
DN_Str8PrintFmt(send.recipient),
|
||||||
|
exec.exit_code,
|
||||||
|
exec.os_error_code,
|
||||||
|
DN_Str8PrintFmt(exec.stderr_text));
|
||||||
|
}
|
||||||
|
DN_TcScratchEnd(&scratch);
|
||||||
|
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int DN_SH_MsgSendDetachedFmtThreadFunc_(DN_OSThread *thread)
|
||||||
|
{
|
||||||
|
DN_SHMsgSendAsyncContext_ *context = DN_Cast(DN_SHMsgSendAsyncContext_ *) thread->user_context;
|
||||||
|
context->send_success = DN_SH_MsgSendBlockingFmt(context->send, &context->args, "%.*s", DN_Str8PrintFmt(context->msg));
|
||||||
|
if (context->detached)
|
||||||
|
DN_ArenaDeinit(context->arena);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DN_SHMsgSendAsyncHandle DN_SH_MsgSendAsyncFmtVMaybeDetached_(DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, DN_Arena *arena, bool detached, char const *fmt, va_list args)
|
||||||
|
{
|
||||||
|
DN_SHMsgSendAsyncHandle result = {};
|
||||||
|
if (!cli_args->valid)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
// NOTE: Setup context
|
||||||
|
DN_SHMsgSendAsyncContext_ *context = DN_ArenaNewZ(arena, DN_SHMsgSendAsyncContext_);
|
||||||
|
context->args = DN_SH_CLIArgsCopy(cli_args, arena);
|
||||||
|
context->send = send;
|
||||||
|
context->arena = arena;
|
||||||
|
context->msg = DN_Str8FmtVArena(arena, fmt, args);
|
||||||
|
context->detached = detached;
|
||||||
|
|
||||||
|
// NOTE: Execute and forget
|
||||||
|
DN_OSThreadInitArgs thread_args = DN_OS_ThreadInitArgsDefault();
|
||||||
|
if (detached)
|
||||||
|
thread_args.flags |= DN_OSThreadFlags_Detached;
|
||||||
|
|
||||||
|
DN_OS_ThreadInit(&result.thread, DN_SH_MsgSendDetachedFmtThreadFunc_, thread_args, context);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DN_SH_MsgSendDetachedFmt(DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, char const *fmt, ...)
|
||||||
|
{
|
||||||
|
DN_Arena arena_stack = DN_OS_ArenaFromHeapVirtual(0, 0, DN_MemFlags_Nil);
|
||||||
|
DN_Arena *arena = DN_ArenaNewZ(&arena_stack, DN_Arena);
|
||||||
|
*arena = arena_stack;
|
||||||
|
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
DN_SH_MsgSendAsyncFmtVMaybeDetached_(send, cli_args, arena, /*detached=*/ true, fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
DN_SHMsgSendAsyncHandle DN_SH_MsgSendAsyncFmt(DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, DN_Arena *arena, char const *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
DN_SHMsgSendAsyncHandle result = DN_SH_MsgSendAsyncFmtVMaybeDetached_(send, cli_args, arena, /*detached=*/ false, fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
DN_SHMsgSendAsyncStatus DN_SH_MsgSendAsyncWait(DN_SHMsgSendAsyncHandle *handle, DN_U32 timeout_ms)
|
||||||
|
{
|
||||||
|
DN_SHMsgSendAsyncStatus result = DN_SHMsgSendAsyncStatus_Success;
|
||||||
|
if (handle && handle->thread.user_context) {
|
||||||
|
bool joined = DN_OS_ThreadJoin(&handle->thread, timeout_ms, DN_TcDeinitArenas_Yes);
|
||||||
|
if (joined) {
|
||||||
|
DN_SHMsgSendAsyncContext_ *context = DN_Cast(DN_SHMsgSendAsyncContext_ *) handle->thread.user_context;
|
||||||
|
result = context->send_success ? DN_SHMsgSendAsyncStatus_Success : DN_SHMsgSendAsyncStatus_Failed;
|
||||||
|
*handle = {};
|
||||||
|
} else {
|
||||||
|
result = DN_SHMsgSendAsyncStatus_Timeout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DN_SH_LogBroadcastFmtV(DN_SHLogMode mode, DN_LogType type, DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, DN_Str8 short_desc, char const *fmt, va_list args)
|
||||||
|
{
|
||||||
|
DN_TcScratch scratch = DN_TcScratchBeginArena(nullptr, 0);
|
||||||
|
DN_Str8 msg = DN_Str8FmtVArena(&scratch.arena, fmt, args);
|
||||||
|
DN_Str8 prefix = {};
|
||||||
|
switch (type) {
|
||||||
|
case DN_LogType_Debug: prefix = DN_Str8Lit("🐞 "); break;
|
||||||
|
case DN_LogType_Info: prefix = DN_Str8Lit("ℹ️ "); break;
|
||||||
|
case DN_LogType_Warning: prefix = DN_Str8Lit("⚠️ "); break;
|
||||||
|
case DN_LogType_Error: prefix = DN_Str8Lit("🚨 "); break;
|
||||||
|
case DN_LogType_Count: break;
|
||||||
|
}
|
||||||
|
DN_LogF(type, "%.*s%.*s. %.*s", DN_Str8PrintFmt(prefix), DN_Str8PrintFmt(short_desc), DN_Str8PrintFmt(msg));
|
||||||
|
|
||||||
|
DN_Date date = DN_OS_DateLocalTimeNow();
|
||||||
|
|
||||||
|
// NOTE: 12-hour conversion
|
||||||
|
DN_U8 hour12 = date.hour % 12;
|
||||||
|
if (hour12 == 0)
|
||||||
|
hour12 = 12;
|
||||||
|
char const *am_pm = date.hour < 12 ? "AM" : "PM";
|
||||||
|
|
||||||
|
// Time-of-day emoji
|
||||||
|
DN_Str8 time_emoji = {};
|
||||||
|
if (date.hour >= 5 && date.hour <= 11)
|
||||||
|
time_emoji = DN_Str8Lit("☀️");
|
||||||
|
else if (date.hour >= 12 && date.hour <= 16)
|
||||||
|
time_emoji = DN_Str8Lit("🌤️");
|
||||||
|
else if (date.hour >= 17 && date.hour <= 19)
|
||||||
|
time_emoji = DN_Str8Lit("🌅");
|
||||||
|
else if (date.hour >= 20 && date.hour <= 23)
|
||||||
|
time_emoji = DN_Str8Lit("✨");
|
||||||
|
else
|
||||||
|
time_emoji = DN_Str8Lit("🌑");
|
||||||
|
|
||||||
|
if (mode == DN_SHLogMode_Detached) {
|
||||||
|
DN_SH_MsgSendDetachedFmt(send,
|
||||||
|
cli_args,
|
||||||
|
"%.*s%.*s\n"
|
||||||
|
"%.*s %u-%02u-%02u %u:%02u:%02u %s%s"
|
||||||
|
"%.*s",
|
||||||
|
DN_Str8PrintFmt(prefix),
|
||||||
|
DN_Str8PrintFmt(short_desc),
|
||||||
|
DN_Str8PrintFmt(time_emoji),
|
||||||
|
date.year,
|
||||||
|
date.month,
|
||||||
|
date.day,
|
||||||
|
hour12,
|
||||||
|
date.minutes,
|
||||||
|
date.seconds,
|
||||||
|
am_pm,
|
||||||
|
msg.count ? "\n" : "",
|
||||||
|
DN_Str8PrintFmt(msg));
|
||||||
|
} else {
|
||||||
|
DN_Assert(mode == DN_SHLogMode_Blocking);
|
||||||
|
DN_SH_MsgSendBlockingFmt(send,
|
||||||
|
cli_args,
|
||||||
|
"%.*s %.*s\n"
|
||||||
|
"%.*s %u-%02u-%02u %u:%02u:%02u %s%s"
|
||||||
|
"%.*s",
|
||||||
|
DN_Str8PrintFmt(prefix),
|
||||||
|
DN_Str8PrintFmt(short_desc),
|
||||||
|
DN_Str8PrintFmt(time_emoji),
|
||||||
|
date.year,
|
||||||
|
date.month,
|
||||||
|
date.day,
|
||||||
|
hour12,
|
||||||
|
date.minutes,
|
||||||
|
date.seconds,
|
||||||
|
am_pm,
|
||||||
|
msg.count ? "\n" : "",
|
||||||
|
DN_Str8PrintFmt(msg));
|
||||||
|
}
|
||||||
|
DN_TcScratchEnd(&scratch);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DN_SH_LogBroadcastBlockingFmt(DN_LogType type, DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, DN_Str8 short_desc, char const *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
DN_SH_LogBroadcastFmtV(DN_SHLogMode_Blocking, type, send, cli_args, short_desc, fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DN_SH_LogBroadcastDetachedFmt(DN_LogType type, DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, DN_Str8 short_desc, char const *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
DN_SH_LogBroadcastFmtV(DN_SHLogMode_Detached, type, send, cli_args, short_desc, fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
#if !defined(DN_SESHC_H)
|
||||||
|
#define DN_SESHC_H
|
||||||
|
|
||||||
|
#if defined(_CLANGD)
|
||||||
|
#define DN_WITH_OS 1
|
||||||
|
#include "../dn.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct DN_SHCLIArgs
|
||||||
|
{
|
||||||
|
bool valid;
|
||||||
|
DN_Str8 exe_path;
|
||||||
|
DN_Str8 ini_path;
|
||||||
|
DN_Str8 seed_node_url;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DN_SHCLIEatArgResult
|
||||||
|
{
|
||||||
|
bool eaten;
|
||||||
|
DN_Str8 error_msg; // Parsing error message. String is immutably stored in the data-segment w/ program lifetime.
|
||||||
|
DN_Str8 error_arg; // Argument that caused the parsing error
|
||||||
|
char const **arg_ptr; // Next argument pointer that that the caller should proceed from
|
||||||
|
DN_USize arg_count; // Next argument count that that the caller should assume
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DN_SHMsgSendData
|
||||||
|
{
|
||||||
|
DN_Str8 recipient; // Either `ini:<section.key>` or "05-prefix session account ID"
|
||||||
|
DN_Str8 account_secret; // Seshc EXE --account-secret format
|
||||||
|
DN_Str8 display_name;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DN_SHMsgSendAsyncHandle
|
||||||
|
{
|
||||||
|
DN_OSThread thread;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum DN_SHLogMode
|
||||||
|
{
|
||||||
|
DN_SHLogMode_Blocking,
|
||||||
|
DN_SHLogMode_Detached,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum DN_SHMsgSendAsyncStatus
|
||||||
|
{
|
||||||
|
DN_SHMsgSendAsyncStatus_Timeout,
|
||||||
|
DN_SHMsgSendAsyncStatus_Success,
|
||||||
|
DN_SHMsgSendAsyncStatus_Failed,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// NOTE: Seshc
|
||||||
|
// Overview
|
||||||
|
// Helper library that provides some useful APIs for programatically calling the Seshc CLI
|
||||||
|
// executable to send messages from your C/C++ application.
|
||||||
|
|
||||||
|
// API
|
||||||
|
// DN_SH_MsgSendDetachedFmt
|
||||||
|
// Send a 1-on-1 message with a background thread that is spawned on demand and detached. If the
|
||||||
|
// application exits before this thread has completed sending the message, the message will not
|
||||||
|
// be sent.
|
||||||
|
|
||||||
|
// DN_SH_MsgSendBlockingFmt
|
||||||
|
// Send a 1-on-1 message using the current executing thread, blocking control-flow until the
|
||||||
|
// message has been sent. Returns true if the send was successful, false otherwise.
|
||||||
|
|
||||||
|
// DN_SH_MsgSendAsyncFmt
|
||||||
|
// Send a 1-on-1 message with a background thread that is spawned on demand. A handle to the
|
||||||
|
// thread is returned that can be waited on.
|
||||||
|
|
||||||
|
DN_SHCLIArgs DN_SH_CLIArgsCopy (DN_SHCLIArgs const *src, DN_Arena *arena);
|
||||||
|
DN_Str8 DN_SH_CLIOptionsStr8 ();
|
||||||
|
DN_SHCLIEatArgResult DN_SH_CLIEatArg (DN_SHCLIArgs *args, char const **arg_ptr, int arg_count);
|
||||||
|
bool DN_SH_MsgSendBlockingFmt (DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, char const *fmt, ...);
|
||||||
|
void DN_SH_MsgSendDetachedFmt (DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, char const *fmt, ...);
|
||||||
|
DN_SHMsgSendAsyncHandle DN_SH_MsgSendAsyncFmt (DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, DN_Arena *arena, char const *fmt, ...);
|
||||||
|
DN_SHMsgSendAsyncStatus DN_SH_MsgSendAsyncWait (DN_SHMsgSendAsyncHandle *handle, DN_U32 timeout_ms);
|
||||||
|
void DN_SH_LogBroadcastFmtV (DN_SHLogMode mode, DN_LogType type, DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, DN_Str8 short_desc, char const *fmt, va_list args);
|
||||||
|
void DN_SH_LogBroadcastBlockingFmt (DN_LogType type, DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, DN_Str8 short_desc, char const *fmt, ...);
|
||||||
|
void DN_SH_LogBroadcastDetachedFmt (DN_LogType type, DN_SHMsgSendData send, DN_SHCLIArgs *cli_args, DN_Str8 short_desc, char const *fmt, ...);
|
||||||
|
|
||||||
|
#endif // #if !defined(DN_SESHC_H)
|
||||||
+6
-9
@@ -1,5 +1,11 @@
|
|||||||
#if DN_WITH_NET_CURL
|
#if DN_WITH_NET_CURL
|
||||||
#define DN_NO_WINDOWS_H_REPLACEMENT_HEADER
|
#define DN_NO_WINDOWS_H_REPLACEMENT_HEADER
|
||||||
|
#define CURL_STATICLIB
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__EMSCRIPTEN__)
|
||||||
|
#define DN_WITH_NET_EMSCRIPTEN 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DN_PARANOIA_LEVEL 1
|
#define DN_PARANOIA_LEVEL 1
|
||||||
@@ -7,15 +13,6 @@
|
|||||||
#define DN_WITH_NET 1
|
#define DN_WITH_NET 1
|
||||||
#define DN_WITH_TESTS 1
|
#define DN_WITH_TESTS 1
|
||||||
#include "dn.h"
|
#include "dn.h"
|
||||||
|
|
||||||
#if DN_WITH_NET_CURL
|
|
||||||
#define CURL_STATICLIB
|
|
||||||
#include <curl/curl.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(DN_PLATFORM_EMSCRIPTEN)
|
|
||||||
#define DN_WITH_NET_EMSCRIPTEN 1
|
|
||||||
#endif
|
|
||||||
#include "dn.cpp"
|
#include "dn.cpp"
|
||||||
|
|
||||||
#define DN_SHA3_WITH_TESTS
|
#define DN_SHA3_WITH_TESTS
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ static void AppendCppFileLineByLine(DN_Str8Builder *dest, DN_Str8 cpp_path)
|
|||||||
line = DN_Str8FmtArena(&scratch.arena, "%S// DN: Single header generator commented out => %S", find.start_to_before_match, DN_Str8TrimWhitespaceAround(find.match_to_end_of_buffer));
|
line = DN_Str8FmtArena(&scratch.arena, "%S// DN: Single header generator commented out => %S", find.start_to_before_match, DN_Str8TrimWhitespaceAround(find.match_to_end_of_buffer));
|
||||||
DN_Str8 rel_include_path = DN_Str8TrimWhitespaceAround(find.after_match_to_end_of_buffer);
|
DN_Str8 rel_include_path = DN_Str8TrimWhitespaceAround(find.after_match_to_end_of_buffer);
|
||||||
DN_Str8 root_dir = DN_Str8FileDirectoryFromPath(cpp_path);
|
DN_Str8 root_dir = DN_Str8FileDirectoryFromPath(cpp_path);
|
||||||
extra_include_path = DN_OS_PathFmtArena(&scratch.arena, "%S/%S", root_dir, DN_Str8TrimSuffixSensitive(rel_include_path, DN_Str8Lit("\"")));
|
extra_include_path = DN_Str8FmtOsPathArena(&scratch.arena, "%S/%S", root_dir, DN_Str8TrimSuffixSensitive(rel_include_path, DN_Str8Lit("\"")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -113,7 +113,7 @@ int main(int argc, char **argv)
|
|||||||
DN_Str8Builder builder = DN_Str8BuilderFromArena(&scratch.arena);
|
DN_Str8Builder builder = DN_Str8BuilderFromArena(&scratch.arena);
|
||||||
DN_Str8 suffix = type == FileType_Header ? DN_Str8Lit("h") : DN_Str8Lit("cpp");
|
DN_Str8 suffix = type == FileType_Header ? DN_Str8Lit("h") : DN_Str8Lit("cpp");
|
||||||
for (DN_ForItCArray(it, DN_Str8 const, REL_FILE_PATHS)) {
|
for (DN_ForItCArray(it, DN_Str8 const, REL_FILE_PATHS)) {
|
||||||
DN_Str8 path = DN_OS_PathFmtArena(&scratch.arena, "%S/%S.%S", dn_root_dir, *it.data, suffix);
|
DN_Str8 path = DN_Str8FmtOsPathArena(&scratch.arena, "%S/%S.%S", dn_root_dir, *it.data, suffix);
|
||||||
AppendCppFileLineByLine(&builder, path);
|
AppendCppFileLineByLine(&builder, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,7 +121,7 @@ int main(int argc, char **argv)
|
|||||||
DN_Str8BuilderPrependF(&builder, "// Generated by the DN single header generator %04u-%02u-%02u %02u:%02u:%02u\n\n", date.year, date.month, date.day, date.hour, date.minutes, date.seconds);
|
DN_Str8BuilderPrependF(&builder, "// Generated by the DN single header generator %04u-%02u-%02u %02u:%02u:%02u\n\n", date.year, date.month, date.day, date.hour, date.minutes, date.seconds);
|
||||||
|
|
||||||
DN_Str8 buffer = DN_Str8TrimWhitespaceAround(DN_Str8FromStr8BuilderArena(&builder, &scratch.arena));
|
DN_Str8 buffer = DN_Str8TrimWhitespaceAround(DN_Str8FromStr8BuilderArena(&builder, &scratch.arena));
|
||||||
DN_Str8 single_header_path = DN_OS_PathFmtArena(&scratch.arena, "%S/dn_single_header.%S", output_dir, suffix);
|
DN_Str8 single_header_path = DN_Str8FmtOsPathArena(&scratch.arena, "%S/dn_single_header.%S", output_dir, suffix);
|
||||||
DN_ErrSink *err = DN_TcErrSinkBeginDefault();
|
DN_ErrSink *err = DN_TcErrSinkBeginDefault();
|
||||||
DN_OS_FileWriteAllSafe(single_header_path, buffer, err);
|
DN_OS_FileWriteAllSafe(single_header_path, buffer, err);
|
||||||
DN_ErrSinkEndExitIfErrorF(err, -1, "Failed to write Single header file '%S'", single_header_path);
|
DN_ErrSinkEndExitIfErrorF(err, -1, "Failed to write Single header file '%S'", single_header_path);
|
||||||
|
|||||||
Reference in New Issue
Block a user