From 6cc3acea1d335a8e31a08c4758e2f7189381c598 Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Fri, 4 Mar 2022 14:32:09 +0300 Subject: [PATCH] serialize() --- DtsodC/Autoarr/Autoarr.h | 13 ++++ DtsodC/Autoarr/Autoarr_declare.h | 9 +++ DtsodC/Autoarr/StringBuilder.c | 49 +++++++++++- DtsodC/Autoarr/StringBuilder.h | 8 +- DtsodC/DtsodParser/DtsodV24.h | 2 +- .../{DtsodV24.c => DtsodV24_deserialize.c} | 16 ++-- DtsodC/DtsodParser/DtsodV24_serialize.c | 77 +++++++++++++++++++ DtsodC/DtsodV24_serialize.c | 76 ++++++++++++++++++ DtsodC/Hashtable/Hashtable.h | 8 ++ DtsodC/Hashtable/KeyValuePair.c | 6 ++ DtsodC/Hashtable/KeyValuePair.h | 2 + DtsodC/Makefile | 5 +- DtsodC/base/mystr.c | 8 ++ DtsodC/base/mystr.h | 3 + DtsodC/base/types.c | 13 ++++ DtsodC/base/types.h | 1 + DtsodC/tests/main.c | 21 +---- DtsodC/tests/test_dtsod.c | 17 ++-- DtsodC/tests/test_hashtable.c | 6 -- 19 files changed, 295 insertions(+), 45 deletions(-) rename DtsodC/DtsodParser/{DtsodV24.c => DtsodV24_deserialize.c} (95%) create mode 100644 DtsodC/DtsodParser/DtsodV24_serialize.c create mode 100644 DtsodC/DtsodV24_serialize.c diff --git a/DtsodC/Autoarr/Autoarr.h b/DtsodC/Autoarr/Autoarr.h index 5be5860..1b894af 100644 --- a/DtsodC/Autoarr/Autoarr.h +++ b/DtsodC/Autoarr/Autoarr.h @@ -17,3 +17,16 @@ declare_Autoarr(Unitype) //right func to clear array of unitype values void Autoarr_Unitype_clear(Autoarr(Unitype)* ar); + +#define Autoarr_foreach(ar,elem,codeblock)({\ + typeof(**ar->values) elem;\ + for(uint32 blockI=0;blockIblocks_count-1;blockI++)\ + for(uint32 elemI=0;elemImax_block_length;elemI++){\ + elem=ar->values[blockI][elemI];\ + (codeblock);\ + }\ + for(uint32 elemI=0;elemIblock_length;elemI++){\ + elem=ar->values[ar->blocks_count-1][elemI];\ + (codeblock);\ + }\ +}) diff --git a/DtsodC/Autoarr/Autoarr_declare.h b/DtsodC/Autoarr/Autoarr_declare.h index e9e5443..9686a4a 100644 --- a/DtsodC/Autoarr/Autoarr_declare.h +++ b/DtsodC/Autoarr/Autoarr_declare.h @@ -50,3 +50,12 @@ Autoarr_##type __Autoarr_create_##type(uint16 max_blocks_count, uint16 max_block autoarr->max_block_length*(autoarr->blocks_count-1)+autoarr->block_length) #define Autoarr_max_length(autoarr)\ (uint32)(autoarr->max_block_length*autoarr->max_blocks_count) + +#define Autoarr_remove(AR){\ + if(AR->block_length==1){\ + AR->blocks_count--;\ + AR->block_length=AR->max_block_length;\ + free(AR->values[AR->blocks_count]);\ + }\ + else AR->block_length--;\ +} diff --git a/DtsodC/Autoarr/StringBuilder.c b/DtsodC/Autoarr/StringBuilder.c index 755b449..4b8273e 100644 --- a/DtsodC/Autoarr/StringBuilder.c +++ b/DtsodC/Autoarr/StringBuilder.c @@ -4,16 +4,61 @@ StringBuilder StringBuilder_create(uint16 max_blocks_count, uint16 max_block_len return Autoarr_create(int8,max_blocks_count,max_block_length); } -void StringBuilder_append(StringBuilder* b, char c){ +void StringBuilder_append_char(StringBuilder* b, char c){ Autoarr_add(b,c); } -void StringBuilder_append_str(StringBuilder* b, char* s){ +void StringBuilder_append_cptr(StringBuilder* b, char* s){ char c; while((c=*s++)) Autoarr_add(b,c); } +void StringBuilder_append_string(StringBuilder* b, string s){ + while(s.length>0){ + Autoarr_add(b,*s.ptr++); + s.length--; + } +} + +void StringBuilder_append_int64(StringBuilder* b, int64 a){ + uint8 i=0; + if(a==0){ + Autoarr_add(b,'0'); + } + else if(a<0){ + Autoarr_add(b,'-'); + a=-a; + } + char buf[24]; + while(a!=0){ + buf[i++]='0'+a%10; + a/=10; + } + string rev=string_reverse((string){buf,i}); + StringBuilder_append_string(b,rev); +} + +void StringBuilder_append_uint64(StringBuilder* b, uint64 a){ + uint8 i=0; + if(a==0){ + Autoarr_add(b,'0'); + } + char buf[24]; + while(a!=0){ + buf[i++]='0'+a%10; + a/=10; + } + string rev=string_reverse((string){buf,i}); + StringBuilder_append_string(b,rev); +} + +void StringBuilder_append_double(StringBuilder* b, double a){ + char buf[32]; + sprintf(buf,32,"%f",a); + StringBuilder_append_cptr(b,buf); +} + char* StringBuilder_build(StringBuilder* b){ uint32 len=Autoarr_length(b); char* str=malloc(len+1); diff --git a/DtsodC/Autoarr/StringBuilder.h b/DtsodC/Autoarr/StringBuilder.h index dd0c83f..2a62558 100644 --- a/DtsodC/Autoarr/StringBuilder.h +++ b/DtsodC/Autoarr/StringBuilder.h @@ -5,6 +5,10 @@ typedef Autoarr(int8) StringBuilder; StringBuilder StringBuilder_create(uint16 max_blocks_count, uint16 max_block_length); -void StringBuilder_append(StringBuilder* b, char c); -void StringBuilder_append_str(StringBuilder* b, char* s); +void StringBuilder_append_char(StringBuilder* b, char c); +void StringBuilder_append_cptr(StringBuilder* b, char* s); +void StringBuilder_append_string(StringBuilder* b, string s); +void StringBuilder_append_int64(StringBuilder* b, int64 a); +void StringBuilder_append_uint64(StringBuilder* b, uint64 a); +void StringBuilder_append_double(StringBuilder* b, double a); char* StringBuilder_build(StringBuilder* b); diff --git a/DtsodC/DtsodParser/DtsodV24.h b/DtsodC/DtsodParser/DtsodV24.h index c4c2aa8..465e13f 100644 --- a/DtsodC/DtsodParser/DtsodV24.h +++ b/DtsodC/DtsodParser/DtsodV24.h @@ -3,4 +3,4 @@ #include "../Hashtable/Hashtable.h" Hashtable* DtsodV24_deserialize(char* text); -string DtsodV24_serialize(Hashtable* dtsod); +char* DtsodV24_serialize(Hashtable* dtsod); diff --git a/DtsodC/DtsodParser/DtsodV24.c b/DtsodC/DtsodParser/DtsodV24_deserialize.c similarity index 95% rename from DtsodC/DtsodParser/DtsodV24.c rename to DtsodC/DtsodParser/DtsodV24_deserialize.c index 847d88c..d4c916f 100644 --- a/DtsodC/DtsodParser/DtsodV24.c +++ b/DtsodC/DtsodParser/DtsodV24_deserialize.c @@ -1,8 +1,7 @@ #include "DtsodV24.h" -#include "../Autoarr/StringBuilder.h" -#define ARR_BC 2 -#define ARR_BL 8 +#define ARR_BC 8 +#define ARR_BL 16 Hashtable* __deserialize(char** _text, bool calledRecursively){ Hashtable* dict=Hashtable_create(); @@ -11,17 +10,17 @@ Hashtable* __deserialize(char** _text, bool calledRecursively){ bool partOfDollarList=false; bool readingList=false; - void __throw_wrongchar(char* fname,char _c){ + void __throw_wrongchar(char* file, int line, char* fname,char _c){ char errBuf[]="unexpected at:\n \"" "00000000000000000000000000000000" "\""; errBuf[12]=_c; for(uint8 i=0;i<32;i++) errBuf[i+22]=*(text-16+i); - printf("\n\e[31mfunc: %s\n",fname); + printf("\n\e[31m>%s:%d/%s\n",file,line,fname); throw(errBuf); }; - #define throw_wrongchar(C) __throw_wrongchar(__func__,C) + #define throw_wrongchar(C) __throw_wrongchar(__FILE__,__LINE__,__func__,C) void SkipComment(){ @@ -31,7 +30,8 @@ Hashtable* __deserialize(char** _text, bool calledRecursively){ string ReadName(){ string nameStr={text,0}; - while ((c=*text++)) switch (c){ + text--; + while ((c=*++text)) switch (c){ case ' ': case '\t': case '\r': case '\n': if(nameStr.length!=0) @@ -46,6 +46,8 @@ Hashtable* __deserialize(char** _text, bool calledRecursively){ break; case '}': if(!calledRecursively) throw_wrongchar(c); + if((*++text)!=';') + throw_wrongchar(c); case ':': return nameStr; case '$': diff --git a/DtsodC/DtsodParser/DtsodV24_serialize.c b/DtsodC/DtsodParser/DtsodV24_serialize.c new file mode 100644 index 0000000..45eecc0 --- /dev/null +++ b/DtsodC/DtsodParser/DtsodV24_serialize.c @@ -0,0 +1,77 @@ +#include "DtsodV24.h" +#include "../Autoarr/StringBuilder.h" + +//65536 max length! +#define STRB_BC 64 +#define STRB_BL 1024 + +#define addc(B,C) StringBuilder_append_char(B,C) + +void __serialize(StringBuilder* b, uint8 tabs, Hashtable* dtsod){ + + void AppendTabs(){ + for(uint8 t; trows+h;\ + Autoarr_foreach(AR, EL, codeblock);\ + }\ +}) diff --git a/DtsodC/Hashtable/KeyValuePair.c b/DtsodC/Hashtable/KeyValuePair.c index 774e396..c11ae9f 100644 --- a/DtsodC/Hashtable/KeyValuePair.c +++ b/DtsodC/Hashtable/KeyValuePair.c @@ -18,3 +18,9 @@ void Autoarr_KeyValuePair_clear(Autoarr_KeyValuePair* ar){ KeyValuePair_free(ar->values[ar->blocks_count-1][elemI]); Autoarr_clear(ar); } + +void printkvp(KeyValuePair p){ + printf("{\"%s\", ",p.key); + printuni(p.value); + printf("}"); +} diff --git a/DtsodC/Hashtable/KeyValuePair.h b/DtsodC/Hashtable/KeyValuePair.h index 462e3dd..efde40a 100644 --- a/DtsodC/Hashtable/KeyValuePair.h +++ b/DtsodC/Hashtable/KeyValuePair.h @@ -13,3 +13,5 @@ void KeyValuePair_free(KeyValuePair p); //func to clear KVP array void Autoarr_KeyValuePair_clear(Autoarr_KeyValuePair* ar); + +void printkvp(KeyValuePair p); diff --git a/DtsodC/Makefile b/DtsodC/Makefile index 7d5f464..29efdeb 100644 --- a/DtsodC/Makefile +++ b/DtsodC/Makefile @@ -17,13 +17,12 @@ clang: all CMPARGS= -Wall -Wno-discarded-qualifiers $(SRC) $(TESTS) -o $(OUTFILE) build: - @echo $(SRC) @echo -e '\n\e[96m----------------[build]----------------\e[0m' @mkdir -p $(OUTDIR) $(CMP) -O1 -flto $(CMPARGS) -build_dbg: - @mkdir -p $(OUTDIR) +build_dbg: @echo -e '\n\e[96m--------------[build_dbg]--------------\e[0m' + @mkdir -p $(OUTDIR) $(CMP) -O0 -g $(CMPARGS).dbg test: @echo -e '\n\e[96m----------------[test]-----------------\e[0m' diff --git a/DtsodC/base/mystr.c b/DtsodC/base/mystr.c index b77c67b..d34d42c 100644 --- a/DtsodC/base/mystr.c +++ b/DtsodC/base/mystr.c @@ -66,3 +66,11 @@ bool string_compare(string str0, string str1){ return false; return true; } + +//creates new string which is reversed variant of +string string_reverse(string s){ + string r={malloc(s.length), s.length}; + for(uint32 i; i +string string_reverse(string s); diff --git a/DtsodC/base/types.c b/DtsodC/base/types.c index 36436f2..eab3e33 100644 --- a/DtsodC/base/types.c +++ b/DtsodC/base/types.c @@ -114,3 +114,16 @@ void Unitype_free(Unitype u){ default: throw(ERR_WRONGTYPE); } } + + +void printuni(Unitype v){ + switch (v.type) { + case Null: printf("{Null}");break; + case Double: printf("{%s:%lf}",typename(v.type),v.Double);break; + case Char: printf("{%s:%c}",typename(v.type),v.Char);break; + case Bool: + case UInt64: printf("{%s:%lu}",typename(v.type),v.UInt64);break; + case Int64: printf("{%s:%ld}",typename(v.type),v.Int64);break; + default: printf("{%s:%p}",typename(v.type),v.VoidPtr);break; + } +} diff --git a/DtsodC/base/types.h b/DtsodC/base/types.h index e82db22..3bc5728 100644 --- a/DtsodC/base/types.h +++ b/DtsodC/base/types.h @@ -49,3 +49,4 @@ static const Unitype UniFalse={Bool,.Bool=false}; //frees VoidPtr value or does nothing if type isn't pointer void Unitype_free(Unitype u); +void printuni(Unitype v); diff --git a/DtsodC/tests/main.c b/DtsodC/tests/main.c index 8524ffd..9a5d8f3 100644 --- a/DtsodC/tests/main.c +++ b/DtsodC/tests/main.c @@ -1,24 +1,11 @@ #include "../base/base.h" #include "tests.h" - -void printuni(Unitype v){ - switch (v.type) { - case Null: printf("{Null}");break; - case Double: printf("{%s:%lf}",typename(v.type),v.Double);break; - case Char: printf("{%s:%c}",typename(v.type),v.Char);break; - case Bool: - case UInt64: printf("{%s:%lu}",typename(v.type),v.UInt64);break; - case Int64: printf("{%s:%ld}",typename(v.type),v.Int64);break; - default: printf("{%s:%p}",typename(v.type),v.VoidPtr);break; - } -} - void test_all(){ - test_searchtree(); - test_autoarr(); - test_hashtable(); - test_string(); + //test_searchtree(); + //test_autoarr(); + //test_hashtable(); + //test_string(); test_dtsod(); printf("\e[96m---------------------------------------\e[0m\n"); } diff --git a/DtsodC/tests/test_dtsod.c b/DtsodC/tests/test_dtsod.c index e290f93..a920cd3 100644 --- a/DtsodC/tests/test_dtsod.c +++ b/DtsodC/tests/test_dtsod.c @@ -14,15 +14,18 @@ void test_dtsod(){ " message_id: 920734809096077353ul;\n" " text: \"_$\\\"\\\\'''\n\ta ыыы000;2;=:%d;```\";\n" "};\n"; - Unitype id; + KeyValuePair id; Hashtable* dtsod; optime("deserialize",1,(dtsod=DtsodV24_deserialize(text))); - printf("\e[92mhashtable_get(message)->\n\e[94m"); - Unitype msg=Hashtable_get(dtsod,"message"); - printuni(msg); - Autoarr(Unitype)* ar=msg.VoidPtr; - id=Hashtable_get(Autoarr_get(ar,0).VoidPtr,"message_id"); - printf("\e[92m\nmessage_id: %lu\n",id.UInt64); + printf("\e[92mhashtable_get(\"message\")->\n\e[94m"); + KeyValuePair msg=Hashtable_get_pair(dtsod,"message"); + printkvp(msg); + printf("\n"); + Autoarr(Unitype)* ar=msg.value.VoidPtr; + printf("\e[92mhashtable_get(\"message_id\")->\n\e[94m"); + id=Hashtable_get_pair(Autoarr_get(ar,0).VoidPtr,"message_id"); + printkvp(id); + printf("\n"); Hashtable_free(dtsod); })); } \ No newline at end of file diff --git a/DtsodC/tests/test_hashtable.c b/DtsodC/tests/test_hashtable.c index 991bf63..2b5689c 100644 --- a/DtsodC/tests/test_hashtable.c +++ b/DtsodC/tests/test_hashtable.c @@ -1,12 +1,6 @@ #include "tests.h" #include "../Hashtable/Hashtable.h" -void printkvp(KeyValuePair p){ - printf("{\"%s\", ",p.key); - printuni(p.value); - printf("}"); -} - void print_hashtable(Hashtable* ht){ printf("\e[94mHashtable:%lu\n" " hein: %u\n"