ParseValue()

This commit is contained in:
Timerix22 2022-03-02 14:42:30 +03:00
parent df39b92cfd
commit 4778d0ca2a
9 changed files with 71 additions and 73 deletions

View File

@ -15,11 +15,13 @@ clear_bin:
clang: CMP=clang clang: CMP=clang
clang: all clang: all
CMPARGS= -Wall $(SRC) $(TESTS) -o $(OUTFILE) CMPARGS= -Wall -Wno-discarded-qualifiers $(SRC) $(TESTS) -o $(OUTFILE)
build: build:
@echo -e '\n\e[96m----------------[build]----------------\e[0m' @echo -e '\n\e[96m----------------[build]----------------\e[0m'
@mkdir -p bin
$(CMP) -O1 -flto $(CMPARGS) $(CMP) -O1 -flto $(CMPARGS)
build_dbg: build_dbg:
@mkdir -p bin
@echo -e '\n\e[96m--------------[build_dbg]--------------\e[0m' @echo -e '\n\e[96m--------------[build_dbg]--------------\e[0m'
$(CMP) -O0 -g $(CMPARGS).dbg $(CMP) -O0 -g $(CMPARGS).dbg
test: test:

View File

@ -4,21 +4,25 @@
#define ARR_BC 2 #define ARR_BC 2
#define ARR_BL 8 #define ARR_BL 8
Hashtable* __deserialize(char* text, bool calledRecursively){ Hashtable* __deserialize(char** _text, bool calledRecursively){
Hashtable* dict=Hashtable_create(); Hashtable* dict=Hashtable_create();
char* text=*_text;
char c; char c;
bool partOfDollarList=false; bool partOfDollarList=false;
bool readingList=false; bool readingList=false;
void throw_wrongchar(char _c){ void __throw_wrongchar(char* fname,char _c){
char errBuf[]="unexpected <c> at:\n \"" char errBuf[]="unexpected <c> at:\n \""
"00000000000000000000000000000000" "00000000000000000000000000000000"
"\""; "\"";
errBuf[12]=_c; errBuf[12]=_c;
for(uint8 i=0;i<32;i++) for(uint8 i=0;i<32;i++)
errBuf[i+22]=*(text-16+i); errBuf[i+22]=*(text-16+i);
printf("\n\e[31mfunc: %s\n",fname);
throw(errBuf); throw(errBuf);
}; };
#define throw_wrongchar(C) __throw_wrongchar(__func__,C)
void SkipComment(){ void SkipComment(){
while((c=*++text)!='\n') while((c=*++text)!='\n')
@ -86,7 +90,7 @@ Hashtable* __deserialize(char* text, bool calledRecursively){
Hashtable* ReadDtsod(){ Hashtable* ReadDtsod(){
if(*++text) //skips { if(*++text) //skips {
return __deserialize(text,true); return __deserialize(&text,true);
else { else {
throw(ERR_ENDOFSTR); throw(ERR_ENDOFSTR);
return NULL; return NULL;
@ -123,45 +127,23 @@ Hashtable* __deserialize(char* text, bool calledRecursively){
break; break;
default: default:
switch(str.ptr[str.length-1]){ switch(str.ptr[str.length-1]){
case 's': case 'f':
return value_str[value_str.Length - 2] == 'u' return Uni(Double,strtod(string_cpToCharPtr(str),NULL));
? value_str.Remove(value_str.Length - 2).ToUShort() case 'u': ; //some weird "empty statement"
: value_str.Remove(value_str.Length - 1).ToShort(); //not "statement"
case 'u': uint64 lu=0;
return value_str.Remove(value_str.Length - 1).ToUInt(); sscanf(string_cpToCharPtr(str),"%lu",&lu);
case 'i': return Uni(UInt64,lu);
return value_str[value_str.Length - 2] == 'u' case '0': case '1': case '2': case '3': case '4':
? value_str.Remove(value_str.Length - 2).ToUInt() case '5': case '6': case '7': case '8': case '9': ;
: value_str.Remove(value_str.Length - 1).ToInt(); int64 li=0;
case 'l': sscanf(string_cpToCharPtr(str),"%li",&li);
return value_str[value_str.Length - 2] == 'u' return Uni(Int64,li);
? value_str.Remove(value_str.Length - 2).ToULong() default:
: value_str.Remove(value_str.Length - 1).ToLong(); throw_wrongchar(str.ptr[str.length-1]);
case 'b':
return value_str[value_str.Length - 2] == 's'
? value_str.Remove(value_str.Length - 2).ToSByte()
: value_str.Remove(value_str.Length - 1).ToByte();
case 'f':
return value_str.Remove(value_str.Length - 1).ToFloat();
case 'e':
return value_str[value_str.Length - 2] == 'd'
? value_str.Remove(value_str.Length - 2).ToDecimal()
: throw new Exception("can't parse value:" + value_str);
default:
/* if (value_str.Contains('.'))
return (object)(value_str.ToDouble());
else
{
try { return (object)(value_str.ToInt()); }
catch (FormatException)
{
Log("r", $"can't parse value: {value_str}");
return null;
}
} */
} }
} }
throw(ERR_NOTIMPLEMENTED); throw(ERR_ENDOFSTR);
return UniNull; return UniNull;
}; };
@ -208,7 +190,7 @@ Hashtable* __deserialize(char* text, bool calledRecursively){
while((c=*text++)){ while((c=*text++)){
string name=ReadName(); string name=ReadName();
if(name.length==0) //end of file or '}' in recursive call if(name.length==0) //end of file or '}' in recursive call
return dict; goto END;
char* nameCPtr=string_cpToCharPtr(name); char* nameCPtr=string_cpToCharPtr(name);
Unitype value=ReadValue(); Unitype value=ReadValue();
if(partOfDollarList){ if(partOfDollarList){
@ -225,7 +207,12 @@ Hashtable* __deserialize(char* text, bool calledRecursively){
} }
else Hashtable_add(dict,nameCPtr,value); else Hashtable_add(dict,nameCPtr,value);
} }
END:
*_text=text;
return dict; return dict;
} }
Hashtable* DtsodV24_deserialize(char* text) { return __deserialize(text,false); } Hashtable* DtsodV24_deserialize(char* text) {
Hashtable* r=__deserialize(&text,false);
return r;
}

14
DtsodC/src/base/twmp.h Normal file
View File

@ -0,0 +1,14 @@
case CharPtr: return "CharPtr";
case UniversalType: return "UniversalType";
case STNodePtr: return "STNodePtr";
case HashtablePtr: return "HashtablePtr";
case AutoarrInt8Ptr: return "AutoarrInt8Ptr";
case AutoarrUInt8Ptr: return "AutoarrUInt8Ptr";
case AutoarrInt16Ptr: return "AutoarrInt16Ptr";
case AutoarrUInt16Ptr: return "AutoarrUInt16Ptr";
case AutoarrInt32Ptr: return "AutoarrInt32Ptr";
case AutoarrUInt32Ptr: return "AutoarrUInt32Ptr";
case AutoarrInt64Ptr: return "AutoarrInt64Ptr";
case AutoarrUInt64Ptr: return "AutoarrUInt64Ptr";
case AutoarrUnitypePtr: return "AutoarrUnitypePtr";
case AutoarrKVPairPtr: return "AutoarrKVPairPtr";

View File

@ -25,6 +25,19 @@ const char* typename(my_type t){
case Int64Ptr: return "Int64Ptr"; case Int64Ptr: return "Int64Ptr";
case UInt64Ptr: return "UInt64Ptr"; case UInt64Ptr: return "UInt64Ptr";
case UniversalType: return "Unitype"; case UniversalType: return "Unitype";
case CharPtr: return "CharPtr";
case STNodePtr: return "STNodePtr";
case HashtablePtr: return "HashtablePtr";
case AutoarrInt8Ptr: return "AutoarrInt8Ptr";
case AutoarrUInt8Ptr: return "AutoarrUInt8Ptr";
case AutoarrInt16Ptr: return "AutoarrInt16Ptr";
case AutoarrUInt16Ptr: return "AutoarrUInt16Ptr";
case AutoarrInt32Ptr: return "AutoarrInt32Ptr";
case AutoarrUInt32Ptr: return "AutoarrUInt32Ptr";
case AutoarrInt64Ptr: return "AutoarrInt64Ptr";
case AutoarrUInt64Ptr: return "AutoarrUInt64Ptr";
case AutoarrUnitypePtr: return "AutoarrUnitypePtr";
case AutoarrKVPairPtr: return "AutoarrKVPairPtr";
default: throw(ERR_WRONGTYPE); return "ERROR"; default: throw(ERR_WRONGTYPE); return "ERROR";
} }
} }

View File

@ -30,15 +30,8 @@ int8 typesize(my_type type);
typedef struct Unitype{ typedef struct Unitype{
my_type type; my_type type;
union { union {
int8 Int8;
uint8 UInt8;
int16 Int16;
uint16 UInt16;
int32 Int32;
uint32 UInt32;
int64 Int64; int64 Int64;
uint64 UInt64; uint64 UInt64;
float Float;
double Double; double Double;
char Char; char Char;
bool Bool; bool Bool;

View File

@ -4,28 +4,13 @@
void printuni(Unitype v){ void printuni(Unitype v){
switch (v.type) { switch (v.type) {
case Null: printf("{%s}",typename(v.type));break; case Null: printf("{Null}");break;
case Double: printf("{%s:%lf}",typename(v.type),v.Double);break; case Double: printf("{%s:%lf}",typename(v.type),v.Double);break;
case Float: printf("{%s:%f}",typename(v.type),v.Float);break; case Char: printf("{%s:%c}",typename(v.type),v.Char);break;
case Char: printf("{%s:%c}",typename(v.type),v.Int8);break;
case UInt8:
case UInt16: printf("{%s:%u}",typename(v.type),v.UInt16);break;
case UInt32:
case UInt64: printf("{%s:%lu}",typename(v.type),v.UInt64);break;
case Bool: case Bool:
case Int8: case UInt64: printf("{%s:%lu}",typename(v.type),v.UInt64);break;
case Int16: printf("{%s:%d}",typename(v.type),v.Int16);break;
case Int32:
case Int64: printf("{%s:%ld}",typename(v.type),v.Int64);break; case Int64: printf("{%s:%ld}",typename(v.type),v.Int64);break;
case Int8Ptr: default: printf("{%s:%p}",typename(v.type),v.VoidPtr);break;
case UInt8Ptr:
case Int16Ptr:
case UInt16Ptr:
case Int32Ptr:
case UInt32Ptr:
case Int64Ptr:
case UInt64Ptr: printf("{%s:%p}",typename(v.type),v.VoidPtr);break;
default: throw(ERR_WRONGTYPE);break;
} }
} }

View File

@ -15,5 +15,9 @@ void test_dtsod(){
" text: \"_$\\\"\\\\'''\n\ta ыыы000;2;=:%d;```\";\n" " text: \"_$\\\"\\\\'''\n\ta ыыы000;2;=:%d;```\";\n"
"};\n"; "};\n";
Hashtable* dtsod=DtsodV24_deserialize(text); Hashtable* dtsod=DtsodV24_deserialize(text);
Unitype msg=Hashtable_get(dtsod,"message");
printuni(msg);
Unitype id=Hashtable_get(msg.VoidPtr,"message_id");
printf("\e[92mid: %lu",id.UInt64);
})); }));
} }

View File

@ -45,7 +45,7 @@ void fill(Hashtable* ht){
for(uint32 i=0;i<100000;i++){ for(uint32 i=0;i<100000;i++){
char* key=malloc(12); char* key=malloc(12);
sprintf(key,"key__%u",i); sprintf(key,"key__%u",i);
Hashtable_add(ht,key,Uni(UInt32,i)); Hashtable_add(ht,key,Uni(UInt64,i));
} }
} }

View File

@ -25,11 +25,11 @@ void test_searchtree(){
STNode* node=STNode_create(); STNode* node=STNode_create();
printf("\e[92mnode created\n"); printf("\e[92mnode created\n");
printf("push:\e[94m\n "); printf("push:\e[94m\n ");
Unitype u={.type=Int16,.Int16=-3}; Unitype u={.type=Int64,.Int64=-3};
printuni(u); printuni(u);
ST_push(node,"type", u); ST_push(node,"type", u);
printf(" -> type\n "); printf(" -> type\n ");
u=(Unitype){.type=Int16,.Int16=25}; u=(Unitype){.type=Int64,.Int64=25};
printuni(u); printuni(u);
ST_push(node,"time", u); ST_push(node,"time", u);
printf(" -> time\n "); printf(" -> time\n ");
@ -41,7 +41,7 @@ void test_searchtree(){
printuni(u); printuni(u);
ST_push(node,"channel_id", u); ST_push(node,"channel_id", u);
printf(" -> channel_id\n "); printf(" -> channel_id\n ");
u=(Unitype){.type=Float,.Float=32.2004}; u=(Unitype){.type=Double,.Double=32.2004};
printuni(u); printuni(u);
ST_push(node,"message_id", u); ST_push(node,"message_id", u);
printf(" -> message_id\n "); printf(" -> message_id\n ");