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; const char* sh_text_first;
char* sh_text; char* sh_text;
bool sh_partOfDollarList; bool sh_partOfDollarList;
bool sh_readingList;
bool sh_calledRecursively; bool sh_calledRecursively;
} DeserializeSharedData; } DeserializeSharedData;
#define text shared->sh_text #define text shared->sh_text
#define partOfDollarList shared->sh_partOfDollarList #define partOfDollarList shared->sh_partOfDollarList
#define readingList shared->sh_readingList
#define calledRecursively shared->sh_calledRecursively #define calledRecursively shared->sh_calledRecursively
@ -121,8 +119,8 @@ Maybe __ReadName(DeserializeSharedData* shared){
#define ReadName() __ReadName(shared) #define ReadName() __ReadName(shared)
Maybe __deserialize(char** _text, bool _calledRecursively); Maybe __deserialize(char** _text, bool _calledRecursively);
Maybe __ReadValue(DeserializeSharedData* shared); Maybe __ReadValue(DeserializeSharedData* shared, bool* readingList);
#define ReadValue() __ReadValue(shared) #define ReadValue(rL) __ReadValue(shared, rL)
// returns part of <text> without quotes // returns part of <text> without quotes
Maybe __ReadString(DeserializeSharedData* shared){ Maybe __ReadString(DeserializeSharedData* shared){
@ -155,15 +153,19 @@ Maybe __ReadString(DeserializeSharedData* shared){
Maybe __ReadList(DeserializeSharedData* shared){ Maybe __ReadList(DeserializeSharedData* shared){
Autoarr(Unitype)* list=Autoarr_create(Unitype,ARR_BC,ARR_BL); Autoarr(Unitype)* list=Autoarr_create(Unitype,ARR_BC,ARR_BL);
readingList=true; bool readingList=true;
printf("list:\n");
while (true){ while (true){
try(ReadValue(), val,{ try(ReadValue((&readingList)), val, Autoarr_free_Unitype(list))
Autoarr_free_Unitype(list);
free(list);
})
Autoarr_add(list,val.value); Autoarr_add(list,val.value);
if (!readingList) break; 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)); return SUCCESS(UniPtr(AutoarrUnitypePtr,list));
@ -230,10 +232,10 @@ Maybe __ParseValue(DeserializeSharedData* shared, string str){
}; };
#define ParseValue(str) __ParseValue(shared, str) #define ParseValue(str) __ParseValue(shared, str)
Maybe __ReadValue(DeserializeSharedData* shared){ Maybe __ReadValue(DeserializeSharedData* shared, bool* readingList){
char c; char c;
string valueStr={text+1,0}; string valueStr={text+1,0};
Unitype value; Unitype value=UniNull;
bool spaceAfterVal=false; bool spaceAfterVal=false;
while ((c=*++text)) switch (c){ while ((c=*++text)) switch (c){
@ -275,10 +277,12 @@ Maybe __ReadValue(DeserializeSharedData* shared){
value=maybeList.value; value=maybeList.value;
break; break;
case ']': case ']':
readingList=false; *readingList=false;
case ';': case ';':
case ',': case ',':
if(valueStr.length!=0){ if(valueStr.length!=0){
if(value.type!=Null)
safethrow_wrongchar(c,Unitype_free(value));
try(ParseValue(valueStr),maybeParsed,;) try(ParseValue(valueStr),maybeParsed,;)
value=maybeParsed.value; value=maybeParsed.value;
} }
@ -299,7 +303,6 @@ Maybe __deserialize(char** _text, bool _calledRecursively) {
.sh_text_first=*_text, .sh_text_first=*_text,
.sh_text=*_text, .sh_text=*_text,
.sh_partOfDollarList=false, .sh_partOfDollarList=false,
.sh_readingList=false,
.sh_calledRecursively=_calledRecursively .sh_calledRecursively=_calledRecursively
}; };
DeserializeSharedData* shared=&_shared; DeserializeSharedData* shared=&_shared;
@ -311,7 +314,7 @@ Maybe __deserialize(char** _text, bool _calledRecursively) {
if(!maybeName.value.VoidPtr) // end of file or '}' in recursive call if(!maybeName.value.VoidPtr) // end of file or '}' in recursive call
goto END; goto END;
char* nameCPtr=maybeName.value.VoidPtr; char* nameCPtr=maybeName.value.VoidPtr;
try(ReadValue(), val, { try(ReadValue(NULL), val, {
Hashtable_free(dict); Hashtable_free(dict);
free(nameCPtr); free(nameCPtr);
}) { }) {

View File

@ -51,6 +51,7 @@ Maybe __AppendValue(SerializeSharedData* shared, Unitype u){
safethrow("Null isn't supported in DtsodV24",;); safethrow("Null isn't supported in DtsodV24",;);
break; break;
case AutoarrUnitypePtr: case AutoarrUnitypePtr:
if(Autoarr_length(((Autoarr_Unitype*)(u.VoidPtr)))){
addc('\n'); addc('\n');
AppendTabs(); AppendTabs();
addc('['); addc('[');
@ -66,6 +67,11 @@ Maybe __AppendValue(SerializeSharedData* shared, Unitype u){
tabs--; tabs--;
AppendTabs(); AppendTabs();
addc(']'); addc(']');
}
else {
addc('[');
addc(']');
}
break; break;
case HashtablePtr: case HashtablePtr:
addc('\n'); addc('\n');

View File

@ -2,6 +2,8 @@
#include "../DtsodParser/DtsodV24.h" #include "../DtsodParser/DtsodV24.h"
const char text[]= const char text[]=
"list_of_lists: [ [\"sss\"]];"
"blank_list: [];"
"message: {\n" "message: {\n"
" bool: false;" " bool: false;"
" int: -2515;" " int: -2515;"
@ -9,7 +11,6 @@ const char text[]=
" double: 965.557f;#another comment!\n" " double: 965.557f;#another comment!\n"
" text: \"_$\\\"\\\\'''a ыыы000;2;=:%d;```\";\n" " text: \"_$\\\"\\\\'''a ыыы000;2;=:%d;```\";\n"
" list: [10,20,30,0,0 ];" " list: [10,20,30,0,0 ];"
" list_of_lists: [ [\"sss\"]];"
"};"; "};";
void print_dtsod(Hashtable* dtsod){ void print_dtsod(Hashtable* dtsod){