diff --git a/DtsodC/Makefile b/DtsodC/Makefile index ccc9e58..89c179e 100644 --- a/DtsodC/Makefile +++ b/DtsodC/Makefile @@ -17,7 +17,7 @@ clang: all CMPARGS= -Wall $(SRC) -o $(OUTFILE) build: @echo -e '\n\e[96m----------------[build]----------------\e[0m' - $(CMP) -O1 -flto $(CMPARGS) + $(CMP) -O1 -flto -Wno-discarded-qualifiers $(CMPARGS) build_dbg: @echo -e '\n\e[96m--------------[build_dbg]--------------\e[0m' $(CMP) -O0 -g $(CMPARGS).dbg diff --git a/DtsodC/src/DtsodParser/DtsodV24.c b/DtsodC/src/DtsodParser/DtsodV24.c index 20b7e3e..cfe7e8f 100644 --- a/DtsodC/src/DtsodParser/DtsodV24.c +++ b/DtsodC/src/DtsodParser/DtsodV24.c @@ -6,78 +6,140 @@ Hashtable* __parse(const char* text, bool called_recursively){ Hashtable* dict=Hashtable_create(); - char c; bool partOfDollarList=false; + char c; + + void throw_wrongchar(char _c){ + char errstr[]="unexpected "; + errstr[12]=_c; + throw(errstr); + }; void SkipComment(){ - while((c=*text++)!='\n') + while((c=*++text)!='\n') if(!c) throw(ERR_ENDOFSTR); }; - char* ReadName(){ - StringBuilder b=StringBuilder_create(4,32); - while ((c=*text)){ - switch (c){ - case ' ': - case '\t': - case '\r': - case '\n': - break; - case '#': - SkipComment(); - break; - case ':': - return StringBuilder_build(&b); - case '$': - partOfDollarList=true; - break; - case '=': case ';': - case '\'': case '"': - case '[': case ']': - case '{': case '}': - char errstr[]="unexpected "; - errstr[12]=c; - throw(errstr); - break; - default: - StringBuilder_append(&b,c); - break; - } - text++; + string ReadName(){ + string nameStr={text,0}; + while ((c=*++text)) switch (c){ + case ' ': case '\t': + case '\r': case '\n': + break; + case '#': + SkipComment(); + break; + case '}': + if(!called_recursively) throw_wrongchar(c); + case ':': + return nameStr; + case '$': + partOfDollarList=true; + break; + case '=': case ';': + case '\'': case '"': + case '[': case ']': + case '{': + throw_wrongchar(c); + default: + nameStr.length++; + break; } - if(Autoarr2_length((&b))>0) throw(ERR_ENDOFSTR); - return NULL; + + if(nameStr.length>0) throw(ERR_ENDOFSTR); + return nameStr; }; Unitype ReadValue(){ - Unitype value=UniNull; + string valueStr={text,0}; + bool endOfList=false; + string ReadString(){ + bool prevIsBackslash = false; + string str={text,1}; + while ((c=*++text)!='"' || prevIsBackslash){ + if (!c) throw(ERR_ENDOFSTR); + prevIsBackslash= c=='\\' && !prevIsBackslash; + str.length++; + } + str.length++; + return str; + }; + Autoarr2(Unitype)* ReadList(){ - return value; + throw(ERR_ENDOFSTR); + return NULL; + }; + Hashtable* ReadDtsod(){ + + throw(ERR_ENDOFSTR); + return NULL; + }; + Unitype ParseValue(string str){ + + throw(ERR_ENDOFSTR); + return UniNull; + }; + + while ((c=*++text)) switch (c){ + case ' ': case '\t': + case '\r': case '\n': + break; + case '#': + SkipComment(); + break; + case '"': + valueStr=ReadString(); + break; + case '\'': + text++; + char valueChar=*++text; + if (*++text != '\'') throw("after <'> should be char"); + else if (valueStr.length!=0) throw("char assignement error"); + else return Uni(Char,valueChar); + break; + case ';': + case ',': + return ParseValue(valueStr); + case '[': + return UniPtr(AutoarrUnitypePtr,ReadList()); + case ']': + endOfList=true; + break; + case '{': + return UniPtr(HashtablePtr,ReadDtsod()); + case '=': case ':': + case '}': case '$': + throw_wrongchar(c); + default: + valueStr.length++; + break; + } + + throw(ERR_ENDOFSTR); + return UniNull; }; - - while((c=*text++)){ - char* name=ReadName(); - if(!name){ - free(name); + text--; + while((c=*++text)){ + string name=ReadName(); + if(name.length==0) //closing figure bracket in recursive call or end of file return dict; - } + char* nameCPtr=string_toCharPtr(name); Unitype value=ReadValue(); if(partOfDollarList){ Autoarr2(Unitype)* list; - Unitype _lu; - if(Hashtable_try_get(dict,name, &_lu)) - list=(Autoarr2(Unitype)*)_lu.VoidPtr; - else { + Unitype lu; + if(Hashtable_try_get(dict,nameCPtr, &lu)) + list=(Autoarr2(Unitype)*)lu.VoidPtr; + else{ list=malloc(sizeof(Autoarr2(Unitype))); *list=Autoarr2_create(Unitype,ARR_BC,ARR_BL); - Hashtable_add(dict,name,UniF(AutoarrUnitypePtr,VoidPtr,list)); + Hashtable_add(dict,nameCPtr,UniPtr(AutoarrUnitypePtr,list)); } Autoarr2_add(list,value); } - else Hashtable_add(dict,name,value); + else Hashtable_add(dict,nameCPtr,value); } - return dict; } diff --git a/DtsodC/src/base/mystr.c b/DtsodC/src/base/mystr.c index 5ca958d..fe9e54d 100644 --- a/DtsodC/src/base/mystr.c +++ b/DtsodC/src/base/mystr.c @@ -36,3 +36,22 @@ char* mystrmtpl(char c, uint32 n){ rez[--n]=c; return rez; } + +char* string_toCharPtr(string str){ + char* cptr=malloc(str.length*sizeof(char)+1); + if(str.length==0) return NULL; + cptr[str.length]=0; + while(str.length>0) + cptr[--str.length]=str.ptr[str.length]; + return cptr; +} + +string string_fromCharPtr(char* cptr){ + if(!cptr) return stringNull; + string str; + str.length=mystrlen(cptr); + str.ptr=malloc(str.length); + for(uint32 i=0;i>str.length;i++) + str.ptr[i]=cptr[i]; + return str; +} diff --git a/DtsodC/src/base/mystr.h b/DtsodC/src/base/mystr.h index 5e9e150..0bd4b70 100644 --- a/DtsodC/src/base/mystr.h +++ b/DtsodC/src/base/mystr.h @@ -13,3 +13,18 @@ bool mystrcmp(char* key0, char* key1); //multiplies char n times char* mystrmtpl(char c, uint32 n); + +//my fixed length string struct +//doesn't store '\0' at the end +typedef struct string{ + char* ptr; //char pointer + uint32 length; //amount of chars in ptr value +} string; + +static const string stringNull={NULL,0}; + +//copies str content to new char pointer value (adding '\0' at the end) +char* string_toCharPtr(string str); + +//copies cptr content (excluding '\0' at the end) to new string +string string_fromCharPtr(char* cptr); diff --git a/DtsodC/src/base/types.h b/DtsodC/src/base/types.h index a487b47..2ffaa33 100644 --- a/DtsodC/src/base/types.h +++ b/DtsodC/src/base/types.h @@ -14,7 +14,7 @@ typedef enum my_type{ Null, Float, Double, Char, Bool, UInt8, Int8, UInt16, Int16, UInt32, Int32, UInt64, Int64, UInt8Ptr, Int8Ptr, UInt16Ptr, Int16Ptr, UInt32Ptr, Int32Ptr, UInt64Ptr, Int64Ptr, - UniversalType, STNodePtr, + UniversalType, STNodePtr, HashtablePtr, AutoarrInt8Ptr, AutoarrUInt8Ptr, AutoarrInt16Ptr, AutoarrUInt16Ptr, AutoarrInt32Ptr, AutoarrUInt32Ptr, AutoarrInt64Ptr, AutoarrUInt64Ptr, AutoarrUnitypePtr, AutoarrKVPairPtr @@ -40,10 +40,12 @@ typedef struct Unitype{ uint64 UInt64; float Float; double Double; + char Char; + bool Bool; void* VoidPtr; }; } Unitype; #define Uni(TYPE,VAL) (Unitype){.type=TYPE,.TYPE=VAL} -#define UniF(TYPE,FIELD,VAL) (Unitype){.type=TYPE,.FIELD=VAL} +#define UniPtr(TYPE,VAL) (Unitype){.type=TYPE,.VoidPtr=VAL} #define UniNull (Unitype){Null,.VoidPtr=NULL}