From 0464bd54df5d0a2224c3e2ef3a09313d4651ff9a Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Sun, 17 Apr 2022 18:01:41 +0300 Subject: [PATCH] DtsodV24_serialize updated to safethrow --- DtsodParser/DtsodV24.h | 2 +- DtsodParser/DtsodV24_exported.c | 8 ++- DtsodParser/DtsodV24_serialize.c | 108 ++++++++++++++++--------------- Hashtable/Hashtable.c | 6 +- Hashtable/Hashtable.h | 2 +- base/errors.h | 1 + tests/test_dtsod.c | 8 ++- 7 files changed, 73 insertions(+), 62 deletions(-) diff --git a/DtsodParser/DtsodV24.h b/DtsodParser/DtsodV24.h index b36b610..a49f07e 100644 --- a/DtsodParser/DtsodV24.h +++ b/DtsodParser/DtsodV24.h @@ -10,7 +10,7 @@ extern "C" { Maybe DtsodV24_deserialize(char* text); // creates text representation of dtsod -char* DtsodV24_serialize(Hashtable* dtsod); +Maybe DtsodV24_serialize(Hashtable* dtsod); // returns value or UniNull if key not found Unitype DtsodV24_get(Hashtable* dtsod, char* key); diff --git a/DtsodParser/DtsodV24_exported.c b/DtsodParser/DtsodV24_exported.c index 1ffb67b..3cd5581 100644 --- a/DtsodParser/DtsodV24_exported.c +++ b/DtsodParser/DtsodV24_exported.c @@ -13,13 +13,15 @@ extern "C" { // parses text to binary values EXPORT void CALL kerep_DtsodV24_deserialize(char* text, Hashtable** output, char** errmsg){ Maybe r=DtsodV24_deserialize(text); - *errmsg= r.errmsg ? r.errmsg : NULL; + *errmsg=r.errmsg; *output=r.value.VoidPtr; } // creates text representation of dtsod -EXPORT void CALL kerep_DtsodV24_serialize(Hashtable* dtsod, char** output){ - *output=DtsodV24_serialize(dtsod); +EXPORT void CALL kerep_DtsodV24_serialize(Hashtable* dtsod, char** output, char** errmsg){ + Maybe r=DtsodV24_serialize(dtsod); + *errmsg=r.errmsg; + *output=r.value.VoidPtr; } // returns value or UniNull if key not found diff --git a/DtsodParser/DtsodV24_serialize.c b/DtsodParser/DtsodV24_serialize.c index 5d9b915..8b22ff9 100644 --- a/DtsodParser/DtsodV24_serialize.c +++ b/DtsodParser/DtsodV24_serialize.c @@ -12,7 +12,7 @@ typedef struct SerializeSharedData{ #define b shared->sh_builder #define tabs shared->sh_tabs -void __serialize(StringBuilder* _b, uint8 _tabs, Hashtable* dtsod); +Maybe __serialize(StringBuilder* _b, uint8 _tabs, Hashtable* dtsod); #define addc(C) StringBuilder_append_char(b,C) @@ -23,59 +23,61 @@ void __AppendTabs(SerializeSharedData* shared) { }; #define AppendTabs() __AppendTabs(shared) -void __AppendValue(SerializeSharedData* shared, Unitype u); +Maybe __AppendValue(SerializeSharedData* shared, Unitype u); #define AppendValue(UNI) __AppendValue(shared, UNI) -void __AppendValue(SerializeSharedData* shared, Unitype u){ +Maybe __AppendValue(SerializeSharedData* shared, Unitype u){ switch(u.type){ - case Int64: - StringBuilder_append_int64(b,u.Int64); - break; - case UInt64: - StringBuilder_append_uint64(b,u.UInt64); - addc('u'); - break; - case Float64: - StringBuilder_append_double(b,u.Float64); - addc('f'); - break; - case CharPtr: - addc('"'); - char c; - while((c=*(char*)(u.VoidPtr++))){ - if(c=='\"') addc('\\'); - addc(c); - } - addc('"'); - break; - case Bool: - StringBuilder_append_cptr(b, u.Bool ? "true" : "false"); - break; - case Null: - throw("Null isn't supported in DtsodV24"); - break; - case AutoarrUnitypePtr: - addc('['); - Autoarr_foreach(((Autoarr_Unitype*)(u.VoidPtr)), e, ({ - addc(' '); - AppendValue(e); - addc(','); - })); - Autoarr_remove(b); + case Int64: + StringBuilder_append_int64(b,u.Int64); + break; + case UInt64: + StringBuilder_append_uint64(b,u.UInt64); + addc('u'); + break; + case Float64: + StringBuilder_append_double(b,u.Float64); + addc('f'); + break; + case CharPtr: + addc('"'); + char c; + while((c=*(char*)(u.VoidPtr++))){ + if(c=='\"') addc('\\'); + addc(c); + } + addc('"'); + break; + case Bool: + StringBuilder_append_cptr(b, u.Bool ? "true" : "false"); + break; + case Null: + safethrow("Null isn't supported in DtsodV24"); + break; + case AutoarrUnitypePtr: + addc('['); + Autoarr_foreach(((Autoarr_Unitype*)(u.VoidPtr)), e, ({ addc(' '); - addc(']'); - break; - case HashtablePtr: - addc('{'); - addc('\n'); - __serialize(b,tabs+1,u.VoidPtr); - AppendTabs(); - addc('}'); - break; - default: dbg((u.type)); throw(ERR_WRONGTYPE); + try(AppendValue(e),__); + addc(','); + })); + Autoarr_remove(b); + addc(' '); + addc(']'); + break; + case HashtablePtr: + addc('{'); + addc('\n'); + try(__serialize(b,tabs+1,u.VoidPtr),___); + AppendTabs(); + addc('}'); + break; + default: dbg((u.type)); safethrow(ERR_WRONGTYPE); } + + return MaybeNull; }; -void __serialize(StringBuilder* _b, uint8 _tabs, Hashtable* dtsod){ +Maybe __serialize(StringBuilder* _b, uint8 _tabs, Hashtable* dtsod){ SerializeSharedData _shared={ .sh_builder=_b, .sh_tabs=_tabs @@ -87,16 +89,18 @@ void __serialize(StringBuilder* _b, uint8 _tabs, Hashtable* dtsod){ StringBuilder_append_cptr(b,p.key); addc(':'); addc(' '); - AppendValue(p.value); + try(AppendValue(p.value),__); addc(';'); addc('\n'); })); + + return MaybeNull; } -char* DtsodV24_serialize(Hashtable* dtsod){ +Maybe DtsodV24_serialize(Hashtable* dtsod){ StringBuilder sb=StringBuilder_create(STRB_BC,STRB_BL); - __serialize(&sb,0,dtsod); + try(__serialize(&sb,0,dtsod),__); char* str=StringBuilder_build(&sb); Autoarr_clear((&sb)); - return str; + return SUCCESS(UniPtr(CharPtr, str)); } diff --git a/Hashtable/Hashtable.c b/Hashtable/Hashtable.c index 7bddbb6..0f6a230 100644 --- a/Hashtable/Hashtable.c +++ b/Hashtable/Hashtable.c @@ -1,9 +1,9 @@ #include "Hashtable.h" // amount of rows +static const uint16 HT_HEIGHTS[]={17,61,257,1021,4099,16381,65521}; #define HT_HEIN_MIN 0 -#define HT_HEIN_MAX 5 -static const uint16 HT_HEIGHTS[]={61,257,1021,4099,16381,65521}; +#define HT_HEIN_MAX 6 #define ARR_BC 2 #define ARR_BL 8 @@ -25,7 +25,7 @@ void Hashtable_free(Hashtable* ht){ free(ht); } -uint32 Hashtable_height(Hashtable* ht) { return HT_HEIGHTS[ht->hein]; } +uint16 Hashtable_height(Hashtable* ht) { return HT_HEIGHTS[ht->hein]; } void Hashtable_expand(Hashtable* ht){ diff --git a/Hashtable/Hashtable.h b/Hashtable/Hashtable.h index 90ab0ac..82902fa 100644 --- a/Hashtable/Hashtable.h +++ b/Hashtable/Hashtable.h @@ -17,7 +17,7 @@ Hashtable* Hashtable_create(); void Hashtable_free(Hashtable* ht); // amount of rows -uint32 Hashtable_height(Hashtable* ht); +uint16 Hashtable_height(Hashtable* ht); // adds charptr and value to new KeyValuePair // use cptr_copy() to create new string if needed diff --git a/base/errors.h b/base/errors.h index 309b060..02435c0 100644 --- a/base/errors.h +++ b/base/errors.h @@ -21,6 +21,7 @@ typedef struct Maybe{ Unitype value; char* errmsg; } Maybe; +// return it if func doesn't return anything static const Maybe MaybeNull={.value.type=Null, .value.VoidPtr=NULL,.errmsg=NULL}; void Maybe_free(Maybe e); diff --git a/tests/test_dtsod.c b/tests/test_dtsod.c index b1d3b09..8f8a205 100644 --- a/tests/test_dtsod.c +++ b/tests/test_dtsod.c @@ -42,7 +42,10 @@ void test_dtsod(){ print_dtsod(dtsod); char* s; - optime("serialize",1,(s=DtsodV24_serialize(dtsod))); + optime("serialize",1,({ + tryLast(DtsodV24_serialize(dtsod),r) + s=r.value.VoidPtr; + })); Hashtable_free(dtsod); printf("\e[92m%s",s); @@ -50,7 +53,8 @@ void test_dtsod(){ tryLast(DtsodV24_deserialize(s),r) dtsod=r.value.VoidPtr; free(s); - s=DtsodV24_serialize(dtsod); + tryLast(DtsodV24_serialize(dtsod),rr) + s=rr.value.VoidPtr; Hashtable_free(dtsod); }));