trying to fix broken list deserialization
This commit is contained in:
parent
2a6ad6e207
commit
2aee6af0ca
@ -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);
|
||||||
}) {
|
}) {
|
||||||
|
|||||||
@ -51,21 +51,27 @@ 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:
|
||||||
addc('\n');
|
if(Autoarr_length(((Autoarr_Unitype*)(u.VoidPtr)))){
|
||||||
AppendTabs();
|
|
||||||
addc('[');
|
|
||||||
tabs++;
|
|
||||||
Autoarr_foreach(((Autoarr_Unitype*)(u.VoidPtr)), e, ({
|
|
||||||
addc('\n');
|
addc('\n');
|
||||||
AppendTabs();
|
AppendTabs();
|
||||||
try(AppendValue(e),__,;);
|
addc('[');
|
||||||
addc(',');
|
tabs++;
|
||||||
}));
|
Autoarr_foreach(((Autoarr_Unitype*)(u.VoidPtr)), e, ({
|
||||||
StringBuilder_rmchar(b);
|
addc('\n');
|
||||||
addc('\n');
|
AppendTabs();
|
||||||
tabs--;
|
try(AppendValue(e),__,;);
|
||||||
AppendTabs();
|
addc(',');
|
||||||
addc(']');
|
}));
|
||||||
|
StringBuilder_rmchar(b);
|
||||||
|
addc('\n');
|
||||||
|
tabs--;
|
||||||
|
AppendTabs();
|
||||||
|
addc(']');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
addc('[');
|
||||||
|
addc(']');
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case HashtablePtr:
|
case HashtablePtr:
|
||||||
addc('\n');
|
addc('\n');
|
||||||
|
|||||||
@ -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){
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user