From e2c126916ad71e3381805180af5448c29e9ef706 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 4 May 2020 15:14:56 -0500 Subject: [PATCH] Adding more string functionality --- bh.h | 102 +++++++++++++++++++++++++++++++++++++++++++++++++----- demo.onyx | 1 - onyx | Bin 21512 -> 22944 bytes onyx.c | 33 ++++++++++++++---- 4 files changed, 120 insertions(+), 16 deletions(-) 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 d4295645e1a50997b5f9704ea3fd40f6121210f5..f41434829deb74d21d276f499cbd68a11df9be1f 100755 GIT binary patch delta 5913 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 delta 3474 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 M-x%?fLdul?0Vg@wga7~l 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 -- 2.25.1