mirror of
https://github.com/Ed94/metadesk.git
synced 2026-07-31 11:50:05 +00:00
progress on sanity_tests.c, adding back md_str8_styllize
Eventually a heavy reduction of base & OS should be provided via libgen or done here to reduce the overall surface area of the library for the user. Base and os were dragged from raddbg and the original metadesk didn't need as many definitions.
This commit is contained in:
+123
-1
@@ -6,6 +6,128 @@
|
||||
// Copyright (c) 2024 Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
MD_String8
|
||||
md_str8_stylize(MD_Arena* arena, MD_String8 string, MD_IdentifierStyle word_style, MD_String8 separator)
|
||||
{
|
||||
MD_String8 result = md_zero_struct();
|
||||
MD_String8List words = md_zero_struct();
|
||||
|
||||
MD_B32 break_on_uppercase = 0;
|
||||
{
|
||||
break_on_uppercase = 1;
|
||||
for (MD_U64 i = 0; i < string.size; i += 1)
|
||||
{
|
||||
if ( ! md_char_is_alpha(string.str[i]) && ! md_char_is_digit(string.str[i])) {
|
||||
break_on_uppercase = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MD_B32 making_word = 0;
|
||||
MD_String8 word = md_zero_struct();
|
||||
for (MD_U64 i = 0; i < string.size;)
|
||||
{
|
||||
if (making_word)
|
||||
{
|
||||
|
||||
if ( (break_on_uppercase && md_char_is_upper(string.str[i])) || string.str[i] == '_' || md_char_is_space(string.str[i]) || i == string.size - 1)
|
||||
{
|
||||
if (i == string.size - 1) {
|
||||
word.size += 1;
|
||||
}
|
||||
making_word = 0;
|
||||
md_str8_list_push(arena, &words, word);
|
||||
}
|
||||
else
|
||||
{
|
||||
word.size += 1;
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(md_char_is_alpha(string.str[i]))
|
||||
{
|
||||
making_word = 1;
|
||||
word.str = string.str + i;
|
||||
word.size = 1;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
|
||||
result.size = words.total_size;
|
||||
if (words.node_count > 1) {
|
||||
result.size += separator.size*(words.node_count-1);
|
||||
}
|
||||
result.str = md_push_array(arena, MD_U8*, result.size);
|
||||
{
|
||||
MD_U64 write_pos = 0;
|
||||
for(MD_String8Node *node = words.first; node; node = node->next)
|
||||
{
|
||||
|
||||
// NOTE(rjf): Write word string to result.
|
||||
{
|
||||
MD_MemoryCopy(result.str + write_pos, node->string.str, node->string.size);
|
||||
|
||||
// NOTE(rjf): Transform string based on word style.
|
||||
switch(word_style)
|
||||
{
|
||||
case MD_IdentifierStyle_UpperCamelCase:
|
||||
{
|
||||
result.str[write_pos] = MD_CharToUpper(result.str[write_pos]);
|
||||
for(MD_u64 i = write_pos+1; i < write_pos + node->string.size; i += 1)
|
||||
{
|
||||
result.str[i] = MD_CharToLower(result.str[i]);
|
||||
}
|
||||
}break;
|
||||
|
||||
case MD_IdentifierStyle_LowerCamelCase:
|
||||
{
|
||||
MD_b32 is_first = (node == words.first);
|
||||
result.str[write_pos] = (is_first ?
|
||||
MD_CharToLower(result.str[write_pos]) :
|
||||
MD_CharToUpper(result.str[write_pos]));
|
||||
for(MD_u64 i = write_pos+1; i < write_pos + node->string.size; i += 1)
|
||||
{
|
||||
result.str[i] = MD_CharToLower(result.str[i]);
|
||||
}
|
||||
}break;
|
||||
|
||||
case MD_IdentifierStyle_UpperCase:
|
||||
{
|
||||
for(MD_u64 i = write_pos; i < write_pos + node->string.size; i += 1)
|
||||
{
|
||||
result.str[i] = MD_CharToUpper(result.str[i]);
|
||||
}
|
||||
}break;
|
||||
|
||||
case MD_IdentifierStyle_LowerCase:
|
||||
{
|
||||
for(MD_u64 i = write_pos; i < write_pos + node->string.size; i += 1)
|
||||
{
|
||||
result.str[i] = MD_CharToLower(result.str[i]);
|
||||
}
|
||||
}break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
|
||||
write_pos += node->string.size;
|
||||
}
|
||||
|
||||
if(node->next)
|
||||
{
|
||||
MD_MemoryCopy(result.str + write_pos, separator.str, separator.size);
|
||||
write_pos += separator.size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
// MD_Context
|
||||
|
||||
@@ -648,7 +770,7 @@ void md_parse__work_push(MD_ParseWorkKind work_kind, MD_Node* work_parent, MD_Pa
|
||||
{
|
||||
MD_ParseWorkNode* work_node = work_free;
|
||||
if (work_node == 0) {
|
||||
work_node = md_push_array_(scratch->arena, MD_ParseWorkNode, 1);
|
||||
work_node = md_push_array(scratch->arena, MD_ParseWorkNode, 1);
|
||||
}
|
||||
else {
|
||||
md_sll_stack_pop(work_free);
|
||||
|
||||
+16
-4
@@ -6,6 +6,18 @@
|
||||
// Copyright (c) 2024 Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
// String Identifier Style
|
||||
typedef enum MD_IdentifierStyle MD_IdentifierStyle;
|
||||
enum MD_IdentifierStyle
|
||||
{
|
||||
MD_IdentifierStyle_UpperCamelCase,
|
||||
MD_IdentifierStyle_LowerCamelCase,
|
||||
MD_IdentifierStyle_UpperCase,
|
||||
MD_IdentifierStyle_LowerCase,
|
||||
};
|
||||
|
||||
MD_API MD_String8 md_str8_stylize(MD_Arena* arena, MD_String8 string, MD_IdentifierStyle style, MD_String8 separator);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Messages
|
||||
|
||||
@@ -325,9 +337,9 @@ MD_API MD_TokenArray md_token_array_from_chunk_list__ainfo (MD_AllocatorInfo ai
|
||||
#define md_token_chunk_list_push(allocator, list, cap, token) _Generic(allocator, MD_Arena*: md_token_chunk_list_push__arena, MD_AllocatorInfo: md_token_chunk_list_push__ainfo, default: md_assert_generic_sel_fail) md_generic_call(allocator, list, cap, token)
|
||||
#define md_token_array_from_chunk_list(allocator, chunks) _Generic(allocator, MD_Arena*: md_token_array_from_chunk_list__arena, MD_AllocatorInfo: md_token_array_from_chunk_list__ainfo, default: md_assert_generic_sel_fail) md_generic_call(allocator, chunks)
|
||||
|
||||
md_force_inline MD_String8List md_string_list_from_token_flags__arena(MD_Arena* arena, MD_TokenFlags flags) { return md_string_list_from_token_flags__ainfo(md_arena_allocator(arena), flags); }
|
||||
md_force_inline void md_token_chunk_list_push__arena (MD_Arena* arena, MD_TokenChunkList* list, MD_U64 cap, MD_Token token) { md_token_chunk_list_push__ainfo(md_arena_allocator(arena), list, cap, token); }
|
||||
md_force_inline MD_TokenArray md_token_array_from_chunk_list__arena (MD_Arena* arena, MD_TokenChunkList* chunks) { return md_token_array_from_chunk_list__ainfo(md_arena_allocator(arena), chunks); }
|
||||
md_force_inline MD_String8List md_string_list_from_token_flags__arena(MD_Arena* arena, MD_TokenFlags flags) { return md_string_list_from_token_flags__ainfo(md_arena_allocator(arena), flags); }
|
||||
md_force_inline void md_token_chunk_list_push__arena (MD_Arena* arena, MD_TokenChunkList* list, MD_U64 cap, MD_Token token) { md_token_chunk_list_push__ainfo(md_arena_allocator(arena), list, cap, token); }
|
||||
md_force_inline MD_TokenArray md_token_array_from_chunk_list__arena (MD_Arena* arena, MD_TokenChunkList* chunks) { return md_token_array_from_chunk_list__ainfo(md_arena_allocator(arena), chunks); }
|
||||
|
||||
inline MD_Token
|
||||
md_token_make(MD_Rng1U64 range, MD_TokenFlags flags) {
|
||||
@@ -593,7 +605,7 @@ MD_API MD_ParseResult md_parse_from_text__arena(MD_Arena* arena, MD_Strin
|
||||
MD_API MD_ParseResult md_parse_from_text__ainfo(MD_AllocatorInfo ainfo, MD_String8 filename, MD_String8 text);
|
||||
|
||||
#define md_parse_from_text(allocator, filename, text) _Generic(allocator, MD_Arena*: md_parse_from_text__arena, MD_AllocatorInfo: md_parse_from_text__ainfo, default: md_assert_generic_sel_fail) md_generic_call(allocator, filename, text)
|
||||
#define tree_from_string(allocator, string) (md_parse_from_text((allocator), md_str8_zero(), (string)).root)
|
||||
#define md_tree_from_string(allocator, string) (md_parse_from_text((allocator), md_str8_zero(), (string)).root)
|
||||
|
||||
md_force_inline MD_ParseResult md_parse_from_text__arena(MD_Arena* arena, MD_String8 filename, MD_String8 text) { return md_parse_from_text__ainfo(md_arena_allocator(arena), filename, text); }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user