mirror of
https://github.com/Ed94/metadesk.git
synced 2026-06-13 07:52:22 -07:00
inline parse tag list call; fix uninitialized memory in string copy
This commit is contained in:
+59
-4
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user