This commit is contained in:
attilavs2 2025-03-23 00:13:30 +01:00
parent 1ac96b0d60
commit 767f03e765
3 changed files with 21 additions and 3 deletions

View file

@ -441,13 +441,27 @@ Value add(Value a, Value b){
break;
case T_str:
if(a.vstr.len + b.vstr.len > 4){
runtime_err("not implem");
u32 tmp = flisp_alloc(a.vstr.len + b.vstr.len);
if(!tmp){
a.tag = ntag;
break;
}
a.vstr.pos = tmp;
char *nstr = get_addr(tmp);
if(a.vstr.len > 4)
memcpy(nstr, get_addr(a.vstr.pos), a.vstr.len);
else
memcpy(nstr, a.vstr.str, a.vstr.len);
if(b.vstr.len > 4)
memcpy(nstr+a.vstr.len, get_addr(b.vstr.pos), b.vstr.len);
else
memcpy(nstr+a.vstr.len, b.vstr.str, b.vstr.len);
}
else {
for(int i = 0; i < b.vstr.len; i++)
a.vstr.str[a.vstr.len + i] = b.vstr.str[i];
a.vstr.len += b.vstr.len;
}
a.vstr.len += b.vstr.len;
break;
default:
runtime_err("Add : Invalid types");

View file

@ -49,5 +49,6 @@ Value cast(Tag tag, Value b);
// Makes a copy of the string
// If len < 0, will copy up to a '\0'
Value str_to_val(char *str, i32 len);
void clean_strval(Value str);
void symbol_map_add_bi(HashMap *map);

View file

@ -38,8 +38,11 @@ void assign(Value *dst, Value src){
printf("Assign : %d -> %d\n", src.tag.type, dst->tag.type);
#endif
if((dst->tag.type == src.tag.type || dst->tag.type == T_any)
&& dst->tag.is_array == src.tag.is_array)
&& dst->tag.is_array == src.tag.is_array){
if(dst->tag.type == T_str)
clean_strval(*dst);
*dst = src;
}
else{
fprintf(stderr, "Warning : Possibly incorrect assignement\n"
"This may error in the future\n");