aboutsummaryrefslogtreecommitdiff
path: root/code/lib/string.felan
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-06-10 00:39:11 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-06-10 00:40:03 +0330
commita839ff6229f4ae1415dddd5995781acb4bb599e1 (patch)
tree55015a667e09c974c38b689ae8245fa2696eca55 /code/lib/string.felan
parent91214dfb533ac693880ef06b3e990d944009d2e4 (diff)
fix some return type issues
Diffstat (limited to 'code/lib/string.felan')
-rw-r--r--code/lib/string.felan103
1 files changed, 99 insertions, 4 deletions
diff --git a/code/lib/string.felan b/code/lib/string.felan
index c7047b3..4b5452f 100644
--- a/code/lib/string.felan
+++ b/code/lib/string.felan
@@ -1,9 +1,104 @@
@import("operator.felan");
+@import("io.felan");
@import("types.felan");
+@import("memory.felan");
+
+String :: struct {
+ ptr : *u8;
+ size : u64;
+ capacity : u64;
+};
+
+string_new :: () -> String {
+ str : String = undefined;
+
+ str.ptr = malloc(0u64,u8);
+ str.size = 0u64;
+ str.capacity = 0u64;
+
+ return str;
+};
+
+string_from :: (str:[]u8) -> String {
+ result : String = undefined;
+
+ result.ptr = malloc(str.length,u8);
+ result.size = str.length;
+ result.capacity = str.length;
+
+ memcpy(result.ptr,str.ptr,str.length);
-sub_string :: (str:string, begin:i64, end:i64) -> string {
- result :[0]u8 = undefined;
- result.ptr = str.ptr + begin;
- result.length = @cast(end-begin,u64);
return result;
};
+
+append :: (this:*String, str:String) -> void {
+ _grow_if_needed(this, str.size);
+
+ memcpy(this.*.ptr+this.*.size,str.ptr,str.size);
+
+ this.*.size += str.size;
+};
+
+append :: (this:*String, str:[]u8) -> void {
+ _grow_if_needed(this, str.length);
+
+ memcpy(this.*.ptr+this.*.size,str.ptr,str.length);
+
+ this.*.size += str.length;
+};
+
+append :: (this:*String, char:u8) -> void {
+ _grow_if_needed(this, 1u64);
+
+ this.*[this.*.size] = char;
+
+ this.*.size += 1u64;
+};
+
+_grow_if_needed :: (this:*String, count:u64) -> void {
+ new_size := this.*.size + count;
+ if new_size >= this.*.capacity {
+ cap := this.*.capacity + this.*.capacity / 2u64 + 1u64;
+ if new_size >= cap {
+ cap = new_size;
+ }
+ this.*.capacity = cap;
+ this.*.ptr = realloc(this.*.ptr,this.*.capacity);
+ }
+};
+
+delete :: (this:String) -> void {
+ free(this.ptr);
+};
+
+print :: (this:String) -> void {
+ i := 0u64;
+ while i < this.size {
+ @putc(this[i]);
+ i += 1u64;
+ }
+};
+
+__get_item__ :: (left:*String,index:i64) -> u8 {
+ return (left.*.ptr + index).*;
+};
+
+__set_item__ :: (left:*String,index:i64,item:u8) -> u8 {
+ return (left.*.ptr + index).* = item;
+};
+
+__get_item_address__ :: (left:*String,index:i64) -> (*u8) {
+ return (left.*.ptr + index);
+};
+
+__get_item__ :: (left:*String,index:u64) -> u8 {
+ return (left.*.ptr + index).*;
+};
+
+__set_item__ :: (left:*String,index:u64,item:u8) -> u8 {
+ return (left.*.ptr + index).* = item;
+};
+
+__get_item_address__ :: (left:*String,index:u64) -> (*u8) {
+ return (left.*.ptr + index);
+};