Adding more string functionality
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 4 May 2020 20:14:56 +0000 (15:14 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 4 May 2020 20:14:56 +0000 (15:14 -0500)
bh.h
demo.onyx
onyx
onyx.c

diff --git a/bh.h b/bh.h
index c0b2a23f366c0134659b0c9a565b80d03c2131db..a08aad4f3d52edf23c9c314881e56e1463c98bdd 100644 (file)
--- a/bh.h
+++ b/bh.h
@@ -1,3 +1,4 @@
+#include <stdio.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <fcntl.h>
@@ -20,6 +21,9 @@ typedef signed int i32;
 typedef signed long i64;
 typedef signed long long i128;
 
+//-------------------------------------------------------------------------------------
+// Better strings
+//-------------------------------------------------------------------------------------
 typedef struct bh_string {
        u8* data;
        u64 length;
@@ -28,9 +32,48 @@ typedef struct bh_string {
 
 #define bh_string_new(x) _Generic((x), \
        unsigned long: bh_string_new_cap, \
+       unsigned int: bh_string_new_cap, \
+       int: bh_string_new_cap, \
+       long: bh_string_new_cap, \
        const char*: bh_string_new_str, \
        char*: bh_string_new_str)(x)
 
+#define bh_string_append(str1, str2) _Generic((str2), \
+       bh_string*: bh_string_append_bh_string, \
+       char*: bh_string_append_cstr, \
+       const char*: bh_string_append_cstr)(str1, str2)
+
+#define bh_string_replace_at(dest, src, offset) _Generic((src), \
+       bh_string*: bh_string_replace_at_bh_string, \
+       char*: bh_string_replace_at_cstr, \
+       const char*: bh_string_replace_at_cstr)(dest, src, offset)
+
+#define bh_string_insert_at(dest, src, offset) _Generic((src), \
+       bh_string*: bh_string_insert_at_bh_string, \
+       char*: bh_string_insert_at_cstr, \
+       const char*: bh_string_insert_at_cstr)(dest, src, offset)
+
+bh_string bh_string_new_cap(unsigned long cap);
+bh_string bh_string_new_str(const char* cstr);
+i32 bh_string_delete(bh_string* str);
+i32 bh_string_ensure_capacity(bh_string* str, u64 cap);
+void bh_string_append_bh_string(bh_string* str1, bh_string* str2);
+void bh_string_append_cstr(bh_string* str1, const char* str2);
+void bh_string_replace_at_bh_string(bh_string* dest, bh_string* src, u64 offset);
+void bh_string_replace_at_cstr(bh_string* dest, const char* src, u64 offset);
+void bh_string_insert_at_bh_string(bh_string* dest, bh_string* src, u64 offset);
+void bh_string_insert_at_cstr(bh_string* dest, bh_string* src, u64 offset);
+void bh_string_trim_end(bh_string* str, const char* charset);
+void bh_string_trim_begin(bh_string* str, const char* charset);
+void bh_string_trim_end_space(bh_string* str);
+// TEMP
+void bh_string_print(bh_string* str);
+
+
+//-------------------------------------------------------------------------------------
+// IMPLEMENTATIONS
+//-------------------------------------------------------------------------------------
+
 bh_string bh_string_new_cap(unsigned long cap) {
        bh_string str;
        str.data = (u8*) malloc(sizeof(u8) * cap);
@@ -40,38 +83,38 @@ bh_string bh_string_new_cap(unsigned long cap) {
 }
 
 bh_string bh_string_new_str(const char* cstr) {
-       const int len = strlen(cstr);
+       const i32 len = strlen(cstr);
        bh_string str;
-       int i;
+       i32 i;
 
        str.data = (u8*) malloc(sizeof(u8) * len);
        for (i = 0; i < len; i++) {
                str.data[i] = cstr[i];
        }
-       
+
        str.length = len;
        str.capacity = len;
        return str;
 }
 
-int bh_string_delete(bh_string* str) {
+i32 bh_string_delete(bh_string* str) {
        free(str->data);
        str->length = 0;
        str->capacity = 0;
        return 1;
 }
 
-int bh_string_ensure_capacity(bh_string* str, u64 cap) {
+i32 bh_string_ensure_capacity(bh_string* str, u64 cap) {
        if (str->capacity >= cap) return 1;
 
-        //TODO: This could fail
+       //TODO: This could fail
        str->data = (u8*) realloc((void*) str->data, sizeof(u8) * cap);
        str->capacity = cap;
 
        return 1;
 }
 
-void bh_string_append(bh_string* str1, bh_string* str2) {
+void bh_string_append_bh_string(bh_string* str1, bh_string* str2) {
        if (!bh_string_ensure_capacity(str1, str1->length + str2->length)) return;
 
        //TODO: Replace with custom memory management
@@ -79,9 +122,52 @@ void bh_string_append(bh_string* str1, bh_string* str2) {
        str1->length += str2->length;
 }
 
+void bh_string_append_cstr(bh_string* str1, const char* str2) {
+       const i32 str2len = strlen(str2);
+       if (!bh_string_ensure_capacity(str1, str1->length + str2len)) return;
+
+       //TODO: Replace with custom memory management
+       memcpy(str1->data + str1->length, str2, str2len);
+       str1->length += str2len;
+}
+
+void bh_string_replace_at_bh_string(bh_string* dest, bh_string* src, u64 offset) {
+       if (offset >= dest->length) return;
+       if (!bh_string_ensure_capacity(dest, offset + src->length)) return;
+
+       memcpy(dest->data + offset, src->data, src->length);
+       if (offset + src->length > dest->length)
+               dest->length = offset + src->length;
+}
+
+void bh_string_replace_at_cstr(bh_string* dest, const char* src, u64 offset) {
+       if (offset >= dest->length) return;
+       const int srclen = strlen(src);
+       if (!bh_string_ensure_capacity(dest, offset + srclen)) return;
+
+       memcpy(dest->data + offset, src, srclen);
+       if (offset + srclen > dest->length)
+               dest->length = offset + srclen;
+}
+
+void bh_string_insert_at_bh_string(bh_string* dest, bh_string* src, u64 offset) {
+}
+
+void bh_string_insert_at_cstr(bh_string* dest, bh_string* src, u64 offset) {
+}
+
+void bh_string_trim_end(bh_string* str, const char* charset) {
+}
+
+void bh_string_trim_begin(bh_string* str, const char* charset) {
+}
+
+void bh_string_trim_end_space(bh_string* str) {
+}
+
 // TEMP
 void bh_string_print(bh_string* str) {
-       write(STDOUT_FILENO, str->data, str->length);
+       write(STDOUT_FILENO, str->data, str->capacity);
 }
 
 
index 27b20f74f510a7873f13f7f5dc57a1df64b47587..ee02d76bce162d6cb1874fe136206ce8b14590f9 100644 (file)
--- a/demo.onyx
+++ b/demo.onyx
@@ -1,4 +1,3 @@
-
 use "core";
 
 Foo :: struct {
diff --git a/onyx b/onyx
index d4295645e1a50997b5f9704ea3fd40f6121210f5..f41434829deb74d21d276f499cbd68a11df9be1f 100755 (executable)
Binary files a/onyx and b/onyx differ
diff --git a/onyx.c b/onyx.c
index 4bb216c67d4a99a2bf9e20105dbc5bf6ee21e11f..615c50cade9756de0c4c4e7d1feef4814874f8de 100644 (file)
--- a/onyx.c
+++ b/onyx.c
 // 
 
 int main(int argc, char *argv[]) {
-       bh_string test_str1 = bh_string_new("Hello ");
-       bh_string test_str2 = bh_string_new("World!");
+       bh_string test_str = bh_string_new(256);
+       bh_string world_str = bh_string_new("World");
 
-       bh_string_append(&test_str1, &test_str2);
-       bh_string_print(&test_str1);
+       bh_string_append(&test_str, "Hello Frank!");
+       bh_string_replace_at(&test_str, &world_str, 6);
+       bh_string_replace_at(&test_str, "Hola ", 0);
+       bh_string_print(&test_str);
 
-       bh_string_delete(&test_str1);
-       bh_string_delete(&test_str2);
-}
\ No newline at end of file
+       bh_string_delete(&test_str);
+       bh_string_delete(&world_str);
+       
+       return 0;
+}
+
+// int main(int argc, char const *argv[]) {
+//     FILE* file = fopen(argv[1], "r");
+//     long start = ftell(file);
+//     fseek(file, 0, SEEK_END);
+//     long end = ftell(file);
+//     fseek(file, 0, SEEK_SET);
+// 
+// 
+//     char* data = (char *) malloc(sizeof(u8) * (end - start + 1));
+//     read(file->, data, end - start);
+//     fclose(file);
+//     printf("%ld - %ld = %ld\n", end, start, end - start);
+//     printf("%s", data);
+// }
\ No newline at end of file