diff --git a/docs/metadesk_reference.mdesk b/docs/metadesk_reference.mdesk index 8b37664..30b232e 100644 --- a/docs/metadesk_reference.mdesk +++ b/docs/metadesk_reference.mdesk @@ -670,12 +670,6 @@ main: size: MD_u64, } -@send(MemoryOperations) -@macro MD_PushArray: { T, c } - -@send(MemoryOperations) -@macro MD_PushArrayZero: { T, c } - //////////////////////////////// //~ Characters @@ -917,6 +911,7 @@ main: @send(Strings) @doc("Copies @code 'string' by allocating an entirely new portion of memory and copying the passed string's memory to the newly allocated memory. Returns the copy of @code 'string' using the new memory.") @func MD_S8Copy: { + arena: *MD_Arena, string: MD_String8, return: MD_String8, }; @@ -1738,6 +1733,7 @@ MD_ParseWholeFile: @send(FileSystemHelper) @doc("Uses the C standard library to load the contents of the file with @code 'filename' into an MD_String8.") @func MD_LoadEntireFile: { + arena: *MD_Arena, filename: MD_String8, return: MD_String8, }; diff --git a/samples/node_errors/node_errors.c b/samples/node_errors/node_errors.c index 5b37f38..f358406 100644 --- a/samples/node_errors/node_errors.c +++ b/samples/node_errors/node_errors.c @@ -5,11 +5,13 @@ int main(int argument_count, char **arguments) { + MD_Arena *arena = MD_ArenaNew(1ull << 40); + // NOTE(rjf): Parse all the files passed in via command line. MD_Node *list = MD_MakeList(); for(int i = 1; i < argument_count; i += 1) { - MD_Node *root = MD_ParseWholeFile(MD_S8CString(arguments[i])).node; + MD_Node *root = MD_ParseWholeFile(arena, MD_S8CString(arguments[i])).node; MD_PushNewReference(list, root); } diff --git a/samples/old_style_custom_layer.c b/samples/old_style_custom_layer.c index b49e365..e3dce97 100644 --- a/samples/old_style_custom_layer.c +++ b/samples/old_style_custom_layer.c @@ -23,11 +23,13 @@ CleanUp(void) int main(int argument_count, char **arguments) { + MD_Arena *arena = MD_ArenaNew(1ull << 40); + // NOTE(rjf): Parse all the files passed in via command line. MD_Node *list = MD_MakeList(); for(int i = 1; i < argument_count; i += 1) { - MD_Node *root = MD_ParseWholeFile(MD_S8CString(arguments[i])).node; + MD_Node *root = MD_ParseWholeFile(arena, MD_S8CString(arguments[i])).node; MD_PushNewReference(list, root); } diff --git a/samples/output_parse/output_parse.c b/samples/output_parse/output_parse.c index 906a44f..2b29375 100644 --- a/samples/output_parse/output_parse.c +++ b/samples/output_parse/output_parse.c @@ -62,11 +62,13 @@ static void PrintNode(MD_Node* node, FILE* file, int indent_count) { int main(int argument_count, char **arguments) { + MD_Arena *arena = MD_ArenaNew(1ull << 40); + // NOTE(pmh): Parse all the files passed in via command line. MD_Node *list = MD_MakeList(); for(int i = 1; i < argument_count; i += 1) { - MD_Node *root = MD_ParseWholeFile(MD_S8CString(arguments[i])).node; + MD_Node *root = MD_ParseWholeFile(arena, MD_S8CString(arguments[i])).node; MD_PushNewReference(list, root); } diff --git a/samples/parse_check.c b/samples/parse_check.c index e8c2d78..241b12f 100644 --- a/samples/parse_check.c +++ b/samples/parse_check.c @@ -3,10 +3,12 @@ int main(int argument_count, char **arguments) { + MD_Arena *arena = MD_ArenaNew(1ull << 40); + MD_Node *list = MD_MakeList(); for(int i = 1; i < argument_count; i += 1) { - MD_Node *root = MD_ParseWholeFile(MD_S8CString(arguments[i])).node; + MD_Node *root = MD_ParseWholeFile(arena, MD_S8CString(arguments[i])).node; MD_PushNewReference(list, root); } diff --git a/samples/static_site_generator/static_site_generator.c b/samples/static_site_generator/static_site_generator.c index 9545e6e..92360db 100644 --- a/samples/static_site_generator/static_site_generator.c +++ b/samples/static_site_generator/static_site_generator.c @@ -32,6 +32,7 @@ static void GeneratePageContent(MD_Map *index_table, SiteInfo *site_info, PageIn int main(int argument_count, char **arguments) { + MD_Arena *arena = MD_ArenaNew(1ull << 40); //~ NOTE(rjf): Parse command line arguments. MD_CmdLine cmdln = MD_MakeCmdLineFromOptions(MD_StringListFromArgCV(argument_count, arguments)); @@ -45,13 +46,13 @@ int main(int argument_count, char **arguments) } //~ NOTE(rjf): Load JS. - MD_String8 js_string = MD_LoadEntireFile(MD_S8Fmt("%.*s/site.js", MD_S8VArg(page_dir_path))); + MD_String8 js_string = MD_LoadEntireFile(arena, MD_S8Fmt("%.*s/site.js", MD_S8VArg(page_dir_path))); //~ NOTE(rjf): Parse site info. SiteInfo site_info = {0}; { printf("Parsing site metadata at \"%.*s\"...\n", MD_S8VArg(site_info_path)); - MD_Node *site_info_file = MD_ParseWholeFile(site_info_path).node; + MD_Node *site_info_file = MD_ParseWholeFile(arena, site_info_path).node; site_info = ParseSiteInfo(site_info_file); } @@ -73,7 +74,7 @@ int main(int argument_count, char **arguments) MD_String8 path = MD_S8Fmt("%.*s/%.*s", MD_S8VArg(folder), MD_S8VArg(file_info.filename)); - MD_Node *node = MD_ParseWholeFile(path).node; + MD_Node *node = MD_ParseWholeFile(arena, path).node; MD_PushNewReference(root_list, node); } } diff --git a/samples/toy_language/toy_language.c b/samples/toy_language/toy_language.c index 532fa3a..303c1e5 100644 --- a/samples/toy_language/toy_language.c +++ b/samples/toy_language/toy_language.c @@ -180,6 +180,8 @@ EvaluateScope(NamespaceNode *ns, MD_Node *code) int main(int argument_count, char **arguments) { + MD_Arena *arena = MD_ArenaNew(1ull << 40); + //- rjf: parse command line MD_CmdLine cmdln = MD_MakeCmdLineFromOptions(MD_StringListFromArgCV(argument_count, arguments)); @@ -187,7 +189,7 @@ int main(int argument_count, char **arguments) MD_Node *file_list = MD_MakeList(); for(MD_String8Node *n = cmdln.inputs.first; n; n = n->next) { - MD_ParseResult parse = MD_ParseWholeFile(n->string); + MD_ParseResult parse = MD_ParseWholeFile(arena, n->string); MD_PushNewReference(file_list, parse.node); } diff --git a/source/md.c b/source/md.c index 5145911..ec640fa 100644 --- a/source/md.c +++ b/source/md.c @@ -625,11 +625,11 @@ MD_S8FindSubstring(MD_String8 str, MD_String8 substring, MD_u64 start_pos, MD_Ma } MD_FUNCTION_IMPL MD_String8 -MD_S8Copy(MD_String8 string) +MD_S8Copy(MD_Arena *arena, MD_String8 string) { MD_String8 res; res.size = string.size; - res.str = MD_PushArray(MD_u8, string.size + 1); + res.str = MD_PushArrayAr(arena, MD_u8, string.size + 1); MD_MemoryCopy(res.str, string.str, string.size); return(res); } @@ -1402,7 +1402,7 @@ MD_MapMakeBucketCount(MD_u64 bucket_count){ // make most sense with a parameter MD_Map result = {0}; result.bucket_count = bucket_count; - result.buckets = MD_PushArrayZero(MD_MapBucket, bucket_count); + result.buckets = MD_PushArray(MD_MapBucket, bucket_count); //zero return(result); } @@ -1783,7 +1783,7 @@ MD_LexAdvanceFromSkips(MD_String8 string, MD_TokenKind skip_kinds) MD_FUNCTION_IMPL MD_Message * MD_MakeNodeError(MD_Node *node, MD_MessageKind kind, MD_String8 str) { - MD_Message *error = MD_PushArrayZero(MD_Message, 1); + MD_Message *error = MD_PushArray(MD_Message, 1); //zero error->node = node; error->kind = kind; error->string = str; @@ -2376,9 +2376,9 @@ MD_ParseWholeString(MD_String8 filename, MD_String8 contents) } MD_FUNCTION_IMPL MD_ParseResult -MD_ParseWholeFile(MD_String8 filename) +MD_ParseWholeFile(MD_Arena *arena, MD_String8 filename) { - MD_String8 file_contents = MD_LoadEntireFile(filename); + MD_String8 file_contents = MD_LoadEntireFile(arena, filename); MD_ParseResult parse = MD_ParseWholeString(filename, file_contents); if(file_contents.str == 0) { @@ -2970,10 +2970,10 @@ MD_CmdLineI64FromString(MD_CmdLine cmdln, MD_String8 name) //~ File System MD_FUNCTION_IMPL MD_String8 -MD_LoadEntireFile(MD_String8 filename) +MD_LoadEntireFile(MD_Arena *arena, MD_String8 filename) { MD_String8 file_contents = MD_ZERO_STRUCT; - FILE *file = fopen((char*)MD_S8Copy(filename).str, "rb"); + FILE *file = fopen((char*)MD_S8Copy(arena, filename).str, "rb"); if(file) { fseek(file, 0, SEEK_END); diff --git a/source/md.h b/source/md.h index 8c6d8c0..61ffafe 100644 --- a/source/md.h +++ b/source/md.h @@ -689,11 +689,6 @@ MD_FUNCTION void* MD_MemoryCopy(void *dst, void *src, MD_u64 size); MD_FUNCTION void* MD_AllocZero(MD_u64 size); #define MD_PushArray(T,c) (T*)MD_AllocZero(sizeof(T)*(c)) -// NOTE(rjf): Right now, both calls just automatically zero their memory, -// but I'm explicitly splitting this out to ensure that we don't accidentally -// assume that we have zeroed memory incorrectly in the future (when our -// allocation approach changes). -#define MD_PushArrayZero(T,c) (T*)MD_AllocZero(sizeof(T)*(c)) //~ Arena Functions @@ -759,7 +754,7 @@ MD_FUNCTION MD_b32 MD_S8Match(MD_String8 a, MD_String8 b, MD_MatchFlags MD_FUNCTION MD_u64 MD_S8FindSubstring(MD_String8 str, MD_String8 substring, MD_u64 start_pos, MD_MatchFlags flags); -MD_FUNCTION MD_String8 MD_S8Copy(MD_String8 string); +MD_FUNCTION MD_String8 MD_S8Copy(MD_Arena *arena, MD_String8 string); MD_FUNCTION MD_String8 MD_S8FmtV(char *fmt, va_list args); MD_FUNCTION MD_String8 MD_S8Fmt(char *fmt, ...); @@ -838,7 +833,7 @@ MD_FUNCTION MD_ParseResult MD_ParseResultZero(void); MD_FUNCTION MD_ParseResult MD_ParseOneNode(MD_String8 string, MD_u64 offset); MD_FUNCTION MD_ParseResult MD_ParseWholeString(MD_String8 filename, MD_String8 contents); -MD_FUNCTION MD_ParseResult MD_ParseWholeFile(MD_String8 filename); +MD_FUNCTION MD_ParseResult MD_ParseWholeFile(MD_Arena *arena, MD_String8 filename); //~ Location Conversion @@ -909,7 +904,7 @@ MD_FUNCTION MD_i64 MD_CmdLineI64FromString(MD_CmdLine cmdln, MD_String8 name); //~ File System -MD_FUNCTION MD_String8 MD_LoadEntireFile(MD_String8 filename); +MD_FUNCTION MD_String8 MD_LoadEntireFile(MD_Arena *arena, MD_String8 filename); MD_FUNCTION MD_b32 MD_FileIterIncrement(MD_FileIter *it, MD_String8 path, MD_FileInfo *out_info); #endif // MD_H diff --git a/tests/sanity_tests.c b/tests/sanity_tests.c index f0c62a5..5ba9e23 100644 --- a/tests/sanity_tests.c +++ b/tests/sanity_tests.c @@ -118,6 +118,8 @@ TokenMatch(MD_Token token, MD_String8 string, MD_TokenKind kind) int main(void) { + MD_Arena *arena = MD_ArenaNew(1ull << 40); + Test("Lexer") { MD_String8 string = MD_S8Lit("abc def 123 456 123_456 abc123 123abc"); @@ -536,7 +538,7 @@ int main(void) } { - MD_ParseResult parse = MD_ParseWholeFile(MD_S8Lit("__does_not_exist.mdesk")); + MD_ParseResult parse = MD_ParseWholeFile(arena, MD_S8Lit("__does_not_exist.mdesk")); TestResult(parse.node->kind == MD_NodeKind_File && parse.errors.first != 0); }