+#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
typedef signed long i64;
typedef signed long long i128;
+//-------------------------------------------------------------------------------------
+// Better strings
+//-------------------------------------------------------------------------------------
typedef struct bh_string {
u8* data;
u64 length;
#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);
}
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
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);
}
//
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