Compare commits
	
		
			3 Commits
		
	
	
		
			970c588d66
			...
			3f9a908860
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 3f9a908860 | |||
| 2e93bd794a | |||
| 39c88505bd | 
| @@ -2,6 +2,7 @@ | |||||||
| #define DSTR_H | #define DSTR_H | ||||||
|  |  | ||||||
| #include "aliases.h" | #include "aliases.h" | ||||||
|  | #include "mem_allocator.h" | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
| @@ -9,8 +10,8 @@ extern "C" { | |||||||
|  |  | ||||||
| typedef struct dstr String; | typedef struct dstr String; | ||||||
|  |  | ||||||
| String *wapp_dstr_with_capacity(u64 capacity); | String *wapp_dstr_with_capacity(u64 capacity, Allocator *allocator); | ||||||
| String *wapp_dstr_from_string(const char *str); | String *wapp_dstr_from_string(const char *str, Allocator *allocator); | ||||||
| void wapp_dstr_update(String **dst, const char *src); | void wapp_dstr_update(String **dst, const char *src); | ||||||
| void wapp_dstr_free(String **str); | void wapp_dstr_free(String **str); | ||||||
| void wapp_dstr_concat(String **dst, const char *src); | void wapp_dstr_concat(String **dst, const char *src); | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| #include "dstr.h" | #include "dstr.h" | ||||||
| #include "aliases.h" | #include "aliases.h" | ||||||
|  | #include "mem_allocator.h" | ||||||
|  | #include "mem_libc.h" | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| @@ -9,24 +11,34 @@ | |||||||
| #define CAPACITY_SCALAR 8 | #define CAPACITY_SCALAR 8 | ||||||
|  |  | ||||||
| struct dstr { | struct dstr { | ||||||
|  |   Allocator allocator; | ||||||
|   u64 capacity; |   u64 capacity; | ||||||
|   u64 size; |   u64 size; | ||||||
|   char buf[]; |   char buf[]; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| String *wapp_dstr_with_capacity(u64 capacity) { | String *wapp_dstr_with_capacity(u64 capacity, Allocator *allocator) { | ||||||
|   String *out = (String *)calloc(1, sizeof(String) + capacity + 1); |   Allocator alloc; | ||||||
|  |   if (allocator) { | ||||||
|  |     alloc = *allocator; | ||||||
|  |   } else { | ||||||
|  |     alloc = wapp_mem_libc_allocator(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   String *out = | ||||||
|  |       (String *)wapp_mem_allocator_alloc(&alloc, sizeof(String) + capacity + 1); | ||||||
|   if (!out) { |   if (!out) { | ||||||
|     return NULL; |     return NULL; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   out->allocator = alloc; | ||||||
|   out->capacity = capacity; |   out->capacity = capacity; | ||||||
|   out->size = 0; |   out->size = 0; | ||||||
|  |  | ||||||
|   return out; |   return out; | ||||||
| } | } | ||||||
|  |  | ||||||
| String *wapp_dstr_from_string(const char *str) { | String *wapp_dstr_from_string(const char *str, Allocator *allocator) { | ||||||
|   if (!str) { |   if (!str) { | ||||||
|     return NULL; |     return NULL; | ||||||
|   } |   } | ||||||
| @@ -35,14 +47,13 @@ String *wapp_dstr_from_string(const char *str) { | |||||||
|  |  | ||||||
|   u64 capacity = length * CAPACITY_SCALAR; |   u64 capacity = length * CAPACITY_SCALAR; | ||||||
|  |  | ||||||
|   String *out = wapp_dstr_with_capacity(capacity); |   String *out = wapp_dstr_with_capacity(capacity, allocator); | ||||||
|  |  | ||||||
|   if (!out) { |   if (!out) { | ||||||
|     return NULL; |     return NULL; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   out->size = length; |   out->size = length; | ||||||
|   strncpy(out->buf, str, length); |   strncpy(out->buf, str, length + 1); | ||||||
|  |  | ||||||
|   return out; |   return out; | ||||||
| } | } | ||||||
| @@ -56,24 +67,24 @@ void wapp_dstr_update(String **dst, const char *src) { | |||||||
|  |  | ||||||
|   String *str = *dst; |   String *str = *dst; | ||||||
|  |  | ||||||
|   if (length <= str->capacity) { |   if (length < str->capacity) { | ||||||
|     memset(str->buf, 0, str->capacity); |     memset(str->buf, 0, str->capacity); | ||||||
|  |  | ||||||
|     str->size = length; |     str->size = length; | ||||||
|  |  | ||||||
|     strncpy(str->buf, src, length); |     strncpy(str->buf, src, length + 1); | ||||||
|   } else { |   } else { | ||||||
|     u64 capacity = length * CAPACITY_SCALAR; |     u64 capacity = length * CAPACITY_SCALAR; | ||||||
|  |  | ||||||
|     String *tmp = (String *)realloc(*dst, sizeof(String) + capacity + 1); |     String *tmp = (String *)wapp_mem_allocator_realloc( | ||||||
|  |         &(str->allocator), *dst, sizeof(String) + capacity + 1); | ||||||
|     if (!tmp) { |     if (!tmp) { | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     tmp->capacity = capacity; |     tmp->capacity = capacity; | ||||||
|     tmp->size = length; |     tmp->size = length; | ||||||
|     strncpy(tmp->buf, src, length); |     strncpy(tmp->buf, src, length + 1); | ||||||
|  |  | ||||||
|     *dst = tmp; |     *dst = tmp; | ||||||
|   } |   } | ||||||
| @@ -84,8 +95,8 @@ void wapp_dstr_free(String **str) { | |||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   free(*str); |   String *str_ptr = *str; | ||||||
|   *str = NULL; |   wapp_mem_allocator_free(&(str_ptr->allocator), (void **)str); | ||||||
| } | } | ||||||
|  |  | ||||||
| void wapp_dstr_concat(String **dst, const char *src) { | void wapp_dstr_concat(String **dst, const char *src) { | ||||||
| @@ -94,7 +105,6 @@ void wapp_dstr_concat(String **dst, const char *src) { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   u64 src_length = strlen(src); |   u64 src_length = strlen(src); | ||||||
|  |  | ||||||
|   if (src_length == 0) { |   if (src_length == 0) { | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
| @@ -105,7 +115,7 @@ void wapp_dstr_concat(String **dst, const char *src) { | |||||||
|   memset(str, 0, new_length + 1); |   memset(str, 0, new_length + 1); | ||||||
|  |  | ||||||
|   strncpy(str, (*dst)->buf, (*dst)->size); |   strncpy(str, (*dst)->buf, (*dst)->size); | ||||||
|   strncat(str, src, src_length); |   strncat(str, src, new_length + 1 - (*dst)->size); | ||||||
|  |  | ||||||
|   wapp_dstr_update(dst, str); |   wapp_dstr_update(dst, str); | ||||||
| } | } | ||||||
| @@ -131,10 +141,11 @@ void wapp_dstr_resize(String **str) { | |||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   String *str_ptr = *str; | ||||||
|   u64 capacity = (*str)->size; |   u64 capacity = (*str)->size; | ||||||
|  |  | ||||||
|   String *tmp = (String *)realloc(*str, sizeof(String) + capacity + 1); |   String *tmp = (String *)wapp_mem_allocator_realloc( | ||||||
|  |       &(str_ptr->allocator), *str, sizeof(String) + capacity + 1); | ||||||
|   if (!tmp) { |   if (!tmp) { | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
| @@ -158,7 +169,7 @@ void wapp_dstr_print(const String *str) { | |||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   printf("%s\n", str->buf); |   printf("%.*s\n", (i32)str->size, str->buf); | ||||||
| } | } | ||||||
|  |  | ||||||
| i64 wapp_dstr_find(const String *str, const char *substr) { | i64 wapp_dstr_find(const String *str, const char *substr) { | ||||||
| @@ -167,7 +178,6 @@ i64 wapp_dstr_find(const String *str, const char *substr) { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   u64 substr_length = strlen(substr); |   u64 substr_length = strlen(substr); | ||||||
|  |  | ||||||
|   if (substr_length == 0 || substr_length > str->size) { |   if (substr_length == 0 || substr_length > str->size) { | ||||||
|     return -1; |     return -1; | ||||||
|   } |   } | ||||||
| @@ -175,16 +185,15 @@ i64 wapp_dstr_find(const String *str, const char *substr) { | |||||||
|   char buf[substr_length + 1]; |   char buf[substr_length + 1]; | ||||||
|   memset(buf, 0, substr_length + 1); |   memset(buf, 0, substr_length + 1); | ||||||
|  |  | ||||||
|  |   const char *s1; | ||||||
|   for (u64 i = 0; i < str->size; ++i) { |   for (u64 i = 0; i < str->size; ++i) { | ||||||
|     if (i + substr_length >= str->size) { |     if (i + substr_length > str->size) { | ||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     for (u64 j = 0; j < substr_length; ++j) { |     s1 = &(str->buf[i]); | ||||||
|       buf[j] = str->buf[i + j]; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (strcmp(buf, substr) == 0) { |     if (strncmp(s1, substr, substr_length) == 0) { | ||||||
|       return i; |       return i; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -35,12 +35,7 @@ internal void *mem_libc_alloc_aligned(u64 size, u64 alignment, | |||||||
| } | } | ||||||
|  |  | ||||||
| internal void *mem_libc_realloc(void *ptr, u64 size, void *alloc_obj) { | internal void *mem_libc_realloc(void *ptr, u64 size, void *alloc_obj) { | ||||||
|   void *output = realloc(ptr, size); |   return realloc(ptr, size); | ||||||
|   if (output) { |  | ||||||
|     memset(output, 0, size); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   return output; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| internal void mem_libc_free(void **ptr, void *alloc_obj) { | internal void mem_libc_free(void **ptr, void *alloc_obj) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user