fix top-level frontend exit logic; eliminate path -> entity code, since we are totally off filesystem entities

This commit is contained in:
Ryan Fleury
2024-09-11 16:25:02 -07:00
parent f59694fcfb
commit 26fb91d539
4 changed files with 32 additions and 244 deletions
-197
View File
@@ -1287,203 +1287,6 @@ d_entity_equip_namef(D_Entity *entity, char *fmt, ...)
scratch_end(scratch);
}
//- rjf: params tree equipment
internal void
d_entity_equip_params(D_Entity *entity, MD_Node *params)
{
if(entity->params_arena == 0)
{
entity->params_arena = arena_alloc();
}
arena_clear(entity->params_arena);
entity->params_root = md_tree_copy(entity->params_arena, params);
}
internal void
d_entity_equip_param(D_Entity *entity, String8 key, String8 value)
{
Temp scratch = scratch_begin(0, 0);
//- rjf: try to incrementally add to existing tree
B32 incrementally_added = 0;
if(!md_node_is_nil(entity->params_root))
{
MD_Node *params = entity->params_root;
MD_Node *key_node = md_child_from_string(params, key, 0);
if(md_node_is_nil(key_node))
{
String8 key_copy = push_str8_copy(entity->params_arena, key);
key_node = md_push_node(entity->params_arena, MD_NodeKind_Main, MD_NodeFlag_Identifier, key_copy, key_copy, 0);
md_node_push_child(params, key_node);
String8 value_copy = push_str8_copy(entity->params_arena, value);
MD_TokenizeResult value_tokenize = md_tokenize_from_text(scratch.arena, value_copy);
MD_ParseResult value_parse = md_parse_from_text_tokens(scratch.arena, str8_zero(), value_copy, value_tokenize.tokens);
for(MD_EachNode(child, value_parse.root->first))
{
child->parent = key_node;
}
key_node->first = value_parse.root->first;
key_node->last = value_parse.root->last;
incrementally_added = 1;
}
}
//- rjf: not incrementally added -> fully rewrite parameter tree
if(!incrementally_added)
{
MD_Node *params = md_tree_copy(scratch.arena, entity->params_root);
MD_Node *key_node = md_child_from_string(params, key, 0);
if(md_node_is_nil(key_node))
{
key_node = md_push_node(scratch.arena, MD_NodeKind_Main, MD_NodeFlag_Identifier, key, key, 0);
md_node_push_child(params, key_node);
}
MD_TokenizeResult value_tokenize = md_tokenize_from_text(scratch.arena, value);
MD_ParseResult value_parse = md_parse_from_text_tokens(scratch.arena, str8_zero(), value, value_tokenize.tokens);
for(MD_EachNode(child, value_parse.root->first))
{
child->parent = key_node;
}
key_node->first = value_parse.root->first;
key_node->last = value_parse.root->last;
d_entity_equip_params(entity, params);
}
scratch_end(scratch);
}
//- rjf: opening folders/files & maintaining the entity model of the filesystem
internal D_Entity *
d_entity_from_path(String8 path, D_EntityFromPathFlags flags)
{
Temp scratch = scratch_begin(0, 0);
PathStyle path_style = PathStyle_Relative;
String8List path_parts = path_normalized_list_from_string(scratch.arena, path, &path_style);
StringMatchFlags path_match_flags = path_match_flags_from_os(operating_system_from_context());
//- rjf: pass 1: open parts, ignore overrides
D_Entity *file_no_override = &d_nil_entity;
{
D_Entity *parent = d_entity_root();
for(String8Node *path_part_n = path_parts.first;
path_part_n != 0;
path_part_n = path_part_n->next)
{
// rjf: find next child
D_Entity *next_parent = &d_nil_entity;
for(D_Entity *child = parent->first; !d_entity_is_nil(child); child = child->next)
{
B32 name_matches = str8_match(child->string, path_part_n->string, path_match_flags);
if(name_matches && child->kind == D_EntityKind_File)
{
next_parent = child;
break;
}
}
// rjf: no next -> allocate one
if(d_entity_is_nil(next_parent))
{
if(flags & D_EntityFromPathFlag_OpenAsNeeded)
{
String8 parent_path = d_full_path_from_entity(scratch.arena, parent);
String8 path = push_str8f(scratch.arena, "%S%s%S", parent_path, parent_path.size != 0 ? "/" : "", path_part_n->string);
FileProperties file_properties = os_properties_from_file_path(path);
if(file_properties.created != 0 || flags & D_EntityFromPathFlag_OpenMissing)
{
next_parent = d_entity_alloc(parent, D_EntityKind_File);
d_entity_equip_name(next_parent, path_part_n->string);
next_parent->timestamp = file_properties.modified;
next_parent->flags |= D_EntityFlag_IsFolder * !!(file_properties.flags & FilePropertyFlag_IsFolder);
next_parent->flags |= D_EntityFlag_IsMissing * !!(file_properties.created == 0);
if(path_part_n->next != 0)
{
next_parent->flags |= D_EntityFlag_IsFolder;
}
}
}
else
{
parent = &d_nil_entity;
break;
}
}
// rjf: next parent -> follow it
parent = next_parent;
}
file_no_override = (parent != d_entity_root() ? parent : &d_nil_entity);
}
//- rjf: pass 2: follow overrides
D_Entity *file_overrides_applied = &d_nil_entity;
if(flags & D_EntityFromPathFlag_AllowOverrides)
{
D_Entity *parent = d_entity_root();
for(String8Node *path_part_n = path_parts.first;
path_part_n != 0;
path_part_n = path_part_n->next)
{
// rjf: find next child
D_Entity *next_parent = &d_nil_entity;
for(D_Entity *child = parent->first; !d_entity_is_nil(child); child = child->next)
{
B32 name_matches = str8_match(child->string, path_part_n->string, path_match_flags);
if(name_matches && child->kind == D_EntityKind_File)
{
next_parent = child;
}
}
// rjf: no next -> allocate one
if(d_entity_is_nil(next_parent))
{
if(flags & D_EntityFromPathFlag_OpenAsNeeded)
{
String8 parent_path = d_full_path_from_entity(scratch.arena, parent);
String8 path = push_str8f(scratch.arena, "%S%s%S", parent_path, parent_path.size != 0 ? "/" : "", path_part_n->string);
FileProperties file_properties = os_properties_from_file_path(path);
if(file_properties.created != 0 || flags & D_EntityFromPathFlag_OpenMissing)
{
next_parent = d_entity_alloc(parent, D_EntityKind_File);
d_entity_equip_name(next_parent, path_part_n->string);
next_parent->timestamp = file_properties.modified;
next_parent->flags |= D_EntityFlag_IsFolder * !!(file_properties.flags & FilePropertyFlag_IsFolder);
next_parent->flags |= D_EntityFlag_IsMissing * !!(file_properties.created == 0);
if(path_part_n->next != 0)
{
next_parent->flags |= D_EntityFlag_IsFolder;
}
}
}
else
{
parent = &d_nil_entity;
break;
}
}
// rjf: next parent -> follow it
parent = next_parent;
}
file_overrides_applied = (parent != d_entity_root() ? parent : &d_nil_entity);;
}
//- rjf: pick & return result
D_Entity *result = (flags & D_EntityFromPathFlag_AllowOverrides) ? file_overrides_applied : file_no_override;
if(flags & D_EntityFromPathFlag_AllowOverrides &&
result == file_overrides_applied &&
result->flags & D_EntityFlag_IsMissing)
{
result = file_no_override;
}
scratch_end(scratch);
return result;
}
//- rjf: file path map override lookups
internal String8List
-7
View File
@@ -873,13 +873,6 @@ internal void d_entity_equip_vaddr(D_Entity *entity, U64 vaddr);
internal void d_entity_equip_name(D_Entity *entity, String8 name);
internal void d_entity_equip_namef(D_Entity *entity, char *fmt, ...);
//- rjf: params tree equipment
internal void d_entity_equip_params(D_Entity *entity, MD_Node *params);
internal void d_entity_equip_param(D_Entity *entity, String8 key, String8 value);
//- rjf: opening folders/files & maintaining the entity model of the filesystem
internal D_Entity *d_entity_from_path(String8 path, D_EntityFromPathFlags flags);
//- rjf: file path map override lookups
internal String8List d_possible_overrides_from_file_path(Arena *arena, String8 file_path);