trying to fix broken list deserialization

This commit is contained in:
Timerix22 2022-04-21 00:20:25 +03:00
parent 2a6ad6e207
commit 2aee6af0ca
3 changed files with 41 additions and 31 deletions

View File

@ -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 <text> 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);
}) {

View File

@ -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');

View File

@ -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){