Backup, new approach to ast
This commit is contained in:
42
memory.c
42
memory.c
@@ -40,6 +40,23 @@ arena_push_size(Arena *a, SizeU size){
|
||||
return result;
|
||||
}
|
||||
|
||||
function void
|
||||
arena_pop_pos(Arena *arena, SizeU pos){
|
||||
pos = clamp_top_sizeu(pos, arena->len);
|
||||
arena->len = pos;
|
||||
}
|
||||
|
||||
function Arena_Checkpoint
|
||||
arena_checkpoint(Arena *arena){
|
||||
Arena_Checkpoint result = {arena, arena->len};
|
||||
return result;
|
||||
}
|
||||
|
||||
function void
|
||||
arena_restore(Arena_Checkpoint checkpoint){
|
||||
arena_pop_pos(checkpoint.arena, checkpoint.pos);
|
||||
}
|
||||
|
||||
function String
|
||||
arena_push_string_copy(Arena *arena, String string){
|
||||
U8 *copy = arena_push_array(arena, U8, string.len+1);
|
||||
@@ -47,3 +64,28 @@ arena_push_string_copy(Arena *arena, String string){
|
||||
copy[string.len] = 0;
|
||||
return (String){copy, string.len};
|
||||
}
|
||||
|
||||
function String
|
||||
string_fmtv(Arena *arena, const char *str, va_list args1) {
|
||||
va_list args2;
|
||||
va_copy(args2, args1);
|
||||
U64 len = vsnprintf(0, 0, str, args2);
|
||||
va_end(args2);
|
||||
|
||||
char *result = (char *)arena_push_size(arena, len + 1);
|
||||
vsnprintf(result, len + 1, str, args1);
|
||||
if (arena->len > 0)
|
||||
arena->len -= 1;
|
||||
|
||||
return (String){(U8 *)result, len};
|
||||
}
|
||||
|
||||
function String
|
||||
string_fmt(Arena *arena, const char *str, ...) {
|
||||
va_list args1;
|
||||
va_start(args1, str);
|
||||
String result = string_fmtv(arena, str, args1);
|
||||
va_end(args1);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user