// Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// //~ rjf: Generated Code #include "eval/generated/eval.meta.c" //////////////////////////////// //~ rjf: Basic Helper Functions internal U64 e_hash_from_string(U64 seed, String8 string) { U64 result = seed; for(U64 i = 0; i < string.size; i += 1) { result = ((result << 5) + result) + string.str[i]; } return result; } internal String8 e_raw_from_escaped_string(Arena *arena, String8 string) { Temp scratch = scratch_begin(&arena, 1); String8List strs = {0}; U64 start = 0; for(U64 idx = 0; idx <= string.size; idx += 1) { if(idx == string.size || string.str[idx] == '\\' || string.str[idx] == '\r') { String8 str = str8_substr(string, r1u64(start, idx)); if(str.size != 0) { str8_list_push(scratch.arena, &strs, str); } start = idx+1; } if(idx < string.size && string.str[idx] == '\\') { U8 next_char = string.str[idx+1]; U8 replace_byte = 0; switch(next_char) { default:{}break; case 'a': replace_byte = 0x07; break; case 'b': replace_byte = 0x08; break; case 'e': replace_byte = 0x1b; break; case 'f': replace_byte = 0x0c; break; case 'n': replace_byte = 0x0a; break; case 'r': replace_byte = 0x0d; break; case 't': replace_byte = 0x09; break; case 'v': replace_byte = 0x0b; break; case '\\':replace_byte = '\\'; break; case '\'':replace_byte = '\''; break; case '"': replace_byte = '"'; break; case '?': replace_byte = '?'; break; } String8 replace_string = push_str8_copy(scratch.arena, str8(&replace_byte, 1)); str8_list_push(scratch.arena, &strs, replace_string); if(replace_byte == '\\' || replace_byte == '"' || replace_byte == '\'') { idx += 1; start += 1; } } } String8 result = str8_list_join(arena, &strs, 0); scratch_end(scratch); return result; } internal String8 e_escaped_from_raw_string(Arena *arena, String8 string) { Temp scratch = scratch_begin(&arena, 1); String8List parts = {0}; U64 start_split_idx = 0; for(U64 idx = 0; idx <= string.size; idx += 1) { U8 byte = (idx < string.size) ? string.str[idx] : 0; B32 split = 1; String8 separator_replace = {0}; switch(byte) { default:{split = 0;}break; case 0: {}break; case '\a': {separator_replace = str8_lit("\\a");}break; case '\b': {separator_replace = str8_lit("\\b");}break; case '\f': {separator_replace = str8_lit("\\f");}break; case '\n': {separator_replace = str8_lit("\\n");}break; case '\r': {separator_replace = str8_lit("\\r");}break; case '\t': {separator_replace = str8_lit("\\t");}break; case '\v': {separator_replace = str8_lit("\\v");}break; case '\\': {separator_replace = str8_lit("\\\\");}break; case '"': {separator_replace = str8_lit("\\\"");}break; case '?': {separator_replace = str8_lit("\\?");}break; } if(split) { String8 substr = str8_substr(string, r1u64(start_split_idx, idx)); start_split_idx = idx+1; str8_list_push(scratch.arena, &parts, substr); if(separator_replace.size != 0) { str8_list_push(scratch.arena, &parts, separator_replace); } } } StringJoin join = {0}; String8 result = str8_list_join(arena, &parts, &join); scratch_end(scratch); return result; } //////////////////////////////// //~ rjf: Message Functions internal void e_msg(Arena *arena, E_MsgList *msgs, E_MsgKind kind, void *location, String8 text) { E_Msg *msg = push_array(arena, E_Msg, 1); SLLQueuePush(msgs->first, msgs->last, msg); msgs->count += 1; msgs->max_kind = Max(kind, msgs->max_kind); msg->kind = kind; msg->location = location; msg->text = text; } internal void e_msgf(Arena *arena, E_MsgList *msgs, E_MsgKind kind, void *location, char *fmt, ...) { va_list args; va_start(args, fmt); String8 text = push_str8fv(arena, fmt, args); va_end(args); e_msg(arena, msgs, kind, location, text); } internal void e_msg_list_concat_in_place(E_MsgList *dst, E_MsgList *to_push) { if(dst->last != 0 && to_push->first != 0) { dst->last->next = to_push->first; dst->last = to_push->last; dst->count += to_push->count; dst->max_kind = Max(dst->max_kind, to_push->max_kind); } else if(to_push->first != 0) { MemoryCopyStruct(dst, to_push); } MemoryZeroStruct(to_push); } //////////////////////////////// //~ rjf: Space Functions internal E_Space e_space_make(E_SpaceKind kind) { E_Space space = {0}; space.kind = kind; return space; }