| 
							
							
							
						 |  |  | @@ -1,5 +1,7 @@ | 
		
	
		
			
				|  |  |  |  | #include "dstr.h" | 
		
	
		
			
				|  |  |  |  | #include "aliases.h" | 
		
	
		
			
				|  |  |  |  | #include "mem_allocator.h" | 
		
	
		
			
				|  |  |  |  | #include "mem_libc.h" | 
		
	
		
			
				|  |  |  |  | #include <stdio.h> | 
		
	
		
			
				|  |  |  |  | #include <stdlib.h> | 
		
	
		
			
				|  |  |  |  | #include <string.h> | 
		
	
	
		
			
				
					
					|  |  |  | @@ -9,24 +11,34 @@ | 
		
	
		
			
				|  |  |  |  | #define CAPACITY_SCALAR 8 | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | struct dstr { | 
		
	
		
			
				|  |  |  |  |   Allocator allocator; | 
		
	
		
			
				|  |  |  |  |   u64 capacity; | 
		
	
		
			
				|  |  |  |  |   u64 size; | 
		
	
		
			
				|  |  |  |  |   char buf[]; | 
		
	
		
			
				|  |  |  |  | }; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | String *wapp_dstr_with_capacity(u64 capacity) { | 
		
	
		
			
				|  |  |  |  |   String *out = (String *)calloc(1, sizeof(String) + capacity + 1); | 
		
	
		
			
				|  |  |  |  | String *wapp_dstr_with_capacity(u64 capacity, Allocator *allocator) { | 
		
	
		
			
				|  |  |  |  |   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) { | 
		
	
		
			
				|  |  |  |  |     return NULL; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   out->allocator = alloc; | 
		
	
		
			
				|  |  |  |  |   out->capacity = capacity; | 
		
	
		
			
				|  |  |  |  |   out->size = 0; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   return out; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | String *wapp_dstr_from_string(const char *str) { | 
		
	
		
			
				|  |  |  |  | String *wapp_dstr_from_string(const char *str, Allocator *allocator) { | 
		
	
		
			
				|  |  |  |  |   if (!str) { | 
		
	
		
			
				|  |  |  |  |     return NULL; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
	
		
			
				
					
					|  |  |  | @@ -35,14 +47,13 @@ String *wapp_dstr_from_string(const char *str) { | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   u64 capacity = length * CAPACITY_SCALAR; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   String *out = wapp_dstr_with_capacity(capacity); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   String *out = wapp_dstr_with_capacity(capacity, allocator); | 
		
	
		
			
				|  |  |  |  |   if (!out) { | 
		
	
		
			
				|  |  |  |  |     return NULL; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   out->size = length; | 
		
	
		
			
				|  |  |  |  |   strncpy(out->buf, str, length); | 
		
	
		
			
				|  |  |  |  |   strncpy(out->buf, str, length + 1); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   return out; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
	
		
			
				
					
					|  |  |  | @@ -56,24 +67,24 @@ void wapp_dstr_update(String **dst, const char *src) { | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   String *str = *dst; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if (length <= str->capacity) { | 
		
	
		
			
				|  |  |  |  |   if (length < str->capacity) { | 
		
	
		
			
				|  |  |  |  |     memset(str->buf, 0, str->capacity); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     str->size = length; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     strncpy(str->buf, src, length); | 
		
	
		
			
				|  |  |  |  |     strncpy(str->buf, src, length + 1); | 
		
	
		
			
				|  |  |  |  |   } else { | 
		
	
		
			
				|  |  |  |  |     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) { | 
		
	
		
			
				|  |  |  |  |       return; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     tmp->capacity = capacity; | 
		
	
		
			
				|  |  |  |  |     tmp->size = length; | 
		
	
		
			
				|  |  |  |  |     strncpy(tmp->buf, src, length); | 
		
	
		
			
				|  |  |  |  |     strncpy(tmp->buf, src, length + 1); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     *dst = tmp; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
	
		
			
				
					
					|  |  |  | @@ -84,8 +95,8 @@ void wapp_dstr_free(String **str) { | 
		
	
		
			
				|  |  |  |  |     return; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   free(*str); | 
		
	
		
			
				|  |  |  |  |   *str = NULL; | 
		
	
		
			
				|  |  |  |  |   String *str_ptr = *str; | 
		
	
		
			
				|  |  |  |  |   wapp_mem_allocator_free(&(str_ptr->allocator), (void **)str); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 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); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if (src_length == 0) { | 
		
	
		
			
				|  |  |  |  |     return; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
	
		
			
				
					
					|  |  |  | @@ -105,7 +115,7 @@ void wapp_dstr_concat(String **dst, const char *src) { | 
		
	
		
			
				|  |  |  |  |   memset(str, 0, new_length + 1); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   strncpy(str, (*dst)->buf, (*dst)->size); | 
		
	
		
			
				|  |  |  |  |   strncat(str, src, src_length); | 
		
	
		
			
				|  |  |  |  |   strncat(str, src, new_length + 1 - (*dst)->size); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   wapp_dstr_update(dst, str); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
	
		
			
				
					
					|  |  |  | @@ -131,10 +141,11 @@ void wapp_dstr_resize(String **str) { | 
		
	
		
			
				|  |  |  |  |     return; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   String *str_ptr = *str; | 
		
	
		
			
				|  |  |  |  |   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) { | 
		
	
		
			
				|  |  |  |  |     return; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
	
		
			
				
					
					|  |  |  | @@ -158,7 +169,7 @@ void wapp_dstr_print(const String *str) { | 
		
	
		
			
				|  |  |  |  |     return; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   printf("%s\n", str->buf); | 
		
	
		
			
				|  |  |  |  |   printf("%.*s\n", (i32)str->size, str->buf); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 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); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if (substr_length == 0 || substr_length > str->size) { | 
		
	
		
			
				|  |  |  |  |     return -1; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
	
		
			
				
					
					|  |  |  | @@ -175,16 +185,15 @@ i64 wapp_dstr_find(const String *str, const char *substr) { | 
		
	
		
			
				|  |  |  |  |   char buf[substr_length + 1]; | 
		
	
		
			
				|  |  |  |  |   memset(buf, 0, substr_length + 1); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   const char *s1; | 
		
	
		
			
				|  |  |  |  |   for (u64 i = 0; i < str->size; ++i) { | 
		
	
		
			
				|  |  |  |  |     if (i + substr_length >= str->size) { | 
		
	
		
			
				|  |  |  |  |     if (i + substr_length > str->size) { | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     for (u64 j = 0; j < substr_length; ++j) { | 
		
	
		
			
				|  |  |  |  |       buf[j] = str->buf[i + j]; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     s1 = &(str->buf[i]); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     if (strcmp(buf, substr) == 0) { | 
		
	
		
			
				|  |  |  |  |     if (strncmp(s1, substr, substr_length) == 0) { | 
		
	
		
			
				|  |  |  |  |       return i; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
	
		
			
				
					
					|  |  |  |   |