Advertisement
Guest User

PAWN - JS

a guest
May 25th, 2015
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.36 KB | None | 0 0
  1. var funcReg = /native (\w*.)(\w*)\((.*)\);/;
  2.  
  3.  
  4. var fs = require('fs');
  5.  
  6. var output = "";
  7.  
  8. var files = ['a_actor.inc', 'a_http.inc', 'a_npc.inc', 'a_objects.inc', 'a_players.inc', 'a_samp.inc', 'a_sampdb.inc', 'a_vehicles.inc'];
  9.  
  10. var ignoreFuncs = ["print"];
  11.  
  12. function template(name, params, param) {
  13. var prms = [];
  14. var callback = false;
  15. var callback_info = [];
  16. var comments = "/**\n * " + name + "\n";
  17.  
  18. var prm = "";
  19. for (var i in params) {
  20. if (params[i].name == "function") params[i].name = "func";
  21. if (params[i].reference) {
  22. callback = true;
  23. callback_info.push(params[i]);
  24.  
  25. } else {
  26. if (!params[i].ignore) {
  27. comments += " * @param {";
  28. switch (params[i].type) {
  29. case 'i':
  30. {
  31. comments += "Number";
  32. }
  33. break;
  34. case 'f':
  35. {
  36. comments += "Number";
  37. }
  38. break;
  39. case 's':
  40. {
  41. comments += "String";
  42. }
  43. break;
  44. }
  45. comments += "} " + params[i].name + "\n";
  46.  
  47. prms.push(params[i].name);
  48. }
  49. }
  50.  
  51. if (!params[i].ignore) prm += params[i].type;
  52. }
  53.  
  54. var extra = "";
  55. var cb = "";
  56. if (callback) {
  57. // prms.push("callback");
  58. // cb = "/* callback( "+callback_info.join(', ')+" ) */ ";
  59.  
  60. if (callback_info.length > 1) {
  61. var arr = [];
  62. comments += " * @return {{";
  63. for (var i in callback_info) {
  64. comments += " " + callback_info[i].name + ": ";
  65. switch (callback_info[i].type) {
  66. case 'I':
  67. case 'F':
  68. comments += "Number, ";
  69. break;
  70. case 'S':
  71. {
  72. comments += "String, ";
  73. }
  74. break;
  75. }
  76. arr.push('"' + callback_info[i].name + '"');
  77. }
  78. extra = ", [ " + arr.join(', ') + " ]";
  79. comments = comments.substring(0, comments.length - 2);
  80. comments += " }}\n";
  81. } else {
  82. comments += " * @return " + ((callback_info[0].type == 'S') ? '{String}' : '{Number}') + " " + callback_info[0].name + "\n";
  83. }
  84.  
  85.  
  86. } else comments += " * @return {Number} retval\n";
  87. comments += "*/\n";
  88.  
  89. prms = prms.join(', ');
  90.  
  91. var out = "";
  92. out += comments;
  93. if (prms == "") out += "function " + name + "(){\n\tCallNative( \"" + name + "\" );\n}\n";
  94. else out += "function " + name + "( " + prms + " " + cb + "){\n\t return CallNative( \"" + name + "\", \"" + prm + "\", " + prms + extra + " );\n}\n";
  95. return out;
  96. }
  97.  
  98. function invokeTemplate(name, params) {
  99. var param = [];
  100. for (var i in params) {
  101. var p = params[i];
  102. var tmp = '';
  103. switch (p.type) {
  104. case 's':
  105. {
  106. tmp = '""';
  107. }
  108. break;
  109. case 'S':
  110. {
  111. tmp = 'Str';
  112. }
  113. break;
  114. case 'i':
  115. tmp = '0';
  116. break;
  117. case 'f':
  118. tmp = '0.0';
  119. break;
  120. case 'I':
  121. tmp = 'iVar';
  122. break;
  123. case 'F':
  124. tmp = 'fVar';
  125. break;
  126. }
  127. if (p.tag) tmp = p.tag + ':' + tmp;
  128. param.push(tmp);
  129. }
  130.  
  131.  
  132. if (params.length == 0) param = "";
  133. else param = param.join(', ');
  134. var out = "\t" + name + "( " + param + " );\n";
  135.  
  136. return out;
  137. }
  138.  
  139. function checkFunc(func) {
  140. var param = '';
  141. for (var i in func.params) {
  142. if (func.params[i].type == 's') {
  143. if (func.params[(i * 1) + 1] && func.params[(i * 1) + 1].name == 'len') {
  144. func.params[i].type = 'S';
  145. func.params[i].reference = true;
  146. func.params[(i * 1) + 1].ignore = true;
  147. }
  148.  
  149.  
  150. }
  151. param += func.params[i].type;
  152. }
  153. func.param = param;
  154. return func;
  155. }
  156.  
  157. for (var j in files) {
  158. var file = fs.readFileSync('pawno/include/' + files[j], 'utf8');
  159.  
  160. var lines = file.split('\n');
  161.  
  162.  
  163. var funcs = [];
  164. for (var i in lines) {
  165. var matches = lines[i].match(funcReg);
  166. if (matches) {
  167.  
  168. var func = {
  169. func: matches[1],
  170. params: [],
  171. return: 'i',
  172. param: '',
  173. tag: '',
  174. ignore: false
  175. };
  176. if (ignoreFuncs.indexOf(func.func) > -1) {} else {
  177. if (matches[2]) {
  178. if (matches[1] == 'Float') func.return = 'f';
  179. func.func = matches[2];
  180. }
  181.  
  182.  
  183. if (matches[3]) {
  184.  
  185. var params = matches[3].split(',');
  186.  
  187.  
  188. for (var k in params) {
  189. var p = {
  190. type: 'i',
  191. reference: false,
  192. name: ''
  193. };
  194. var param = params[k].trim();
  195.  
  196.  
  197. if (param[0] == '&') {
  198.  
  199. p.reference = true;
  200. param = param.substring(1);
  201.  
  202. }
  203.  
  204. if (param[0] == '{') break; // Varadic funcs, deal with them later
  205. param = param.split('=');
  206. param = param[0].trim();
  207. var sp = param.split(':');
  208. if (sp.length > 1) {
  209. if (sp[0] == 'Float') p.type = 'f';
  210. else p.tag = sp[0];
  211. p.name = sp[1];
  212. } else {
  213. if (sp[0].substring(sp[0].length - 1) == ']') {
  214. p.type = 's';
  215. p.name = sp[0].substr(0, sp[0].length - 2);
  216. } else p.name = sp[0];
  217. }
  218.  
  219. var c = p.type;
  220. if (p.reference) c = c.toUpperCase();
  221. p.type = c;
  222. p.name = p.name.replace('const ', '');
  223. func.param += c;
  224. func.params.push(p);
  225. }
  226. }
  227.  
  228.  
  229. funcs.push(func);
  230. }
  231.  
  232.  
  233. }
  234. }
  235. var output = "";
  236. var invoke = "forward Invoke_" + files[j].replace('.', '') + "();\npublic Invoke_" + files[j].replace('.', '') + "(){\n";
  237. invoke += "\tnew Str[256];\n\tnew iVar;\n\tnew Float:fVar;\n\n";
  238. for (var i in funcs) {
  239. funcs[i] = checkFunc(funcs[i]);
  240. output += template(funcs[i].func, funcs[i].params, funcs[i].param);
  241. invoke += invokeTemplate(funcs[i].func, funcs[i].params);
  242.  
  243. }
  244.  
  245. invoke += "\t#pragma unused iVar, fVar, Str\n";
  246.  
  247. invoke += "}\n";
  248.  
  249. fs.writeFile('scriptfiles/js/include/' + files[j] + '.js', output, 'utf8');
  250. fs.writeFile('include/js/sampJS.' + files[j], invoke, 'utf8');
  251.  
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement