added simple string_builder

This commit is contained in:
victor 2025-05-13 21:44:49 +02:00
parent 30fb9231d8
commit 390dd10dca
6 changed files with 41 additions and 24 deletions

View File

@ -120,7 +120,7 @@ GLOBALSRC := $(addprefix $(GLOBALDIR)/, $(addsuffix .s, \
)) ))
SBSRC := $(addprefix $(SBDIR)/, $(addsuffix .s, \ SBSRC := $(addprefix $(SBDIR)/, $(addsuffix .s, \
string_builder\ string_builder sb_append \
)) ))
# Collect all sources and objects # Collect all sources and objects

BIN
langc

Binary file not shown.

Binary file not shown.

View File

@ -2,15 +2,17 @@
section .text section .text
extern strlen extern strlen
extern strcpy extern memcpy
extern malloc extern malloc
extern err_malloc extern err_malloc
%define SB [rbp - 16] %define SB [rbp - 16]
%define SB_LEN [rbp - 4] %define SB_LEN dword [rbp - 4]
%define SB_CAP [rbp - 8] %define SB_CAP dword [rbp - 8]
%define APPENDIX [rbp - 24] %define APPENDIX [rbp - 24]
%define APP_LEN dword [rbp - 28]
global sb_append
sb_append: ; (rdi: *sb, rsi: char*) sb_append: ; (rdi: *sb, rsi: char*)
push rbp push rbp
mov rbp, rsp mov rbp, rsp
@ -26,26 +28,28 @@ sb_append: ; (rdi: *sb, rsi: char*)
; get sb len ; get sb len
mov eax, dword [rdi + STR_LEN] mov eax, dword [rdi + STR_LEN]
mov dword SB_LEN, eax mov SB_LEN, eax
mov eax, dword [rdi + STR_CAP] mov eax, dword [rdi + STR_CAP]
mov dword SB_CAP, eax mov SB_CAP, eax
push rdi push rdi
mov rdi, rsi mov rdi, rsi
call strlen call strlen
add rax, SB_LEN mov APP_LEN, eax
cmp rax, SB_CAP
add eax, SB_LEN
cmp eax, SB_CAP
jl .copy_string jl .copy_string
mov r9, SB_CAP mov r9d, SB_CAP
; new string will be to large for current cap, need to realloc ; new string will be to large for current cap, need to realloc
.get_new_len: .get_new_len:
imul r9, 2 imul r9, 2
cmp r9, rax cmp r9, rax
jl .get_new_len jl .get_new_len
mov SB_CAP, r9 mov SB_CAP, r9d
push r9 push r9
push rax push rax
mov rdi, r9 mov rdi, r9
@ -55,11 +59,12 @@ sb_append: ; (rdi: *sb, rsi: char*)
mov rdi, rax mov rdi, rax
mov rsi, SB mov rsi, SB
mov rsi, [rsi + STR_DATA] mov rsi, [rsi + STR_DATA]
call strcpy mov edx, SB_LEN
call memcpy
pop rax pop rax
mov rsi, SB mov rsi, SB
pop r9 pop r9
mov [SB + STR_CAP], r9 mov [rsi + STR_CAP], r9
.copy_string: .copy_string:
pop rdi pop rdi
@ -67,9 +72,10 @@ sb_append: ; (rdi: *sb, rsi: char*)
mov dword [r9 + STR_LEN], eax mov dword [r9 + STR_LEN], eax
mov rdi, [r9 + STR_DATA] mov rdi, [r9 + STR_DATA]
mov eax, dword [rbp - 4] mov eax, dword [rbp - 4]
lea rdi, [rdi + eax] lea rdi, [rdi + rax]
mov rsi, [rbp - 24] mov rsi, APPENDIX
call strcpy mov edx, APP_LEN
call memcpy
.done: .done:
mov rsp, rbp mov rsp, rbp

View File

@ -10,7 +10,6 @@ section .text
global sb_new global sb_new
sb_new: ; rax: str*(rdi: char* || NULL, rsi: *hidden_copy_ptr) sb_new: ; rax: str*(rdi: char* || NULL, rsi: *hidden_copy_ptr)
push rbx push rbx
push rdi
push rsi push rsi
mov rbx, STRING_INIT_CAP mov rbx, STRING_INIT_CAP
@ -31,7 +30,6 @@ sb_new: ; rax: str*(rdi: char* || NULL, rsi: *hidden_copy_ptr)
cmp r9, rbx cmp r9, rbx
jg .calc_init_len jg .calc_init_len
.alloc_string: .alloc_string:
push rdi push rdi
mov rdi, rbx mov rdi, rbx
@ -46,9 +44,10 @@ sb_new: ; rax: str*(rdi: char* || NULL, rsi: *hidden_copy_ptr)
mov [rsi + STR_DATA], rax mov [rsi + STR_DATA], rax
test r9, r9 test r9, r9
jz .done jz .done
push rdi
mov rdi, rax mov rdi, rax
mov rdx, r9
pop rsi pop rsi
mov rdx, r9
call memcpy call memcpy
.done: .done:

View File

@ -1,5 +1,8 @@
%include "./src/core/string_builder/sb.s"
section .data section .data
usage: db "Usage: ./debug <file>.lang", 0xa, 0 usage: db "Usage: ./debug <file>.lang", 0xa, 0
example_data: db "Do you know Ligma?"
section .text section .text
global _start global _start
@ -14,6 +17,7 @@ section .text
extern putchar extern putchar
extern vec_pop extern vec_pop
extern sb_new extern sb_new
extern sb_append
print_usage: print_usage:
mov rdi, usage mov rdi, usage
@ -25,9 +29,17 @@ _start:
mov rbp, rsp mov rbp, rsp
sub rsp, 16 sub rsp, 16
mov rdi, usage mov rdi, usage
lea rsi, [rsp - 16] lea rsi, [rbp - 16]
call sb_new call sb_new
mov rdi, [rbp - 16 + STR_DATA]
call putstr
lea rdi, [rbp - 16]
mov rsi, example_data
call sb_append
mov rdi, [rbp - 16 + STR_DATA]
call putstr
; pop rdi ; pop rdi
; cmp rdi, 2 ; cmp rdi, 2
; jne err_args ; jne err_args
@ -44,9 +56,9 @@ _start:
; mov rdi, rax ; mov rdi, rax
; call lex ; call lex
; ;
; mov rsp, rbp mov rsp, rbp
; pop rbp pop rbp
;
done: done:
; xor rdi, rdi xor rdi, rdi
; call exit call exit