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});
StringBuilder_append_string(b,rev);
free(rev.ptr);
}
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});
StringBuilder_append_string(b,rev);
free(rev.ptr);
}
void StringBuilder_append_double(StringBuilder* b, double a){

View File

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

View File

@ -84,5 +84,7 @@ void __serialize(StringBuilder* b, uint8 tabs, Hashtable* dtsod){
char* DtsodV24_serialize(Hashtable* dtsod){
StringBuilder b=StringBuilder_create(STRB_BC,STRB_BL);
__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);
for(uint32 i=0;i<arlen;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;
}
@ -80,7 +80,7 @@ Unitype Hashtable_get(Hashtable* ht, char* key){
uint32 arlen=Autoarr_length(ar);
for(uint32 i=0;i<arlen;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;
}

View File

@ -16,7 +16,7 @@ void Hashtable_free(Hashtable* ht);
uint32 Hashtable_height(Hashtable* ht);
//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}

View File

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

View File

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

View File

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