diff --git a/docs/metadesk_reference.mdesk b/docs/metadesk_reference.mdesk index 4ed931e..962443e 100644 --- a/docs/metadesk_reference.mdesk +++ b/docs/metadesk_reference.mdesk @@ -949,6 +949,7 @@ main: @see(MD_String8Node) @see(MD_String8) @func MD_S8ListPush: { + arena: *MD_Arena, list: *MD_String8List, string: MD_String8, }; @@ -988,6 +989,7 @@ main: @see(MD_String8Node) @see(MD_S8Split) @func MD_S8ListJoin: { + arena: *MD_Arena, list: MD_String8List, join: *MD_StringJoin, return: MD_String8, @@ -1001,6 +1003,7 @@ main: @send(Strings) @func MD_S8Stylize: { + arena: *MD_Arena, string: MD_String8, word_style: MD_IdentifierStyle, separator: MD_String8, @@ -1045,6 +1048,7 @@ main: @send(Nodes) @doc("Builds a string list for all bits set in @code 'flags', with each string being the name of one of the flags that is set.") @func MD_StringListFromNodeFlags: { + arena: *MD_Arena, flags: MD_NodeFlags, return: MD_String8List, }; @@ -1692,6 +1696,7 @@ MD_ParseWholeFile: @see(MD_CmdLineB32FromString) @func MD_MakeCmdLineFromOptions: { + arena: *MD_Arena, options: MD_String8List; return: MD_CmdLine; } diff --git a/samples/output_parse/output_parse.c b/samples/output_parse/output_parse.c index 4842827..fe9fb8f 100644 --- a/samples/output_parse/output_parse.c +++ b/samples/output_parse/output_parse.c @@ -2,6 +2,8 @@ #include "md.h" #include "md.c" +static MD_Arena *arena = 0; + #define INDENT_SPACES 2 static void Print(FILE* file, int indent_count, char* fmt, ...) { for(int i = 0; i < indent_count*INDENT_SPACES; i += 1) @@ -31,7 +33,7 @@ static void PrintNode(MD_Node* node, FILE* file, int indent_count) { Print(file, indent_count+1, "Flags: %s,\n", binary_flags); Print(file, indent_count+1, "Flag Names: ", binary_flags); - MD_String8List flags_list = MD_StringListFromNodeFlags(node->flags); + MD_String8List flags_list = MD_StringListFromNodeFlags(arena, node->flags); MD_StringJoin join = MD_ZERO_STRUCT; join.mid = MD_S8CString(", "); @@ -62,7 +64,7 @@ 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); + arena = MD_ArenaNew(1ull << 40); // NOTE(pmh): Parse all the files passed in via command line. MD_Node *list = MD_MakeList(); diff --git a/samples/static_site_generator/static_site_generator.c b/samples/static_site_generator/static_site_generator.c index 930a9bf..f94113a 100644 --- a/samples/static_site_generator/static_site_generator.c +++ b/samples/static_site_generator/static_site_generator.c @@ -37,7 +37,8 @@ int main(int argument_count, char **arguments) arena = MD_ArenaNew(1ull << 40); //~ NOTE(rjf): Parse command line arguments. - MD_CmdLine cmdln = MD_MakeCmdLineFromOptions(MD_StringListFromArgCV(argument_count, arguments)); + MD_String8List arg_list = MD_StringListFromArgCV(arena, argument_count, arguments); + MD_CmdLine cmdln = MD_MakeCmdLineFromOptions(arena, arg_list); MD_String8 site_info_path = MD_S8ListJoin(MD_CmdLineValuesFromString(cmdln, MD_S8Lit("siteinfo")), 0); MD_String8 page_dir_path = MD_S8ListJoin(MD_CmdLineValuesFromString(cmdln, MD_S8Lit("pagedir")), 0); if(!MD_CmdLineB32FromString(cmdln, MD_S8Lit("siteinfo")) || @@ -406,7 +407,8 @@ GeneratePageContent(MD_Map *index_table, SiteInfo *site_info, PageInfo *page_inf { MD_S8Lit("\n\n"), }; - MD_String8List strlist = MD_S8Split(node->string, sizeof(splits)/sizeof(splits[0]), splits); + MD_String8List strlist = MD_S8Split(arena, node->string, sizeof(splits)/sizeof(splits[0]), + splits); for(MD_String8Node *strnode = strlist.first; strnode; strnode = strnode->next) { diff --git a/samples/toy_language/toy_language.c b/samples/toy_language/toy_language.c index 303c1e5..3f6854b 100644 --- a/samples/toy_language/toy_language.c +++ b/samples/toy_language/toy_language.c @@ -183,7 +183,8 @@ 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)); + MD_String8List arg_list = MD_StringListFromArgCV(arena, argument_count, arguments); + MD_CmdLine cmdln = MD_MakeCmdLineFromOptions(arena, arg_list); //- rjf: parse all input files MD_Node *file_list = MD_MakeList(); diff --git a/source/md.c b/source/md.c index 3a9226d..c1cc6ce 100644 --- a/source/md.c +++ b/source/md.c @@ -682,9 +682,9 @@ MD_S8Fmt(MD_Arena *arena, char *fmt, ...) } MD_FUNCTION_IMPL void -MD_S8ListPush(MD_String8List *list, MD_String8 string) +MD_S8ListPush(MD_Arena *arena, MD_String8List *list, MD_String8 string) { - MD_String8Node *node = MD_PushArray(MD_String8Node, 1); + MD_String8Node *node = MD_PushArrayAr(arena, MD_String8Node, 1); node->string = string; MD_QueuePush(list->first, list->last, node); @@ -714,7 +714,7 @@ MD_S8ListConcat(MD_String8List *list, MD_String8List *to_push) } MD_FUNCTION_IMPL MD_String8List -MD_S8Split(MD_String8 string, int split_count, MD_String8 *splits) +MD_S8Split(MD_Arena *arena, MD_String8 string, int split_count, MD_String8 *splits) { MD_String8List list = MD_ZERO_STRUCT; @@ -740,7 +740,7 @@ MD_S8Split(MD_String8 string, int split_count, MD_String8 *splits) if(match) { MD_String8 split_string = MD_S8(string.str + split_start, i - split_start); - MD_S8ListPush(&list, split_string); + MD_S8ListPush(arena, &list, split_string); split_start = i + splits[split_idx].size; i += splits[split_idx].size - 1; was_split = 1; @@ -751,7 +751,7 @@ MD_S8Split(MD_String8 string, int split_count, MD_String8 *splits) if(was_split == 0 && i == string.size - 1) { MD_String8 split_string = MD_S8(string.str + split_start, i+1 - split_start); - MD_S8ListPush(&list, split_string); + MD_S8ListPush(arena, &list, split_string); break; } } @@ -798,7 +798,8 @@ MD_S8ListJoin(MD_String8List list, MD_StringJoin *join_ptr) } MD_FUNCTION_IMPL MD_String8 -MD_S8Stylize(MD_String8 string, MD_IdentifierStyle word_style, MD_String8 separator) +MD_S8Stylize(MD_Arena *arena, MD_String8 string, MD_IdentifierStyle word_style, + MD_String8 separator) { MD_String8 result = MD_ZERO_STRUCT; @@ -833,7 +834,7 @@ MD_S8Stylize(MD_String8 string, MD_IdentifierStyle word_style, MD_String8 separa word.size += 1; } making_word = 0; - MD_S8ListPush(&words, word); + MD_S8ListPush(arena, &words, word); } else { @@ -1353,7 +1354,7 @@ MD_StringFromNodeKind(MD_NodeKind kind) } MD_FUNCTION_IMPL MD_String8List -MD_StringListFromNodeFlags(MD_NodeFlags flags) +MD_StringListFromNodeFlags(MD_Arena *arena, MD_NodeFlags flags) { // NOTE(rjf): @maintenance Must be kept in sync with MD_NodeFlags enum. static char *flag_cstrs[] = @@ -1387,7 +1388,7 @@ MD_StringListFromNodeFlags(MD_NodeFlags flags) { if(flags & (1ull << i)) { - MD_S8ListPush(&list, MD_S8CString(flag_cstrs[i])); + MD_S8ListPush(arena, &list, MD_S8CString(flag_cstrs[i])); } } return list; @@ -2305,7 +2306,7 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) for(int i_byte = 0; i_byte < bad_token.raw_string.size; ++i_byte) { MD_u8 b = bad_token.raw_string.str[i_byte]; - MD_S8ListPush(&bytes, MD_CStyleHexStringFromU64(b, 1)); + MD_S8ListPush(arena, &bytes, MD_CStyleHexStringFromU64(b, 1)); } MD_StringJoin join = MD_ZERO_STRUCT; @@ -2835,18 +2836,18 @@ MD_DebugOutputTree(FILE *file, MD_Node *node, int indent_spaces) //~ Command Line Argument Helper MD_FUNCTION MD_String8List -MD_StringListFromArgCV(int argument_count, char **arguments) +MD_StringListFromArgCV(MD_Arena *arena, int argument_count, char **arguments) { MD_String8List options = MD_ZERO_STRUCT; for(int i = 1; i < argument_count; i += 1) { - MD_S8ListPush(&options, MD_S8CString(arguments[i])); + MD_S8ListPush(arena, &options, MD_S8CString(arguments[i])); } return options; } MD_FUNCTION MD_CmdLine -MD_MakeCmdLineFromOptions(MD_String8List options) +MD_MakeCmdLineFromOptions(MD_Arena *arena, MD_String8List options) { MD_CmdLine cmdln = MD_ZERO_STRUCT; @@ -2893,7 +2894,7 @@ MD_MakeCmdLineFromOptions(MD_String8List options) //- rjf: push first value if(first_value.size != 0) { - MD_S8ListPush(&option_values, first_value); + MD_S8ListPush(arena, &option_values, first_value); } //- rjf: scan next string values, add them to option values until we hit a lack @@ -2912,7 +2913,7 @@ MD_MakeCmdLineFromOptions(MD_String8List options) { if(start != i) { - MD_S8ListPush(&option_values, MD_S8Substring(value_str, start, i)); + MD_S8ListPush(arena, &option_values, MD_S8Substring(value_str, start, i)); } start = i+1; } @@ -2949,7 +2950,7 @@ MD_MakeCmdLineFromOptions(MD_String8List options) //- rjf: this argument is not an option, push it to regular inputs list. else { - MD_S8ListPush(&cmdln.inputs, n->string); + MD_S8ListPush(arena, &cmdln.inputs, n->string); } } diff --git a/source/md.h b/source/md.h index 797cfe7..50ef13b 100644 --- a/source/md.h +++ b/source/md.h @@ -761,12 +761,15 @@ MD_FUNCTION MD_String8 MD_S8Fmt(MD_Arena *arena, char *fmt, ...); #define MD_S8VArg(s) (int)(s).size, (s).str -MD_FUNCTION void MD_S8ListPush(MD_String8List *list, MD_String8 string); +MD_FUNCTION void MD_S8ListPush(MD_Arena *arena, MD_String8List *list, + MD_String8 string); MD_FUNCTION void MD_S8ListConcat(MD_String8List *list, MD_String8List *to_push); -MD_FUNCTION MD_String8List MD_S8Split(MD_String8 string, int split_count, MD_String8 *splits); +MD_FUNCTION MD_String8List MD_S8Split(MD_Arena *arena, MD_String8 string, int split_count, + MD_String8 *splits); MD_FUNCTION MD_String8 MD_S8ListJoin(MD_String8List list, MD_StringJoin *join); -MD_FUNCTION MD_String8 MD_S8Stylize(MD_String8 string, MD_IdentifierStyle word_style, MD_String8 separator); +MD_FUNCTION MD_String8 MD_S8Stylize(MD_Arena *arena, MD_String8 string, + MD_IdentifierStyle style, MD_String8 separator); //~ Unicode Conversions @@ -804,7 +807,7 @@ MD_FUNCTION MD_String8 MD_CStyleHexStringFromU64(MD_u64 x, MD_b32 caps); //~ Enum/Flag Strings MD_FUNCTION MD_String8 MD_StringFromNodeKind(MD_NodeKind kind); -MD_FUNCTION MD_String8List MD_StringListFromNodeFlags(MD_NodeFlags flags); +MD_FUNCTION MD_String8List MD_StringListFromNodeFlags(MD_Arena *arena, MD_NodeFlags flags); //~ Map Table Data Structure @@ -896,8 +899,9 @@ MD_FUNCTION void MD_DebugOutputTree(FILE *file, MD_Node *node, int indent_spaces //~ Command Line Argument Helper -MD_FUNCTION MD_String8List MD_StringListFromArgCV(int argument_count, char **arguments); -MD_FUNCTION MD_CmdLine MD_MakeCmdLineFromOptions(MD_String8List options); +MD_FUNCTION MD_String8List MD_StringListFromArgCV(MD_Arena *arena, int argument_count, + char **arguments); +MD_FUNCTION MD_CmdLine MD_MakeCmdLineFromOptions(MD_Arena *arena, MD_String8List options); MD_FUNCTION MD_String8List MD_CmdLineValuesFromString(MD_CmdLine cmdln, MD_String8 name); MD_FUNCTION MD_b32 MD_CmdLineB32FromString(MD_CmdLine cmdln, MD_String8 name); MD_FUNCTION MD_i64 MD_CmdLineI64FromString(MD_CmdLine cmdln, MD_String8 name); diff --git a/tests/sanity_tests.c b/tests/sanity_tests.c index 76e73d9..3c8615a 100644 --- a/tests/sanity_tests.c +++ b/tests/sanity_tests.c @@ -416,19 +416,23 @@ int main(void) Test("Style Strings") { { - MD_String8 str = MD_S8Stylize(MD_S8Lit("THIS_IS_A_TEST"), MD_IdentifierStyle_UpperCamelCase, MD_S8Lit(" ")); + MD_String8 str = MD_S8Stylize(arena, MD_S8Lit("THIS_IS_A_TEST"), + MD_IdentifierStyle_UpperCamelCase, MD_S8Lit(" ")); TestResult(MD_S8Match(str, MD_S8Lit("This Is A Test"), 0)); } { - MD_String8 str = MD_S8Stylize(MD_S8Lit("this_is_a_test"), MD_IdentifierStyle_UpperCamelCase, MD_S8Lit(" ")); + MD_String8 str = MD_S8Stylize(arena, MD_S8Lit("this_is_a_test"), + MD_IdentifierStyle_UpperCamelCase, MD_S8Lit(" ")); TestResult(MD_S8Match(str, MD_S8Lit("This Is A Test"), 0)); } { - MD_String8 str = MD_S8Stylize(MD_S8Lit("ThisIsATest"), MD_IdentifierStyle_UpperCamelCase, MD_S8Lit(" ")); + MD_String8 str = MD_S8Stylize(arena, MD_S8Lit("ThisIsATest"), + MD_IdentifierStyle_UpperCamelCase, MD_S8Lit(" ")); TestResult(MD_S8Match(str, MD_S8Lit("This Is A Test"), 0)); } { - MD_String8 str = MD_S8Stylize(MD_S8Lit("Here is another test."), MD_IdentifierStyle_UpperCamelCase, MD_S8Lit("")); + MD_String8 str = MD_S8Stylize(arena, MD_S8Lit("Here is another test."), + MD_IdentifierStyle_UpperCamelCase, MD_S8Lit("")); TestResult(MD_S8Match(str, MD_S8Lit("HereIsAnotherTest."), 0)); } } @@ -437,7 +441,10 @@ int main(void) { TestResult(MD_S8Match(MD_StringFromNodeKind(MD_NodeKind_Main), MD_S8Lit("Main"), 0)); TestResult(MD_S8Match(MD_StringFromNodeKind(MD_NodeKind_Main), MD_S8Lit("Main"), 0)); - MD_String8List list = MD_StringListFromNodeFlags(MD_NodeFlag_StringLiteral | MD_NodeFlag_HasParenLeft | MD_NodeFlag_IsBeforeSemicolon); + MD_String8List list = MD_StringListFromNodeFlags(arena, + MD_NodeFlag_StringLiteral | + MD_NodeFlag_HasParenLeft | + MD_NodeFlag_IsBeforeSemicolon); MD_b32 match = 1; for(MD_String8Node *node = list.first; node; node = node->next) {