summaryrefslogtreecommitdiff
path: root/core/variant_parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/variant_parser.cpp')
-rw-r--r--core/variant_parser.cpp243
1 files changed, 170 insertions, 73 deletions
diff --git a/core/variant_parser.cpp b/core/variant_parser.cpp
index 2bf9fd7f32..fed8c28740 100644
--- a/core/variant_parser.cpp
+++ b/core/variant_parser.cpp
@@ -54,6 +54,10 @@ Error VariantParser::get_token(Stream *p_stream, Token& r_token, int &line, Stri
p_stream->saved=0;
} else {
cchar=p_stream->get_char();
+ if (p_stream->is_eof()) {
+ r_token.type=TK_EOF;
+ return OK;
+ }
}
switch(cchar) {
@@ -202,6 +206,9 @@ Error VariantParser::get_token(Stream *p_stream, Token& r_token, int &line, Stri
}
}
+ if (p_stream->is_utf8()) {
+ str.parse_utf8( str.ascii(true).get_data() );
+ }
r_token.type=TK_STRING;
r_token.value=str;
return OK;
@@ -215,7 +222,7 @@ Error VariantParser::get_token(Stream *p_stream, Token& r_token, int &line, Stri
if (cchar=='-' || (cchar>='0' && cchar<='9')) {
//a number
- print_line("a numbar");
+
String num;
#define READING_SIGN 0
@@ -228,7 +235,6 @@ Error VariantParser::get_token(Stream *p_stream, Token& r_token, int &line, Stri
if (cchar=='-') {
num+='-';
cchar=p_stream->get_char();
- print_line("isnegative");
}
@@ -246,14 +252,11 @@ Error VariantParser::get_token(Stream *p_stream, Token& r_token, int &line, Stri
if (c>='0' && c<='9') {
//pass
- print_line("num: regular");
} else if (c=='.') {
reading=READING_DEC;
- print_line("num: decimal");
is_float=true;
} else if (c=='e') {
reading=READING_EXP;
- print_line("num: exp");
} else {
reading=READING_DONE;
}
@@ -262,11 +265,10 @@ Error VariantParser::get_token(Stream *p_stream, Token& r_token, int &line, Stri
case READING_DEC: {
if (c>='0' && c<='9') {
- print_line("dec: exp");
} else if (c=='e') {
reading=READING_EXP;
- print_line("dec: expe");
+
} else {
reading=READING_DONE;
}
@@ -276,10 +278,10 @@ Error VariantParser::get_token(Stream *p_stream, Token& r_token, int &line, Stri
if (c>='0' && c<='9') {
exp_beg=true;
- print_line("exp: num");
+
} else if ((c=='-' || c=='+') && !exp_sign && !exp_beg) {
exp_sign=true;
- print_line("exp: sgn");
+
} else {
reading=READING_DONE;
}
@@ -290,13 +292,13 @@ Error VariantParser::get_token(Stream *p_stream, Token& r_token, int &line, Stri
break;
num+=String::chr(c);
c = p_stream->get_char();
- print_line("add to c");
+
}
p_stream->saved=c;
- print_line("num was: "+num);
+
r_token.type=TK_NUMBER;
if (is_float)
r_token.value=num.to_double();
@@ -307,11 +309,13 @@ Error VariantParser::get_token(Stream *p_stream, Token& r_token, int &line, Stri
} else if ((cchar>='A' && cchar<='Z') || (cchar>='a' && cchar<='z') || cchar=='_') {
String id;
+ bool first=true;
- while((cchar>='A' && cchar<='Z') || (cchar>='a' && cchar<='z') || cchar=='_') {
+ while((cchar>='A' && cchar<='Z') || (cchar>='a' && cchar<='z') || cchar=='_' || (!first && cchar>='0' && cchar<='9')) {
id+=String::chr(cchar);
cchar=p_stream->get_char();
+ first=false;
}
p_stream->saved=cchar;
@@ -332,14 +336,14 @@ Error VariantParser::get_token(Stream *p_stream, Token& r_token, int &line, Stri
return ERR_PARSE_ERROR;
}
-
-Error VariantParser::_parse_construct(Stream *p_stream,Vector<float>& r_construct,int &line,String &r_err_str) {
+template<class T>
+Error VariantParser::_parse_construct(Stream *p_stream,Vector<T>& r_construct,int &line,String &r_err_str) {
Token token;
get_token(p_stream,token,line,r_err_str);
if (token.type!=TK_PARENTHESIS_OPEN) {
- r_err_str="Expected '('";
+ r_err_str="Expected '(' in constructor";
return ERR_PARSE_ERROR;
}
@@ -351,21 +355,23 @@ Error VariantParser::_parse_construct(Stream *p_stream,Vector<float>& r_construc
get_token(p_stream,token,line,r_err_str);
if (token.type==TK_COMMA) {
//do none
- } else if (token.type!=TK_PARENTHESIS_CLOSE) {
+ } else if (token.type==TK_PARENTHESIS_CLOSE) {
break;
} else {
- r_err_str="Expected ',' or ')'";
+ r_err_str="Expected ',' or ')' in constructor";
return ERR_PARSE_ERROR;
}
}
get_token(p_stream,token,line,r_err_str);
if (token.type!=TK_NUMBER) {
- r_err_str="Expected float";
+ r_err_str="Expected float in constructor";
return ERR_PARSE_ERROR;
}
+
r_construct.push_back(token.value);
+ first=false;
}
return OK;
@@ -444,7 +450,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
else if (id=="Vector2"){
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -457,7 +463,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="Vector3"){
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -470,7 +476,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="Matrix32"){
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -486,7 +492,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="Plane") {
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -499,7 +505,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="Quat") {
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -513,7 +519,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="AABB"){
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -527,7 +533,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="Matrix3"){
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -540,7 +546,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="Transform"){
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -554,7 +560,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="Color") {
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -600,6 +606,8 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
}
int height=token.value;
+
+ get_token(p_stream,token,line,r_err_str);
if (token.type!=TK_COMMA) {
r_err_str="Expected ','";
return ERR_PARSE_ERROR;
@@ -612,6 +620,8 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
}
int mipmaps=token.value;
+
+ get_token(p_stream,token,line,r_err_str);
if (token.type!=TK_COMMA) {
r_err_str="Expected ','";
return ERR_PARSE_ERROR;
@@ -624,6 +634,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
return ERR_PARSE_ERROR;
}
+
String sformat=token.value;
Image::Format format;
@@ -666,12 +677,13 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
DVector<uint8_t>::Write w=buffer.write();
for(int i=0;i<len;i++) {
-
+ get_token(p_stream,token,line,r_err_str);
if (token.type!=TK_COMMA) {
r_err_str="Expected ','";
return ERR_PARSE_ERROR;
}
+ get_token(p_stream,token,line,r_err_str);
if (token.type!=TK_NUMBER) {
r_err_str="Expected number";
return ERR_PARSE_ERROR;
@@ -702,7 +714,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
get_token(p_stream,token,line,r_err_str);
if (token.type!=TK_STRING) {
- r_err_str="Expected string as argument";
+ r_err_str="Expected string as argument for NodePath()";
return ERR_PARSE_ERROR;
}
@@ -741,7 +753,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
return OK;
- } else if (id=="Resource") {
+ } else if (id=="Resource" || id=="SubResource" || id=="ExtResource") {
@@ -751,28 +763,31 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
return ERR_PARSE_ERROR;
}
- get_token(p_stream,token,line,r_err_str);
- if (token.type==TK_STRING) {
- String path=token.value;
- RES res = ResourceLoader::load(path);
- if (res.is_null()) {
- r_err_str="Can't load resource at path: '"+path+"'.";
- return ERR_PARSE_ERROR;
- }
- get_token(p_stream,token,line,r_err_str);
- if (token.type!=TK_PARENTHESIS_CLOSE) {
- r_err_str="Expected ')'";
- return ERR_PARSE_ERROR;
- }
+ if (p_res_parser && id=="Resource" && p_res_parser->func){
+
+ RES res;
+ Error err = p_res_parser->func(p_res_parser->userdata,p_stream,res,line,r_err_str);
+ if (err)
+ return err;
value=res;
+
return OK;
+ } else if (p_res_parser && id=="ExtResource" && p_res_parser->ext_func){
+
+ RES res;
+ Error err = p_res_parser->ext_func(p_res_parser->userdata,p_stream,res,line,r_err_str);
+ if (err)
+ return err;
+
+ value=res;
- } else if (p_res_parser && p_res_parser->func){
+ return OK;
+ } else if (p_res_parser && id=="SubResource" && p_res_parser->sub_func){
RES res;
- Error err = p_res_parser->func(p_res_parser->userdata,p_stream,res,line,r_err_str);
+ Error err = p_res_parser->sub_func(p_res_parser->userdata,p_stream,res,line,r_err_str);
if (err)
return err;
@@ -781,12 +796,33 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
return OK;
} else {
- r_err_str="Expected string as argument.";
- return ERR_PARSE_ERROR;
+ get_token(p_stream,token,line,r_err_str);
+ if (token.type==TK_STRING) {
+ String path=token.value;
+ RES res = ResourceLoader::load(path);
+ if (res.is_null()) {
+ r_err_str="Can't load resource at path: '"+path+"'.";
+ return ERR_PARSE_ERROR;
+ }
+
+ get_token(p_stream,token,line,r_err_str);
+ if (token.type!=TK_PARENTHESIS_CLOSE) {
+ r_err_str="Expected ')'";
+ return ERR_PARSE_ERROR;
+ }
+
+ value=res;
+ return OK;
+
+ } else {
+ r_err_str="Expected string as argument for Resource().";
+ return ERR_PARSE_ERROR;
+ }
}
return OK;
+
} else if (id=="InputEvent") {
@@ -952,8 +988,8 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="ByteArray") {
- Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Vector<uint8_t> args;
+ Error err = _parse_construct<uint8_t>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -973,8 +1009,8 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="IntArray") {
- Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Vector<int32_t> args;
+ Error err = _parse_construct<int32_t>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -984,7 +1020,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
arr.resize(len);
DVector<int32_t>::Write w = arr.write();
for(int i=0;i<len;i++) {
- w[i]=Math::fast_ftoi(args[i]);
+ w[i]=int(args[i]);
}
}
@@ -995,7 +1031,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="FloatArray") {
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -1066,7 +1102,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="Vector2Array") {
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -1087,7 +1123,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="Vector3Array") {
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -1108,7 +1144,7 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
} else if (id=="ColorArray") {
Vector<float> args;
- Error err = _parse_construct(p_stream,args,line,r_err_str);
+ Error err = _parse_construct<float>(p_stream,args,line,r_err_str);
if (err)
return err;
@@ -1191,7 +1227,12 @@ Error VariantParser::_parse_array(Array &array, Stream *p_stream, int &line, Str
bool need_comma=false;
- while(!p_stream->is_eof()) {
+ while(true) {
+
+ if (p_stream->is_eof()) {
+ r_err_str="Unexpected End of File while parsing array";
+ return ERR_FILE_CORRUPT;
+ }
Error err = get_token(p_stream,token,line,r_err_str);
if (err!=OK)
@@ -1236,8 +1277,13 @@ Error VariantParser::_parse_dictionary(Dictionary &object, Stream *p_stream, int
bool need_comma=false;
- while(!p_stream->is_eof()) {
+ while(true) {
+
+ if (p_stream->is_eof()) {
+ r_err_str="Unexpected End of File while parsing dictionary";
+ return ERR_FILE_CORRUPT;
+ }
if (at_key) {
@@ -1301,7 +1347,7 @@ Error VariantParser::_parse_dictionary(Dictionary &object, Stream *p_stream, int
}
-Error VariantParser::_parse_tag(Token& token,Stream *p_stream, int &line, String &r_err_str,Tag& r_tag) {
+Error VariantParser::_parse_tag(Token& token, Stream *p_stream, int &line, String &r_err_str, Tag& r_tag, ResourceParser *p_res_parser) {
r_tag.fields.clear();
@@ -1321,10 +1367,13 @@ Error VariantParser::_parse_tag(Token& token,Stream *p_stream, int &line, String
r_tag.name=token.value;
- print_line("tag name: "+r_tag.name);
-
while(true) {
+ if (p_stream->is_eof()) {
+ r_err_str="Unexpected End of File while parsing tag: "+r_tag.name;
+ return ERR_FILE_CORRUPT;
+ }
+
get_token(p_stream,token,line,r_err_str);
if (token.type==TK_BRACKET_CLOSE)
break;
@@ -1336,7 +1385,6 @@ Error VariantParser::_parse_tag(Token& token,Stream *p_stream, int &line, String
String id=token.value;
- print_line("got ID: "+id);
get_token(p_stream,token,line,r_err_str);
if (token.type!=TK_EQUAL) {
@@ -1344,17 +1392,13 @@ Error VariantParser::_parse_tag(Token& token,Stream *p_stream, int &line, String
return ERR_PARSE_ERROR;
}
- print_line("got tk: "+String(tk_name[token.type]));
-
get_token(p_stream,token,line,r_err_str);
Variant value;
- Error err = parse_value(token,value,p_stream,line,r_err_str);
+ Error err = parse_value(token,value,p_stream,line,r_err_str,p_res_parser);
if (err)
return err;
- print_line("id: "+id+" value: "+String(value));
-
- r_tag.fields[id]=value;
+ r_tag.fields[id]=value;
}
@@ -1363,23 +1407,71 @@ Error VariantParser::_parse_tag(Token& token,Stream *p_stream, int &line, String
}
-Error VariantParser::parse_tag(Stream *p_stream, int &line, String &r_err_str,Tag& r_tag) {
+Error VariantParser::parse_tag(Stream *p_stream, int &line, String &r_err_str, Tag& r_tag, ResourceParser *p_res_parser) {
Token token;
get_token(p_stream,token,line,r_err_str);
+
+ if (token.type==TK_EOF) {
+ return ERR_FILE_EOF;
+ }
+
if (token.type!=TK_BRACKET_OPEN) {
r_err_str="Expected '['";
return ERR_PARSE_ERROR;
}
- return _parse_tag(token,p_stream,line,r_err_str,r_tag);
+ return _parse_tag(token,p_stream,line,r_err_str,r_tag,p_res_parser);
}
-Error VariantParser::parse_tag_assign_eof(Stream *p_stream, int &line, String &r_err_str,Tag& r_tag,String &r_assign) {
+Error VariantParser::parse_tag_assign_eof(Stream *p_stream, int &line, String &r_err_str, Tag& r_tag, String &r_assign, Variant &r_value, ResourceParser *p_res_parser) {
- r_tag.name.clear();
- r_assign=String();
+
+ //assign..
+ String what;
+
+ while(true) {
+
+
+ CharType c;
+ if (p_stream->saved) {
+ c=p_stream->saved;
+ p_stream->saved=0;
+
+ } else {
+ c=p_stream->get_char();
+ }
+
+ if (p_stream->is_eof())
+ return ERR_FILE_EOF;
+
+ if (c=='[' && what.length()==0) {
+ //it's a tag!
+ p_stream->saved='['; //go back one
+
+ Error err = parse_tag(p_stream,line,r_err_str,r_tag,p_res_parser);
+
+ return err;
+ }
+
+ if (c>32) {
+ if (c!='=') {
+ what+=String::chr(c);
+ } else {
+ r_assign=what;
+ Token token;
+ get_token(p_stream,token,line,r_err_str);
+ Error err = parse_value(token,r_value,p_stream,line,r_err_str,p_res_parser);
+ if (err) {
+
+ }
+ return err;
+ }
+ } else if (c=='\n') {
+ line++;
+ }
+ }
return OK;
}
@@ -1391,6 +1483,11 @@ Error VariantParser::parse(Stream *p_stream, Variant& r_ret, String &r_err_str,
Error err = get_token(p_stream,token,r_err_line,r_err_str);
if (err)
return err;
+
+ if (token.type==TK_EOF) {
+ return ERR_FILE_EOF;
+ }
+
return parse_value(token,r_ret,p_stream,r_err_line,r_err_str,p_res_parser);
}