/source_maker/include/function_generation.php

https://bitbucket.org/lordgnu/wxphp · PHP · 1080 lines · 888 code · 132 blank · 60 comment · 54 complexity · a319effc234f32170e4b94f0d8d0fdb6 MD5 · raw file

  1. <?php
  2. /**
  3. * @author Jefferson González
  4. *
  5. * @license
  6. * This file is part of wxPHP check the LICENSE file for information.
  7. *
  8. * @description
  9. * Functions to assist on the generation of code to wrap the wxWidgets
  10. * class methods and global functions.
  11. *
  12. */
  13. /**
  14. * Generates the parameters list code for a given class method or
  15. * function including its overloads
  16. *
  17. * @param array $method_definitions Data for the method or function.
  18. * @param string $method_name Name of the function.
  19. * @param string $class_name Name of the parent class if applicable.
  20. *
  21. * @return string Generated code ready to insert on the beginning
  22. * of the PHP_METHOD or PHP_FUNCTION body
  23. */
  24. function function_parameters($method_definitions, $method_name, $class_name=null)
  25. {
  26. //Positions on the array of function_data where parameters data is stored
  27. $parameter_types = "parameters_type";
  28. $parameter_names = "parameters_name";
  29. $parameter_values = "parameters_default_value";
  30. $parameters = "";
  31. foreach($method_definitions as $declaration_index=>$declaration)
  32. {
  33. $parameters .= "//Parameters for overload $declaration_index\n\t";
  34. foreach($declaration[$parameter_types] as $parameter_index=>$parameter_type)
  35. {
  36. $parameter_is_array = $declaration["parameters_is_array"][$parameter_index];
  37. $declaration_modifier = "";
  38. $standard_parameter_type = parameter_type($parameter_type, $parameter_is_array, $method_name, $class_name, $declaration_modifier);
  39. switch($standard_parameter_type)
  40. {
  41. case "bool":
  42. {
  43. switch($declaration_modifier)
  44. {
  45. case "pointer": //bool*
  46. $parameters .= "bool* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  47. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  48. break;
  49. case "const_pointer": //const bool* Array
  50. $parameters .= "zval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  51. break;
  52. case "reference": //bool&
  53. $parameters .= "bool " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  54. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  55. break;
  56. case "const_reference": //const bool&
  57. case "none": //bool
  58. case "const_none": //const bool
  59. $parameters .= "bool " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  60. break;
  61. }
  62. break;
  63. }
  64. case "integer":
  65. case "class_enum":
  66. case "global_enum":
  67. {
  68. switch($declaration_modifier)
  69. {
  70. case "pointer": //long*
  71. $parameters .= "long* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  72. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  73. break;
  74. case "const_pointer": //const long* Array
  75. $parameters .= "zval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  76. break;
  77. case "reference": //long&
  78. $parameters .= "long " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  79. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  80. break;
  81. case "const_reference": //const long&
  82. case "none": //long
  83. case "const_none": //const long
  84. $parameters .= "long " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  85. break;
  86. }
  87. break;
  88. }
  89. case "float":
  90. {
  91. switch($declaration_modifier)
  92. {
  93. case "pointer": //double*
  94. $parameters .= "double* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  95. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  96. break;
  97. case "const_pointer": //const double* Array
  98. $parameters .= "zval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  99. break;
  100. case "reference": //double&
  101. $parameters .= "double " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  102. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  103. break;
  104. case "const_reference": //const double&
  105. case "none": //double
  106. case "const_none": //const double
  107. $parameters .= "double " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  108. break;
  109. }
  110. break;
  111. }
  112. case "characters":
  113. {
  114. switch($declaration_modifier)
  115. {
  116. case "pointer": //char* with reference
  117. $parameters .= "char* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  118. $parameters .= "\tlong " . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ";\n";
  119. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  120. break;
  121. case "const_pointer": //const char*
  122. $parameters .= "char* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  123. $parameters .= "\tlong " . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ";\n";
  124. break;
  125. case "reference": //char&
  126. $parameters .= "\tlong " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  127. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  128. break;
  129. case "const_reference": //const char&
  130. case "none": //char
  131. case "const_none": //const char
  132. $parameters .= "long " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  133. break;
  134. }
  135. break;
  136. }
  137. case "void":
  138. {
  139. switch($declaration_modifier)
  140. {
  141. case "const_pointer_pointer": //const void**
  142. case "pointer_pointer":
  143. case "const_pointer": //const void*
  144. case "pointer": //void*
  145. $parameters .= "char* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  146. $parameters .= "\tlong " . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ";\n";
  147. if($declaration_modifier == "pointer" || $declaration_modifier == "pointer_pointer")
  148. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  149. break;
  150. }
  151. break;
  152. }
  153. case "date":
  154. {
  155. switch($declaration_modifier)
  156. {
  157. case "pointer": //long*
  158. $parameters .= "long " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  159. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  160. break;
  161. case "const_pointer": //const long* Array
  162. $parameters .= "zval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  163. break;
  164. case "reference": //long&
  165. $parameters .= "long " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  166. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  167. break;
  168. case "const_reference": //const long&
  169. case "none": //long
  170. case "const_none": //const long
  171. $parameters .= "long " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  172. break;
  173. }
  174. break;
  175. }
  176. case "string":
  177. {
  178. switch($declaration_modifier)
  179. {
  180. case "pointer": //wxString*
  181. $parameters .= "char* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  182. $parameters .= "\tlong " . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ";\n";
  183. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  184. break;
  185. case "const_pointer": //const wxString* Array
  186. case "const_reference_array": //const wxString&[]
  187. case "const_none_array": //const wxString[]
  188. case "none_array": //wxString[]
  189. $parameters .= "zval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  190. break;
  191. case "reference": //wxString&
  192. $parameters .= "char* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  193. $parameters .= "\tlong " . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ";\n";
  194. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  195. break;
  196. case "const_reference": //const wxString&
  197. case "none": //wxString
  198. case "const_none": //const wxString
  199. $parameters .= "char* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . ";\n";
  200. $parameters .= "\tlong " . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ";\n";
  201. break;
  202. }
  203. break;
  204. }
  205. case "strings_array":
  206. {
  207. switch($declaration_modifier)
  208. {
  209. case "pointer": //wxArrayString*
  210. die("Unhandled wxArrayString*");
  211. break;
  212. case "const_pointer": //const wxArrayString* Array
  213. die("Unhandled const wxArrayString*");
  214. break;
  215. case "reference": //wxArrayString&
  216. $parameters .= "zval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . " = 0;\n";
  217. $parameters .= "\tzval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref;\n";
  218. break;
  219. case "const_reference": //const wxArrayString&
  220. case "none": //wxArrayString
  221. case "const_none": //const wxArrayString
  222. $parameters .= "zval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . " = 0;\n";
  223. break;
  224. }
  225. break;
  226. }
  227. case "object":
  228. {
  229. $parameters .= "zval* " . $declaration[$parameter_names][$parameter_index] . $declaration_index . " = 0;\n";
  230. $parameters .= "\tvoid* object_pointer{$declaration_index}_{$parameter_index} = 0;\n";
  231. break;
  232. }
  233. default:
  234. ob_clean();
  235. die("Unhandled type " . parameter_type($parameter_type, $parameter_is_array, $method_name, $class_name) . " on class '$class_name' at method '$method_name'\n");
  236. }
  237. $parameters .= "\t";
  238. }
  239. $parameters .= "bool overload{$declaration_index}_called = false;\n\t";
  240. }
  241. return $parameters;
  242. }
  243. /**
  244. * Generates the code that checks which of the method
  245. * or function overloads was called
  246. *
  247. * @param array $method_definitions Data for the function.
  248. * @param string $method_name Name of the function.
  249. * @param string $class_name Name of the parent class if applicable.
  250. *
  251. * @return string Generated code ready to insert on the middle of
  252. * the PHP_METHOD or PHP_FUNCTION body after the generated code of
  253. * function_parameters()
  254. */
  255. function function_called_overload($method_definitions, $method_name, $class_name=null)
  256. {
  257. //Positions on the array of function_data where parameters data is stored
  258. $parameter_types = "parameters_type";
  259. $parameter_names = "parameters_name";
  260. $parameter_required = "parameters_required";
  261. $parameter_values = "parameters_default_value";
  262. $called_overload = "";
  263. $declarations_count = count($method_definitions);
  264. foreach($method_definitions as $declaration_index=>$declaration)
  265. {
  266. $object_retrieve_code = "";
  267. $required_parameters = count($declaration[$parameter_required]);
  268. $parameters_count = count($declaration[$parameter_types]);
  269. $clause = $required_parameters == $parameters_count ? "arguments_received == $required_parameters" : "arguments_received >= $required_parameters && arguments_received <= $parameters_count";
  270. $called_overload .= "//Overload $declaration_index\n";
  271. $called_overload .= "\toverload$declaration_index:\n";
  272. $called_overload .= "\tif(!already_called && $clause)\n";
  273. $called_overload .= "\t{\n";
  274. $zend_parse_parameters = "";
  275. $zend_parse_parameters_string = "";
  276. $references_found = false;
  277. $references_parameters_string = "";
  278. $references_parameters = "";
  279. for($parameter_index=0; $parameter_index<$parameters_count; $parameter_index++)
  280. {
  281. //Check if all parameters are optional
  282. if($required_parameters == 0 && $parameters_count > 0 && $parameter_index == 0)
  283. {
  284. $zend_parse_parameters_string .= "|";
  285. $references_parameters_string .= "|";
  286. }
  287. $references_parameters_string .= "z";
  288. $parameter_is_array = $declaration["parameters_is_array"][$parameter_index];
  289. $declaration_modifier = "";
  290. $standard_parameter_type = parameter_type($declaration[$parameter_types][$parameter_index], $parameter_is_array, $method_name, $class_name, $declaration_modifier);
  291. $argument_parameter_type = str_replace(array("const ", "*", "&"), "", $declaration[$parameter_types][$parameter_index]);
  292. switch($standard_parameter_type)
  293. {
  294. case "bool":
  295. {
  296. switch($declaration_modifier)
  297. {
  298. case "pointer": //bool*
  299. $zend_parse_parameters_string .= "b";
  300. $zend_parse_parameters .= $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  301. $references_found = true;
  302. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  303. break;
  304. case "const_pointer": //const bool* Array
  305. $zend_parse_parameters_string .= "a";
  306. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  307. $references_parameters .= "&dummy, ";
  308. break;
  309. case "reference": //bool&
  310. $zend_parse_parameters_string .= "b";
  311. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  312. $references_found = true;
  313. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  314. break;
  315. case "const_reference": //const bool&
  316. case "none": //bool
  317. case "const_none": //const bool
  318. $zend_parse_parameters_string .= "b";
  319. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  320. $references_parameters .= "&dummy, ";
  321. break;
  322. }
  323. break;
  324. }
  325. case "integer":
  326. case "class_enum":
  327. case "global_enum":
  328. {
  329. switch($declaration_modifier)
  330. {
  331. case "pointer": //long*
  332. $zend_parse_parameters_string .= "l";
  333. $zend_parse_parameters .= $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  334. $references_found = true;
  335. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  336. break;
  337. case "const_pointer": //const long* Array
  338. $zend_parse_parameters_string .= "a";
  339. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  340. $references_parameters .= "&dummy, ";
  341. break;
  342. case "reference": //long&
  343. $zend_parse_parameters_string .= "l";
  344. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  345. $references_found = true;
  346. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  347. break;
  348. case "const_reference": //const long&
  349. case "none": //long
  350. case "const_none": //const long
  351. $zend_parse_parameters_string .= "l";
  352. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  353. $references_parameters .= "&dummy, ";
  354. break;
  355. }
  356. break;
  357. }
  358. case "float":
  359. {
  360. switch($declaration_modifier)
  361. {
  362. case "pointer": //double*
  363. $zend_parse_parameters_string .= "d";
  364. $zend_parse_parameters .= $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  365. $references_found = true;
  366. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  367. break;
  368. case "const_pointer": //const double* Array
  369. $zend_parse_parameters_string .= "a";
  370. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  371. $references_parameters .= "&dummy, ";
  372. break;
  373. case "reference": //double&
  374. $zend_parse_parameters_string .= "d";
  375. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  376. $references_found = true;
  377. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  378. break;
  379. case "const_reference": //const double&
  380. case "none": //bool
  381. case "const_none": //const double
  382. $zend_parse_parameters_string .= "d";
  383. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  384. $references_parameters .= "&dummy, ";
  385. break;
  386. }
  387. break;
  388. }
  389. case "characters":
  390. {
  391. switch($declaration_modifier)
  392. {
  393. case "pointer": //char*
  394. $zend_parse_parameters_string .= "s";
  395. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  396. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ", ";
  397. $references_found = true;
  398. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  399. break;
  400. case "const_pointer": //const char*
  401. $zend_parse_parameters_string .= "s";
  402. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  403. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ", ";
  404. $references_parameters .= "&dummy, ";
  405. break;
  406. case "reference": //char&
  407. $zend_parse_parameters_string .= "l";
  408. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  409. $references_found = true;
  410. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  411. break;
  412. case "const_reference": //const char&
  413. case "none": //char
  414. case "const_none": //const char
  415. $zend_parse_parameters_string .= "l";
  416. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  417. $references_parameters .= "&dummy, ";
  418. break;
  419. }
  420. break;
  421. }
  422. case "void":
  423. {
  424. switch($declaration_modifier)
  425. {
  426. case "pointer": //void*
  427. case "pointer_pointer": //void**
  428. $zend_parse_parameters_string .= "s";
  429. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  430. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ", ";
  431. $references_found = true;
  432. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  433. break;
  434. case "const_pointer": //const void*
  435. case "const_pointer_pointer": //const void**
  436. $zend_parse_parameters_string .= "s";
  437. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  438. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ", ";
  439. $references_parameters .= "&dummy, ";
  440. break;
  441. }
  442. break;
  443. }
  444. case "date":
  445. {
  446. switch($declaration_modifier)
  447. {
  448. case "pointer": //long*
  449. $zend_parse_parameters_string .= "l";
  450. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  451. $references_found = true;
  452. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  453. break;
  454. case "const_pointer": //const long* Array
  455. $zend_parse_parameters_string .= "a";
  456. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  457. $references_parameters .= "&dummy, ";
  458. break;
  459. case "reference": //long&
  460. $zend_parse_parameters_string .= "l";
  461. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  462. $references_found = true;
  463. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  464. break;
  465. case "const_reference": //const long&
  466. case "none": //long
  467. case "const_none": //const long
  468. $zend_parse_parameters_string .= "l";
  469. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  470. $references_parameters .= "&dummy, ";
  471. break;
  472. }
  473. break;
  474. }
  475. case "string":
  476. {
  477. switch($declaration_modifier)
  478. {
  479. case "pointer": //wxString*
  480. $zend_parse_parameters_string .= "s";
  481. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  482. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ", ";
  483. $references_found = true;
  484. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  485. break;
  486. case "const_pointer": //const wxString* array
  487. case "const_reference_array": //const wxString&[]
  488. case "const_none_array": //const wxString[]
  489. case "none_array": //wxString[]
  490. $zend_parse_parameters_string .= "a";
  491. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  492. $references_parameters .= "&dummy, ";
  493. break;
  494. case "reference": //wxString&
  495. $zend_parse_parameters_string .= "s";
  496. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  497. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ", ";
  498. $references_found = true;
  499. $references_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref, ";
  500. break;
  501. case "const_reference": //const wxString&
  502. case "none": //wxString
  503. case "const_none": //const wxString
  504. $zend_parse_parameters_string .= "s";
  505. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  506. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . "_len" . $declaration_index . ", ";
  507. $references_parameters .= "&dummy, ";
  508. break;
  509. }
  510. break;
  511. }
  512. case "strings_array":
  513. {
  514. //wxArrayString
  515. $zend_parse_parameters_string .= "a";
  516. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  517. $references_parameters .= "&dummy, ";
  518. break;
  519. }
  520. case "object":
  521. {
  522. $zend_parse_parameters .= "&" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ", ";
  523. $references_parameters .= "&dummy, ";
  524. $typeVerifierStr = array();
  525. if($declaration_modifier == "pointer" || $declaration_modifier == "const_pointer" || $declaration_modifier == "const_pointer_pointer")
  526. {
  527. $zend_parse_parameters_string .= "z";
  528. $typeVerifier = derivationsOfClass($argument_parameter_type);
  529. foreach($typeVerifier as $argument_parent_class => $v)
  530. {
  531. $typeVerifierStr[] = "rsrc_type != le_".$argument_parent_class;
  532. }
  533. $typeVerifierStr = trim(join(" && ", $typeVerifierStr));
  534. }
  535. else
  536. {
  537. $zend_parse_parameters_string .= "O";
  538. $zend_parse_parameters .= "php_{$argument_parameter_type}_entry" . ", ";
  539. }
  540. $object_retrieve_code .= "\t\t\tif(arguments_received >= ".($parameter_index+1)."){\n";
  541. $object_retrieve_code .= "\t\t\t\tif(Z_TYPE_P(".$declaration[$parameter_names][$parameter_index] . $declaration_index.") == IS_OBJECT && zend_hash_find(Z_OBJPROP_P(".$declaration[$parameter_names][$parameter_index] . $declaration_index."), _wxResource , sizeof(_wxResource), (void **)&tmp) == SUCCESS)\n";
  542. $object_retrieve_code .= "\t\t\t\t{\n";
  543. $object_retrieve_code .= "\t\t\t\t\tid_to_find = Z_RESVAL_P(*tmp);\n";
  544. $object_retrieve_code .= "\t\t\t\t\tobject_pointer{$declaration_index}_{$parameter_index} = zend_list_find(id_to_find, &rsrc_type);\n";
  545. $object_retrieve_code .= "\t\t\t\t\tif (!object_pointer{$declaration_index}_{$parameter_index} ";
  546. if(trim($typeVerifierStr) != "")
  547. {
  548. $object_retrieve_code .= "|| ($typeVerifierStr)";
  549. }
  550. $object_retrieve_code .= ")\n";
  551. $object_retrieve_code .= "\t\t\t\t\t{\n";
  552. if(($declaration_index+1) != $declarations_count && $declarations_count > 1)
  553. {
  554. $object_retrieve_code .= "\t\t\t\t\t\tgoto overload".($declaration_index+1).";\n";
  555. }
  556. else
  557. {
  558. $object_retrieve_code .= "\t\t\t\t\t\tzend_error(E_ERROR, \"Parameter $paramenter_index could not be retreived correctly.\");\n";
  559. }
  560. $object_retrieve_code .= "\t\t\t\t\t}\n";
  561. $object_retrieve_code .= "\t\t\t\t}\n";
  562. $object_retrieve_code .= "\t\t\t\telse if(Z_TYPE_P(".$declaration[$parameter_names][$parameter_index] . $declaration_index.") != IS_NULL)\n";
  563. $object_retrieve_code .= "\t\t\t\t{\n";
  564. if(($declaration_index+1) != $declarations_count && $declarations_count > 1)
  565. {
  566. $object_retrieve_code .= "\t\t\t\t\t\tgoto overload".($declaration_index+1).";\n";
  567. }
  568. else
  569. {
  570. $object_retrieve_code .= "\t\t\t\t\t\tzend_error(E_ERROR, \"Parameter $paramenter_index could not be retreived correctly.\");\n";
  571. }
  572. $object_retrieve_code .= "\t\t\t\t}\n";
  573. $object_retrieve_code .= "\t\t\t}\n\n";
  574. break;
  575. }
  576. }
  577. //Check if all other parameters are optional
  578. if($parameter_index == $required_parameters-1 && $required_parameters > 0 && $parameters_count > 1 && $required_parameters != $parameters_count)
  579. {
  580. $zend_parse_parameters_string .= "|";
  581. $references_parameters_string .= "|";
  582. }
  583. }
  584. $called_overload .= "\t\t#ifdef USE_WXPHP_DEBUG\n";
  585. $called_overload .= "\t\tphp_printf(\"Parameters received %d\\n\", arguments_received);\n";
  586. $called_overload .= "\t\tphp_printf(\"Parsing parameters with '$zend_parse_parameters_string' (".trim($zend_parse_parameters, ", ").")\\n\");\n";
  587. $called_overload .= "\t\t#endif\n";
  588. if($required_parameters == 0 && $parameters_count < 1)
  589. {
  590. $called_overload .= "\t\toverload{$declaration_index}_called = true;\n";
  591. $called_overload .= "\t\talready_called = true;\n";
  592. }
  593. else
  594. {
  595. $called_overload .= "\t\tchar parse_parameters_string[] = \"$zend_parse_parameters_string\";\n";
  596. $called_overload .= "\t\tif(zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, arguments_received TSRMLS_CC, parse_parameters_string, ".trim($zend_parse_parameters, ", ")." ) == SUCCESS)\n";
  597. $called_overload .= "\t\t{\n";
  598. $called_overload .= $object_retrieve_code;
  599. $called_overload .= "\t\t\toverload{$declaration_index}_called = true;\n";
  600. $called_overload .= "\t\t\talready_called = true;\n";
  601. //Just get variables not originally parsed as zvals since they are references
  602. if($references_found)
  603. {
  604. $called_overload .= "\n\t\t\tchar parse_references_string[] = \"$references_parameters_string\";\n";
  605. $called_overload .= "\t\t\tzend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, arguments_received TSRMLS_CC, parse_references_string, ".trim($references_parameters, ", ")." );\n";
  606. }
  607. $called_overload .= "\t\t}\n";
  608. }
  609. $called_overload .= "\t}\n";
  610. $called_overload .= "\n\t";
  611. }
  612. return $called_overload;
  613. }
  614. /**
  615. * Generates the code that calls a method, function or constructor
  616. * and returns the data
  617. *
  618. * @param array $method_definitions Data for the method or function.
  619. * @param string $method_name Name of the function.
  620. * @param string $class_name Name of parent class if applicable
  621. * @param bool $is_constructor Flag to indicate if constructor or just a regular method.
  622. *
  623. * @return string Generated code ready to insert on the end of
  624. * the PHP_METHOD or PHP_FUNCTION body after the generated code of class_method_called_overload()
  625. */
  626. function function_return($method_definitions, $method_name, $class_name=null, $is_constructor=false)
  627. {
  628. //Positions on the array of $method_definition where type and parameters data is stored
  629. $function_return_types = "return_type";
  630. $parameter_types = "parameters_type";
  631. $parameter_names = "parameters_name";
  632. $parameter_required = "parameters_required";
  633. $parameter_values = "parameters_default_value";
  634. $return_called_overload = "";
  635. foreach($method_definitions as $declaration_index=>$declaration)
  636. {
  637. $return_called_overload .= "if(overload{$declaration_index}_called)\n";
  638. $return_called_overload .= "\t{\n";
  639. $required_parameters = count($declaration[$parameter_required]);
  640. $parameters_count = count($declaration[$parameter_types]);
  641. //Generate code for object arguments
  642. foreach($declaration[$parameter_types] as $parameter_index=>$parameter_type)
  643. {
  644. $parameter_is_array = $declaration["parameters_is_array"][$parameter_index];
  645. $argument_type_modifier = "";
  646. $standard_parameter_type = parameter_type($parameter_type, $parameter_is_array, $method_name, $class_name, $argument_type_modifier);
  647. $plain_type = str_replace(array("const ", "&", "*"), "", $parameter_type);
  648. switch($standard_parameter_type)
  649. {
  650. case "bool":
  651. switch($argument_type_modifier)
  652. {
  653. case "const_pointer":
  654. $return_called_overload .= tabs(2) . "int array_count{$declaration_index}_{$parameter_index} = 1;\n";
  655. $return_called_overload .= tabs(2) . "HashTable* arr_hash{$declaration_index}_{$parameter_index};\n";
  656. $return_called_overload .= tabs(2) . "if(arguments_received > $parameter_index)\n";
  657. $return_called_overload .= tabs(2) . "{\n";
  658. $return_called_overload .= tabs(3) . "arr_hash{$declaration_index}_{$parameter_index} = Z_ARRVAL_P(".$declaration[$parameter_names][$parameter_index] . $declaration_index.");\n";
  659. $return_called_overload .= tabs(3) . "array_count{$declaration_index}_{$parameter_index} = zend_hash_num_elements(arr_hash{$declaration_index}_{$parameter_index});\n";
  660. $return_called_overload .= tabs(2) . "}\n";
  661. $return_called_overload .= tabs(2) . "bool* bools_array{$declaration_index}_{$parameter_index} = new bool[array_count{$declaration_index}_{$parameter_index}];\n";
  662. $return_called_overload .= tabs(2) . "bool bools_continue{$declaration_index}_{$parameter_index} = true;\n\n";
  663. break;
  664. }
  665. break;
  666. case "integer":
  667. switch($argument_type_modifier)
  668. {
  669. case "const_pointer":
  670. $return_called_overload .= tabs(2) . "int array_count{$declaration_index}_{$parameter_index} = 1;\n";
  671. $return_called_overload .= tabs(2) . "HashTable* arr_hash{$declaration_index}_{$parameter_index};\n";
  672. $return_called_overload .= tabs(2) . "if(arguments_received > $parameter_index)\n";
  673. $return_called_overload .= tabs(2) . "{\n";
  674. $return_called_overload .= tabs(3) . "arr_hash{$declaration_index}_{$parameter_index} = Z_ARRVAL_P(".$declaration[$parameter_names][$parameter_index] . $declaration_index.");\n";
  675. $return_called_overload .= tabs(3) . "array_count{$declaration_index}_{$parameter_index} = zend_hash_num_elements(arr_hash{$declaration_index}_{$parameter_index});\n";
  676. $return_called_overload .= tabs(2) . "}\n";
  677. $return_called_overload .= tabs(2) . "{$plain_type}* integers_array{$declaration_index}_{$parameter_index} = new {$plain_type}[array_count{$declaration_index}_{$parameter_index}];\n";
  678. $return_called_overload .= tabs(2) . "bool integers_continue{$declaration_index}_{$parameter_index} = true;\n\n";
  679. break;
  680. }
  681. break;
  682. case "float":
  683. switch($argument_type_modifier)
  684. {
  685. case "const_pointer":
  686. $return_called_overload .= tabs(2) . "int array_count{$declaration_index}_{$parameter_index} = 1;\n";
  687. $return_called_overload .= tabs(2) . "HashTable* arr_hash{$declaration_index}_{$parameter_index};\n";
  688. $return_called_overload .= tabs(2) . "if(arguments_received > $parameter_index)\n";
  689. $return_called_overload .= tabs(2) . "{\n";
  690. $return_called_overload .= tabs(3) . "arr_hash{$declaration_index}_{$parameter_index} = Z_ARRVAL_P(".$declaration[$parameter_names][$parameter_index] . $declaration_index.");\n";
  691. $return_called_overload .= tabs(3) . "array_count{$declaration_index}_{$parameter_index} = zend_hash_num_elements(arr_hash{$declaration_index}_{$parameter_index});\n";
  692. $return_called_overload .= tabs(2) . "}\n";
  693. $return_called_overload .= tabs(2) . "{$plain_type}* floats_array{$declaration_index}_{$parameter_index} = new {$plain_type}[array_count{$declaration_index}_{$parameter_index}];\n";
  694. $return_called_overload .= tabs(2) . "bool floats_continue{$declaration_index}_{$parameter_index} = true;\n\n";
  695. break;
  696. }
  697. break;
  698. case "string":
  699. switch($argument_type_modifier)
  700. {
  701. case "const_pointer": //const wxString* Array
  702. case "const_reference_array": //const wxString&[]
  703. case "const_none_array": //const wxString[]
  704. case "none_array": //wxString[]
  705. $return_called_overload .= tabs(2) . "int array_count{$declaration_index}_{$parameter_index} = 1;\n";
  706. $return_called_overload .= tabs(2) . "HashTable* arr_hash{$declaration_index}_{$parameter_index};\n";
  707. $return_called_overload .= tabs(2) . "if(arguments_received > $parameter_index)\n";
  708. $return_called_overload .= tabs(2) . "{\n";
  709. $return_called_overload .= tabs(3) . "arr_hash{$declaration_index}_{$parameter_index} = Z_ARRVAL_P(".$declaration[$parameter_names][$parameter_index] . $declaration_index.");\n";
  710. $return_called_overload .= tabs(3) . "array_count{$declaration_index}_{$parameter_index} = zend_hash_num_elements(arr_hash{$declaration_index}_{$parameter_index});\n";
  711. $return_called_overload .= tabs(2) . "}\n";
  712. $return_called_overload .= tabs(2) . "wxString* strings_array{$declaration_index}_{$parameter_index} = new wxString[array_count{$declaration_index}_{$parameter_index}];\n";
  713. $return_called_overload .= tabs(2) . "bool strings_continue{$declaration_index}_{$parameter_index} = true;\n\n";
  714. break;
  715. }
  716. break;
  717. case "strings_array":
  718. $return_called_overload .= tabs(2) . "wxArrayString strings_array{$declaration_index}_{$parameter_index};\n";
  719. $return_called_overload .= tabs(2) . "bool strings_continue{$declaration_index}_{$parameter_index} = true;\n\n";
  720. break;
  721. case "date":
  722. switch($argument_type_modifier)
  723. {
  724. case "const_pointer":
  725. $return_called_overload .= tabs(2) . "int array_count{$declaration_index}_{$parameter_index} = 1;\n";
  726. $return_called_overload .= tabs(2) . "HashTable* arr_hash{$declaration_index}_{$parameter_index};\n";
  727. $return_called_overload .= tabs(2) . "if(arguments_received > $parameter_index)\n";
  728. $return_called_overload .= tabs(2) . "{\n";
  729. $return_called_overload .= tabs(3) . "arr_hash{$declaration_index}_{$parameter_index} = Z_ARRVAL_P(".$declaration[$parameter_names][$parameter_index] . $declaration_index.");\n";
  730. $return_called_overload .= tabs(3) . "array_count{$declaration_index}_{$parameter_index} = zend_hash_num_elements(arr_hash{$declaration_index}_{$parameter_index});\n";
  731. $return_called_overload .= tabs(2) . "}\n";
  732. $return_called_overload .= tabs(2) . "wxDateTime* dates_array{$declaration_index}_{$parameter_index} = new wxDateTime[array_count{$declaration_index}_{$parameter_index}];\n";
  733. $return_called_overload .= tabs(2) . "bool dates_continue{$declaration_index}_{$parameter_index} = true;\n\n";
  734. break;
  735. }
  736. break;
  737. }
  738. }
  739. $return_called_overload .= "\t\tswitch(arguments_received)\n";
  740. $return_called_overload .= "\t\t{\n";
  741. for($required_parameters; $required_parameters<=$parameters_count; $required_parameters++)
  742. {
  743. $return_called_overload .= "\t\t\tcase $required_parameters:\n";
  744. $return_called_overload .= "\t\t\t{\n";
  745. $after_return_called_overload = ""; //Holds code that sets reference variables (* or &)
  746. $after_constructor_called = ""; //Holds code to execute after a constructor was called
  747. $parameters_string = "";
  748. for($parameter_index=0; $parameter_index<$required_parameters; $parameter_index++)
  749. {
  750. $parameter_is_array = $declaration["parameters_is_array"][$parameter_index];
  751. $declaration_modifier = "";
  752. $standard_parameter_type = parameter_type($declaration[$parameter_types][$parameter_index], $parameter_is_array, $method_name, $class_name, $declaration_modifier);
  753. $argument_parameter_type = str_replace(array("const ", "*", "&"), "", $declaration[$parameter_types][$parameter_index]);
  754. //Holds the name of the variable passed to called function
  755. $variable_name = $declaration[$parameter_names][$parameter_index] . $declaration_index;
  756. //Holds the name for the reference variable
  757. $reference_name = $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref";
  758. switch($standard_parameter_type)
  759. {
  760. case "bool":
  761. {
  762. switch($declaration_modifier)
  763. {
  764. case "pointer": //bool*
  765. $parameters_string .= $variable_name . ", ";
  766. break;
  767. case "const_pointer": //const bool* Array
  768. $return_called_overload .= tabs(4) . "int array_index{$declaration_index}_{$parameter_index} = 0;\n";
  769. $return_called_overload .= tabs(4) . "zval** temp_array_value{$declaration_index}_{$parameter_index} = 0;\n";
  770. $return_called_overload .= tabs(4) . "while(bools_continue{$declaration_index}_{$parameter_index})\n";
  771. $return_called_overload .= tabs(4) . "{\n";
  772. $return_called_overload .= tabs(5) . "if(zend_hash_index_find(HASH_OF(".$variable_name."), array_index{$declaration_index}_{$parameter_index}, (void**)&temp_array_value{$declaration_index}_{$parameter_index}) == SUCCESS)\n";
  773. $return_called_overload .= tabs(5) . "{\n";
  774. $return_called_overload .= tabs(6) . "convert_to_boolean_ex(temp_array_value{$declaration_index}_{$parameter_index});\n";
  775. $return_called_overload .= tabs(6) . "bools_array{$declaration_index}_{$parameter_index}[array_index{$declaration_index}_{$parameter_index}] = Z_BVAL_PP(temp_array_value{$declaration_index}_{$parameter_index});\n";
  776. $return_called_overload .= tabs(6) . "array_index{$declaration_index}_{$parameter_index}++;\n";
  777. $return_called_overload .= tabs(5) . "}\n";
  778. $return_called_overload .= tabs(5) . "else\n";
  779. $return_called_overload .= tabs(5) . "{\n";
  780. $return_called_overload .= tabs(6) . "bools_continue{$declaration_index}_{$parameter_index} = false;\n";
  781. $return_called_overload .= tabs(5) . "}\n";
  782. $return_called_overload .= tabs(4) . "}\n";
  783. $parameters_string .= "bools_array{$declaration_index}_{$parameter_index}, ";
  784. $after_return_called_overload .= "\t\t\t\tdelete[] bools_array{$declaration_index}_{$parameter_index};\n";
  785. break;
  786. case "reference": //bool&
  787. $parameters_string .= $variable_name . ", ";
  788. break;
  789. case "const_reference": //const bool&
  790. case "none": //bool
  791. case "const_none": //const bool
  792. $parameters_string .= $variable_name . ", ";
  793. break;
  794. }
  795. //Code to set references
  796. switch($declaration_modifier)
  797. {
  798. case "pointer":
  799. $after_return_called_overload .= "\t\t\t\tsize_t elements_returned{$declaration_index}_{$parameter_index} = sizeof($variable_name)/sizeof(*$variable_name);\n";
  800. $after_return_called_overload .= "\t\t\t\tarray_init($reference_name);\n";
  801. $after_return_called_overload .= "\t\t\t\tfor(size_t i=0; i<elements_returned{$declaration_index}_{$parameter_index}; i++)\n";
  802. $after_return_called_overload .= "\t\t\t\t{\n";
  803. $after_return_called_overload .= "\t\t\t\t\tadd_next_index_long($reference_name, {$variable_name}[i]);\n";
  804. $after_return_called_overload .= "\t\t\t\t}\n";
  805. break;
  806. case "reference":
  807. $after_return_called_overload .= "\t\t\t\tZVAL_BOOL($reference_name, $variable_name);\n";
  808. break;
  809. }
  810. break;
  811. }
  812. case "integer":
  813. case "class_enum":
  814. case "global_enum":
  815. {
  816. $integer_type = $class_enum.$declaration[$parameter_types][$parameter_index];
  817. if($enum_class = enum_parent_class($argument_parameter_type))
  818. {
  819. if("".strpos($integer_type, "$enum_class::")."" == "")
  820. $integer_type = str_replace($argument_parameter_type, "$enum_class::$argument_parameter_type", $integer_type);
  821. }
  822. switch($declaration_modifier)
  823. {
  824. case "pointer": //integer*
  825. $parameters_string .= "(".$integer_type.") " . $variable_name . ", ";
  826. break;
  827. case "const_pointer": //const integer* Array
  828. $return_called_overload .= tabs(4) . "int array_index{$declaration_index}_{$parameter_index} = 0;\n";
  829. $return_called_overload .= tabs(4) . "zval** temp_array_value{$declaration_index}_{$parameter_index} = 0;\n";
  830. $return_called_overload .= tabs(4) . "while(integers_continue{$declaration_index}_{$parameter_index})\n";
  831. $return_called_overload .= tabs(4) . "{\n";
  832. $return_called_overload .= tabs(5) . "if(zend_hash_index_find(HASH_OF(".$variable_name."), array_index{$declaration_index}_{$parameter_index}, (void**)&temp_array_value{$declaration_index}_{$parameter_index}) == SUCCESS)\n";
  833. $return_called_overload .= tabs(5) . "{\n";
  834. $return_called_overload .= tabs(6) . "convert_to_long_ex(temp_array_value{$declaration_index}_{$parameter_index});\n";
  835. $return_called_overload .= tabs(6) . "integers_array{$declaration_index}_{$parameter_index}[array_index{$declaration_index}_{$parameter_index}] = ($argument_parameter_type) Z_LVAL_PP(temp_array_value{$declaration_index}_{$parameter_index});\n";
  836. $return_called_overload .= tabs(6) . "array_index{$declaration_index}_{$parameter_index}++;\n";
  837. $return_called_overload .= tabs(5) . "}\n";
  838. $return_called_overload .= tabs(5) . "else\n";
  839. $return_called_overload .= tabs(5) . "{\n";
  840. $return_called_overload .= tabs(6) . "integers_continue{$declaration_index}_{$parameter_index} = false;\n";
  841. $return_called_overload .= tabs(5) . "}\n";
  842. $return_called_overload .= tabs(4) . "}\n";
  843. $parameters_string .= "(".$integer_type.") " . "integers_array{$declaration_index}_{$parameter_index}, ";
  844. $after_return_called_overload .= "\t\t\t\tdelete[] integers_array{$declaration_index}_{$parameter_index};\n";
  845. break;
  846. case "reference": //integer&
  847. $parameters_string .= "(".$integer_type.") " . $variable_name . ", ";
  848. break;
  849. case "const_reference": //const integer&
  850. case "none": //integer
  851. case "const_none": //const integer
  852. $parameters_string .= "(".$integer_type.") " . $variable_name . ", ";
  853. break;
  854. }
  855. //Code to set references
  856. switch($declaration_modifier)
  857. {
  858. case "pointer":
  859. $after_return_called_overload .= "\t\t\t\tsize_t elements_returned{$declaration_index}_{$parameter_index} = sizeof($variable_name)/sizeof(*$variable_name);\n";
  860. $after_return_called_overload .= "\t\t\t\tarray_init($reference_name);\n";
  861. $after_return_called_overload .= "\t\t\t\tfor(size_t i=0; i<elements_returned{$declaration_index}_{$parameter_index}; i++)\n";
  862. $after_return_called_overload .= "\t\t\t\t{\n";
  863. $after_return_called_overload .= "\t\t\t\t\tadd_next_index_long($reference_name, {$variable_name}[i]);\n";
  864. $after_return_called_overload .= "\t\t\t\t}\n";
  865. break;
  866. case "reference":
  867. $after_return_called_overload .= "\t\t\t\tZVAL_LONG($reference_name, $variable_name);\n";
  868. break;
  869. }
  870. break;
  871. }
  872. case "float":
  873. {
  874. switch($declaration_modifier)
  875. {
  876. case "pointer": //double*
  877. $parameters_string .= $variable_name . ", ";
  878. break;
  879. case "const_pointer": //const double* Array
  880. $return_called_overload .= tabs(4) . "int array_index{$declaration_index}_{$parameter_index} = 0;\n";
  881. $return_called_overload .= tabs(4) . "zval** temp_array_value{$declaration_index}_{$parameter_index} = 0;\n";
  882. $return_called_overload .= tabs(4) . "while(floats_continue{$declaration_index}_{$parameter_index})\n";
  883. $return_called_overload .= tabs(4) . "{\n";
  884. $return_called_overload .= tabs(5) . "if(zend_hash_index_find(HASH_OF(".$variable_name."), array_index{$declaration_index}_{$parameter_index}, (void**)&temp_array_value{$declaration_index}_{$parameter_index}) == SUCCESS)\n";
  885. $return_called_overload .= tabs(5) . "{\n";
  886. $return_called_overload .= tabs(6) . "convert_to_double_ex(temp_array_value{$declaration_index}_{$parameter_index});\n";
  887. $return_called_overload .= tabs(6) . "floats_array{$declaration_index}_{$parameter_index}[array_index{$declaration_index}_{$parameter_index}] = ($argument_parameter_type) Z_DVAL_PP(temp_array_value{$declaration_index}_{$parameter_index});\n";
  888. $return_called_overload .= tabs(6) . "array_index{$declaration_index}_{$parameter_index}++;\n";
  889. $return_called_overload .= tabs(5) . "}\n";
  890. $return_called_overload .= tabs(5) . "else\n";
  891. $return_called_overload .= tabs(5) . "{\n";
  892. $return_called_overload .= tabs(6) . "floats_continue{$declaration_index}_{$parameter_index} = false;\n";
  893. $return_called_overload .= tabs(5) . "}\n";
  894. $return_called_overload .= tabs(4) . "}\n";
  895. $parameters_string .= "(".$declaration[$parameter_types][$parameter_index].") " . "floats_array{$declaration_index}_{$parameter_index}, ";
  896. $after_return_called_overload .= "\t\t\t\tdelete[] floats_array{$declaration_index}_{$parameter_index};\n";
  897. break;
  898. case "reference": //double&
  899. $parameters_string .= $variable_name . ", ";
  900. break;
  901. case "const_reference": //const double&
  902. case "none": //double
  903. case "const_none": //const double
  904. $parameters_string .= $variable_name . ", ";
  905. break;
  906. }
  907. //Code to set references
  908. switch($declaration_modifier)
  909. {
  910. case "pointer":
  911. $after_return_called_overload .= "\t\t\t\tsize_t elements_returned{$declaration_index}_{$parameter_index} = sizeof($variable_name)/sizeof(*$variable_name);\n";
  912. $after_return_called_overload .= "\t\t\t\tarray_init($reference_name);\n";
  913. $after_return_called_overload .= "\t\t\t\tfor(size_t i=0; i<elements_returned{$declaration_index}_{$parameter_index}; i++)\n";
  914. $after_return_called_overload .= "\t\t\t\t{\n";
  915. $after_return_called_overload .= "\t\t\t\t\tadd_next_index_long($reference_name, {$variable_name}[i]);\n";
  916. $after_return_called_overload .= "\t\t\t\t}\n";
  917. break;
  918. case "reference":
  919. $after_return_called_overload .= "\t\t\t\tZVAL_DOUBLE($reference_name, $variable_name);\n";
  920. break;
  921. }
  922. break;
  923. }
  924. case "characters":
  925. {
  926. switch($declaration_modifier)
  927. {
  928. case "pointer": //char* Array with reference
  929. case "const_pointer": //const char* Array
  930. $parameters_string .= $variable_name . ", ";
  931. break;
  932. case "reference": //char&
  933. $parameters_string .= "(".$declaration[$parameter_types][$parameter_index].") " . $variable_name . ", ";
  934. break;
  935. case "const_reference": //const char&
  936. case "none": //char
  937. case "const_none": //const char
  938. $parameters_string .= "(".$declaration[$parameter_types][$parameter_index].") " . $variable_name . ", ";
  939. break;
  940. }
  941. //Code to set references
  942. switch($declaration_modifier)
  943. {
  944. case "pointer":
  945. $after_return_called_overload .= "\t\t\t\tZVAL_STRING($reference_name, $variable_name, 1);\n";
  946. break;
  947. case "reference":
  948. $after_return_called_overload .= "\t\t\t\tZVAL_LON