From 883c384e3825b59b0f55419056af8814baf8cca1 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 16 Sep 2021 19:56:02 -0700 Subject: [PATCH] [examples] hello_world.c first pass; parse check touch ups; API touch ups --- examples/metaprograms/hello_world.c | 37 ++++ examples/metaprograms/parse_check.c | 17 +- source/md.c | 286 +++++++++++++++------------- source/md.h | 15 +- tests/sanity_tests.c | 12 +- 5 files changed, 211 insertions(+), 156 deletions(-) create mode 100644 examples/metaprograms/hello_world.c diff --git a/examples/metaprograms/hello_world.c b/examples/metaprograms/hello_world.c new file mode 100644 index 0000000..9333a9d --- /dev/null +++ b/examples/metaprograms/hello_world.c @@ -0,0 +1,37 @@ +/* +** Example: hello world +** + ** +** +*/ + +//~ Includes and globals ////////////////////////////////////////////////////// + +// @notes Metadesk is a source-include library. So we include the +// file "md.c" into the usage code directly. The library + +#include "md.h" +#include "md.c" + +// @notes For simple single-threaded memory management in a run-once-and-exit +// utility, a single global arena is our prefered setup. +static MD_Arena *arena = 0; + +//~ main ////////////////////////////////////////////////////////////////////// + +int +main(int argc, char **argv){ + // setup the global arena + // @notes Metadesk arenas do linear reserve-and-commit allocation. This + // code makes an arena with a 1 terabyte reserve which works so long as + // we're only doing one or a few arenas. + arena = MD_ArenaAlloc(1ull << 40); + + // parse a string + MD_String8 name = MD_S8Lit(""); + MD_String8 hello_world = MD_S8Lit("hello world"); + MD_ParseResult parse = MD_ParseWholeString(arena, hello_world_name, hello_world); + + // print the results + MD_PrintDebugDumpFromNode(stdout, parse.node, MD_GenerateFlags_All); +} \ No newline at end of file diff --git a/examples/metaprograms/parse_check.c b/examples/metaprograms/parse_check.c index 4a76902..20550f2 100644 --- a/examples/metaprograms/parse_check.c +++ b/examples/metaprograms/parse_check.c @@ -9,33 +9,28 @@ //~ Includes and globals ////////////////////////////////////////////////////// -// @notes Print helpers will make it easier to print the errors. This brings in -// C's stdio.h. It is possible to use error messages without print helpers, -// but a dependency on stdio.h is fine here so we will use it. -#define MD_ENABLE_PRINT_HELPERS 1 - #include "md.h" #include "md.c" // @notes For simple single-threaded memory management in a run-once-and-exit -// utility, a single global arena is our prefered setup. +// utility, a single global arena is our recommended approach. static MD_Arena *arena = 0; //~ main ////////////////////////////////////////////////////////////////////// -int main(int argument_count, char **arguments) +int main(int argc, char **argv) { // setup the global arena // @notes Metadesk arenas do linear reserve-and-commit allocation. This - // code makes an arena with a 1 terabyte reserve which works quite nicely, - // so long as we aren't doing more than a few of them. + // code makes an arena with a 1 terabyte reserve which works so long as + // we're only doing one or a few arenas. arena = MD_ArenaAlloc(1ull << 40); // parse all files passed to the command line MD_Node *list = MD_MakeList(arena); - for (int i = 1; i < argument_count; i += 1) + for (int i = 1; i < argc; i += 1) { // parse the file @@ -43,7 +38,7 @@ int main(int argument_count, char **arguments) // and then does the whole parse. In a simple utility program like // this metadesk's default implementations for the overrides make // this work. - MD_String8 file_name = MD_S8CString(arguments[i]); + MD_String8 file_name = MD_S8CString(argv[i]); MD_ParseResult parse_result = MD_ParseWholeFile(arena, file_name); // print metadesk errors diff --git a/source/md.c b/source/md.c index 945257c..2e59d0b 100644 --- a/source/md.c +++ b/source/md.c @@ -1,5 +1,8 @@ // LICENSE AT END OF FILE (MIT). +#if !defined(MD_C) +#define MD_C + //~///////////////////////////////////////////////////////////////////////////// /////////////////////////// CRT Implementation ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -29,7 +32,7 @@ # define MD_IMPL_LoadEntireFile MD_CRT_LoadEntireFile #endif -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_CRT_LoadEntireFile(MD_Arena *arena, MD_String8 filename){ MD_ArenaTemp scratch = MD_GetScratch(&arena, 1); MD_String8 file_contents = MD_ZERO_STRUCT; @@ -516,23 +519,23 @@ static MD_Node _md_nil_node = //~ Arena Functions -MD_FUNCTION_IMPL MD_Arena* +MD_FUNCTION MD_Arena* MD_ArenaAlloc(MD_u64 cap){ return(MD_IMPL_ArenaAlloc(cap)); } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_ArenaRelease(MD_Arena *arena){ MD_IMPL_ArenaRelease(arena); } -MD_FUNCTION_IMPL void* +MD_FUNCTION void* MD_ArenaPush(MD_Arena *arena, MD_u64 size){ void *result = MD_IMPL_ArenaPush(arena, size); return(result); } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_ArenaPutBack(MD_Arena *arena, MD_u64 size){ MD_u64 pos = MD_IMPL_ArenaGetPos(arena); MD_u64 new_pos = pos - size; @@ -540,12 +543,12 @@ MD_ArenaPutBack(MD_Arena *arena, MD_u64 size){ MD_IMPL_ArenaPopTo(arena, new_pos_clamped); } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_ArenaSetAlign(MD_Arena *arena, MD_u64 boundary){ MD_IMPL_ArenaSetAutoAlign(arena, boundary); } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_ArenaPushAlign(MD_Arena *arena, MD_u64 boundary){ MD_u64 pos = MD_IMPL_ArenaGetPos(arena); MD_u64 align_m1 = boundary - 1; @@ -557,12 +560,12 @@ MD_ArenaPushAlign(MD_Arena *arena, MD_u64 boundary){ } } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_ArenaClear(MD_Arena *arena){ MD_IMPL_ArenaPopTo(arena, MD_IMPL_ArenaHeaderSize); } -MD_FUNCTION_IMPL MD_ArenaTemp +MD_FUNCTION MD_ArenaTemp MD_ArenaBeginTemp(MD_Arena *arena){ MD_ArenaTemp result; result.arena = arena; @@ -570,14 +573,14 @@ MD_ArenaBeginTemp(MD_Arena *arena){ return(result); } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_ArenaEndTemp(MD_ArenaTemp temp){ MD_IMPL_ArenaPopTo(temp.arena, temp.pos); } //~ Arena Scratch Pool -MD_FUNCTION_IMPL MD_ArenaTemp +MD_FUNCTION MD_ArenaTemp MD_GetScratch(MD_Arena **conflicts, MD_u64 count){ MD_Arena *arena = MD_IMPL_GetScratch(conflicts, count); MD_ArenaTemp result = MD_ZERO_STRUCT; @@ -589,31 +592,31 @@ MD_GetScratch(MD_Arena **conflicts, MD_u64 count){ //~ Characters -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_CharIsAlpha(MD_u8 c) { return MD_CharIsAlphaUpper(c) || MD_CharIsAlphaLower(c); } -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_CharIsAlphaUpper(MD_u8 c) { return c >= 'A' && c <= 'Z'; } -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_CharIsAlphaLower(MD_u8 c) { return c >= 'a' && c <= 'z'; } -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_CharIsDigit(MD_u8 c) { return (c >= '0' && c <= '9'); } -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_CharIsUnreservedSymbol(MD_u8 c) { return (c == '~' || c == '!' || c == '$' || c == '%' || c == '^' || @@ -622,7 +625,7 @@ MD_CharIsUnreservedSymbol(MD_u8 c) c == '|'); } -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_CharIsReservedSymbol(MD_u8 c) { return (c == '{' || c == '}' || c == '(' || c == ')' || c == '\\' || @@ -630,25 +633,25 @@ MD_CharIsReservedSymbol(MD_u8 c) c == ':' || c == '@'); } -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_CharIsSpace(MD_u8 c) { return c == ' ' || c == '\r' || c == '\t' || c == '\f' || c == '\v'; } -MD_FUNCTION_IMPL MD_u8 +MD_FUNCTION MD_u8 MD_CharToUpper(MD_u8 c) { return (c >= 'a' && c <= 'z') ? ('A' + (c - 'a')) : c; } -MD_FUNCTION_IMPL MD_u8 +MD_FUNCTION MD_u8 MD_CharToLower(MD_u8 c) { return (c >= 'A' && c <= 'Z') ? ('a' + (c - 'A')) : c; } -MD_FUNCTION_IMPL MD_u8 +MD_FUNCTION MD_u8 MD_CharToForwardSlash(MD_u8 c) { return (c == '\\' ? '/' : c); @@ -656,7 +659,7 @@ MD_CharToForwardSlash(MD_u8 c) //~ Strings -MD_FUNCTION_IMPL MD_u64 +MD_FUNCTION MD_u64 MD_CalculateCStringLength(char *cstr) { MD_u64 i = 0; @@ -664,7 +667,7 @@ MD_CalculateCStringLength(char *cstr) return i; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8(MD_u8 *str, MD_u64 size) { MD_String8 string; @@ -673,7 +676,7 @@ MD_S8(MD_u8 *str, MD_u64 size) return string; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8Range(MD_u8 *first, MD_u8 *opl) { MD_String8 string; @@ -682,7 +685,7 @@ MD_S8Range(MD_u8 *first, MD_u8 *opl) return string; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8Substring(MD_String8 str, MD_u64 min, MD_u64 max) { if(max > str.size) @@ -704,31 +707,31 @@ MD_S8Substring(MD_String8 str, MD_u64 min, MD_u64 max) return str; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8Skip(MD_String8 str, MD_u64 min) { return MD_S8Substring(str, min, str.size); } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8Chop(MD_String8 str, MD_u64 nmax) { return MD_S8Substring(str, 0, str.size - nmax); } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8Prefix(MD_String8 str, MD_u64 size) { return MD_S8Substring(str, 0, size); } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8Suffix(MD_String8 str, MD_u64 size) { return MD_S8Substring(str, str.size - size, str.size); } -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_S8Match(MD_String8 a, MD_String8 b, MD_MatchFlags flags) { int result = 0; @@ -756,7 +759,7 @@ MD_S8Match(MD_String8 a, MD_String8 b, MD_MatchFlags flags) return result; } -MD_FUNCTION_IMPL MD_u64 +MD_FUNCTION MD_u64 MD_S8FindSubstring(MD_String8 str, MD_String8 substring, MD_u64 start_pos, MD_MatchFlags flags) { MD_b32 found = 0; @@ -780,7 +783,7 @@ MD_S8FindSubstring(MD_String8 str, MD_String8 substring, MD_u64 start_pos, MD_Ma return found_idx; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8Copy(MD_Arena *arena, MD_String8 string) { MD_String8 res; @@ -790,7 +793,7 @@ MD_S8Copy(MD_Arena *arena, MD_String8 string) return(res); } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8FmtV(MD_Arena *arena, char *fmt, va_list args) { MD_String8 result = MD_ZERO_STRUCT; @@ -803,7 +806,7 @@ MD_S8FmtV(MD_Arena *arena, char *fmt, va_list args) return result; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8Fmt(MD_Arena *arena, char *fmt, ...) { va_list args; @@ -813,7 +816,7 @@ MD_S8Fmt(MD_Arena *arena, char *fmt, ...) return result; } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_S8ListPush(MD_Arena *arena, MD_String8List *list, MD_String8 string) { MD_String8Node *node = MD_PushArray(arena, MD_String8Node, 1); @@ -824,7 +827,7 @@ MD_S8ListPush(MD_Arena *arena, MD_String8List *list, MD_String8 string) list->total_size += string.size; } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_S8ListPushFmt(MD_Arena *arena, MD_String8List *list, char *fmt, ...) { va_list args; @@ -834,7 +837,7 @@ MD_S8ListPushFmt(MD_Arena *arena, MD_String8List *list, char *fmt, ...) MD_S8ListPush(arena, list, string); } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_S8ListConcat(MD_String8List *list, MD_String8List *to_push) { if(to_push->first) @@ -855,7 +858,7 @@ MD_S8ListConcat(MD_String8List *list, MD_String8List *to_push) MD_MemoryZeroStruct(to_push); } -MD_FUNCTION_IMPL MD_String8List +MD_FUNCTION MD_String8List MD_S8Split(MD_Arena *arena, MD_String8 string, int split_count, MD_String8 *splits) { MD_String8List list = MD_ZERO_STRUCT; @@ -901,7 +904,7 @@ MD_S8Split(MD_Arena *arena, MD_String8 string, int split_count, MD_String8 *spli return list; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8ListJoin(MD_Arena *arena, MD_String8List list, MD_StringJoin *join_ptr) { // setup join parameters @@ -939,7 +942,7 @@ MD_S8ListJoin(MD_Arena *arena, MD_String8List list, MD_StringJoin *join_ptr) return(result); } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8Stylize(MD_Arena *arena, MD_String8 string, MD_IdentifierStyle word_style, MD_String8 separator) { @@ -1075,7 +1078,7 @@ MD_GLOBAL MD_u8 md_utf8_class[32] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2,3,3,4,5, }; -MD_FUNCTION_IMPL MD_DecodedCodepoint +MD_FUNCTION MD_DecodedCodepoint MD_DecodeCodepointFromUtf8(MD_u8 *str, MD_u64 max) { #define MD_bitmask1 0x01 @@ -1151,7 +1154,7 @@ MD_DecodeCodepointFromUtf8(MD_u8 *str, MD_u64 max) return(result); } -MD_FUNCTION_IMPL MD_DecodedCodepoint +MD_FUNCTION MD_DecodedCodepoint MD_DecodeCodepointFromUtf16(MD_u16 *out, MD_u64 max) { MD_DecodedCodepoint result = {~((MD_u32)0), 1}; @@ -1309,7 +1312,7 @@ MD_S32FromS8(MD_Arena *arena, MD_String8 in) //~ File Name Strings -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_PathChopLastPeriod(MD_String8 string) { MD_u64 period_pos = MD_S8FindSubstring(string, MD_S8Lit("."), 0, MD_MatchFlag_FindLast); @@ -1320,7 +1323,7 @@ MD_PathChopLastPeriod(MD_String8 string) return string; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_PathSkipLastSlash(MD_String8 string) { MD_u64 slash_pos = MD_S8FindSubstring(string, MD_S8Lit("/"), 0, @@ -1334,7 +1337,7 @@ MD_PathSkipLastSlash(MD_String8 string) return string; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_PathSkipLastPeriod(MD_String8 string) { MD_u64 period_pos = MD_S8FindSubstring(string, MD_S8Lit("."), 0, MD_MatchFlag_FindLast); @@ -1346,7 +1349,7 @@ MD_PathSkipLastPeriod(MD_String8 string) return string; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_PathChopLastSlash(MD_String8 string) { MD_u64 slash_pos = MD_S8FindSubstring(string, MD_S8Lit("/"), 0, @@ -1359,7 +1362,7 @@ MD_PathChopLastSlash(MD_String8 string) return string; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8SkipWhitespace(MD_String8 string) { for(MD_u64 i = 0; i < string.size; i += 1) @@ -1373,7 +1376,7 @@ MD_S8SkipWhitespace(MD_String8 string) return string; } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_S8ChopWhitespace(MD_String8 string) { for(MD_u64 i = string.size-1; i < string.size; i -= 1) @@ -1389,7 +1392,7 @@ MD_S8ChopWhitespace(MD_String8 string) //~ Numeric Strings -MD_FUNCTION_IMPL MD_u64 +MD_FUNCTION MD_u64 MD_U64FromString(MD_String8 string, MD_u32 radix) { MD_Assert(2 <= radix && radix <= 16); @@ -1408,7 +1411,7 @@ MD_U64FromString(MD_String8 string, MD_u32 radix) return(value); } -MD_FUNCTION_IMPL MD_i64 +MD_FUNCTION MD_i64 MD_CStyleIntFromString(MD_String8 string) { MD_u64 p = 0; @@ -1456,7 +1459,7 @@ MD_CStyleIntFromString(MD_String8 string) return(result); } -MD_FUNCTION_IMPL MD_f64 +MD_FUNCTION MD_f64 MD_F64FromString(MD_String8 string) { char str[64]; @@ -1470,7 +1473,7 @@ MD_F64FromString(MD_String8 string) } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_CStyleHexStringFromU64(MD_Arena *arena, MD_u64 x, MD_b32 caps) { static char md_int_value_to_char[] = "0123456789abcdef"; @@ -1510,7 +1513,7 @@ MD_CStyleHexStringFromU64(MD_Arena *arena, MD_u64 x, MD_b32 caps) //~ Enum/Flag Strings -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_StringFromNodeKind(MD_NodeKind kind) { // NOTE(rjf): @maintenance Must be kept in sync with MD_NodeKind enum. @@ -1530,7 +1533,7 @@ MD_StringFromNodeKind(MD_NodeKind kind) return MD_S8CString(cstrs[kind]); } -MD_FUNCTION_IMPL MD_String8List +MD_FUNCTION MD_String8List MD_StringListFromNodeFlags(MD_Arena *arena, MD_NodeFlags flags) { // NOTE(rjf): @maintenance Must be kept in sync with MD_NodeFlags enum. @@ -1573,7 +1576,7 @@ MD_StringListFromNodeFlags(MD_Arena *arena, MD_NodeFlags flags) //~ Map Table Data Structure -MD_FUNCTION_IMPL MD_u64 +MD_FUNCTION MD_u64 MD_HashStr(MD_String8 string) { MD_u64 result = 5381; @@ -1586,7 +1589,7 @@ MD_HashStr(MD_String8 string) // NOTE(mal): Generic 64-bit hash function (https://nullprogram.com/blog/2018/07/31/) // Reversible, so no collisions. Assumes all bits of the pointer matter. -MD_FUNCTION_IMPL MD_u64 +MD_FUNCTION MD_u64 MD_HashPtr(void *p) { MD_u64 h = (MD_u64)p; @@ -1597,7 +1600,7 @@ MD_HashPtr(void *p) return h; } -MD_FUNCTION_IMPL MD_Map +MD_FUNCTION MD_Map MD_MapMakeBucketCount(MD_Arena *arena, MD_u64 bucket_count){ MD_Map result = {0}; result.bucket_count = bucket_count; @@ -1605,7 +1608,7 @@ MD_MapMakeBucketCount(MD_Arena *arena, MD_u64 bucket_count){ return(result); } -MD_FUNCTION_IMPL MD_Map +MD_FUNCTION MD_Map MD_MapMake(MD_Arena *arena){ MD_Map result = MD_MapMakeBucketCount(arena, 4093); return(result); @@ -1635,7 +1638,7 @@ MD_MapKeyPtr(void *ptr){ return(result); } -MD_FUNCTION_IMPL MD_MapSlot* +MD_FUNCTION MD_MapSlot* MD_MapLookup(MD_Map *map, MD_MapKey key){ MD_MapSlot *result = 0; if (map->bucket_count > 0){ @@ -1645,7 +1648,7 @@ MD_MapLookup(MD_Map *map, MD_MapKey key){ return(result); } -MD_FUNCTION_IMPL MD_MapSlot* +MD_FUNCTION MD_MapSlot* MD_MapScan(MD_MapSlot *first_slot, MD_MapKey key){ MD_MapSlot *result = 0; if (first_slot != 0){ @@ -1674,7 +1677,7 @@ MD_MapScan(MD_MapSlot *first_slot, MD_MapKey key){ return(result); } -MD_FUNCTION_IMPL MD_MapSlot* +MD_FUNCTION MD_MapSlot* MD_MapInsert(MD_Arena *arena, MD_Map *map, MD_MapKey key, void *val){ MD_MapSlot *result = 0; if (map->bucket_count > 0){ @@ -1689,7 +1692,7 @@ MD_MapInsert(MD_Arena *arena, MD_Map *map, MD_MapKey key, void *val){ return(result); } -MD_FUNCTION_IMPL MD_MapSlot* +MD_FUNCTION MD_MapSlot* MD_MapOverwrite(MD_Arena *arena, MD_Map *map, MD_MapKey key, void *val){ MD_MapSlot *result = MD_MapLookup(map, key); if (result != 0){ @@ -1709,7 +1712,7 @@ MD_TokenGroupContainsKind(MD_TokenGroups groups, MD_TokenKind kind) return (groups & kind) != 0; } -MD_FUNCTION_IMPL MD_Token +MD_FUNCTION MD_Token MD_TokenFromString(MD_String8 string) { MD_Token token = MD_ZERO_STRUCT; @@ -1962,7 +1965,7 @@ MD_TokenFromString(MD_String8 string) return token; } -MD_FUNCTION_IMPL MD_u64 +MD_FUNCTION MD_u64 MD_LexAdvanceFromSkips(MD_String8 string, MD_TokenKind skip_kinds) { MD_u64 result = string.size; @@ -1980,7 +1983,7 @@ MD_LexAdvanceFromSkips(MD_String8 string, MD_TokenKind skip_kinds) return(result); } -MD_FUNCTION_IMPL MD_Message* +MD_FUNCTION MD_Message* MD_MakeNodeError(MD_Arena *arena, MD_Node *node, MD_MessageKind kind, MD_String8 str) { MD_Message *error = MD_PushArrayZero(arena, MD_Message, 1); @@ -1990,7 +1993,7 @@ MD_MakeNodeError(MD_Arena *arena, MD_Node *node, MD_MessageKind kind, MD_String8 return error; } -MD_FUNCTION_IMPL MD_Message * +MD_FUNCTION MD_Message * MD_MakeTokenError(MD_Arena *arena, MD_String8 parse_contents, MD_Token token, MD_MessageKind kind, MD_String8 str) { @@ -1999,7 +2002,7 @@ MD_MakeTokenError(MD_Arena *arena, MD_String8 parse_contents, MD_Token token, return MD_MakeNodeError(arena, err_node, kind, str); } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_MessageListPush(MD_MessageList *list, MD_Message *message) { MD_QueuePush(list->first, list->last, message); @@ -2010,7 +2013,7 @@ MD_MessageListPush(MD_MessageList *list, MD_Message *message) list->node_count += 1; } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_MessageListConcat(MD_MessageList *list, MD_MessageList *to_push) { if(list->last) @@ -2033,7 +2036,7 @@ MD_MessageListConcat(MD_MessageList *list, MD_MessageList *to_push) MD_MemoryZeroStruct(to_push); } -MD_FUNCTION_IMPL MD_ParseResult +MD_FUNCTION MD_ParseResult MD_ParseResultZero(void) { MD_ParseResult result = MD_ZERO_STRUCT; @@ -2041,7 +2044,7 @@ MD_ParseResultZero(void) return result; } -MD_FUNCTION_IMPL MD_ParseResult +MD_FUNCTION MD_ParseResult MD_ParseNodeSet(MD_Arena *arena, MD_String8 string, MD_u64 offset, MD_Node *parent, MD_ParseSetRule rule) { @@ -2298,7 +2301,7 @@ MD_ParseNodeSet(MD_Arena *arena, MD_String8 string, MD_u64 offset, MD_Node *pare } // TODO(rjf): Inline this in the only place it is called -MD_FUNCTION_IMPL MD_ParseResult +MD_FUNCTION MD_ParseResult _MD_ParseTagList(MD_Arena *arena, MD_String8 string, MD_u64 offset) { MD_ParseResult result = MD_ParseResultZero(); @@ -2354,7 +2357,7 @@ _MD_ParseTagList(MD_Arena *arena, MD_String8 string, MD_u64 offset) return result; } -MD_FUNCTION_IMPL MD_ParseResult +MD_FUNCTION MD_ParseResult MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) { MD_ParseResult result = MD_ParseResultZero(); @@ -2568,7 +2571,7 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) return result; } -MD_FUNCTION_IMPL MD_ParseResult +MD_FUNCTION MD_ParseResult MD_ParseWholeString(MD_Arena *arena, MD_String8 filename, MD_String8 contents) { MD_Node *root = MD_MakeNode(arena, MD_NodeKind_File, filename, contents, 0); @@ -2584,7 +2587,7 @@ MD_ParseWholeString(MD_Arena *arena, MD_String8 filename, MD_String8 contents) return result; } -MD_FUNCTION_IMPL MD_ParseResult +MD_FUNCTION MD_ParseResult MD_ParseWholeFile(MD_Arena *arena, MD_String8 filename) { MD_String8 file_contents = MD_LoadEntireFile(arena, filename); @@ -2602,7 +2605,7 @@ MD_ParseWholeFile(MD_Arena *arena, MD_String8 filename) //~ Location Conversions -MD_FUNCTION_IMPL MD_CodeLoc +MD_FUNCTION MD_CodeLoc MD_CodeLocFromFileOffset(MD_String8 filename, MD_u8 *base, MD_u64 offset) { MD_CodeLoc loc; @@ -2628,7 +2631,7 @@ MD_CodeLocFromFileOffset(MD_String8 filename, MD_u8 *base, MD_u64 offset) return loc; } -MD_FUNCTION_IMPL MD_CodeLoc +MD_FUNCTION MD_CodeLoc MD_CodeLocFromNode(MD_Node *node) { MD_Node *root = MD_RootFromNode(node); @@ -2638,16 +2641,16 @@ MD_CodeLocFromNode(MD_Node *node) //~ Tree/List Building -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_NodeIsNil(MD_Node *node) { return node == 0 || node == &_md_nil_node || node->kind == MD_NodeKind_Nil; } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_NilNode(void) { return &_md_nil_node; } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_MakeNode(MD_Arena *arena, MD_NodeKind kind, MD_String8 string, MD_String8 raw_string, MD_u64 offset) { @@ -2662,7 +2665,7 @@ MD_MakeNode(MD_Arena *arena, MD_NodeKind kind, MD_String8 string, MD_String8 raw return node; } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_PushChild(MD_Node *parent, MD_Node *new_child) { if (!MD_NodeIsNil(new_child)) @@ -2672,7 +2675,7 @@ MD_PushChild(MD_Node *parent, MD_Node *new_child) } } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_PushTag(MD_Node *node, MD_Node *tag) { if (!MD_NodeIsNil(tag)) @@ -2682,7 +2685,7 @@ MD_PushTag(MD_Node *node, MD_Node *tag) } } -MD_FUNCTION_IMPL MD_Node* +MD_FUNCTION MD_Node* MD_MakeList(MD_Arena *arena) { MD_String8 empty = {0}; @@ -2690,7 +2693,7 @@ MD_MakeList(MD_Arena *arena) return(result); } -MD_FUNCTION_IMPL MD_Node* +MD_FUNCTION MD_Node* MD_PushNewReference(MD_Arena *arena, MD_Node *list, MD_Node *target) { MD_Node *n = MD_MakeNode(arena, MD_NodeKind_Reference, target->string, target->raw_string, @@ -2702,7 +2705,7 @@ MD_PushNewReference(MD_Arena *arena, MD_Node *list, MD_Node *target) //~ Introspection Helpers -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_NodeFromString(MD_Node *first, MD_Node *one_past_last, MD_String8 string, MD_MatchFlags flags) { MD_Node *result = MD_NilNode(); @@ -2717,7 +2720,7 @@ MD_NodeFromString(MD_Node *first, MD_Node *one_past_last, MD_String8 string, MD_ return result; } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_NodeFromIndex(MD_Node *first, MD_Node *one_past_last, int n) { MD_Node *result = MD_NilNode(); @@ -2736,7 +2739,7 @@ MD_NodeFromIndex(MD_Node *first, MD_Node *one_past_last, int n) return result; } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_NodeFromFlags(MD_Node *first, MD_Node *one_past_last, MD_NodeFlags flags) { MD_Node *result = MD_NilNode(); @@ -2751,7 +2754,7 @@ MD_NodeFromFlags(MD_Node *first, MD_Node *one_past_last, MD_NodeFlags flags) return result; } -MD_FUNCTION_IMPL int +MD_FUNCTION int MD_IndexFromNode(MD_Node *node) { int idx = 0; @@ -2759,7 +2762,7 @@ MD_IndexFromNode(MD_Node *node) return idx; } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_RootFromNode(MD_Node *node) { MD_Node *parent = node; @@ -2770,38 +2773,38 @@ MD_RootFromNode(MD_Node *node) return parent; } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_ChildFromString(MD_Node *node, MD_String8 child_string, MD_MatchFlags flags) { return MD_NodeFromString(node->first_child, MD_NilNode(), child_string, flags); } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_TagFromString(MD_Node *node, MD_String8 tag_string, MD_MatchFlags flags) { return MD_NodeFromString(node->first_tag, MD_NilNode(), tag_string, flags); } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_ChildFromIndex(MD_Node *node, int n) { return MD_NodeFromIndex(node->first_child, MD_NilNode(), n); } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_TagFromIndex(MD_Node *node, int n) { return MD_NodeFromIndex(node->first_child, MD_NilNode(), n); } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_TagArgFromIndex(MD_Node *node, MD_String8 tag_string, MD_MatchFlags flags, int n) { MD_Node *tag = MD_TagFromString(node, tag_string, flags); return MD_ChildFromIndex(tag, n); } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_TagArgFromString(MD_Node *node, MD_String8 tag_string, MD_MatchFlags tag_str_flags, MD_String8 arg_string, MD_MatchFlags arg_str_flags) { MD_Node *tag = MD_TagFromString(node, tag_string, tag_str_flags); @@ -2809,13 +2812,13 @@ MD_TagArgFromString(MD_Node *node, MD_String8 tag_string, MD_MatchFlags tag_str_ return arg; } -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_NodeHasTag(MD_Node *node, MD_String8 tag_string, MD_MatchFlags flags) { return !MD_NodeIsNil(MD_TagFromString(node, tag_string, flags)); } -MD_FUNCTION_IMPL MD_i64 +MD_FUNCTION MD_i64 MD_ChildCountFromNode(MD_Node *node) { MD_i64 result = 0; @@ -2826,7 +2829,7 @@ MD_ChildCountFromNode(MD_Node *node) return result; } -MD_FUNCTION_IMPL MD_i64 +MD_FUNCTION MD_i64 MD_TagCountFromNode(MD_Node *node) { MD_i64 result = 0; @@ -2837,7 +2840,7 @@ MD_TagCountFromNode(MD_Node *node) return result; } -MD_FUNCTION_IMPL MD_Node * +MD_FUNCTION MD_Node * MD_ResolveNodeFromReference(MD_Node *node) { MD_u64 safety = 100; @@ -2847,13 +2850,13 @@ MD_ResolveNodeFromReference(MD_Node *node) return(result); } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_PrevCommentFromNode(MD_Node *node) { return(node->prev_comment); } -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_NextCommentFromNode(MD_Node *node) { return(node->next_comment); @@ -2882,7 +2885,7 @@ MD_FormatMessage(MD_Arena *arena, MD_CodeLoc loc, MD_MessageKind kind, MD_String return(result); } -#if MD_ENABLE_PRINT_HELPERS +#if !MD_DISABLE_PRINT_HELPERS MD_FUNCTION void MD_PrintMessage(FILE *file, MD_CodeLoc code_loc, MD_MessageKind kind, MD_String8 string){ @@ -2908,7 +2911,7 @@ MD_PrintMessageFmt(FILE *file, MD_CodeLoc code_loc, MD_MessageKind kind, char *f //~ Tree Comparison/Verification -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_NodeMatch(MD_Node *a, MD_Node *b, MD_MatchFlags flags) { MD_b32 result = 0; @@ -2949,7 +2952,7 @@ MD_NodeMatch(MD_Node *a, MD_Node *b, MD_MatchFlags flags) return result; } -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_NodeDeepMatch(MD_Node *a, MD_Node *b, MD_MatchFlags flags) { MD_b32 result = MD_NodeMatch(a, b, flags); @@ -2972,7 +2975,7 @@ MD_NodeDeepMatch(MD_Node *a, MD_Node *b, MD_MatchFlags flags) //~ Expression Parsing -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_ExprOperatorPush(MD_Arena *arena, MD_ExprOperatorList *list, MD_u32 op_id, MD_ExprOperatorKind kind, MD_u64 precedence, MD_Node *md_node) @@ -2986,7 +2989,7 @@ MD_ExprOperatorPush(MD_Arena *arena, MD_ExprOperatorList *list, node->op.md_node = md_node; } -MD_FUNCTION_IMPL MD_ExprOperator * +MD_FUNCTION MD_ExprOperator * _MD_ExprOperatorMatch(MD_ExprOperatorTable *table, MD_ExprOperatorKind kind, MD_String8 s) { // NOTE(mal): Look for operator on one or all (kind == MD_ExprOperatorKind_Null) tables @@ -3009,7 +3012,7 @@ _MD_ExprOperatorMatch(MD_ExprOperatorTable *table, MD_ExprOperatorKind kind, MD_ return result; } -MD_FUNCTION_IMPL MD_ExprOperatorTable +MD_FUNCTION MD_ExprOperatorTable MD_ExprBakeOperatorTableFromList(MD_Arena *arena, MD_ExprOperatorList *list) { MD_ExprOperatorTable result = MD_ZERO_STRUCT; @@ -3088,11 +3091,11 @@ struct _MD_ExprParseCtx } accel; }; -MD_FUNCTION_IMPL MD_ExprParseResult +MD_FUNCTION MD_ExprParseResult _MD_ExprParse_Ctx_MinPrecedence(MD_Arena *arena, _MD_ExprParseCtx *ctx, MD_u32 min_precedence); -MD_FUNCTION_IMPL MD_ExprNode * _MD_Expr_Make(MD_Arena *arena, MD_ExprOperator *op, MD_Node *op_node, - MD_ExprNode *left, MD_ExprNode *right) +MD_FUNCTION MD_ExprNode * _MD_Expr_Make(MD_Arena *arena, MD_ExprOperator *op, MD_Node *op_node, + MD_ExprNode *left, MD_ExprNode *right) { MD_ExprNode *result = MD_PushArrayZero(arena, MD_ExprNode, 1); result->is_op = 1; @@ -3109,13 +3112,13 @@ MD_FUNCTION_IMPL MD_ExprNode * _MD_Expr_Make(MD_Arena *arena, MD_ExprOperator *o return result; } -MD_FUNCTION_IMPL void _MD_CtxAdvance(_MD_ExprParseCtx *ctx) +MD_FUNCTION void _MD_CtxAdvance(_MD_ExprParseCtx *ctx) { ctx->first = ctx->first->next; } -MD_FUNCTION_IMPL MD_b32 _MD_ExprOperatorConsumed(_MD_ExprParseCtx *ctx, MD_ExprOperatorKind kind, MD_u32 min_precedence, - MD_ExprOperator **op_out) +MD_FUNCTION MD_b32 _MD_ExprOperatorConsumed(_MD_ExprParseCtx *ctx, MD_ExprOperatorKind kind, MD_u32 min_precedence, + MD_ExprOperator **op_out) { MD_b32 result = 0; if(!MD_NodeIsNil(ctx->first)) @@ -3132,7 +3135,7 @@ MD_FUNCTION_IMPL MD_b32 _MD_ExprOperatorConsumed(_MD_ExprParseCtx *ctx, MD_ExprO return result; } -MD_FUNCTION_IMPL _MD_ExprParseCtx +MD_FUNCTION _MD_ExprParseCtx _MD_ExprParse_MakeContext(MD_ExprOperatorTable *op_table, MD_Node *first, MD_Node *one_past_last) { _MD_ExprParseCtx result = MD_ZERO_STRUCT; @@ -3149,7 +3152,7 @@ _MD_ExprParse_MakeContext(MD_ExprOperatorTable *op_table, MD_Node *first, MD_Nod return result; } -MD_FUNCTION_IMPL _MD_ExprParseCtx +MD_FUNCTION _MD_ExprParseCtx _MD_ExprParse_MakeSubcontext(_MD_ExprParseCtx *ctx, MD_Node *first, MD_Node *one_past_last) { _MD_ExprParseCtx result = *ctx; @@ -3158,13 +3161,13 @@ _MD_ExprParse_MakeSubcontext(_MD_ExprParseCtx *ctx, MD_Node *first, MD_Node *one return result; } -MD_FUNCTION_IMPL MD_Message * MD_MakeExprParseError(MD_Arena *arena, MD_String8 str, MD_u64 offset) +MD_FUNCTION MD_Message * MD_MakeExprParseError(MD_Arena *arena, MD_String8 str, MD_u64 offset) { MD_Node *err_node = MD_MakeNode(arena, MD_NodeKind_ErrorMarker, MD_S8Lit(""), MD_S8Lit(""), offset); return MD_MakeNodeError(arena, err_node, MD_MessageKind_FatalError, str); } -MD_FUNCTION_IMPL MD_ExprParseResult +MD_FUNCTION MD_ExprParseResult _MD_ExprParse_Atom(MD_Arena *arena, _MD_ExprParseCtx *ctx) { MD_ExprParseResult result = MD_ZERO_STRUCT; @@ -3236,7 +3239,7 @@ _MD_ExprParse_Atom(MD_Arena *arena, _MD_ExprParseCtx *ctx) return result; } -MD_FUNCTION_IMPL MD_ExprParseResult +MD_FUNCTION MD_ExprParseResult _MD_ExprParse_Ctx_MinPrecedence(MD_Arena *arena, _MD_ExprParseCtx *ctx, MD_u32 min_precedence) { MD_ExprParseResult result = MD_ZERO_STRUCT; @@ -3301,7 +3304,7 @@ _MD_ExprParse_Ctx_MinPrecedence(MD_Arena *arena, _MD_ExprParseCtx *ctx, MD_u32 m return result; } -MD_FUNCTION_IMPL MD_ExprParseResult +MD_FUNCTION MD_ExprParseResult MD_ExprParse(MD_Arena *arena, MD_ExprOperatorTable *op_table, MD_Node *first, MD_Node *one_past_last) { MD_ExprParseResult result = MD_ZERO_STRUCT; @@ -3324,9 +3327,9 @@ MD_ExprParse(MD_Arena *arena, MD_ExprOperatorTable *op_table, MD_Node *first, MD //~ String Generation -MD_FUNCTION_IMPL void -MD_DebugStringListFromNode(MD_Arena *arena, MD_String8List *out, MD_Node *node, - int indent, MD_String8 indent_string, MD_GenerateFlags flags) +MD_FUNCTION void +MD_DebugDumpFromNode(MD_Arena *arena, MD_String8List *out, MD_Node *node, + int indent, MD_String8 indent_string, MD_GenerateFlags flags) { #define MD_PrintIndent(_indent_level) do\ {\ @@ -3369,7 +3372,7 @@ MD_S8ListPush(arena, out, indent_string);\ { child_indent = 0; } - MD_DebugStringListFromNode(arena, out, child, child_indent, MD_S8Lit(" "), flags); + MD_DebugDumpFromNode(arena, out, child, child_indent, MD_S8Lit(" "), flags); if(!MD_NodeIsNil(child->next)) { MD_S8ListPush(arena, out, MD_S8Lit(",\n")); @@ -3450,7 +3453,7 @@ MD_S8ListPush(arena, out, indent_string);\ MD_S8ListPush(arena, out, MD_S8Lit("{\n")); for(MD_EachNode(child, node->first_child)) { - MD_DebugStringListFromNode(arena, out, child, indent+1, indent_string, flags); + MD_DebugDumpFromNode(arena, out, child, indent+1, indent_string, flags); MD_S8ListPush(arena, out, MD_S8Lit(",\n")); } MD_PrintIndent(indent); @@ -3473,10 +3476,10 @@ MD_S8ListPush(arena, out, indent_string);\ #undef MD_PrintIndent } -MD_FUNCTION_IMPL void -MD_ReconstructedStringListFromNode(MD_Arena *arena, MD_String8List *out, MD_Node *node, - int indent, MD_String8 indent_string, - MD_GenerateFlags flags) +MD_FUNCTION void +MD_ReconstructionFromNode(MD_Arena *arena, MD_String8List *out, MD_Node *node, + int indent, MD_String8 indent_string, + MD_GenerateFlags flags) { // TODO(rjf): // TODO(rjf): // TODO(rjf): // TODO(rjf): // TODO(rjf): // TODO(rjf): @@ -3548,7 +3551,7 @@ MD_S8ListPush(arena, out, indent_string);\ { child_indent = 0; } - MD_ReconstructedStringListFromNode(arena, out, child, child_indent, MD_S8Lit(" "), flags); + MD_ReconstructionFromNode(arena, out, child, child_indent, MD_S8Lit(" "), flags); if(!MD_NodeIsNil(child->next)) { MD_S8ListPush(arena, out, MD_S8Lit(",\n")); @@ -3648,7 +3651,7 @@ MD_S8ListPush(arena, out, indent_string);\ child_indent = indent+1; } last_line = child_loc.line; - MD_ReconstructedStringListFromNode(arena, out, child, child_indent, indent_string, flags); + MD_ReconstructionFromNode(arena, out, child, child_indent, indent_string, flags); } MD_PrintIndent(indent); if(closer_char != 0) @@ -3701,6 +3704,21 @@ MD_S8ListPush(arena, out, indent_string);\ #undef MD_PrintIndent } + +#if !MD_DISABLE_PRINT_HELPERS +MD_FUNCTION void +MD_PrintDebugDumpFromNode(FILE *file, MD_Node *node, MD_GenerateFlags flags){ + MD_ArenaTemp scratch = MD_GetScratch(0, 0); + MD_String8List list = {0}; + MD_DebugDumpFromNode(scratch.arena, &list, node, + 0, MD_S8Lit(" "), flags); + MD_String8 string = MD_S8ListJoin(scratch.arena, list, 0); + fwrite(string.str, string.size, 1, file); + MD_ReleaseScratch(scratch); +} +#endif + + //~ Command Line Argument Helper MD_FUNCTION MD_String8List @@ -3870,7 +3888,7 @@ MD_CmdLineI64FromString(MD_CmdLine cmdln, MD_String8 name) //~ File System -MD_FUNCTION_IMPL MD_String8 +MD_FUNCTION MD_String8 MD_LoadEntireFile(MD_Arena *arena, MD_String8 filename) { MD_String8 result = MD_ZERO_STRUCT; @@ -3880,7 +3898,7 @@ MD_LoadEntireFile(MD_Arena *arena, MD_String8 filename) return(result); } -MD_FUNCTION_IMPL MD_b32 +MD_FUNCTION MD_b32 MD_FileIterBegin(MD_FileIter *it, MD_String8 path) { #if !defined(MD_IMPL_FileIterBegin) @@ -3890,7 +3908,7 @@ MD_FileIterBegin(MD_FileIter *it, MD_String8 path) #endif } -MD_FUNCTION_IMPL MD_FileInfo +MD_FUNCTION MD_FileInfo MD_FileIterNext(MD_Arena *arena, MD_FileIter *it) { #if !defined(MD_IMPL_FileIterNext) @@ -3901,7 +3919,7 @@ MD_FileIterNext(MD_Arena *arena, MD_FileIter *it) #endif } -MD_FUNCTION_IMPL void +MD_FUNCTION void MD_FileIterEnd(MD_FileIter *it) { #if defined(MD_IMPL_FileIterEnd) @@ -3909,6 +3927,8 @@ MD_FileIterEnd(MD_FileIter *it) #endif } +#endif // MD_C + /* Copyright 2021 Dion Systems LLC diff --git a/source/md.h b/source/md.h index f62b8a2..3432927 100644 --- a/source/md.h +++ b/source/md.h @@ -77,8 +77,8 @@ # define MD_DEFAULT_SCRATCH 1 #endif -#if !defined(MD_ENABLE_PRINT_HELPERS) -# define MD_ENABLE_PRINT_HELPERS 0 +#if !defined(MD_DISABLE_PRINT_HELPERS) +# define MD_DISABLE_PRINT_HELPERS 0 #endif @@ -316,9 +316,8 @@ //~ Linkage Wrappers #if !defined(MD_FUNCTION) -# define MD_FUNCTION +# define MD_FUNCTION static #endif -#define MD_FUNCTION_IMPL MD_FUNCTION #if !defined(MD_GLOBAL) # define MD_GLOBAL static @@ -1048,7 +1047,7 @@ MD_FUNCTION void MD_MessageListPush(MD_MessageList *list, MD_Message * MD_FUNCTION void MD_MessageListConcat(MD_MessageList *list, MD_MessageList *to_push); MD_FUNCTION MD_ParseResult MD_ParseResultZero(void); MD_FUNCTION MD_ParseResult MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset); -MD_FUNCTION MD_ParseResult MD_ParseWholeString(MD_Arena *arena, MD_String8 filename, MD_String8 contents); +MD_FUNCTION MD_ParseResult MD_ParseWholeString(MD_Arena *arena, MD_String8 name, MD_String8 contents); MD_FUNCTION MD_ParseResult MD_ParseWholeFile(MD_Arena *arena, MD_String8 filename); @@ -1106,7 +1105,7 @@ MD_FUNCTION MD_String8 MD_StringFromMessageKind(MD_MessageKind kind); MD_FUNCTION MD_String8 MD_FormatMessage(MD_Arena *arena, MD_CodeLoc loc, MD_MessageKind kind, MD_String8 string); -#if MD_ENABLE_PRINT_HELPERS +#if !MD_DISABLE_PRINT_HELPERS #include MD_FUNCTION void MD_PrintMessage(FILE *file, MD_CodeLoc loc, MD_MessageKind kind, MD_String8 string); @@ -1140,6 +1139,10 @@ MD_FUNCTION void MD_ReconstructionFromNode(MD_Arena *arena, MD_String8List *out, int indent, MD_String8 indent_string, MD_GenerateFlags flags); +#if !MD_DISABLE_PRINT_HELPERS +MD_FUNCTION void MD_PrintDebugDumpFromNode(FILE *file, MD_Node *node, MD_GenerateFlags flags); +#endif + //~ Command Line Argument Helper MD_FUNCTION MD_String8List MD_StringListFromArgCV(MD_Arena *arena, int argument_count, diff --git a/tests/sanity_tests.c b/tests/sanity_tests.c index 5a42fdf..a487415 100644 --- a/tests/sanity_tests.c +++ b/tests/sanity_tests.c @@ -785,8 +785,8 @@ int main(void) MD_String8 expected = MD_S8Lit("@foo\n@bar\n@baz\na:\n{\n b,\n c,\n d,\n e,\n f,\n}"); MD_ParseResult parse = MD_ParseOneNode(arena, code, 0); MD_String8List actual_strings = {0}; - MD_DebugStringListFromNode(arena, &actual_strings, parse.node, - 0, MD_S8Lit(" "), MD_GenerateFlags_Tree); + MD_DebugDumpFromNode(arena, &actual_strings, parse.node, + 0, MD_S8Lit(" "), MD_GenerateFlags_Tree); MD_String8 actual = MD_S8ListJoin(arena, actual_strings, 0); TestResult(MD_S8Match(expected, actual, 0)); } @@ -795,8 +795,8 @@ int main(void) MD_String8 expected = MD_S8Lit("@foo(1,\n 2,\n 3)\na:\n{\n x,\n y,\n}"); MD_ParseResult parse = MD_ParseOneNode(arena, code, 0); MD_String8List actual_strings = {0}; - MD_DebugStringListFromNode(arena, &actual_strings, parse.node, - 0, MD_S8Lit(" "), MD_GenerateFlags_Tree); + MD_DebugDumpFromNode(arena, &actual_strings, parse.node, + 0, MD_S8Lit(" "), MD_GenerateFlags_Tree); MD_String8 actual = MD_S8ListJoin(arena, actual_strings, 0); TestResult(MD_S8Match(expected, actual, 0)); } @@ -805,8 +805,8 @@ int main(void) MD_String8 expected = MD_S8Lit("/*\n foo\n*/\na"); MD_ParseResult parse = MD_ParseOneNode(arena, code, 0); MD_String8List actual_strings = {0}; - MD_DebugStringListFromNode(arena, &actual_strings, parse.node, 0, MD_S8Lit(" "), - MD_GenerateFlags_Tree|MD_GenerateFlag_Comments); + MD_DebugDumpFromNode(arena, &actual_strings, parse.node, 0, MD_S8Lit(" "), + MD_GenerateFlags_Tree|MD_GenerateFlag_Comments); MD_String8 actual = MD_S8ListJoin(arena, actual_strings, 0); TestResult(MD_S8Match(expected, actual, 0)); }