DtsodV24_serialize updated to safethrow

This commit is contained in:
Timerix22 2022-04-17 18:01:41 +03:00
parent 8d3991f8fb
commit 0464bd54df
7 changed files with 73 additions and 62 deletions

View File

@ -10,7 +10,7 @@ extern "C" {
Maybe DtsodV24_deserialize(char* text); Maybe DtsodV24_deserialize(char* text);
// creates text representation of dtsod // creates text representation of dtsod
char* DtsodV24_serialize(Hashtable* dtsod); Maybe DtsodV24_serialize(Hashtable* dtsod);
// returns value or UniNull if key not found // returns value or UniNull if key not found
Unitype DtsodV24_get(Hashtable* dtsod, char* key); Unitype DtsodV24_get(Hashtable* dtsod, char* key);

View File

@ -13,13 +13,15 @@ extern "C" {
// parses text to binary values // parses text to binary values
EXPORT void CALL kerep_DtsodV24_deserialize(char* text, Hashtable** output, char** errmsg){ EXPORT void CALL kerep_DtsodV24_deserialize(char* text, Hashtable** output, char** errmsg){
Maybe r=DtsodV24_deserialize(text); Maybe r=DtsodV24_deserialize(text);
*errmsg= r.errmsg ? r.errmsg : NULL; *errmsg=r.errmsg;
*output=r.value.VoidPtr; *output=r.value.VoidPtr;
} }
// creates text representation of dtsod // creates text representation of dtsod
EXPORT void CALL kerep_DtsodV24_serialize(Hashtable* dtsod, char** output){ EXPORT void CALL kerep_DtsodV24_serialize(Hashtable* dtsod, char** output, char** errmsg){
*output=DtsodV24_serialize(dtsod); Maybe r=DtsodV24_serialize(dtsod);
*errmsg=r.errmsg;
*output=r.value.VoidPtr;
} }
// returns value or UniNull if key not found // returns value or UniNull if key not found

View File

@ -12,7 +12,7 @@ typedef struct SerializeSharedData{
#define b shared->sh_builder #define b shared->sh_builder
#define tabs shared->sh_tabs #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) #define addc(C) StringBuilder_append_char(b,C)
@ -23,59 +23,61 @@ void __AppendTabs(SerializeSharedData* shared) {
}; };
#define AppendTabs() __AppendTabs(shared) #define AppendTabs() __AppendTabs(shared)
void __AppendValue(SerializeSharedData* shared, Unitype u); Maybe __AppendValue(SerializeSharedData* shared, Unitype u);
#define AppendValue(UNI) __AppendValue(shared, UNI) #define AppendValue(UNI) __AppendValue(shared, UNI)
void __AppendValue(SerializeSharedData* shared, Unitype u){ Maybe __AppendValue(SerializeSharedData* shared, Unitype u){
switch(u.type){ switch(u.type){
case Int64: case Int64:
StringBuilder_append_int64(b,u.Int64); StringBuilder_append_int64(b,u.Int64);
break; break;
case UInt64: case UInt64:
StringBuilder_append_uint64(b,u.UInt64); StringBuilder_append_uint64(b,u.UInt64);
addc('u'); addc('u');
break; break;
case Float64: case Float64:
StringBuilder_append_double(b,u.Float64); StringBuilder_append_double(b,u.Float64);
addc('f'); addc('f');
break; break;
case CharPtr: case CharPtr:
addc('"'); addc('"');
char c; char c;
while((c=*(char*)(u.VoidPtr++))){ while((c=*(char*)(u.VoidPtr++))){
if(c=='\"') addc('\\'); if(c=='\"') addc('\\');
addc(c); addc(c);
} }
addc('"'); addc('"');
break; break;
case Bool: case Bool:
StringBuilder_append_cptr(b, u.Bool ? "true" : "false"); StringBuilder_append_cptr(b, u.Bool ? "true" : "false");
break; break;
case Null: case Null:
throw("Null isn't supported in DtsodV24"); safethrow("Null isn't supported in DtsodV24");
break; break;
case AutoarrUnitypePtr: case AutoarrUnitypePtr:
addc('['); addc('[');
Autoarr_foreach(((Autoarr_Unitype*)(u.VoidPtr)), e, ({ Autoarr_foreach(((Autoarr_Unitype*)(u.VoidPtr)), e, ({
addc(' ');
AppendValue(e);
addc(',');
}));
Autoarr_remove(b);
addc(' '); addc(' ');
addc(']'); try(AppendValue(e),__);
break; addc(',');
case HashtablePtr: }));
addc('{'); Autoarr_remove(b);
addc('\n'); addc(' ');
__serialize(b,tabs+1,u.VoidPtr); addc(']');
AppendTabs(); break;
addc('}'); case HashtablePtr:
break; addc('{');
default: dbg((u.type)); throw(ERR_WRONGTYPE); 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={ SerializeSharedData _shared={
.sh_builder=_b, .sh_builder=_b,
.sh_tabs=_tabs .sh_tabs=_tabs
@ -87,16 +89,18 @@ void __serialize(StringBuilder* _b, uint8 _tabs, Hashtable* dtsod){
StringBuilder_append_cptr(b,p.key); StringBuilder_append_cptr(b,p.key);
addc(':'); addc(':');
addc(' '); addc(' ');
AppendValue(p.value); try(AppendValue(p.value),__);
addc(';'); addc(';');
addc('\n'); addc('\n');
})); }));
return MaybeNull;
} }
char* DtsodV24_serialize(Hashtable* dtsod){ Maybe DtsodV24_serialize(Hashtable* dtsod){
StringBuilder sb=StringBuilder_create(STRB_BC,STRB_BL); StringBuilder sb=StringBuilder_create(STRB_BC,STRB_BL);
__serialize(&sb,0,dtsod); try(__serialize(&sb,0,dtsod),__);
char* str=StringBuilder_build(&sb); char* str=StringBuilder_build(&sb);
Autoarr_clear((&sb)); Autoarr_clear((&sb));
return str; return SUCCESS(UniPtr(CharPtr, str));
} }

View File

@ -1,9 +1,9 @@
#include "Hashtable.h" #include "Hashtable.h"
// amount of rows // amount of rows
static const uint16 HT_HEIGHTS[]={17,61,257,1021,4099,16381,65521};
#define HT_HEIN_MIN 0 #define HT_HEIN_MIN 0
#define HT_HEIN_MAX 5 #define HT_HEIN_MAX 6
static const uint16 HT_HEIGHTS[]={61,257,1021,4099,16381,65521};
#define ARR_BC 2 #define ARR_BC 2
#define ARR_BL 8 #define ARR_BL 8
@ -25,7 +25,7 @@ void Hashtable_free(Hashtable* ht){
free(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){ void Hashtable_expand(Hashtable* ht){

View File

@ -17,7 +17,7 @@ Hashtable* Hashtable_create();
void Hashtable_free(Hashtable* ht); void Hashtable_free(Hashtable* ht);
// amount of rows // amount of rows
uint32 Hashtable_height(Hashtable* ht); uint16 Hashtable_height(Hashtable* ht);
// adds charptr and value to new KeyValuePair // adds charptr and value to new KeyValuePair
// use cptr_copy() to create new string if needed // use cptr_copy() to create new string if needed

View File

@ -21,6 +21,7 @@ typedef struct Maybe{
Unitype value; Unitype value;
char* errmsg; char* errmsg;
} Maybe; } Maybe;
// return it if func doesn't return anything
static const Maybe MaybeNull={.value.type=Null, .value.VoidPtr=NULL,.errmsg=NULL}; static const Maybe MaybeNull={.value.type=Null, .value.VoidPtr=NULL,.errmsg=NULL};
void Maybe_free(Maybe e); void Maybe_free(Maybe e);

View File

@ -42,7 +42,10 @@ void test_dtsod(){
print_dtsod(dtsod); print_dtsod(dtsod);
char* s; char* s;
optime("serialize",1,(s=DtsodV24_serialize(dtsod))); optime("serialize",1,({
tryLast(DtsodV24_serialize(dtsod),r)
s=r.value.VoidPtr;
}));
Hashtable_free(dtsod); Hashtable_free(dtsod);
printf("\e[92m%s",s); printf("\e[92m%s",s);
@ -50,7 +53,8 @@ void test_dtsod(){
tryLast(DtsodV24_deserialize(s),r) tryLast(DtsodV24_deserialize(s),r)
dtsod=r.value.VoidPtr; dtsod=r.value.VoidPtr;
free(s); free(s);
s=DtsodV24_serialize(dtsod); tryLast(DtsodV24_serialize(dtsod),rr)
s=rr.value.VoidPtr;
Hashtable_free(dtsod); Hashtable_free(dtsod);
})); }));