variant_parser.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398
  1. #include "variant_parser.h"
  2. #include "io/resource_loader.h"
  3. #include "os/keyboard.h"
  4. CharType VariantParser::StreamFile::get_char() {
  5. return f->get_8();
  6. }
  7. bool VariantParser::StreamFile::is_utf8() const {
  8. return true;
  9. }
  10. bool VariantParser::StreamFile::is_eof() const {
  11. return f->eof_reached();
  12. }
  13. /////////////////////////////////////////////////////////////////////////////////////////////////
  14. const char * VariantParser::tk_name[TK_MAX] = {
  15. "'{'",
  16. "'}'",
  17. "'['",
  18. "']'",
  19. "'('",
  20. "')'",
  21. "identifier",
  22. "string",
  23. "number",
  24. "':'",
  25. "','",
  26. "'='",
  27. "EOF",
  28. "ERROR"
  29. };
  30. Error VariantParser::get_token(Stream *p_stream, Token& r_token, int &line, String &r_err_str) {
  31. while (true) {
  32. CharType cchar;
  33. if (p_stream->saved) {
  34. cchar=p_stream->saved;
  35. p_stream->saved=0;
  36. } else {
  37. cchar=p_stream->get_char();
  38. }
  39. switch(cchar) {
  40. case '\n': {
  41. line++;
  42. break;
  43. };
  44. case 0: {
  45. r_token.type=TK_EOF;
  46. return OK;
  47. } break;
  48. case '{': {
  49. r_token.type=TK_CURLY_BRACKET_OPEN;
  50. return OK;
  51. };
  52. case '}': {
  53. r_token.type=TK_CURLY_BRACKET_CLOSE;
  54. return OK;
  55. };
  56. case '[': {
  57. r_token.type=TK_BRACKET_OPEN;
  58. return OK;
  59. };
  60. case ']': {
  61. r_token.type=TK_BRACKET_CLOSE;
  62. return OK;
  63. };
  64. case '(': {
  65. r_token.type=TK_PARENTHESIS_OPEN;
  66. return OK;
  67. };
  68. case ')': {
  69. r_token.type=TK_PARENTHESIS_CLOSE;
  70. return OK;
  71. };
  72. case ':': {
  73. r_token.type=TK_COLON;
  74. return OK;
  75. };
  76. case ',': {
  77. r_token.type=TK_COMMA;
  78. return OK;
  79. };
  80. case '=': {
  81. r_token.type=TK_EQUAL;
  82. return OK;
  83. };
  84. case '"': {
  85. String str;
  86. while(true) {
  87. CharType ch=p_stream->get_char();
  88. if (ch==0) {
  89. r_err_str="Unterminated String";
  90. r_token.type=TK_ERROR;
  91. return ERR_PARSE_ERROR;
  92. } else if (ch=='"') {
  93. break;
  94. } else if (ch=='\\') {
  95. //escaped characters...
  96. CharType next = p_stream->get_char();
  97. if (next==0) {
  98. r_err_str="Unterminated String";
  99. r_token.type=TK_ERROR;
  100. return ERR_PARSE_ERROR;
  101. }
  102. CharType res=0;
  103. switch(next) {
  104. case 'b': res=8; break;
  105. case 't': res=9; break;
  106. case 'n': res=10; break;
  107. case 'f': res=12; break;
  108. case 'r': res=13; break;
  109. case 'u': {
  110. //hexnumbarh - oct is deprecated
  111. for(int j=0;j<4;j++) {
  112. CharType c = p_stream->get_char();
  113. if (c==0) {
  114. r_err_str="Unterminated String";
  115. r_token.type=TK_ERROR;
  116. return ERR_PARSE_ERROR;
  117. }
  118. if (!((c>='0' && c<='9') || (c>='a' && c<='f') || (c>='A' && c<='F'))) {
  119. r_err_str="Malformed hex constant in string";
  120. r_token.type=TK_ERROR;
  121. return ERR_PARSE_ERROR;
  122. }
  123. CharType v;
  124. if (c>='0' && c<='9') {
  125. v=c-'0';
  126. } else if (c>='a' && c<='f') {
  127. v=c-'a';
  128. v+=10;
  129. } else if (c>='A' && c<='F') {
  130. v=c-'A';
  131. v+=10;
  132. } else {
  133. ERR_PRINT("BUG");
  134. v=0;
  135. }
  136. res<<=4;
  137. res|=v;
  138. }
  139. } break;
  140. //case '\"': res='\"'; break;
  141. //case '\\': res='\\'; break;
  142. //case '/': res='/'; break;
  143. default: {
  144. res = next;
  145. //r_err_str="Invalid escape sequence";
  146. //return ERR_PARSE_ERROR;
  147. } break;
  148. }
  149. str+=res;
  150. } else {
  151. if (ch=='\n')
  152. line++;
  153. str+=ch;
  154. }
  155. }
  156. r_token.type=TK_STRING;
  157. r_token.value=str;
  158. return OK;
  159. } break;
  160. default: {
  161. if (cchar<=32) {
  162. break;
  163. }
  164. if (cchar=='-' || (cchar>='0' && cchar<='9')) {
  165. //a number
  166. print_line("a numbar");
  167. String num;
  168. #define READING_SIGN 0
  169. #define READING_INT 1
  170. #define READING_DEC 2
  171. #define READING_EXP 3
  172. #define READING_DONE 4
  173. int reading=READING_INT;
  174. if (cchar=='-') {
  175. num+='-';
  176. cchar=p_stream->get_char();
  177. print_line("isnegative");
  178. }
  179. CharType c = cchar;
  180. bool exp_sign=false;
  181. bool exp_beg=false;
  182. bool is_float=false;
  183. while(true) {
  184. switch(reading) {
  185. case READING_INT: {
  186. if (c>='0' && c<='9') {
  187. //pass
  188. print_line("num: regular");
  189. } else if (c=='.') {
  190. reading=READING_DEC;
  191. print_line("num: decimal");
  192. is_float=true;
  193. } else if (c=='e') {
  194. reading=READING_EXP;
  195. print_line("num: exp");
  196. } else {
  197. reading=READING_DONE;
  198. }
  199. } break;
  200. case READING_DEC: {
  201. if (c>='0' && c<='9') {
  202. print_line("dec: exp");
  203. } else if (c=='e') {
  204. reading=READING_EXP;
  205. print_line("dec: expe");
  206. } else {
  207. reading=READING_DONE;
  208. }
  209. } break;
  210. case READING_EXP: {
  211. if (c>='0' && c<='9') {
  212. exp_beg=true;
  213. print_line("exp: num");
  214. } else if ((c=='-' || c=='+') && !exp_sign && !exp_beg) {
  215. exp_sign=true;
  216. print_line("exp: sgn");
  217. } else {
  218. reading=READING_DONE;
  219. }
  220. } break;
  221. }
  222. if (reading==READING_DONE)
  223. break;
  224. num+=String::chr(c);
  225. c = p_stream->get_char();
  226. print_line("add to c");
  227. }
  228. p_stream->saved=c;
  229. print_line("num was: "+num);
  230. r_token.type=TK_NUMBER;
  231. if (is_float)
  232. r_token.value=num.to_double();
  233. else
  234. r_token.value=num.to_int();
  235. return OK;
  236. } else if ((cchar>='A' && cchar<='Z') || (cchar>='a' && cchar<='z') || cchar=='_') {
  237. String id;
  238. while((cchar>='A' && cchar<='Z') || (cchar>='a' && cchar<='z') || cchar=='_') {
  239. id+=String::chr(cchar);
  240. cchar=p_stream->get_char();
  241. }
  242. p_stream->saved=cchar;
  243. r_token.type=TK_IDENTIFIER;
  244. r_token.value=id;
  245. return OK;
  246. } else {
  247. r_err_str="Unexpected character.";
  248. r_token.type=TK_ERROR;
  249. return ERR_PARSE_ERROR;
  250. }
  251. }
  252. }
  253. }
  254. r_token.type=TK_ERROR;
  255. return ERR_PARSE_ERROR;
  256. }
  257. Error VariantParser::_parse_construct(Stream *p_stream,Vector<float>& r_construct,int &line,String &r_err_str) {
  258. Token token;
  259. get_token(p_stream,token,line,r_err_str);
  260. if (token.type!=TK_PARENTHESIS_OPEN) {
  261. r_err_str="Expected '('";
  262. return ERR_PARSE_ERROR;
  263. }
  264. bool first=true;
  265. while(true) {
  266. if (!first) {
  267. get_token(p_stream,token,line,r_err_str);
  268. if (token.type==TK_COMMA) {
  269. //do none
  270. } else if (token.type!=TK_PARENTHESIS_CLOSE) {
  271. break;
  272. } else {
  273. r_err_str="Expected ',' or ')'";
  274. return ERR_PARSE_ERROR;
  275. }
  276. }
  277. get_token(p_stream,token,line,r_err_str);
  278. if (token.type!=TK_NUMBER) {
  279. r_err_str="Expected float";
  280. return ERR_PARSE_ERROR;
  281. }
  282. r_construct.push_back(token.value);
  283. }
  284. return OK;
  285. }
  286. Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,int &line,String &r_err_str,ResourceParser *p_res_parser) {
  287. /* {
  288. Error err = get_token(p_stream,token,line,r_err_str);
  289. if (err)
  290. return err;
  291. }*/
  292. if (token.type==TK_CURLY_BRACKET_OPEN) {
  293. Dictionary d;
  294. Error err = _parse_dictionary(d,p_stream,line,r_err_str,p_res_parser);
  295. if (err)
  296. return err;
  297. value=d;
  298. return OK;
  299. } else if (token.type==TK_BRACKET_OPEN) {
  300. Array a;
  301. Error err = _parse_array(a,p_stream,line,r_err_str,p_res_parser);
  302. if (err)
  303. return err;
  304. value=a;
  305. return OK;
  306. } else if (token.type==TK_IDENTIFIER) {
  307. /*
  308. VECTOR2, // 5
  309. RECT2,
  310. VECTOR3,
  311. MATRIX32,
  312. PLANE,
  313. QUAT, // 10
  314. _AABB, //sorry naming convention fail :( not like it's used often
  315. MATRIX3,
  316. TRANSFORM,
  317. // misc types
  318. COLOR,
  319. IMAGE, // 15
  320. NODE_PATH,
  321. _RID,
  322. OBJECT,
  323. INPUT_EVENT,
  324. DICTIONARY, // 20
  325. ARRAY,
  326. // arrays
  327. RAW_ARRAY,
  328. INT_ARRAY,
  329. REAL_ARRAY,
  330. STRING_ARRAY, // 25
  331. VECTOR2_ARRAY,
  332. VECTOR3_ARRAY,
  333. COLOR_ARRAY,
  334. VARIANT_MAX
  335. */
  336. String id = token.value;
  337. if (id=="true")
  338. value=true;
  339. else if (id=="false")
  340. value=false;
  341. else if (id=="null")
  342. value=Variant();
  343. else if (id=="Vector2"){
  344. Vector<float> args;
  345. Error err = _parse_construct(p_stream,args,line,r_err_str);
  346. if (err)
  347. return err;
  348. if (args.size()!=2) {
  349. r_err_str="Expected 2 arguments for constructor";
  350. }
  351. value=Vector2(args[0],args[1]);
  352. return OK;
  353. } else if (id=="Vector3"){
  354. Vector<float> args;
  355. Error err = _parse_construct(p_stream,args,line,r_err_str);
  356. if (err)
  357. return err;
  358. if (args.size()!=3) {
  359. r_err_str="Expected 3 arguments for constructor";
  360. }
  361. value=Vector3(args[0],args[1],args[2]);
  362. return OK;
  363. } else if (id=="Matrix32"){
  364. Vector<float> args;
  365. Error err = _parse_construct(p_stream,args,line,r_err_str);
  366. if (err)
  367. return err;
  368. if (args.size()!=6) {
  369. r_err_str="Expected 6 arguments for constructor";
  370. }
  371. Matrix32 m;
  372. m[0]=Vector2(args[0],args[1]);
  373. m[1]=Vector2(args[2],args[3]);
  374. m[2]=Vector2(args[4],args[5]);
  375. value=m;
  376. return OK;
  377. } else if (id=="Plane") {
  378. Vector<float> args;
  379. Error err = _parse_construct(p_stream,args,line,r_err_str);
  380. if (err)
  381. return err;
  382. if (args.size()!=4) {
  383. r_err_str="Expected 4 arguments for constructor";
  384. }
  385. value=Plane(args[0],args[1],args[2],args[3]);
  386. return OK;
  387. } else if (id=="Quat") {
  388. Vector<float> args;
  389. Error err = _parse_construct(p_stream,args,line,r_err_str);
  390. if (err)
  391. return err;
  392. if (args.size()!=4) {
  393. r_err_str="Expected 4 arguments for constructor";
  394. }
  395. value=Quat(args[0],args[1],args[2],args[3]);
  396. return OK;
  397. } else if (id=="AABB"){
  398. Vector<float> args;
  399. Error err = _parse_construct(p_stream,args,line,r_err_str);
  400. if (err)
  401. return err;
  402. if (args.size()!=6) {
  403. r_err_str="Expected 6 arguments for constructor";
  404. }
  405. value=AABB(Vector3(args[0],args[1],args[2]),Vector3(args[3],args[4],args[5]));
  406. return OK;
  407. } else if (id=="Matrix3"){
  408. Vector<float> args;
  409. Error err = _parse_construct(p_stream,args,line,r_err_str);
  410. if (err)
  411. return err;
  412. if (args.size()!=9) {
  413. r_err_str="Expected 9 arguments for constructor";
  414. }
  415. value=Matrix3(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]);
  416. return OK;
  417. } else if (id=="Transform"){
  418. Vector<float> args;
  419. Error err = _parse_construct(p_stream,args,line,r_err_str);
  420. if (err)
  421. return err;
  422. if (args.size()!=12) {
  423. r_err_str="Expected 12 arguments for constructor";
  424. }
  425. value=Transform(Matrix3(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]),Vector3(args[9],args[10],args[11]));
  426. return OK;
  427. } else if (id=="Color") {
  428. Vector<float> args;
  429. Error err = _parse_construct(p_stream,args,line,r_err_str);
  430. if (err)
  431. return err;
  432. if (args.size()!=4) {
  433. r_err_str="Expected 4 arguments for constructor";
  434. }
  435. value=Color(args[0],args[1],args[2],args[3]);
  436. return OK;
  437. } else if (id=="Image") {
  438. //:|
  439. get_token(p_stream,token,line,r_err_str);
  440. if (token.type!=TK_PARENTHESIS_OPEN) {
  441. r_err_str="Expected '('";
  442. return ERR_PARSE_ERROR;
  443. }
  444. get_token(p_stream,token,line,r_err_str);
  445. if (token.type==TK_PARENTHESIS_CLOSE) {
  446. value=Image(); // just an Image()
  447. return OK;
  448. } else if (token.type!=TK_NUMBER) {
  449. r_err_str="Expected number (width)";
  450. return ERR_PARSE_ERROR;
  451. }
  452. get_token(p_stream,token,line,r_err_str);
  453. int width=token.value;
  454. if (token.type!=TK_COMMA) {
  455. r_err_str="Expected ','";
  456. return ERR_PARSE_ERROR;
  457. }
  458. get_token(p_stream,token,line,r_err_str);
  459. if (token.type!=TK_NUMBER) {
  460. r_err_str="Expected number (height)";
  461. return ERR_PARSE_ERROR;
  462. }
  463. int height=token.value;
  464. if (token.type!=TK_COMMA) {
  465. r_err_str="Expected ','";
  466. return ERR_PARSE_ERROR;
  467. }
  468. get_token(p_stream,token,line,r_err_str);
  469. if (token.type!=TK_NUMBER) {
  470. r_err_str="Expected number (mipmaps)";
  471. return ERR_PARSE_ERROR;
  472. }
  473. int mipmaps=token.value;
  474. if (token.type!=TK_COMMA) {
  475. r_err_str="Expected ','";
  476. return ERR_PARSE_ERROR;
  477. }
  478. get_token(p_stream,token,line,r_err_str);
  479. if (token.type!=TK_IDENTIFIER) {
  480. r_err_str="Expected identifier (format)";
  481. return ERR_PARSE_ERROR;
  482. }
  483. String sformat=token.value;
  484. Image::Format format;
  485. if (sformat=="GRAYSCALE") format=Image::FORMAT_GRAYSCALE;
  486. else if (sformat=="INTENSITY") format=Image::FORMAT_INTENSITY;
  487. else if (sformat=="GRAYSCALE_ALPHA") format=Image::FORMAT_GRAYSCALE_ALPHA;
  488. else if (sformat=="RGB") format=Image::FORMAT_RGB;
  489. else if (sformat=="RGBA") format=Image::FORMAT_RGBA;
  490. else if (sformat=="INDEXED") format=Image::FORMAT_INDEXED;
  491. else if (sformat=="INDEXED_ALPHA") format=Image::FORMAT_INDEXED_ALPHA;
  492. else if (sformat=="BC1") format=Image::FORMAT_BC1;
  493. else if (sformat=="BC2") format=Image::FORMAT_BC2;
  494. else if (sformat=="BC3") format=Image::FORMAT_BC3;
  495. else if (sformat=="BC4") format=Image::FORMAT_BC4;
  496. else if (sformat=="BC5") format=Image::FORMAT_BC5;
  497. else if (sformat=="PVRTC2") format=Image::FORMAT_PVRTC2;
  498. else if (sformat=="PVRTC2_ALPHA") format=Image::FORMAT_PVRTC2_ALPHA;
  499. else if (sformat=="PVRTC4") format=Image::FORMAT_PVRTC4;
  500. else if (sformat=="PVRTC4_ALPHA") format=Image::FORMAT_PVRTC4_ALPHA;
  501. else if (sformat=="ATC") format=Image::FORMAT_ATC;
  502. else if (sformat=="ATC_ALPHA_EXPLICIT") format=Image::FORMAT_ATC_ALPHA_EXPLICIT;
  503. else if (sformat=="ATC_ALPHA_INTERPOLATED") format=Image::FORMAT_ATC_ALPHA_INTERPOLATED;
  504. else if (sformat=="CUSTOM") format=Image::FORMAT_CUSTOM;
  505. else {
  506. r_err_str="Invalid image format: '"+sformat+"'";
  507. return ERR_PARSE_ERROR;
  508. };
  509. int len = Image::get_image_data_size(width,height,format,mipmaps);
  510. DVector<uint8_t> buffer;
  511. buffer.resize(len);
  512. if (buffer.size()!=len) {
  513. r_err_str="Couldn't allocate image buffer of size: "+itos(len);
  514. }
  515. {
  516. DVector<uint8_t>::Write w=buffer.write();
  517. for(int i=0;i<len;i++) {
  518. if (token.type!=TK_COMMA) {
  519. r_err_str="Expected ','";
  520. return ERR_PARSE_ERROR;
  521. }
  522. if (token.type!=TK_NUMBER) {
  523. r_err_str="Expected number";
  524. return ERR_PARSE_ERROR;
  525. }
  526. w[i]=int(token.value);
  527. }
  528. }
  529. Image img(width,height,mipmaps,format,buffer);
  530. value=img;
  531. return OK;
  532. } else if (id=="NodePath") {
  533. get_token(p_stream,token,line,r_err_str);
  534. if (token.type!=TK_PARENTHESIS_OPEN) {
  535. r_err_str="Expected '('";
  536. return ERR_PARSE_ERROR;
  537. }
  538. get_token(p_stream,token,line,r_err_str);
  539. if (token.type!=TK_STRING) {
  540. r_err_str="Expected string as argument";
  541. return ERR_PARSE_ERROR;
  542. }
  543. value=NodePath(String(token.value));
  544. get_token(p_stream,token,line,r_err_str);
  545. if (token.type!=TK_PARENTHESIS_CLOSE) {
  546. r_err_str="Expected ')'";
  547. return ERR_PARSE_ERROR;
  548. }
  549. } else if (id=="RID") {
  550. get_token(p_stream,token,line,r_err_str);
  551. if (token.type!=TK_PARENTHESIS_OPEN) {
  552. r_err_str="Expected '('";
  553. return ERR_PARSE_ERROR;
  554. }
  555. get_token(p_stream,token,line,r_err_str);
  556. if (token.type!=TK_NUMBER) {
  557. r_err_str="Expected number as argument";
  558. return ERR_PARSE_ERROR;
  559. }
  560. value=token.value;
  561. get_token(p_stream,token,line,r_err_str);
  562. if (token.type!=TK_PARENTHESIS_CLOSE) {
  563. r_err_str="Expected ')'";
  564. return ERR_PARSE_ERROR;
  565. }
  566. return OK;
  567. } else if (id=="Resource") {
  568. get_token(p_stream,token,line,r_err_str);
  569. if (token.type!=TK_PARENTHESIS_OPEN) {
  570. r_err_str="Expected '('";
  571. return ERR_PARSE_ERROR;
  572. }
  573. get_token(p_stream,token,line,r_err_str);
  574. if (token.type==TK_STRING) {
  575. String path=token.value;
  576. RES res = ResourceLoader::load(path);
  577. if (res.is_null()) {
  578. r_err_str="Can't load resource at path: '"+path+"'.";
  579. return ERR_PARSE_ERROR;
  580. }
  581. get_token(p_stream,token,line,r_err_str);
  582. if (token.type!=TK_PARENTHESIS_CLOSE) {
  583. r_err_str="Expected ')'";
  584. return ERR_PARSE_ERROR;
  585. }
  586. value=res;
  587. return OK;
  588. } else if (p_res_parser && p_res_parser->func){
  589. RES res;
  590. Error err = p_res_parser->func(p_res_parser->userdata,p_stream,res,line,r_err_str);
  591. if (err)
  592. return err;
  593. value=res;
  594. return OK;
  595. } else {
  596. r_err_str="Expected string as argument.";
  597. return ERR_PARSE_ERROR;
  598. }
  599. return OK;
  600. } else if (id=="InputEvent") {
  601. get_token(p_stream,token,line,r_err_str);
  602. if (token.type!=TK_PARENTHESIS_OPEN) {
  603. r_err_str="Expected '('";
  604. return ERR_PARSE_ERROR;
  605. }
  606. get_token(p_stream,token,line,r_err_str);
  607. if (token.type!=TK_IDENTIFIER) {
  608. r_err_str="Expected identifier";
  609. return ERR_PARSE_ERROR;
  610. }
  611. String id = token.value;
  612. InputEvent ie;
  613. if (id=="KEY") {
  614. get_token(p_stream,token,line,r_err_str);
  615. if (token.type!=TK_COMMA) {
  616. r_err_str="Expected ','";
  617. return ERR_PARSE_ERROR;
  618. }
  619. ie.type=InputEvent::KEY;
  620. get_token(p_stream,token,line,r_err_str);
  621. if (token.type==TK_IDENTIFIER) {
  622. String name=token.value;
  623. ie.key.scancode=find_keycode(name);
  624. } else if (token.type==TK_NUMBER) {
  625. ie.key.scancode=token.value;
  626. } else {
  627. r_err_str="Expected string or integer for keycode";
  628. return ERR_PARSE_ERROR;
  629. }
  630. get_token(p_stream,token,line,r_err_str);
  631. if (token.type==TK_COMMA) {
  632. get_token(p_stream,token,line,r_err_str);
  633. if (token.type!=TK_IDENTIFIER) {
  634. r_err_str="Expected identifier with modifier flas";
  635. return ERR_PARSE_ERROR;
  636. }
  637. String mods=token.value;
  638. if (mods.findn("C")!=-1)
  639. ie.key.mod.control=true;
  640. if (mods.findn("A")!=-1)
  641. ie.key.mod.alt=true;
  642. if (mods.findn("S")!=-1)
  643. ie.key.mod.shift=true;
  644. if (mods.findn("M")!=-1)
  645. ie.key.mod.meta=true;
  646. get_token(p_stream,token,line,r_err_str);
  647. if (token.type!=TK_PARENTHESIS_CLOSE) {
  648. r_err_str="Expected ')'";
  649. return ERR_PARSE_ERROR;
  650. }
  651. } else if (token.type!=TK_PARENTHESIS_CLOSE) {
  652. r_err_str="Expected ')' or modifier flags.";
  653. return ERR_PARSE_ERROR;
  654. }
  655. } else if (id=="MBUTTON") {
  656. get_token(p_stream,token,line,r_err_str);
  657. if (token.type!=TK_COMMA) {
  658. r_err_str="Expected ','";
  659. return ERR_PARSE_ERROR;
  660. }
  661. ie.type=InputEvent::MOUSE_BUTTON;
  662. get_token(p_stream,token,line,r_err_str);
  663. if (token.type!=TK_NUMBER) {
  664. r_err_str="Expected button index";
  665. return ERR_PARSE_ERROR;
  666. }
  667. ie.mouse_button.button_index = token.value;
  668. get_token(p_stream,token,line,r_err_str);
  669. if (token.type!=TK_PARENTHESIS_CLOSE) {
  670. r_err_str="Expected ')'";
  671. return ERR_PARSE_ERROR;
  672. }
  673. } else if (id=="JBUTTON") {
  674. get_token(p_stream,token,line,r_err_str);
  675. if (token.type!=TK_COMMA) {
  676. r_err_str="Expected ','";
  677. return ERR_PARSE_ERROR;
  678. }
  679. ie.type=InputEvent::JOYSTICK_BUTTON;
  680. get_token(p_stream,token,line,r_err_str);
  681. if (token.type!=TK_NUMBER) {
  682. r_err_str="Expected button index";
  683. return ERR_PARSE_ERROR;
  684. }
  685. ie.joy_button.button_index = token.value;
  686. get_token(p_stream,token,line,r_err_str);
  687. if (token.type!=TK_PARENTHESIS_CLOSE) {
  688. r_err_str="Expected ')'";
  689. return ERR_PARSE_ERROR;
  690. }
  691. } else if (id=="JAXIS") {
  692. get_token(p_stream,token,line,r_err_str);
  693. if (token.type!=TK_COMMA) {
  694. r_err_str="Expected ','";
  695. return ERR_PARSE_ERROR;
  696. }
  697. ie.type=InputEvent::JOYSTICK_MOTION;
  698. get_token(p_stream,token,line,r_err_str);
  699. if (token.type!=TK_NUMBER) {
  700. r_err_str="Expected axis index";
  701. return ERR_PARSE_ERROR;
  702. }
  703. ie.joy_motion.axis = token.value;
  704. get_token(p_stream,token,line,r_err_str);
  705. if (token.type!=TK_PARENTHESIS_CLOSE) {
  706. r_err_str="Expected ')'";
  707. return ERR_PARSE_ERROR;
  708. }
  709. } else {
  710. r_err_str="Invalid input event type.";
  711. return ERR_PARSE_ERROR;
  712. }
  713. value=ie;
  714. return OK;
  715. } else if (id=="ByteArray") {
  716. Vector<float> args;
  717. Error err = _parse_construct(p_stream,args,line,r_err_str);
  718. if (err)
  719. return err;
  720. DVector<uint8_t> arr;
  721. {
  722. int len=args.size();
  723. arr.resize(len);
  724. DVector<uint8_t>::Write w = arr.write();
  725. for(int i=0;i<len;i++) {
  726. w[i]=args[i];
  727. }
  728. }
  729. value=arr;
  730. return OK;
  731. } else if (id=="IntArray") {
  732. Vector<float> args;
  733. Error err = _parse_construct(p_stream,args,line,r_err_str);
  734. if (err)
  735. return err;
  736. DVector<int32_t> arr;
  737. {
  738. int len=args.size();
  739. arr.resize(len);
  740. DVector<int32_t>::Write w = arr.write();
  741. for(int i=0;i<len;i++) {
  742. w[i]=Math::fast_ftoi(args[i]);
  743. }
  744. }
  745. value=arr;
  746. return OK;
  747. } else if (id=="FloatArray") {
  748. Vector<float> args;
  749. Error err = _parse_construct(p_stream,args,line,r_err_str);
  750. if (err)
  751. return err;
  752. DVector<float> arr;
  753. {
  754. int len=args.size();
  755. arr.resize(len);
  756. DVector<float>::Write w = arr.write();
  757. for(int i=0;i<len;i++) {
  758. w[i]=args[i];
  759. }
  760. }
  761. value=arr;
  762. return OK;
  763. } else if (id=="StringArray") {
  764. get_token(p_stream,token,line,r_err_str);
  765. if (token.type!=TK_PARENTHESIS_OPEN) {
  766. r_err_str="Expected '('";
  767. return ERR_PARSE_ERROR;
  768. }
  769. Vector<String> cs;
  770. bool first=true;
  771. while(true) {
  772. if (!first) {
  773. get_token(p_stream,token,line,r_err_str);
  774. if (token.type==TK_COMMA) {
  775. //do none
  776. } else if (token.type!=TK_PARENTHESIS_CLOSE) {
  777. break;
  778. } else {
  779. r_err_str="Expected ',' or ')'";
  780. return ERR_PARSE_ERROR;
  781. }
  782. }
  783. get_token(p_stream,token,line,r_err_str);
  784. if (token.type!=TK_STRING) {
  785. r_err_str="Expected string";
  786. return ERR_PARSE_ERROR;
  787. }
  788. cs.push_back(token.value);
  789. }
  790. DVector<String> arr;
  791. {
  792. int len=cs.size();
  793. arr.resize(len);
  794. DVector<String>::Write w = arr.write();
  795. for(int i=0;i<len;i++) {
  796. w[i]=cs[i];
  797. }
  798. }
  799. value=arr;
  800. return OK;
  801. } else if (id=="Vector2Array") {
  802. Vector<float> args;
  803. Error err = _parse_construct(p_stream,args,line,r_err_str);
  804. if (err)
  805. return err;
  806. DVector<Vector2> arr;
  807. {
  808. int len=args.size()/2;
  809. arr.resize(len);
  810. DVector<Vector2>::Write w = arr.write();
  811. for(int i=0;i<len;i++) {
  812. w[i]=Vector2(args[i*2+0],args[i*2+1]);
  813. }
  814. }
  815. value=arr;
  816. return OK;
  817. } else if (id=="Vector3Array") {
  818. Vector<float> args;
  819. Error err = _parse_construct(p_stream,args,line,r_err_str);
  820. if (err)
  821. return err;
  822. DVector<Vector3> arr;
  823. {
  824. int len=args.size()/3;
  825. arr.resize(len);
  826. DVector<Vector3>::Write w = arr.write();
  827. for(int i=0;i<len;i++) {
  828. w[i]=Vector3(args[i*3+0],args[i*3+1],args[i*3+2]);
  829. }
  830. }
  831. value=arr;
  832. return OK;
  833. } else if (id=="ColorArray") {
  834. Vector<float> args;
  835. Error err = _parse_construct(p_stream,args,line,r_err_str);
  836. if (err)
  837. return err;
  838. DVector<Color> arr;
  839. {
  840. int len=args.size()/4;
  841. arr.resize(len);
  842. DVector<Color>::Write w = arr.write();
  843. for(int i=0;i<len;i++) {
  844. w[i]=Color(args[i*3+0],args[i*3+1],args[i*3+2],args[i*3+3]);
  845. }
  846. }
  847. value=arr;
  848. return OK;
  849. } else {
  850. r_err_str="Unexpected identifier: '"+id+"'.";
  851. return ERR_PARSE_ERROR;
  852. }
  853. /*
  854. VECTOR2, // 5
  855. RECT2,
  856. VECTOR3,
  857. MATRIX32,
  858. PLANE,
  859. QUAT, // 10
  860. _AABB, //sorry naming convention fail :( not like it's used often
  861. MATRIX3,
  862. TRANSFORM,
  863. // misc types
  864. COLOR,
  865. IMAGE, // 15
  866. NODE_PATH,
  867. _RID,
  868. OBJECT,
  869. INPUT_EVENT,
  870. DICTIONARY, // 20
  871. ARRAY,
  872. // arrays
  873. RAW_ARRAY,
  874. INT_ARRAY,
  875. REAL_ARRAY,
  876. STRING_ARRAY, // 25
  877. VECTOR2_ARRAY,
  878. VECTOR3_ARRAY,
  879. COLOR_ARRAY,
  880. VARIANT_MAX
  881. */
  882. return OK;
  883. } else if (token.type==TK_NUMBER) {
  884. value=token.value;
  885. return OK;
  886. } else if (token.type==TK_STRING) {
  887. value=token.value;
  888. return OK;
  889. } else {
  890. r_err_str="Expected value, got "+String(tk_name[token.type])+".";
  891. return ERR_PARSE_ERROR;
  892. }
  893. return ERR_PARSE_ERROR;
  894. }
  895. Error VariantParser::_parse_array(Array &array, Stream *p_stream, int &line, String &r_err_str, ResourceParser *p_res_parser) {
  896. Token token;
  897. bool need_comma=false;
  898. while(!p_stream->is_eof()) {
  899. Error err = get_token(p_stream,token,line,r_err_str);
  900. if (err!=OK)
  901. return err;
  902. if (token.type==TK_BRACKET_CLOSE) {
  903. return OK;
  904. }
  905. if (need_comma) {
  906. if (token.type!=TK_COMMA) {
  907. r_err_str="Expected ','";
  908. return ERR_PARSE_ERROR;
  909. } else {
  910. need_comma=false;
  911. continue;
  912. }
  913. }
  914. Variant v;
  915. err = parse_value(token,v,p_stream,line,r_err_str,p_res_parser);
  916. if (err)
  917. return err;
  918. array.push_back(v);
  919. need_comma=true;
  920. }
  921. return OK;
  922. }
  923. Error VariantParser::_parse_dictionary(Dictionary &object, Stream *p_stream, int &line, String &r_err_str, ResourceParser *p_res_parser) {
  924. bool at_key=true;
  925. Variant key;
  926. Token token;
  927. bool need_comma=false;
  928. while(!p_stream->is_eof()) {
  929. if (at_key) {
  930. Error err = get_token(p_stream,token,line,r_err_str);
  931. if (err!=OK)
  932. return err;
  933. if (token.type==TK_CURLY_BRACKET_CLOSE) {
  934. return OK;
  935. }
  936. if (need_comma) {
  937. if (token.type!=TK_COMMA) {
  938. r_err_str="Expected '}' or ','";
  939. return ERR_PARSE_ERROR;
  940. } else {
  941. need_comma=false;
  942. continue;
  943. }
  944. }
  945. err = parse_value(token,key,p_stream,line,r_err_str,p_res_parser);
  946. if (err)
  947. return err;
  948. err = get_token(p_stream,token,line,r_err_str);
  949. if (err!=OK)
  950. return err;
  951. if (token.type!=TK_COLON) {
  952. r_err_str="Expected ':'";
  953. return ERR_PARSE_ERROR;
  954. }
  955. at_key=false;
  956. } else {
  957. Error err = get_token(p_stream,token,line,r_err_str);
  958. if (err!=OK)
  959. return err;
  960. Variant v;
  961. err = parse_value(token,v,p_stream,line,r_err_str,p_res_parser);
  962. if (err)
  963. return err;
  964. object[key]=v;
  965. need_comma=true;
  966. at_key=true;
  967. }
  968. }
  969. return OK;
  970. }
  971. Error VariantParser::_parse_tag(Token& token,Stream *p_stream, int &line, String &r_err_str,Tag& r_tag) {
  972. r_tag.fields.clear();
  973. if (token.type!=TK_BRACKET_OPEN) {
  974. r_err_str="Expected '['";
  975. return ERR_PARSE_ERROR;
  976. }
  977. get_token(p_stream,token,line,r_err_str);
  978. if (token.type!=TK_IDENTIFIER) {
  979. r_err_str="Expected identifier (tag name)";
  980. return ERR_PARSE_ERROR;
  981. }
  982. r_tag.name=token.value;
  983. print_line("tag name: "+r_tag.name);
  984. while(true) {
  985. get_token(p_stream,token,line,r_err_str);
  986. if (token.type==TK_BRACKET_CLOSE)
  987. break;
  988. if (token.type!=TK_IDENTIFIER) {
  989. r_err_str="Expected Identifier";
  990. return ERR_PARSE_ERROR;
  991. }
  992. String id=token.value;
  993. print_line("got ID: "+id);
  994. get_token(p_stream,token,line,r_err_str);
  995. if (token.type!=TK_EQUAL) {
  996. r_err_str="Expected '='";
  997. return ERR_PARSE_ERROR;
  998. }
  999. print_line("got tk: "+String(tk_name[token.type]));
  1000. get_token(p_stream,token,line,r_err_str);
  1001. Variant value;
  1002. Error err = parse_value(token,value,p_stream,line,r_err_str);
  1003. if (err)
  1004. return err;
  1005. print_line("id: "+id+" value: "+String(value));
  1006. r_tag.fields[id]=value;
  1007. }
  1008. return OK;
  1009. }
  1010. Error VariantParser::parse_tag(Stream *p_stream, int &line, String &r_err_str,Tag& r_tag) {
  1011. Token token;
  1012. get_token(p_stream,token,line,r_err_str);
  1013. if (token.type!=TK_BRACKET_OPEN) {
  1014. r_err_str="Expected '['";
  1015. return ERR_PARSE_ERROR;
  1016. }
  1017. return _parse_tag(token,p_stream,line,r_err_str,r_tag);
  1018. }
  1019. Error VariantParser::parse_tag_assign_eof(Stream *p_stream, int &line, String &r_err_str,Tag& r_tag,String &r_assign) {
  1020. r_tag.name.clear();
  1021. r_assign=String();
  1022. return OK;
  1023. }
  1024. Error VariantParser::parse(Stream *p_stream, Variant& r_ret, String &r_err_str, int &r_err_line, ResourceParser *p_res_parser) {
  1025. Token token;
  1026. Error err = get_token(p_stream,token,r_err_line,r_err_str);
  1027. if (err)
  1028. return err;
  1029. return parse_value(token,r_ret,p_stream,r_err_line,r_err_str,p_res_parser);
  1030. }