serialize()
This commit is contained in:
@@ -3,4 +3,4 @@
|
||||
#include "../Hashtable/Hashtable.h"
|
||||
|
||||
Hashtable* DtsodV24_deserialize(char* text);
|
||||
string DtsodV24_serialize(Hashtable* dtsod);
|
||||
char* DtsodV24_serialize(Hashtable* dtsod);
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
#include "DtsodV24.h"
|
||||
#include "../Autoarr/StringBuilder.h"
|
||||
|
||||
#define ARR_BC 2
|
||||
#define ARR_BL 8
|
||||
#define ARR_BC 8
|
||||
#define ARR_BL 16
|
||||
|
||||
Hashtable* __deserialize(char** _text, bool calledRecursively){
|
||||
Hashtable* dict=Hashtable_create();
|
||||
@@ -11,17 +10,17 @@ Hashtable* __deserialize(char** _text, bool calledRecursively){
|
||||
bool partOfDollarList=false;
|
||||
bool readingList=false;
|
||||
|
||||
void __throw_wrongchar(char* fname,char _c){
|
||||
void __throw_wrongchar(char* file, int line, char* fname,char _c){
|
||||
char errBuf[]="unexpected <c> at:\n \""
|
||||
"00000000000000000000000000000000"
|
||||
"\"";
|
||||
errBuf[12]=_c;
|
||||
for(uint8 i=0;i<32;i++)
|
||||
errBuf[i+22]=*(text-16+i);
|
||||
printf("\n\e[31mfunc: %s\n",fname);
|
||||
printf("\n\e[31m>%s:%d/%s\n",file,line,fname);
|
||||
throw(errBuf);
|
||||
};
|
||||
#define throw_wrongchar(C) __throw_wrongchar(__func__,C)
|
||||
#define throw_wrongchar(C) __throw_wrongchar(__FILE__,__LINE__,__func__,C)
|
||||
|
||||
|
||||
void SkipComment(){
|
||||
@@ -31,7 +30,8 @@ Hashtable* __deserialize(char** _text, bool calledRecursively){
|
||||
|
||||
string ReadName(){
|
||||
string nameStr={text,0};
|
||||
while ((c=*text++)) switch (c){
|
||||
text--;
|
||||
while ((c=*++text)) switch (c){
|
||||
case ' ': case '\t':
|
||||
case '\r': case '\n':
|
||||
if(nameStr.length!=0)
|
||||
@@ -46,6 +46,8 @@ Hashtable* __deserialize(char** _text, bool calledRecursively){
|
||||
break;
|
||||
case '}':
|
||||
if(!calledRecursively) throw_wrongchar(c);
|
||||
if((*++text)!=';')
|
||||
throw_wrongchar(c);
|
||||
case ':':
|
||||
return nameStr;
|
||||
case '$':
|
||||
77
DtsodC/DtsodParser/DtsodV24_serialize.c
Normal file
77
DtsodC/DtsodParser/DtsodV24_serialize.c
Normal file
@@ -0,0 +1,77 @@
|
||||
#include "DtsodV24.h"
|
||||
#include "../Autoarr/StringBuilder.h"
|
||||
|
||||
//65536 max length!
|
||||
#define STRB_BC 64
|
||||
#define STRB_BL 1024
|
||||
|
||||
#define addc(B,C) StringBuilder_append_char(B,C)
|
||||
|
||||
void __serialize(StringBuilder* b, uint8 tabs, Hashtable* dtsod){
|
||||
|
||||
void AppendTabs(){
|
||||
for(uint8 t; t<tabs; t++)
|
||||
addc(b,'\t');
|
||||
};
|
||||
|
||||
void AppendValue(Unitype u){
|
||||
switch(u.type){
|
||||
case Int64:
|
||||
StringBuilder_append_int64(b,u.Int64);
|
||||
break;
|
||||
case UInt64:
|
||||
StringBuilder_append_uint64(b,u.UInt64);
|
||||
addc(b,'u');
|
||||
break;
|
||||
case Double:
|
||||
StringBuilder_append_double(b,u.Double);
|
||||
addc(b,'d');
|
||||
break;
|
||||
case CharPtr:
|
||||
addc(b,'"');
|
||||
StringBuilder_append_cptr(b,u.VoidPtr);
|
||||
addc(b,'"');
|
||||
break;
|
||||
case Char:
|
||||
addc(b,'\'');
|
||||
addc(b,u.Char);
|
||||
addc(b,'\'');
|
||||
break;
|
||||
case AutoarrUnitypePtr:
|
||||
addc(b,'[');
|
||||
Autoarr_foreach(((Autoarr_Unitype*)(u.VoidPtr)), e, ({
|
||||
addc(b,' ');
|
||||
AppendValue(e);
|
||||
addc(b,',');
|
||||
}));
|
||||
Autoarr_remove(b);
|
||||
addc(b,' ');
|
||||
addc(b,']');
|
||||
break;
|
||||
case HashtablePtr:
|
||||
addc(b,'{');
|
||||
addc(b,'\n');
|
||||
__serialize(b,tabs+1,u.VoidPtr);
|
||||
AppendTabs();
|
||||
addc(b,'}');
|
||||
break;
|
||||
default: throw(ERR_WRONGTYPE);
|
||||
}
|
||||
};
|
||||
|
||||
Hashtable_foreach(dtsod, p, ({
|
||||
AppendTabs();
|
||||
StringBuilder_append_cptr(b,p.key);
|
||||
addc(b,':');
|
||||
addc(b,' ');
|
||||
AppendValue(p.value);
|
||||
addc(b,';');
|
||||
addc(b,'\n');
|
||||
}));
|
||||
}
|
||||
|
||||
char* DtsodV24_serialize(Hashtable* dtsod){
|
||||
StringBuilder b=StringBuilder_create(STRB_BC,STRB_BL);
|
||||
__serialize(&b,0,dtsod);
|
||||
return StringBuilder_build(&b);
|
||||
}
|
||||
Reference in New Issue
Block a user