diff --git a/DtsodParser/DtsodV24_deserialize.c b/DtsodParser/DtsodV24_deserialize.c index d410e08..7d1c179 100644 --- a/DtsodParser/DtsodV24_deserialize.c +++ b/DtsodParser/DtsodV24_deserialize.c @@ -9,13 +9,11 @@ typedef struct DeserializeSharedData{ const char* sh_text_first; char* sh_text; bool sh_partOfDollarList; - bool sh_readingList; bool sh_calledRecursively; } DeserializeSharedData; #define text shared->sh_text #define partOfDollarList shared->sh_partOfDollarList -#define readingList shared->sh_readingList #define calledRecursively shared->sh_calledRecursively @@ -121,8 +119,8 @@ Maybe __ReadName(DeserializeSharedData* shared){ #define ReadName() __ReadName(shared) Maybe __deserialize(char** _text, bool _calledRecursively); -Maybe __ReadValue(DeserializeSharedData* shared); -#define ReadValue() __ReadValue(shared) +Maybe __ReadValue(DeserializeSharedData* shared, bool* readingList); +#define ReadValue(rL) __ReadValue(shared, rL) // returns part of without quotes Maybe __ReadString(DeserializeSharedData* shared){ @@ -155,15 +153,19 @@ Maybe __ReadString(DeserializeSharedData* shared){ Maybe __ReadList(DeserializeSharedData* shared){ Autoarr(Unitype)* list=Autoarr_create(Unitype,ARR_BC,ARR_BL); - readingList=true; - + bool readingList=true; + printf("list:\n"); while (true){ - try(ReadValue(), val,{ - Autoarr_free_Unitype(list); - free(list); - }) - Autoarr_add(list,val.value); - if (!readingList) break; + try(ReadValue((&readingList)), val, Autoarr_free_Unitype(list)) + Autoarr_add(list,val.value); + printf(" ");printuni(val.value);printf("\n"); + if (!readingList){ + if(val.value.type==Null){ + printf("null!\n"); + Autoarr_pop(list); + } + break; + } } return SUCCESS(UniPtr(AutoarrUnitypePtr,list)); @@ -230,10 +232,10 @@ Maybe __ParseValue(DeserializeSharedData* shared, string str){ }; #define ParseValue(str) __ParseValue(shared, str) -Maybe __ReadValue(DeserializeSharedData* shared){ +Maybe __ReadValue(DeserializeSharedData* shared, bool* readingList){ char c; string valueStr={text+1,0}; - Unitype value; + Unitype value=UniNull; bool spaceAfterVal=false; while ((c=*++text)) switch (c){ @@ -275,10 +277,12 @@ Maybe __ReadValue(DeserializeSharedData* shared){ value=maybeList.value; break; case ']': - readingList=false; + *readingList=false; case ';': case ',': if(valueStr.length!=0){ + if(value.type!=Null) + safethrow_wrongchar(c,Unitype_free(value)); try(ParseValue(valueStr),maybeParsed,;) value=maybeParsed.value; } @@ -299,7 +303,6 @@ Maybe __deserialize(char** _text, bool _calledRecursively) { .sh_text_first=*_text, .sh_text=*_text, .sh_partOfDollarList=false, - .sh_readingList=false, .sh_calledRecursively=_calledRecursively }; DeserializeSharedData* shared=&_shared; @@ -311,7 +314,7 @@ Maybe __deserialize(char** _text, bool _calledRecursively) { if(!maybeName.value.VoidPtr) // end of file or '}' in recursive call goto END; char* nameCPtr=maybeName.value.VoidPtr; - try(ReadValue(), val, { + try(ReadValue(NULL), val, { Hashtable_free(dict); free(nameCPtr); }) { diff --git a/DtsodParser/DtsodV24_serialize.c b/DtsodParser/DtsodV24_serialize.c index d4869f0..ce632d0 100644 --- a/DtsodParser/DtsodV24_serialize.c +++ b/DtsodParser/DtsodV24_serialize.c @@ -51,21 +51,27 @@ Maybe __AppendValue(SerializeSharedData* shared, Unitype u){ safethrow("Null isn't supported in DtsodV24",;); break; case AutoarrUnitypePtr: - addc('\n'); - AppendTabs(); - addc('['); - tabs++; - Autoarr_foreach(((Autoarr_Unitype*)(u.VoidPtr)), e, ({ + if(Autoarr_length(((Autoarr_Unitype*)(u.VoidPtr)))){ addc('\n'); AppendTabs(); - try(AppendValue(e),__,;); - addc(','); - })); - StringBuilder_rmchar(b); - addc('\n'); - tabs--; - AppendTabs(); - addc(']'); + addc('['); + tabs++; + Autoarr_foreach(((Autoarr_Unitype*)(u.VoidPtr)), e, ({ + addc('\n'); + AppendTabs(); + try(AppendValue(e),__,;); + addc(','); + })); + StringBuilder_rmchar(b); + addc('\n'); + tabs--; + AppendTabs(); + addc(']'); + } + else { + addc('['); + addc(']'); + } break; case HashtablePtr: addc('\n'); diff --git a/tests/test_dtsod.c b/tests/test_dtsod.c index f9f40cf..54ed465 100644 --- a/tests/test_dtsod.c +++ b/tests/test_dtsod.c @@ -2,6 +2,8 @@ #include "../DtsodParser/DtsodV24.h" const char text[]= +"list_of_lists: [ [\"sss\"]];" +"blank_list: [];" "message: {\n" " bool: false;" " int: -2515;" @@ -9,7 +11,6 @@ const char text[]= " double: 965.557f;#another comment!\n" " text: \"_$\\\"\\\\'''a ыыы000;2;=:%d;```\";\n" " list: [10,20,30,0,0 ];" -" list_of_lists: [ [\"sss\"]];" "};"; void print_dtsod(Hashtable* dtsod){