inline parse tag list call; fix uninitialized memory in string copy

This commit is contained in:
Ryan Fleury
2021-09-16 20:36:13 -06:00
parent e11ddda2fb
commit 0288b025f8
+59 -4
View File
@@ -787,6 +787,7 @@ MD_S8Copy(MD_Arena *arena, MD_String8 string)
res.size = string.size;
res.str = MD_PushArray(arena, MD_u8, string.size + 1);
MD_MemoryCopy(res.str, string.str, string.size);
res.str[string.size] = 0;
return(res);
}
@@ -2399,9 +2400,60 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset)
}
//- rjf: parse tag list
MD_Node *first_tag = MD_NilNode();
MD_Node *last_tag = MD_NilNode();
{
for(;off < string.size;)
{
//- rjf: parse @ symbol, signifying start of tag
off += MD_LexAdvanceFromSkips(MD_S8Skip(string, off), MD_TokenGroup_Irregular);
MD_Token next_token = MD_TokenFromString(MD_S8Skip(string, off));
if(next_token.kind != MD_TokenKind_Reserved ||
next_token.string.str[0] != '@')
{
break;
}
off += next_token.raw_string.size;
//- rjf: parse string of tag node
MD_Token name = MD_TokenFromString(MD_S8Skip(string, off));
MD_u64 name_off = off;
if((name.kind & MD_TokenGroup_Label) == 0)
{
// NOTE(rjf): @error Improper token for tag string
MD_String8 error_str = MD_S8Fmt(arena, "\"%.*s\" is not a proper tag label",
MD_S8VArg(name.raw_string));
MD_Message *error = MD_MakeTokenError(arena, string, name, MD_MessageKind_Error, error_str);
MD_MessageListPush(&result.errors, error);
break;
}
off += name.raw_string.size;
//- rjf: build tag
MD_Node *tag = MD_MakeNode(arena, MD_NodeKind_Tag, name.string, name.raw_string, name_off);
//- rjf: parse tag arguments
MD_Token open_paren = MD_TokenFromString(MD_S8Skip(string, off));
MD_ParseResult args_parse = MD_ParseResultZero();
if(open_paren.kind == MD_TokenKind_Reserved &&
open_paren.string.str[0] == '(')
{
args_parse = MD_ParseNodeSet(arena, string, off, tag, MD_ParseSetRule_EndOnDelimiter);
MD_MessageListConcat(&result.errors, &args_parse.errors);
}
off += args_parse.string_advance;
//- rjf: push tag to result
MD_NodeDblPushBack(first_tag, last_tag, tag);
}
}
//- rjf: parse tag list
#if 0
MD_ParseResult tags_parse = _MD_ParseTagList(arena, string, off);
off += tags_parse.string_advance;
MD_MessageListConcat(&result.errors, &tags_parse.errors);
#endif
//- rjf: parse node
MD_Node *parsed_node = MD_NilNode();
@@ -2559,11 +2611,14 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset)
result.node = parsed_node;
if(!MD_NodeIsNil(result.node))
{
result.node->first_tag = tags_parse.node;
result.node->last_tag = tags_parse.last_node;
result.node->first_tag = first_tag;
result.node->last_tag = last_tag;
for(MD_Node *tag = first_tag; !MD_NodeIsNil(tag); tag = tag->next)
{
tag->parent = result.node;
}
}
result.last_node = parsed_node;
result.string_advance= off - offset;
result.string_advance = off - offset;
return result;
}