From: Brendan Hansen Date: Mon, 4 May 2020 20:14:56 +0000 (-0500) Subject: Adding more string functionality X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=e2c126916ad71e3381805180af5448c29e9ef706;p=onyx.git Adding more string functionality --- diff --git a/bh.h b/bh.h index c0b2a23f..a08aad4f 100644 --- a/bh.h +++ b/bh.h @@ -1,3 +1,4 @@ +#include #include #include #include @@ -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); } diff --git a/demo.onyx b/demo.onyx index 27b20f74..ee02d76b 100644 --- a/demo.onyx +++ b/demo.onyx @@ -1,4 +1,3 @@ - use "core"; Foo :: struct { diff --git a/onyx b/onyx index d4295645..f4143482 100755 Binary files a/onyx and b/onyx differ diff --git a/onyx.c b/onyx.c index 4bb216c6..615c50ca 100644 --- a/onyx.c +++ b/onyx.c @@ -22,12 +22,31 @@ // 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