test_dtsod() improved and memory leaks fixed

This commit is contained in:
Timerix22 2022-03-09 18:47:13 +03:00
parent 8819853e15
commit 3c1d92d79a
8 changed files with 56 additions and 33 deletions

View File

@ -37,6 +37,7 @@ void StringBuilder_append_int64(StringBuilder* b, int64 a){
} }
string rev=string_reverse((string){buf,i}); string rev=string_reverse((string){buf,i});
StringBuilder_append_string(b,rev); StringBuilder_append_string(b,rev);
free(rev.ptr);
} }
void StringBuilder_append_uint64(StringBuilder* b, uint64 a){ void StringBuilder_append_uint64(StringBuilder* b, uint64 a){
@ -51,6 +52,7 @@ void StringBuilder_append_uint64(StringBuilder* b, uint64 a){
} }
string rev=string_reverse((string){buf,i}); string rev=string_reverse((string){buf,i});
StringBuilder_append_string(b,rev); StringBuilder_append_string(b,rev);
free(rev.ptr);
} }
void StringBuilder_append_double(StringBuilder* b, double a){ void StringBuilder_append_double(StringBuilder* b, double a){

View File

@ -86,7 +86,11 @@ Hashtable* __deserialize(char** _text, bool calledRecursively){
Autoarr_remove(b); Autoarr_remove(b);
StringBuilder_append_char(b,c); StringBuilder_append_char(b,c);
} }
else return StringBuilder_build(b); else {
char* str=StringBuilder_build(b);
Autoarr_clear(b);
return str;
}
} }
else { else {
prevIsBackslash= c=='\\' && !prevIsBackslash; prevIsBackslash= c=='\\' && !prevIsBackslash;

View File

@ -84,5 +84,7 @@ void __serialize(StringBuilder* b, uint8 tabs, Hashtable* dtsod){
char* DtsodV24_serialize(Hashtable* dtsod){ char* DtsodV24_serialize(Hashtable* dtsod){
StringBuilder b=StringBuilder_create(STRB_BC,STRB_BL); StringBuilder b=StringBuilder_create(STRB_BC,STRB_BL);
__serialize(&b,0,dtsod); __serialize(&b,0,dtsod);
return StringBuilder_build(&b); char* str=StringBuilder_build(&b);
Autoarr_clear((&b));
return str;
} }

View File

@ -70,7 +70,7 @@ Unitype* Hashtable_getptr(Hashtable* ht, char* key){
uint32 arlen=Autoarr_length(ar); uint32 arlen=Autoarr_length(ar);
for(uint32 i=0;i<arlen;i++){ for(uint32 i=0;i<arlen;i++){
KeyValuePair* p=Autoarr_getptr(ar,i); KeyValuePair* p=Autoarr_getptr(ar,i);
if(charbuf_compare(key,p->key)) return &p->value; if(cptr_compare(key,p->key)) return &p->value;
} }
return NULL; return NULL;
} }
@ -80,7 +80,7 @@ Unitype Hashtable_get(Hashtable* ht, char* key){
uint32 arlen=Autoarr_length(ar); uint32 arlen=Autoarr_length(ar);
for(uint32 i=0;i<arlen;i++){ for(uint32 i=0;i<arlen;i++){
KeyValuePair p=Autoarr_get(ar,i); KeyValuePair p=Autoarr_get(ar,i);
if(charbuf_compare(key,p.key)) return p.value; if(cptr_compare(key,p.key)) return p.value;
} }
return UniNull; return UniNull;
} }

View File

@ -16,7 +16,7 @@ void Hashtable_free(Hashtable* ht);
uint32 Hashtable_height(Hashtable* ht); uint32 Hashtable_height(Hashtable* ht);
//adds charptr and value to new KeyValuePair //adds charptr and value to new KeyValuePair
//use charbuf_copy() to create new string if needed //use cptr_copy() to create new string if needed
#define KVPair(key,value) (KeyValuePair){key,value} #define KVPair(key,value) (KeyValuePair){key,value}

View File

@ -1,15 +1,15 @@
#include "base.h" #include "base.h"
//returns length of string (including \0) //returns length of string (including \0)
uint32 mystrlen(char* str){ uint32 cptr_length(char* str){
uint32 len=0; uint32 len=0;
while(*(str++)) len++; while(*(str++)) len++;
return ++len; return ++len;
} }
//allocates new char[] and copies src there //allocates new char[] and copies src there
char* charbuf_copy(char* src){ char* cptr_copy(char* src){
uint32 len=mystrlen(src); uint32 len=cptr_length(src);
char* dst=malloc(len*sizeof(char)); char* dst=malloc(len*sizeof(char));
while(len-->0) while(len-->0)
dst[len]=src[len]; dst[len]=src[len];
@ -17,7 +17,7 @@ char* charbuf_copy(char* src){
} }
//compares two char buffers, NullPtr-friendly //compares two char buffers, NullPtr-friendly
bool charbuf_compare(char* key0, char* key1){ bool cptr_compare(char* key0, char* key1){
if(!key0) return key1 ? false : true; if(!key0) return key1 ? false : true;
if(!key1) return false; if(!key1) return false;
while(*key0&&*key1) while(*key0&&*key1)
@ -49,7 +49,7 @@ char* string_cpToCharPtr(string str){
string string_cpFromCharPtr(char* cptr){ string string_cpFromCharPtr(char* cptr){
if(!cptr) return stringNull; if(!cptr) return stringNull;
string str; string str;
str.length=mystrlen(cptr)-1; str.length=cptr_length(cptr)-1;
str.ptr=malloc(str.length); str.ptr=malloc(str.length);
for(uint32 i=0;i<str.length;i++) for(uint32 i=0;i<str.length;i++)
str.ptr[i]=cptr[i]; str.ptr[i]=cptr[i];

View File

@ -3,13 +3,13 @@
#include "types.h" #include "types.h"
//returns length of string (including \0) //returns length of string (including \0)
uint32 mystrlen(char* str); uint32 cptr_length(char* str);
//allocates new char[] and copies src there //allocates new char[] and copies src there
char* charbuf_copy(char* src); char* cptr_copy(char* src);
//compares two char buffers, NullPtr-friendly //compares two char buffers, NullPtr-friendly
bool charbuf_compare(char* key0, char* key1); bool cptr_compare(char* key0, char* key1);
//multiplies char n times //multiplies char n times
char* char_multiply(char c, uint32 n); char* char_multiply(char c, uint32 n);

View File

@ -11,15 +11,12 @@ const char text[]=
" text: \"_$\\\"\\\\'''a ыыы000;2;=:%d;```\";\n" " text: \"_$\\\"\\\\'''a ыыы000;2;=:%d;```\";\n"
"}; "; "}; ";
void test_dtsod(){ void print_dtsod(Hashtable* dtsod){
printf("\e[96m-------------[test_dtsod]-------------\n"); printf("\e[92m");
optime(__func__,200,({
Hashtable* dtsod;
optime("deserialize",1,(dtsod=DtsodV24_deserialize(text)));
Hashtable_foreach(dtsod, p,({ Hashtable_foreach(dtsod, p,({
printkvp(p); printkvp(p);
if(p.value.type==HashtablePtr){ if(p.value.type==HashtablePtr){
printf(":\n{\n"); printf(": {\n");
Hashtable* sub=p.value.VoidPtr; Hashtable* sub=p.value.VoidPtr;
Hashtable_foreach(sub, _p,({ Hashtable_foreach(sub, _p,({
printf(" "); printf(" ");
@ -29,12 +26,30 @@ void test_dtsod(){
printf("}"); printf("}");
} }
printf("\n"); printf("\n");
}));
}
char* s=DtsodV24_serialize(dtsod); void test_dtsod(){
printf("\e[93m\n%s",s); optime(__func__,1,({
printf("\e[96m-------------[test_dtsod]-------------\n");
Hashtable* dtsod;
char* s=cptr_copy(text);
optime("deserialize",1,(dtsod=DtsodV24_deserialize(s)));
free(s);
print_dtsod(dtsod);
optime("serialize",1,(s=DtsodV24_serialize(dtsod)));
Hashtable_free(dtsod);
printf("\e[92m%s",s);
optime("reserialize",10,({
dtsod=DtsodV24_deserialize(s); dtsod=DtsodV24_deserialize(s);
free(s);
s=DtsodV24_serialize(dtsod);
Hashtable_free(dtsod); Hashtable_free(dtsod);
})); }));
free(s);
})); }));
} }