PageRenderTime 47ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/indra/lscript/lscript_execute/lscript_readlso.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 1588 lines | 1374 code | 172 blank | 42 comment | 41 complexity | 72f490ea59b6a0fbb097cae43f9405a8 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file lscript_readlso.cpp
  3. * @brief classes to read lso file
  4. *
  5. * $LicenseInfo:firstyear=2002&license=viewerlgpl$
  6. * Second Life Viewer Source Code
  7. * Copyright (C) 2010, Linden Research, Inc.
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation;
  12. * version 2.1 of the License only.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. *
  23. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  24. * $/LicenseInfo$
  25. */
  26. #include "linden_common.h"
  27. #include "lscript_readlso.h"
  28. #include "lscript_library.h"
  29. #include "lscript_alloc.h"
  30. LLScriptLSOParse::LLScriptLSOParse(LLFILE *fp)
  31. {
  32. U8 sizearray[4];
  33. size_t filesize;
  34. S32 pos = 0;
  35. if (fread(&sizearray, 1, 4, fp) != 4)
  36. {
  37. llwarns << "Short read" << llendl;
  38. filesize = 0;
  39. } else {
  40. filesize = bytestream2integer(sizearray, pos);
  41. }
  42. mRawData = new U8[filesize];
  43. fseek(fp, 0, SEEK_SET);
  44. if (fread(mRawData, 1, filesize, fp) != filesize)
  45. {
  46. llwarns << "Short read" << llendl;
  47. }
  48. initOpCodePrinting();
  49. }
  50. LLScriptLSOParse::LLScriptLSOParse(U8 *buffer)
  51. {
  52. mRawData = buffer;
  53. initOpCodePrinting();
  54. }
  55. LLScriptLSOParse::~LLScriptLSOParse()
  56. {
  57. delete [] mRawData;
  58. }
  59. void LLScriptLSOParse::printData(LLFILE *fp)
  60. {
  61. printNameDesc(fp);
  62. printRegisters(fp);
  63. printGlobals(fp);
  64. printGlobalFunctions(fp);
  65. printStates(fp);
  66. printHeap(fp);
  67. }
  68. void LLScriptLSOParse::printNameDesc(LLFILE *fp)
  69. {
  70. fprintf(fp, "=============================\n\n");
  71. }
  72. S32 gMajorVersion = 0;
  73. void LLScriptLSOParse::printRegisters(LLFILE *fp)
  74. {
  75. // print out registers first
  76. S32 i;
  77. fprintf(fp, "=============================\n");
  78. fprintf(fp, "Registers\n");
  79. fprintf(fp, "=============================\n");
  80. S32 version = get_register(mRawData, LREG_VN);
  81. if (version == LSL2_VERSION1_END_NUMBER)
  82. {
  83. gMajorVersion = LSL2_MAJOR_VERSION_ONE;
  84. }
  85. else if (version == LSL2_VERSION_NUMBER)
  86. {
  87. gMajorVersion = LSL2_MAJOR_VERSION_TWO;
  88. }
  89. for (i = LREG_IP; i < LREG_EOF; i++)
  90. {
  91. if (i < LREG_NCE)
  92. {
  93. fprintf(fp, "%s: 0x%X\n", gLSCRIPTRegisterNames[i], get_register(mRawData, (LSCRIPTRegisters)i));
  94. }
  95. else if (gMajorVersion == LSL2_MAJOR_VERSION_TWO)
  96. {
  97. U64 data = get_register_u64(mRawData, (LSCRIPTRegisters)i);
  98. fprintf(fp, "%s: 0x%X%X\n", gLSCRIPTRegisterNames[i], (U32)(data>>32), (U32)(data && 0xFFFFFFFF));
  99. }
  100. }
  101. fprintf(fp, "=============================\n\n");
  102. }
  103. void LLScriptLSOParse::printGlobals(LLFILE *fp)
  104. {
  105. // print out registers first
  106. S32 offset, varoffset;
  107. S32 ivalue;
  108. F32 fpvalue;
  109. LLVector3 vvalue;
  110. LLQuaternion qvalue;
  111. char name[256]; /*Flawfinder: ignore*/
  112. U8 type;
  113. S32 global_v_offset = get_register(mRawData, LREG_GVR);
  114. S32 global_f_offset = get_register(mRawData, LREG_GFR);
  115. fprintf(fp, "=============================\n");
  116. fprintf(fp, "[0x%X] Global Variables\n", global_v_offset);
  117. fprintf(fp, "=============================\n");
  118. while (global_v_offset < global_f_offset)
  119. {
  120. // get offset to skip past name
  121. varoffset = global_v_offset;
  122. offset = bytestream2integer(mRawData, global_v_offset);
  123. // get typeexport
  124. type = *(mRawData + global_v_offset++);
  125. // set name
  126. bytestream2char(name, mRawData, global_v_offset, sizeof(name));
  127. switch(type)
  128. {
  129. case LST_INTEGER:
  130. ivalue = bytestream2integer(mRawData, global_v_offset);
  131. fprintf(fp, "[0x%X] integer %s = %d\n", varoffset, name, ivalue);
  132. break;
  133. case LST_FLOATINGPOINT:
  134. fpvalue = bytestream2float(mRawData, global_v_offset);
  135. fprintf(fp, "[0x%X] integer %s = %f\n", varoffset, name, fpvalue);
  136. break;
  137. case LST_STRING:
  138. ivalue = bytestream2integer(mRawData, global_v_offset);
  139. fprintf(fp, "[0x%X] string %s = 0x%X\n", varoffset, name, ivalue + get_register(mRawData, LREG_HR) - 1);
  140. break;
  141. case LST_KEY:
  142. ivalue = bytestream2integer(mRawData, global_v_offset);
  143. fprintf(fp, "[0x%X] key %s = 0x%X\n", varoffset, name, ivalue + get_register(mRawData, LREG_HR) - 1);
  144. break;
  145. case LST_VECTOR:
  146. bytestream2vector(vvalue, mRawData, global_v_offset);
  147. fprintf(fp, "[0x%X] vector %s = < %f, %f, %f >\n", varoffset, name, vvalue.mV[VX], vvalue.mV[VY], vvalue.mV[VZ]);
  148. break;
  149. case LST_QUATERNION:
  150. bytestream2quaternion(qvalue, mRawData, global_v_offset);
  151. fprintf(fp, "[0x%X] quaternion %s = < %f, %f, %f, %f >\n", varoffset, name, qvalue.mQ[VX], qvalue.mQ[VY], qvalue.mQ[VZ], qvalue.mQ[VS]);
  152. break;
  153. case LST_LIST:
  154. ivalue = bytestream2integer(mRawData, global_v_offset);
  155. fprintf(fp, "[0x%X] list %s = 0x%X\n", varoffset, name, ivalue + get_register(mRawData, LREG_HR) - 1);
  156. break;
  157. default:
  158. break;
  159. }
  160. }
  161. fprintf(fp, "=============================\n\n");
  162. }
  163. void LLScriptLSOParse::printGlobalFunctions(LLFILE *fp)
  164. {
  165. // print out registers first
  166. S32 i, offset;
  167. // LLVector3 vvalue; unused
  168. // LLQuaternion qvalue; unused
  169. char name[256]; /*Flawfinder: ignore*/
  170. U8 type;
  171. offset = get_register(mRawData, LREG_GFR);
  172. S32 start_of_state = get_register(mRawData, LREG_SR);
  173. if (start_of_state == offset)
  174. return;
  175. S32 global_f_offset = get_register(mRawData, LREG_GFR);
  176. fprintf(fp, "=============================\n");
  177. fprintf(fp, "[0x%X] Global Functions\n", global_f_offset);
  178. fprintf(fp, "=============================\n");
  179. S32 num_functions = bytestream2integer(mRawData, offset);
  180. S32 orig_function_offset;
  181. S32 function_offset;
  182. S32 next_function_offset = 0;
  183. S32 function_number = 0;
  184. S32 opcode_start;
  185. S32 opcode_end;
  186. for (i = 0; i < num_functions; i++)
  187. {
  188. // jump to function
  189. // if this is the first function
  190. if (i == 0)
  191. {
  192. if (i < num_functions - 1)
  193. {
  194. function_offset = bytestream2integer(mRawData, offset);
  195. next_function_offset = bytestream2integer(mRawData, offset);
  196. function_offset += global_f_offset;
  197. opcode_end = next_function_offset + global_f_offset;
  198. }
  199. else
  200. {
  201. function_offset = bytestream2integer(mRawData, offset);
  202. function_offset += global_f_offset;
  203. opcode_end = get_register(mRawData, LREG_SR);
  204. }
  205. }
  206. else if (i < num_functions - 1)
  207. {
  208. function_offset = next_function_offset;
  209. next_function_offset = bytestream2integer(mRawData, offset);
  210. function_offset += global_f_offset;
  211. opcode_end = next_function_offset + global_f_offset;
  212. }
  213. else
  214. {
  215. function_offset = next_function_offset;
  216. function_offset += global_f_offset;
  217. opcode_end = get_register(mRawData, LREG_SR);
  218. }
  219. orig_function_offset = function_offset;
  220. // where do the opcodes start
  221. opcode_start = bytestream2integer(mRawData, function_offset);
  222. opcode_start += orig_function_offset;
  223. bytestream2char(name, mRawData, function_offset, sizeof(name));
  224. // get return type
  225. type = *(mRawData + function_offset++);
  226. fprintf(fp, "[Function #%d] [0x%X] %s\n", function_number, orig_function_offset, name);
  227. fprintf(fp, "\tReturn Type: %s\n", LSCRIPTTypeNames[type]);
  228. type = *(mRawData + function_offset++);
  229. S32 params;
  230. params = 0;
  231. S32 pcount = 0;
  232. while (type)
  233. {
  234. bytestream2char(name, mRawData, function_offset, sizeof(name));
  235. fprintf(fp, "\tParameter #%d: %s %s\n", pcount++, LSCRIPTTypeNames[type], name);
  236. type = *(mRawData + function_offset++);
  237. }
  238. fprintf(fp, "\t\tOpCodes: 0x%X - 0x%X\n", opcode_start, opcode_end);
  239. printOpCodeRange(fp, opcode_start, opcode_end, 2);
  240. function_number++;
  241. }
  242. fprintf(fp, "=============================\n\n");
  243. }
  244. void LLScriptLSOParse::printStates(LLFILE *fp)
  245. {
  246. // print out registers first
  247. S32 i, offset;
  248. U32 j, k;
  249. // LLVector3 vvalue; unused
  250. // LLQuaternion qvalue; unused
  251. char name[256]; /*Flawfinder: ignore*/
  252. S32 state_offset = get_register(mRawData, LREG_SR);
  253. fprintf(fp, "=============================\n");
  254. fprintf(fp, "[0x%X] States\n", state_offset);
  255. fprintf(fp, "=============================\n");
  256. offset = state_offset;
  257. S32 num_states = bytestream2integer(mRawData, offset);
  258. S32 state_info_offset;
  259. S32 event_jump_table;
  260. U64 event_handlers;
  261. S32 event_offset;
  262. S32 original_event_offset;
  263. S32 opcode_start;
  264. S32 worst_case_opcode_end;
  265. S32 opcode_end;
  266. S32 stack_size;
  267. S32 read_ahead;
  268. S32 first_jump = 0;
  269. for (i = 0; i < num_states; i++)
  270. {
  271. state_info_offset = bytestream2integer(mRawData, offset);
  272. if (gMajorVersion == LSL2_MAJOR_VERSION_TWO)
  273. event_handlers = bytestream2u64(mRawData, offset);
  274. else
  275. event_handlers = bytestream2integer(mRawData, offset);
  276. if (!first_jump)
  277. {
  278. first_jump = state_info_offset;
  279. }
  280. read_ahead = offset;
  281. if (offset < first_jump + state_offset)
  282. {
  283. worst_case_opcode_end = bytestream2integer(mRawData, read_ahead) + state_offset;
  284. }
  285. else
  286. {
  287. worst_case_opcode_end = get_register(mRawData, LREG_HR);
  288. }
  289. state_info_offset += state_offset;
  290. fprintf(fp, "[0x%X] ", state_info_offset);
  291. state_info_offset += LSCRIPTDataSize[LST_INTEGER];
  292. bytestream2char(name, mRawData, state_info_offset, sizeof(name));
  293. fprintf(fp, "%s\n", name);
  294. event_jump_table = state_info_offset;
  295. // run run through the handlers
  296. for (j = LSTT_STATE_BEGIN; j < LSTT_STATE_END; j++)
  297. {
  298. if (event_handlers & LSCRIPTStateBitField[j])
  299. {
  300. event_offset = bytestream2integer(mRawData, state_info_offset);
  301. stack_size = bytestream2integer(mRawData, state_info_offset);
  302. read_ahead = event_jump_table;
  303. S32 temp_end;
  304. S32 dummy;
  305. opcode_end = worst_case_opcode_end;
  306. for (k = LSTT_STATE_BEGIN; k < LSTT_STATE_END; k++)
  307. {
  308. if (event_handlers & LSCRIPTStateBitField[k])
  309. {
  310. temp_end = bytestream2integer(mRawData, read_ahead);
  311. dummy = bytestream2integer(mRawData, read_ahead);
  312. if ( (temp_end < opcode_end)
  313. &&(temp_end > event_offset))
  314. {
  315. opcode_end = temp_end;
  316. }
  317. }
  318. }
  319. if (event_offset)
  320. {
  321. event_offset += event_jump_table;
  322. if (opcode_end < worst_case_opcode_end)
  323. opcode_end += event_jump_table;
  324. original_event_offset = event_offset;
  325. fprintf(fp, "\t[0x%X] ", event_offset);
  326. opcode_start = bytestream2integer(mRawData, event_offset);
  327. opcode_start += original_event_offset;
  328. switch(j)
  329. {
  330. case LSTT_STATE_ENTRY: // LSTT_STATE_ENTRY
  331. bytestream2char(name, mRawData, event_offset, sizeof(name));
  332. fprintf(fp, "%s\n", name);
  333. break;
  334. case LSTT_STATE_EXIT: // LSTT_STATE_EXIT
  335. bytestream2char(name, mRawData, event_offset, sizeof(name));
  336. fprintf(fp, "%s\n", name);
  337. break;
  338. case LSTT_TOUCH_START: // LSTT_TOUCH_START
  339. bytestream2char(name, mRawData, event_offset, sizeof(name));
  340. fprintf(fp, "%s\n", name);
  341. bytestream2char(name, mRawData, event_offset, sizeof(name));
  342. fprintf(fp, "\t\tkey %s\n", name);
  343. bytestream2char(name, mRawData, event_offset, sizeof(name));
  344. fprintf(fp, "\t\tvector %s\n", name);
  345. break;
  346. case LSTT_TOUCH: // LSTT_TOUCH
  347. bytestream2char(name, mRawData, event_offset, sizeof(name));
  348. fprintf(fp, "%s\n", name);
  349. bytestream2char(name, mRawData, event_offset, sizeof(name));
  350. fprintf(fp, "\t\tkey %s\n", name);
  351. bytestream2char(name, mRawData, event_offset, sizeof(name));
  352. fprintf(fp, "\t\tvector %s\n", name);
  353. break;
  354. case LSTT_TOUCH_END: // LSTT_TOUCH_END
  355. bytestream2char(name, mRawData, event_offset, sizeof(name));
  356. fprintf(fp, "%s\n", name);
  357. bytestream2char(name, mRawData, event_offset, sizeof(name));
  358. fprintf(fp, "\t\tkey %s\n", name);
  359. bytestream2char(name, mRawData, event_offset, sizeof(name));
  360. fprintf(fp, "\t\tvector %s\n", name);
  361. break;
  362. case LSTT_COLLISION_START: // LSTT_COLLISION_START
  363. bytestream2char(name, mRawData, event_offset, sizeof(name));
  364. fprintf(fp, "%s\n", name);
  365. bytestream2char(name, mRawData, event_offset, sizeof(name));
  366. fprintf(fp, "\t\tkey %s\n", name);
  367. bytestream2char(name, mRawData, event_offset, sizeof(name));
  368. fprintf(fp, "\t\tvector %s\n", name);
  369. bytestream2char(name, mRawData, event_offset, sizeof(name));
  370. fprintf(fp, "\t\tvector %s\n", name);
  371. break;
  372. case LSTT_COLLISION: // LSTT_COLLISION
  373. bytestream2char(name, mRawData, event_offset, sizeof(name));
  374. fprintf(fp, "%s\n", name);
  375. bytestream2char(name, mRawData, event_offset, sizeof(name));
  376. fprintf(fp, "\t\tkey %s\n", name);
  377. bytestream2char(name, mRawData, event_offset, sizeof(name));
  378. fprintf(fp, "\t\tvector %s\n", name);
  379. bytestream2char(name, mRawData, event_offset, sizeof(name));
  380. fprintf(fp, "\t\tvector %s\n", name);
  381. break;
  382. case LSTT_COLLISION_END: // LSTT_COLLISION_END
  383. bytestream2char(name, mRawData, event_offset, sizeof(name));
  384. fprintf(fp, "%s\n", name);
  385. bytestream2char(name, mRawData, event_offset, sizeof(name));
  386. fprintf(fp, "\t\tkey %s\n", name);
  387. bytestream2char(name, mRawData, event_offset, sizeof(name));
  388. fprintf(fp, "\t\tvector %s\n", name);
  389. bytestream2char(name, mRawData, event_offset, sizeof(name));
  390. fprintf(fp, "\t\tvector %s\n", name);
  391. break;
  392. case LSTT_LAND_COLLISION_START: // LSTT_LAND_COLLISION_START
  393. bytestream2char(name, mRawData, event_offset, sizeof(name));
  394. fprintf(fp, "%s\n", name);
  395. bytestream2char(name, mRawData, event_offset, sizeof(name));
  396. fprintf(fp, "\t\tvector %s\n", name);
  397. break;
  398. case LSTT_LAND_COLLISION: // LSTT_LAND_COLLISION
  399. bytestream2char(name, mRawData, event_offset, sizeof(name));
  400. fprintf(fp, "%s\n", name);
  401. bytestream2char(name, mRawData, event_offset, sizeof(name));
  402. fprintf(fp, "\t\tvector %s\n", name);
  403. break;
  404. case LSTT_LAND_COLLISION_END: // LSTT_LAND_COLLISION_END
  405. bytestream2char(name, mRawData, event_offset, sizeof(name));
  406. fprintf(fp, "%s\n", name);
  407. bytestream2char(name, mRawData, event_offset, sizeof(name));
  408. fprintf(fp, "\t\tvector %s\n", name);
  409. break;
  410. case LSTT_INVENTORY: // LSTT_INVENTORY
  411. bytestream2char(name, mRawData, event_offset, sizeof(name));
  412. fprintf(fp, "%s\n", name);
  413. bytestream2char(name, mRawData, event_offset, sizeof(name));
  414. fprintf(fp, "\t\tinteger %s\n", name);
  415. break;
  416. case LSTT_ATTACH: // LSTT_ATTACH
  417. bytestream2char(name, mRawData, event_offset, sizeof(name));
  418. fprintf(fp, "%s\n", name);
  419. bytestream2char(name, mRawData, event_offset, sizeof(name));
  420. fprintf(fp, "\t\tkey %s\n", name);
  421. break;
  422. case LSTT_DATASERVER: // LSTT_DATASERVER
  423. bytestream2char(name, mRawData, event_offset, sizeof(name));
  424. fprintf(fp, "%s\n", name);
  425. bytestream2char(name, mRawData, event_offset, sizeof(name));
  426. fprintf(fp, "\t\tkey %s\n", name);
  427. bytestream2char(name, mRawData, event_offset, sizeof(name));
  428. fprintf(fp, "\t\tstring %s\n", name);
  429. break;
  430. case LSTT_TIMER: // LSTT_TIMER
  431. bytestream2char(name, mRawData, event_offset, sizeof(name));
  432. fprintf(fp, "%s\n", name);
  433. break;
  434. case LSTT_MOVING_START: // LSTT_MOVING_START
  435. bytestream2char(name, mRawData, event_offset, sizeof(name));
  436. fprintf(fp, "%s\n", name);
  437. break;
  438. case LSTT_MOVING_END: // LSTT_MOVING_END
  439. bytestream2char(name, mRawData, event_offset, sizeof(name));
  440. fprintf(fp, "%s\n", name);
  441. break;
  442. case LSTT_CHAT: // LSTT_CHAT
  443. bytestream2char(name, mRawData, event_offset, sizeof(name));
  444. fprintf(fp, "%s\n", name);
  445. bytestream2char(name, mRawData, event_offset, sizeof(name));
  446. fprintf(fp, "\t\tinteger %s\n", name);
  447. bytestream2char(name, mRawData, event_offset, sizeof(name));
  448. fprintf(fp, "\t\tkey %s\n", name);
  449. bytestream2char(name, mRawData, event_offset, sizeof(name));
  450. fprintf(fp, "\t\tstring %s\n", name);
  451. break;
  452. case LSTT_OBJECT_REZ: // LSTT_OBJECT_REZ
  453. bytestream2char(name, mRawData, event_offset, sizeof(name));
  454. fprintf(fp, "%s\n", name);
  455. bytestream2char(name, mRawData, event_offset, sizeof(name));
  456. fprintf(fp, "\t\tkey %s\n", name);
  457. break;
  458. case LSTT_REMOTE_DATA: // LSTT_REMOTE_DATA
  459. bytestream2char(name, mRawData, event_offset, sizeof(name));
  460. fprintf(fp, "%s\n", name);
  461. bytestream2char(name, mRawData, event_offset, sizeof(name));
  462. fprintf(fp, "\t\tinteger %s\n", name);
  463. bytestream2char(name, mRawData, event_offset, sizeof(name));
  464. fprintf(fp, "\t\tkey %s\n", name);
  465. bytestream2char(name, mRawData, event_offset, sizeof(name));
  466. fprintf(fp, "\t\tinteger %s\n", name);
  467. bytestream2char(name, mRawData, event_offset, sizeof(name));
  468. fprintf(fp, "\t\tstring %s\n", name);
  469. break;
  470. case LSTT_REZ: // LSTT_REZ
  471. bytestream2char(name, mRawData, event_offset, sizeof(name));
  472. fprintf(fp, "%s\n", name);
  473. break;
  474. case LSTT_SENSOR: // LSTT_SENSOR
  475. bytestream2char(name, mRawData, event_offset, sizeof(name));
  476. fprintf(fp, "%s\n", name);
  477. bytestream2char(name, mRawData, event_offset, sizeof(name));
  478. fprintf(fp, "\t\tinteger %s\n", name);
  479. break;
  480. case LSTT_NO_SENSOR: // LSTT_NO_SENSOR
  481. bytestream2char(name, mRawData, event_offset, sizeof(name));
  482. fprintf(fp, "%s\n", name);
  483. break;
  484. case LSTT_CONTROL: // LSTT_CONTROL
  485. bytestream2char(name, mRawData, event_offset, sizeof(name));
  486. fprintf(fp, "%s\n", name);
  487. bytestream2char(name, mRawData, event_offset, sizeof(name));
  488. fprintf(fp, "\t\tkey %s\n", name);
  489. bytestream2char(name, mRawData, event_offset, sizeof(name));
  490. fprintf(fp, "\t\tinteger %s\n", name);
  491. bytestream2char(name, mRawData, event_offset, sizeof(name));
  492. fprintf(fp, "\t\tinteger %s\n", name);
  493. break;
  494. case LSTT_LINK_MESSAGE: // LSTT_LINK_MESSAGE
  495. bytestream2char(name, mRawData, event_offset, sizeof(name));
  496. fprintf(fp, "%s\n", name);
  497. bytestream2char(name, mRawData, event_offset, sizeof(name));
  498. fprintf(fp, "\t\tinteger %s\n", name);
  499. bytestream2char(name, mRawData, event_offset, sizeof(name));
  500. fprintf(fp, "\t\tstring %s\n", name);
  501. bytestream2char(name, mRawData, event_offset, sizeof(name));
  502. fprintf(fp, "\t\tkey %s\n", name);
  503. break;
  504. case LSTT_MONEY: // LSTT_MONEY
  505. bytestream2char(name, mRawData, event_offset, sizeof(name));
  506. fprintf(fp, "%s\n", name);
  507. bytestream2char(name, mRawData, event_offset, sizeof(name));
  508. fprintf(fp, "\t\tkey %s\n", name);
  509. bytestream2char(name, mRawData, event_offset, sizeof(name));
  510. fprintf(fp, "\t\tinteger %s\n", name);
  511. break;
  512. case LSTT_EMAIL: // LSTT_EMAIL
  513. bytestream2char(name, mRawData, event_offset, sizeof(name));
  514. fprintf(fp, "%s\n", name);
  515. bytestream2char(name, mRawData, event_offset, sizeof(name));
  516. fprintf(fp, "\t\tstring %s\n", name);
  517. bytestream2char(name, mRawData, event_offset, sizeof(name));
  518. fprintf(fp, "\t\tstring %s\n", name);
  519. bytestream2char(name, mRawData, event_offset, sizeof(name));
  520. fprintf(fp, "\t\tstring %s\n", name);
  521. bytestream2char(name, mRawData, event_offset, sizeof(name));
  522. fprintf(fp, "\t\tinteger %s\n", name);
  523. break;
  524. case LSTT_AT_TARGET: // LSTT_AT_TARGET
  525. bytestream2char(name, mRawData, event_offset, sizeof(name));
  526. fprintf(fp, "%s\n", name);
  527. bytestream2char(name, mRawData, event_offset, sizeof(name));
  528. fprintf(fp, "\t\tinteger %s\n", name);
  529. bytestream2char(name, mRawData, event_offset, sizeof(name));
  530. fprintf(fp, "\t\tvector %s\n", name);
  531. bytestream2char(name, mRawData, event_offset, sizeof(name));
  532. fprintf(fp, "\t\tvector %s\n", name);
  533. break;
  534. case LSTT_NOT_AT_TARGET: // LSTT_NOT_AT_TARGET
  535. bytestream2char(name, mRawData, event_offset, sizeof(name));
  536. fprintf(fp, "%s\n", name);
  537. break;
  538. case LSTT_AT_ROT_TARGET: // LSTT_AT_ROT_TARGET
  539. bytestream2char(name, mRawData, event_offset, sizeof(name));
  540. fprintf(fp, "%s\n", name);
  541. bytestream2char(name, mRawData, event_offset, sizeof(name));
  542. fprintf(fp, "\t\tinteger %s\n", name);
  543. bytestream2char(name, mRawData, event_offset, sizeof(name));
  544. fprintf(fp, "\t\tquaternion %s\n", name);
  545. bytestream2char(name, mRawData, event_offset, sizeof(name));
  546. fprintf(fp, "\t\tquaternion %s\n", name);
  547. break;
  548. case LSTT_NOT_AT_ROT_TARGET: // LSTT_NOT_AT_TARGET
  549. bytestream2char(name, mRawData, event_offset, sizeof(name));
  550. fprintf(fp, "%s\n", name);
  551. break;
  552. case LSTT_RTPERMISSIONS: // LSTT_RTPERMISSIONS
  553. bytestream2char(name, mRawData, event_offset, sizeof(name));
  554. fprintf(fp, "%s\n", name);
  555. fprintf(fp, "\t\tinteger %s\n", name);
  556. bytestream2char(name, mRawData, event_offset, sizeof(name));
  557. break;
  558. case LSTT_HTTP_RESPONSE: // LSTT_REMOTE_DATA ?!?!?!
  559. bytestream2char(name, mRawData, event_offset, sizeof(name));
  560. fprintf(fp, "%s\n", name);
  561. bytestream2char(name, mRawData, event_offset, sizeof(name));
  562. fprintf(fp, "\t\tkey %s\n", name);
  563. bytestream2char(name, mRawData, event_offset, sizeof(name));
  564. fprintf(fp, "\t\tinteger %s\n", name);
  565. bytestream2char(name, mRawData, event_offset, sizeof(name));
  566. fprintf(fp, "\t\tlist %s\n", name);
  567. bytestream2char(name, mRawData, event_offset, sizeof(name));
  568. fprintf(fp, "\t\tstring %s\n", name);
  569. break;
  570. case LSTT_HTTP_REQUEST: // LSTT_HTTP_REQUEST
  571. bytestream2char(name, mRawData, event_offset, sizeof(name));
  572. fprintf(fp, "%s\n", name);
  573. bytestream2char(name, mRawData, event_offset, sizeof(name));
  574. fprintf(fp, "\t\tkey %s\n", name);
  575. bytestream2char(name, mRawData, event_offset, sizeof(name));
  576. fprintf(fp, "\t\tstring %s\n", name);
  577. bytestream2char(name, mRawData, event_offset, sizeof(name));
  578. fprintf(fp, "\t\tstring %s\n", name);
  579. break;
  580. default:
  581. break;
  582. }
  583. fprintf(fp, "\t\tStack Size: %d\n", stack_size);
  584. fprintf(fp, "\t\t\tOpCodes: 0x%X - 0x%X\n", opcode_start, opcode_end);
  585. printOpCodeRange(fp, opcode_start, opcode_end, 3);
  586. }
  587. }
  588. }
  589. }
  590. fprintf(fp, "=============================\n\n");
  591. }
  592. void LLScriptLSOParse::printHeap(LLFILE *fp)
  593. {
  594. // print out registers first
  595. S32 heap_offset = get_register(mRawData, LREG_HR);
  596. S32 heap_pointer = get_register(mRawData, LREG_HP);
  597. fprintf(fp, "=============================\n");
  598. fprintf(fp, "[0x%X - 0x%X] Heap\n", heap_offset, heap_pointer);
  599. fprintf(fp, "=============================\n");
  600. lsa_fprint_heap(mRawData, fp);
  601. fprintf(fp, "=============================\n\n");
  602. }
  603. void lso_print_tabs(LLFILE *fp, S32 tabs)
  604. {
  605. S32 i;
  606. for (i = 0; i < tabs; i++)
  607. {
  608. fprintf(fp, "\t");
  609. }
  610. }
  611. void LLScriptLSOParse::printOpCodes(LLFILE *fp, S32 &offset, S32 tabs)
  612. {
  613. U8 opcode = *(mRawData + offset);
  614. mPrintOpCodes[opcode](fp, mRawData, offset, tabs);
  615. }
  616. void LLScriptLSOParse::printOpCodeRange(LLFILE *fp, S32 start, S32 end, S32 tabs)
  617. {
  618. while (start < end)
  619. {
  620. printOpCodes(fp, start, tabs);
  621. }
  622. }
  623. void LLScriptLSOParse::initOpCodePrinting()
  624. {
  625. S32 i;
  626. for (i = 0; i < 256; i++)
  627. {
  628. mPrintOpCodes[i] = print_noop;
  629. }
  630. mPrintOpCodes[LSCRIPTOpCodes[LOPC_NOOP]] = print_noop;
  631. mPrintOpCodes[LSCRIPTOpCodes[LOPC_POP]] = print_pop;
  632. mPrintOpCodes[LSCRIPTOpCodes[LOPC_POPS]] = print_pops;
  633. mPrintOpCodes[LSCRIPTOpCodes[LOPC_POPL]] = print_popl;
  634. mPrintOpCodes[LSCRIPTOpCodes[LOPC_POPV]] = print_popv;
  635. mPrintOpCodes[LSCRIPTOpCodes[LOPC_POPQ]] = print_popq;
  636. mPrintOpCodes[LSCRIPTOpCodes[LOPC_POPARG]] = print_poparg;
  637. mPrintOpCodes[LSCRIPTOpCodes[LOPC_POPIP]] = print_popip;
  638. mPrintOpCodes[LSCRIPTOpCodes[LOPC_POPBP]] = print_popbp;
  639. mPrintOpCodes[LSCRIPTOpCodes[LOPC_POPSP]] = print_popsp;
  640. mPrintOpCodes[LSCRIPTOpCodes[LOPC_POPSLR]] = print_popslr;
  641. mPrintOpCodes[LSCRIPTOpCodes[LOPC_DUP]] = print_dup;
  642. mPrintOpCodes[LSCRIPTOpCodes[LOPC_DUPS]] = print_dups;
  643. mPrintOpCodes[LSCRIPTOpCodes[LOPC_DUPL]] = print_dupl;
  644. mPrintOpCodes[LSCRIPTOpCodes[LOPC_DUPV]] = print_dupv;
  645. mPrintOpCodes[LSCRIPTOpCodes[LOPC_DUPQ]] = print_dupq;
  646. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STORE]] = print_store;
  647. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STORES]] = print_stores;
  648. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STOREL]] = print_storel;
  649. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STOREV]] = print_storev;
  650. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STOREQ]] = print_storeq;
  651. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STOREG]] = print_storeg;
  652. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STOREGS]] = print_storegs;
  653. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STOREGL]] = print_storegl;
  654. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STOREGV]] = print_storegv;
  655. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STOREGQ]] = print_storegq;
  656. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LOADP]] = print_loadp;
  657. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LOADSP]] = print_loadsp;
  658. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LOADLP]] = print_loadlp;
  659. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LOADVP]] = print_loadvp;
  660. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LOADQP]] = print_loadqp;
  661. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LOADGP]] = print_loadgp;
  662. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LOADGSP]] = print_loadgsp;
  663. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LOADGLP]] = print_loadglp;
  664. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LOADGVP]] = print_loadgvp;
  665. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LOADGQP]] = print_loadgqp;
  666. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSH]] = print_push;
  667. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHS]] = print_pushs;
  668. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHL]] = print_pushl;
  669. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHV]] = print_pushv;
  670. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHQ]] = print_pushq;
  671. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHG]] = print_pushg;
  672. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHGS]] = print_pushgs;
  673. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHGL]] = print_pushgl;
  674. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHGV]] = print_pushgv;
  675. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHGQ]] = print_pushgq;
  676. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHIP]] = print_puship;
  677. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHSP]] = print_pushsp;
  678. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHBP]] = print_pushbp;
  679. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHARGB]] = print_pushargb;
  680. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHARGI]] = print_pushargi;
  681. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHARGF]] = print_pushargf;
  682. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHARGS]] = print_pushargs;
  683. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHARGV]] = print_pushargv;
  684. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHARGQ]] = print_pushargq;
  685. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHE]] = print_pushe;
  686. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHEV]] = print_pushev;
  687. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHEQ]] = print_pusheq;
  688. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PUSHARGE]] = print_pusharge;
  689. mPrintOpCodes[LSCRIPTOpCodes[LOPC_ADD]] = print_add;
  690. mPrintOpCodes[LSCRIPTOpCodes[LOPC_SUB]] = print_sub;
  691. mPrintOpCodes[LSCRIPTOpCodes[LOPC_MUL]] = print_mul;
  692. mPrintOpCodes[LSCRIPTOpCodes[LOPC_DIV]] = print_div;
  693. mPrintOpCodes[LSCRIPTOpCodes[LOPC_MOD]] = print_mod;
  694. mPrintOpCodes[LSCRIPTOpCodes[LOPC_EQ]] = print_eq;
  695. mPrintOpCodes[LSCRIPTOpCodes[LOPC_NEQ]] = print_neq;
  696. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LEQ]] = print_leq;
  697. mPrintOpCodes[LSCRIPTOpCodes[LOPC_GEQ]] = print_geq;
  698. mPrintOpCodes[LSCRIPTOpCodes[LOPC_LESS]] = print_less;
  699. mPrintOpCodes[LSCRIPTOpCodes[LOPC_GREATER]] = print_greater;
  700. mPrintOpCodes[LSCRIPTOpCodes[LOPC_BITAND]] = print_bitand;
  701. mPrintOpCodes[LSCRIPTOpCodes[LOPC_BITOR]] = print_bitor;
  702. mPrintOpCodes[LSCRIPTOpCodes[LOPC_BITXOR]] = print_bitxor;
  703. mPrintOpCodes[LSCRIPTOpCodes[LOPC_BOOLAND]] = print_booland;
  704. mPrintOpCodes[LSCRIPTOpCodes[LOPC_BOOLOR]] = print_boolor;
  705. mPrintOpCodes[LSCRIPTOpCodes[LOPC_SHL]] = print_shl;
  706. mPrintOpCodes[LSCRIPTOpCodes[LOPC_SHR]] = print_shr;
  707. mPrintOpCodes[LSCRIPTOpCodes[LOPC_NEG]] = print_neg;
  708. mPrintOpCodes[LSCRIPTOpCodes[LOPC_BITNOT]] = print_bitnot;
  709. mPrintOpCodes[LSCRIPTOpCodes[LOPC_BOOLNOT]] = print_boolnot;
  710. mPrintOpCodes[LSCRIPTOpCodes[LOPC_JUMP]] = print_jump;
  711. mPrintOpCodes[LSCRIPTOpCodes[LOPC_JUMPIF]] = print_jumpif;
  712. mPrintOpCodes[LSCRIPTOpCodes[LOPC_JUMPNIF]] = print_jumpnif;
  713. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STATE]] = print_state;
  714. mPrintOpCodes[LSCRIPTOpCodes[LOPC_CALL]] = print_call;
  715. mPrintOpCodes[LSCRIPTOpCodes[LOPC_RETURN]] = print_return;
  716. mPrintOpCodes[LSCRIPTOpCodes[LOPC_CAST]] = print_cast;
  717. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STACKTOS]] = print_stacktos;
  718. mPrintOpCodes[LSCRIPTOpCodes[LOPC_STACKTOL]] = print_stacktol;
  719. mPrintOpCodes[LSCRIPTOpCodes[LOPC_PRINT]] = print_print;
  720. mPrintOpCodes[LSCRIPTOpCodes[LOPC_CALLLIB]] = print_calllib;
  721. mPrintOpCodes[LSCRIPTOpCodes[LOPC_CALLLIB_TWO_BYTE]] = print_calllib_two_byte;
  722. }
  723. void print_noop(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  724. {
  725. lso_print_tabs(fp, tabs);
  726. fprintf(fp, "[0x%X]\tNOOP\n", offset++);
  727. }
  728. void print_pop(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  729. {
  730. lso_print_tabs(fp, tabs);
  731. fprintf(fp, "[0x%X]\tPOP\n", offset++);
  732. }
  733. void print_pops(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  734. {
  735. lso_print_tabs(fp, tabs);
  736. fprintf(fp, "[0x%X]\tPOPS\n", offset++);
  737. }
  738. void print_popl(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  739. {
  740. lso_print_tabs(fp, tabs);
  741. fprintf(fp, "[0x%X]\tPOPL\n", offset++);
  742. }
  743. void print_popv(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  744. {
  745. lso_print_tabs(fp, tabs);
  746. fprintf(fp, "[0x%X]\tPOPV\n", offset++);
  747. }
  748. void print_popq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  749. {
  750. lso_print_tabs(fp, tabs);
  751. fprintf(fp, "[0x%X]\tPOPQ\n", offset++);
  752. }
  753. void print_poparg(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  754. {
  755. S32 arg;
  756. lso_print_tabs(fp, tabs);
  757. fprintf(fp, "[0x%X]\tPOPARG ", offset++);
  758. arg = bytestream2integer(buffer, offset);
  759. fprintf(fp, "%d\n", arg);
  760. }
  761. void print_popip(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  762. {
  763. lso_print_tabs(fp, tabs);
  764. fprintf(fp, "[0x%X]\tPOPIP\n", offset++);
  765. }
  766. void print_popbp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  767. {
  768. lso_print_tabs(fp, tabs);
  769. fprintf(fp, "[0x%X]\tPOPBP\n", offset++);
  770. }
  771. void print_popsp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  772. {
  773. lso_print_tabs(fp, tabs);
  774. fprintf(fp, "[0x%X]\tPOPSP\n", offset++);
  775. }
  776. void print_popslr(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  777. {
  778. lso_print_tabs(fp, tabs);
  779. fprintf(fp, "[0x%X]\tPOPSLR\n", offset++);
  780. }
  781. void print_dup(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  782. {
  783. lso_print_tabs(fp, tabs);
  784. fprintf(fp, "[0x%X]\tDUP\n", offset++);
  785. }
  786. void print_dups(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  787. {
  788. lso_print_tabs(fp, tabs);
  789. fprintf(fp, "[0x%X]\tDUPS\n", offset++);
  790. }
  791. void print_dupl(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  792. {
  793. lso_print_tabs(fp, tabs);
  794. fprintf(fp, "[0x%X]\tDUPL\n", offset++);
  795. }
  796. void print_dupv(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  797. {
  798. lso_print_tabs(fp, tabs);
  799. fprintf(fp, "[0x%X]\tDUPV\n", offset++);
  800. }
  801. void print_dupq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  802. {
  803. lso_print_tabs(fp, tabs);
  804. fprintf(fp, "[0x%X]\tDUPQ\n", offset++);
  805. }
  806. void print_store(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  807. {
  808. S32 arg;
  809. lso_print_tabs(fp, tabs);
  810. fprintf(fp, "[0x%X]\tSTORE $BP + ", offset++);
  811. arg = bytestream2integer(buffer, offset);
  812. fprintf(fp, "%d\n", arg);
  813. }
  814. void print_stores(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  815. {
  816. S32 arg;
  817. lso_print_tabs(fp, tabs);
  818. fprintf(fp, "[0x%X]\tSTORES $BP + ", offset++);
  819. arg = bytestream2integer(buffer, offset);
  820. fprintf(fp, "%d\n", arg);
  821. }
  822. void print_storel(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  823. {
  824. S32 arg;
  825. lso_print_tabs(fp, tabs);
  826. fprintf(fp, "[0x%X]\tSTOREL $BP + ", offset++);
  827. arg = bytestream2integer(buffer, offset);
  828. fprintf(fp, "%d\n", arg);
  829. }
  830. void print_storev(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  831. {
  832. S32 arg;
  833. lso_print_tabs(fp, tabs);
  834. fprintf(fp, "[0x%X]\tSTOREV $BP + ", offset++);
  835. arg = bytestream2integer(buffer, offset);
  836. fprintf(fp, "%d\n", arg);
  837. }
  838. void print_storeq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  839. {
  840. S32 arg;
  841. lso_print_tabs(fp, tabs);
  842. fprintf(fp, "[0x%X]\tSTOREQ $BP + ", offset++);
  843. arg = bytestream2integer(buffer, offset);
  844. fprintf(fp, "%d\n", arg);
  845. }
  846. void print_storeg(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  847. {
  848. S32 arg;
  849. lso_print_tabs(fp, tabs);
  850. fprintf(fp, "[0x%X]\tSTOREG ", offset++);
  851. arg = bytestream2integer(buffer, offset);
  852. fprintf(fp, "%d\n", arg + get_register(buffer, LREG_GVR));
  853. }
  854. void print_storegs(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  855. {
  856. S32 arg;
  857. lso_print_tabs(fp, tabs);
  858. fprintf(fp, "[0x%X]\tSTOREGS ", offset++);
  859. arg = bytestream2integer(buffer, offset);
  860. fprintf(fp, "%d\n", arg + get_register(buffer, LREG_GVR));
  861. }
  862. void print_storegl(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  863. {
  864. S32 arg;
  865. lso_print_tabs(fp, tabs);
  866. fprintf(fp, "[0x%X]\tSTOREGL ", offset++);
  867. arg = bytestream2integer(buffer, offset);
  868. fprintf(fp, "%d\n", arg + get_register(buffer, LREG_GVR));
  869. }
  870. void print_storegv(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  871. {
  872. S32 arg;
  873. lso_print_tabs(fp, tabs);
  874. fprintf(fp, "[0x%X]\tSTOREGV ", offset++);
  875. arg = bytestream2integer(buffer, offset);
  876. fprintf(fp, "%d\n", arg + get_register(buffer, LREG_GVR));
  877. }
  878. void print_storegq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  879. {
  880. S32 arg;
  881. lso_print_tabs(fp, tabs);
  882. fprintf(fp, "[0x%X]\tSTOREGQ ", offset++);
  883. arg = bytestream2integer(buffer, offset);
  884. fprintf(fp, "%d\n", arg + get_register(buffer, LREG_GVR));
  885. }
  886. void print_loadp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  887. {
  888. S32 arg;
  889. lso_print_tabs(fp, tabs);
  890. fprintf(fp, "[0x%X]\tSTOREP $BP + ", offset++);
  891. arg = bytestream2integer(buffer, offset);
  892. fprintf(fp, "%d\n", arg);
  893. }
  894. void print_loadsp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  895. {
  896. S32 arg;
  897. lso_print_tabs(fp, tabs);
  898. fprintf(fp, "[0x%X]\tSTOREPS $BP + ", offset++);
  899. arg = bytestream2integer(buffer, offset);
  900. fprintf(fp, "%d\n", arg);
  901. }
  902. void print_loadlp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  903. {
  904. S32 arg;
  905. lso_print_tabs(fp, tabs);
  906. fprintf(fp, "[0x%X]\tSTOREPL $BP + ", offset++);
  907. arg = bytestream2integer(buffer, offset);
  908. fprintf(fp, "%d\n", arg);
  909. }
  910. void print_loadvp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  911. {
  912. S32 arg;
  913. lso_print_tabs(fp, tabs);
  914. fprintf(fp, "[0x%X]\tSTOREVP $BP + ", offset++);
  915. arg = bytestream2integer(buffer, offset);
  916. fprintf(fp, "%d\n", arg);
  917. }
  918. void print_loadqp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  919. {
  920. S32 arg;
  921. lso_print_tabs(fp, tabs);
  922. fprintf(fp, "[0x%X]\tSTOREQP $BP + ", offset++);
  923. arg = bytestream2integer(buffer, offset);
  924. fprintf(fp, "%d\n", arg);
  925. }
  926. void print_loadgp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  927. {
  928. S32 arg;
  929. lso_print_tabs(fp, tabs);
  930. fprintf(fp, "[0x%X]\tSTOREGP ", offset++);
  931. arg = bytestream2integer(buffer, offset);
  932. fprintf(fp, "%d\n", arg + get_register(buffer, LREG_GVR));
  933. }
  934. void print_loadgsp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  935. {
  936. S32 arg;
  937. lso_print_tabs(fp, tabs);
  938. fprintf(fp, "[0x%X]\tSTOREGSP ", offset++);
  939. arg = bytestream2integer(buffer, offset);
  940. fprintf(fp, "%d\n", arg + get_register(buffer, LREG_GVR));
  941. }
  942. void print_loadglp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  943. {
  944. S32 arg;
  945. lso_print_tabs(fp, tabs);
  946. fprintf(fp, "[0x%X]\tSTOREGLP ", offset++);
  947. arg = bytestream2integer(buffer, offset);
  948. fprintf(fp, "%d\n", arg + get_register(buffer, LREG_GVR));
  949. }
  950. void print_loadgvp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  951. {
  952. S32 arg;
  953. lso_print_tabs(fp, tabs);
  954. fprintf(fp, "[0x%X]\tSTOREGVP ", offset++);
  955. arg = bytestream2integer(buffer, offset);
  956. fprintf(fp, "%d\n", arg + get_register(buffer, LREG_GVR));
  957. }
  958. void print_loadgqp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  959. {
  960. S32 arg;
  961. lso_print_tabs(fp, tabs);
  962. fprintf(fp, "[0x%X]\tSTOREGQP ", offset++);
  963. arg = bytestream2integer(buffer, offset);
  964. fprintf(fp, "%d\n", arg + get_register(buffer, LREG_GVR));
  965. }
  966. void print_push(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  967. {
  968. S32 arg;
  969. lso_print_tabs(fp, tabs);
  970. fprintf(fp, "[0x%X]\tPUSH $BP + ", offset++);
  971. arg = bytestream2integer(buffer, offset);
  972. fprintf(fp, "%d\n", arg);
  973. }
  974. void print_pushs(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  975. {
  976. S32 arg;
  977. lso_print_tabs(fp, tabs);
  978. fprintf(fp, "[0x%X]\tPUSHS $BP + ", offset++);
  979. arg = bytestream2integer(buffer, offset);
  980. fprintf(fp, "%d\n", arg);
  981. }
  982. void print_pushl(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  983. {
  984. S32 arg;
  985. lso_print_tabs(fp, tabs);
  986. fprintf(fp, "[0x%X]\tPUSHL $BP + ", offset++);
  987. arg = bytestream2integer(buffer, offset);
  988. fprintf(fp, "%d\n", arg);
  989. }
  990. void print_pushv(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  991. {
  992. S32 arg;
  993. lso_print_tabs(fp, tabs);
  994. fprintf(fp, "[0x%X]\tPUSHV $BP + ", offset++);
  995. arg = bytestream2integer(buffer, offset);
  996. fprintf(fp, "%d\n", arg);
  997. }
  998. void print_pushq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  999. {
  1000. S32 arg;
  1001. lso_print_tabs(fp, tabs);
  1002. fprintf(fp, "[0x%X]\tPUSHQ $BP + ", offset++);
  1003. arg = bytestream2integer(buffer, offset);
  1004. fprintf(fp, "%d\n", arg);
  1005. }
  1006. void print_pushg(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1007. {
  1008. S32 arg;
  1009. lso_print_tabs(fp, tabs);
  1010. fprintf(fp, "[0x%X]\tPUSHG ", offset++);
  1011. arg = bytestream2integer(buffer, offset);
  1012. fprintf(fp, "0x%X\n", arg + get_register(buffer, LREG_GVR));
  1013. }
  1014. void print_pushgs(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1015. {
  1016. S32 arg;
  1017. lso_print_tabs(fp, tabs);
  1018. fprintf(fp, "[0x%X]\tPUSHGS ", offset++);
  1019. arg = bytestream2integer(buffer, offset);
  1020. fprintf(fp, "0x%X\n", arg + get_register(buffer, LREG_GVR));
  1021. }
  1022. void print_pushgl(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1023. {
  1024. S32 arg;
  1025. lso_print_tabs(fp, tabs);
  1026. fprintf(fp, "[0x%X]\tPUSHGL ", offset++);
  1027. arg = bytestream2integer(buffer, offset);
  1028. fprintf(fp, "0x%X\n", arg + get_register(buffer, LREG_GVR));
  1029. }
  1030. void print_pushgv(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1031. {
  1032. S32 arg;
  1033. lso_print_tabs(fp, tabs);
  1034. fprintf(fp, "[0x%X]\tPUSHGV ", offset++);
  1035. arg = bytestream2integer(buffer, offset);
  1036. fprintf(fp, "0x%X\n", arg + get_register(buffer, LREG_GVR));
  1037. }
  1038. void print_pushgq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1039. {
  1040. S32 arg;
  1041. lso_print_tabs(fp, tabs);
  1042. fprintf(fp, "[0x%X]\tPUSHGQ ", offset++);
  1043. arg = bytestream2integer(buffer, offset);
  1044. fprintf(fp, "0x%X\n", arg + get_register(buffer, LREG_GVR));
  1045. }
  1046. void print_puship(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1047. {
  1048. lso_print_tabs(fp, tabs);
  1049. fprintf(fp, "[0x%X]\tPUSHIP\n", offset++);
  1050. }
  1051. void print_pushbp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1052. {
  1053. lso_print_tabs(fp, tabs);
  1054. fprintf(fp, "[0x%X]\tPUSHBP\n", offset++);
  1055. }
  1056. void print_pushsp(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1057. {
  1058. lso_print_tabs(fp, tabs);
  1059. fprintf(fp, "[0x%X]\tPUSHSP\n", offset++);
  1060. }
  1061. void print_pushargb(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1062. {
  1063. U8 arg;
  1064. lso_print_tabs(fp, tabs);
  1065. fprintf(fp, "[0x%X]\tPUSHARGB ", offset++);
  1066. arg = *(buffer + offset++);
  1067. fprintf(fp, "%d\n", (U32)arg);
  1068. }
  1069. void print_pushargi(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1070. {
  1071. S32 arg;
  1072. lso_print_tabs(fp, tabs);
  1073. fprintf(fp, "[0x%X]\tPUSHARGI ", offset++);
  1074. arg = bytestream2integer(buffer, offset);
  1075. fprintf(fp, "%d\n", arg);
  1076. }
  1077. void print_pushargf(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1078. {
  1079. F32 arg;
  1080. lso_print_tabs(fp, tabs);
  1081. fprintf(fp, "[0x%X]\tPUSHARGF ", offset++);
  1082. arg = bytestream2float(buffer, offset);
  1083. fprintf(fp, "%f\n", arg);
  1084. }
  1085. void print_pushargs(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1086. {
  1087. char arg[1024]; /*Flawfinder: ignore*/
  1088. lso_print_tabs(fp, tabs);
  1089. fprintf(fp, "[0x%X]\tPUSHARGS ", offset++);
  1090. bytestream2char(arg, buffer, offset, sizeof(arg));
  1091. fprintf(fp, "%s\n", arg);
  1092. }
  1093. void print_pushargv(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1094. {
  1095. LLVector3 arg;
  1096. lso_print_tabs(fp, tabs);
  1097. fprintf(fp, "[0x%X]\tPUSHARGV ", offset++);
  1098. bytestream2vector(arg, buffer, offset);
  1099. fprintf(fp, "< %f, %f, %f >\n", arg.mV[VX], arg.mV[VY], arg.mV[VZ]);
  1100. }
  1101. void print_pushargq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1102. {
  1103. LLQuaternion arg;
  1104. lso_print_tabs(fp, tabs);
  1105. fprintf(fp, "[0x%X]\tPUSHARGV ", offset++);
  1106. bytestream2quaternion(arg, buffer, offset);
  1107. fprintf(fp, "< %f, %f, %f, %f >\n", arg.mQ[VX], arg.mQ[VY], arg.mQ[VZ], arg.mQ[VS]);
  1108. }
  1109. void print_pushe(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1110. {
  1111. lso_print_tabs(fp, tabs);
  1112. fprintf(fp, "[0x%X]\tPUSHE\n", offset++);
  1113. }
  1114. void print_pushev(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1115. {
  1116. lso_print_tabs(fp, tabs);
  1117. fprintf(fp, "[0x%X]\tPUSHEV\n", offset++);
  1118. }
  1119. void print_pusheq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1120. {
  1121. lso_print_tabs(fp, tabs);
  1122. fprintf(fp, "[0x%X]\tPUSHEQ\n", offset++);
  1123. }
  1124. void print_pusharge(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1125. {
  1126. S32 arg;
  1127. lso_print_tabs(fp, tabs);
  1128. fprintf(fp, "[0x%X]\tPUSHARGE ", offset++);
  1129. arg = bytestream2integer(buffer, offset);
  1130. fprintf(fp, "%d\n", arg);
  1131. }
  1132. void print_add(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1133. {
  1134. U8 types;
  1135. U8 type1;
  1136. U8 type2;
  1137. lso_print_tabs(fp, tabs);
  1138. fprintf(fp, "[0x%X]\tADD ", offset++);
  1139. types = *(buffer + offset++);
  1140. type1 = types >> 4;
  1141. type2 = types & 0xf;
  1142. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1143. }
  1144. void print_sub(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1145. {
  1146. U8 types;
  1147. U8 type1;
  1148. U8 type2;
  1149. lso_print_tabs(fp, tabs);
  1150. fprintf(fp, "[0x%X]\tSUB ", offset++);
  1151. types = *(buffer + offset++);
  1152. type1 = types >> 4;
  1153. type2 = types & 0xf;
  1154. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1155. }
  1156. void print_mul(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1157. {
  1158. U8 types;
  1159. U8 type1;
  1160. U8 type2;
  1161. lso_print_tabs(fp, tabs);
  1162. fprintf(fp, "[0x%X]\tMUL ", offset++);
  1163. types = *(buffer + offset++);
  1164. type1 = types >> 4;
  1165. type2 = types & 0xf;
  1166. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1167. }
  1168. void print_div(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1169. {
  1170. U8 types;
  1171. U8 type1;
  1172. U8 type2;
  1173. lso_print_tabs(fp, tabs);
  1174. fprintf(fp, "[0x%X]\tDIV ", offset++);
  1175. types = *(buffer + offset++);
  1176. type1 = types >> 4;
  1177. type2 = types & 0xf;
  1178. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1179. }
  1180. void print_mod(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1181. {
  1182. U8 types;
  1183. U8 type1;
  1184. U8 type2;
  1185. lso_print_tabs(fp, tabs);
  1186. fprintf(fp, "[0x%X]\tMOD ", offset++);
  1187. types = *(buffer + offset++);
  1188. type1 = types >> 4;
  1189. type2 = types & 0xf;
  1190. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1191. }
  1192. void print_eq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1193. {
  1194. U8 types;
  1195. U8 type1;
  1196. U8 type2;
  1197. lso_print_tabs(fp, tabs);
  1198. fprintf(fp, "[0x%X]\tEQ ", offset++);
  1199. types = *(buffer + offset++);
  1200. type1 = types >> 4;
  1201. type2 = types & 0xf;
  1202. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1203. }
  1204. void print_neq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1205. {
  1206. U8 types;
  1207. U8 type1;
  1208. U8 type2;
  1209. lso_print_tabs(fp, tabs);
  1210. fprintf(fp, "[0x%X]\tNEQ ", offset++);
  1211. types = *(buffer + offset++);
  1212. type1 = types >> 4;
  1213. type2 = types & 0xf;
  1214. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1215. }
  1216. void print_leq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1217. {
  1218. U8 types;
  1219. U8 type1;
  1220. U8 type2;
  1221. lso_print_tabs(fp, tabs);
  1222. fprintf(fp, "[0x%X]\tLEQ ", offset++);
  1223. types = *(buffer + offset++);
  1224. type1 = types >> 4;
  1225. type2 = types & 0xf;
  1226. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1227. }
  1228. void print_geq(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1229. {
  1230. U8 types;
  1231. U8 type1;
  1232. U8 type2;
  1233. lso_print_tabs(fp, tabs);
  1234. fprintf(fp, "[0x%X]\tGEQ ", offset++);
  1235. types = *(buffer + offset++);
  1236. type1 = types >> 4;
  1237. type2 = types & 0xf;
  1238. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1239. }
  1240. void print_less(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1241. {
  1242. U8 types;
  1243. U8 type1;
  1244. U8 type2;
  1245. lso_print_tabs(fp, tabs);
  1246. fprintf(fp, "[0x%X]\tLESS ", offset++);
  1247. types = *(buffer + offset++);
  1248. type1 = types >> 4;
  1249. type2 = types & 0xf;
  1250. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1251. }
  1252. void print_greater(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1253. {
  1254. U8 types;
  1255. U8 type1;
  1256. U8 type2;
  1257. lso_print_tabs(fp, tabs);
  1258. fprintf(fp, "[0x%X]\tGREATER ", offset++);
  1259. types = *(buffer + offset++);
  1260. type1 = types >> 4;
  1261. type2 = types & 0xf;
  1262. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1263. }
  1264. void print_bitand(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1265. {
  1266. lso_print_tabs(fp, tabs);
  1267. fprintf(fp, "[0x%X]\tBITAND\n", offset++);
  1268. }
  1269. void print_bitor(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1270. {
  1271. lso_print_tabs(fp, tabs);
  1272. fprintf(fp, "[0x%X]\tBITOR\n", offset++);
  1273. }
  1274. void print_bitxor(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1275. {
  1276. lso_print_tabs(fp, tabs);
  1277. fprintf(fp, "[0x%X]\tBITXOR\n", offset++);
  1278. }
  1279. void print_booland(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1280. {
  1281. lso_print_tabs(fp, tabs);
  1282. fprintf(fp, "[0x%X]\tBOOLAND\n", offset++);
  1283. }
  1284. void print_boolor(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1285. {
  1286. lso_print_tabs(fp, tabs);
  1287. fprintf(fp, "[0x%X]\tBOOLOR\n", offset++);
  1288. }
  1289. void print_shl(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1290. {
  1291. lso_print_tabs(fp, tabs);
  1292. fprintf(fp, "[0x%X]\tSHL\n", offset++);
  1293. }
  1294. void print_shr(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1295. {
  1296. lso_print_tabs(fp, tabs);
  1297. fprintf(fp, "[0x%X]\tSHR\n", offset++);
  1298. }
  1299. void print_neg(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1300. {
  1301. U8 type;
  1302. lso_print_tabs(fp, tabs);
  1303. fprintf(fp, "[0x%X]\tNEG ", offset++);
  1304. type = *(buffer + offset++);
  1305. fprintf(fp, "%s\n", LSCRIPTTypeNames[type]);
  1306. }
  1307. void print_bitnot(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1308. {
  1309. lso_print_tabs(fp, tabs);
  1310. fprintf(fp, "[0x%X]\tBITNOT\n", offset++);
  1311. }
  1312. void print_boolnot(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1313. {
  1314. lso_print_tabs(fp, tabs);
  1315. fprintf(fp, "[0x%X]\tBOOLNOT\n", offset++);
  1316. }
  1317. void print_jump(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1318. {
  1319. S32 arg;
  1320. lso_print_tabs(fp, tabs);
  1321. fprintf(fp, "[0x%X]\tJUMP ", offset++);
  1322. arg = bytestream2integer(buffer, offset);
  1323. fprintf(fp, "%d\n", arg);
  1324. }
  1325. void print_jumpif(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1326. {
  1327. S32 arg;
  1328. U8 type;
  1329. lso_print_tabs(fp, tabs);
  1330. fprintf(fp, "[0x%X]\tJUMPIF ", offset++);
  1331. type = *(buffer + offset++);
  1332. arg = bytestream2integer(buffer, offset);
  1333. fprintf(fp, "%s, %d\n", LSCRIPTTypeNames[type], arg);
  1334. }
  1335. void print_jumpnif(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1336. {
  1337. S32 arg;
  1338. U8 type;
  1339. lso_print_tabs(fp, tabs);
  1340. fprintf(fp, "[0x%X]\tJUMPNIF ", offset++);
  1341. type = *(buffer + offset++);
  1342. arg = bytestream2integer(buffer, offset);
  1343. fprintf(fp, "%s, %d\n", LSCRIPTTypeNames[type], arg);
  1344. }
  1345. void print_state(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1346. {
  1347. S32 arg;
  1348. lso_print_tabs(fp, tabs);
  1349. fprintf(fp, "[0x%X]\tSTATE ", offset++);
  1350. arg = bytestream2integer(buffer, offset);
  1351. fprintf(fp, "%d\n", arg);
  1352. }
  1353. void print_call(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1354. {
  1355. S32 arg;
  1356. lso_print_tabs(fp, tabs);
  1357. fprintf(fp, "[0x%X]\tCALL ", offset++);
  1358. arg = bytestream2integer(buffer, offset);
  1359. fprintf(fp, "%d\n", arg);
  1360. }
  1361. void print_return(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1362. {
  1363. lso_print_tabs(fp, tabs);
  1364. fprintf(fp, "[0x%X]\tRETURN\n", offset++);
  1365. }
  1366. void print_cast(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1367. {
  1368. U8 types;
  1369. U8 type1;
  1370. U8 type2;
  1371. lso_print_tabs(fp, tabs);
  1372. fprintf(fp, "[0x%X]\tCAST ", offset++);
  1373. types = *(buffer + offset++);
  1374. type1 = types >> 4;
  1375. type2 = types & 0xf;
  1376. fprintf(fp, "%s, %s\n", LSCRIPTTypeNames[type1], LSCRIPTTypeNames[type2]);
  1377. }
  1378. void print_stacktos(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1379. {
  1380. S32 arg;
  1381. lso_print_tabs(fp, tabs);
  1382. fprintf(fp, "[0x%X]\tSTACKTOS ", offset++);
  1383. arg = bytestream2integer(buffer, offset);
  1384. fprintf(fp, "%d\n", arg);
  1385. }
  1386. void print_stacktol(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1387. {
  1388. S32 arg;
  1389. lso_print_tabs(fp, tabs);
  1390. fprintf(fp, "[0x%X]\tSTACKTOL ", offset++);
  1391. arg = bytestream2integer(buffer, offset);
  1392. fprintf(fp, "%d\n", arg);
  1393. }
  1394. void print_print(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1395. {
  1396. lso_print_tabs(fp, tabs);
  1397. fprintf(fp, "[0x%X]\tPRINT ", offset++);
  1398. U8 type = *(buffer + offset++);
  1399. fprintf(fp, "%s\n", LSCRIPTTypeNames[type]);
  1400. }
  1401. void print_calllib(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1402. {
  1403. U8 arg;
  1404. lso_print_tabs(fp, tabs);
  1405. fprintf(fp, "[0x%X]\tCALLLIB ", offset++);
  1406. arg = *(buffer + offset++);
  1407. fprintf(fp, "%d (%s)\n", (U32)arg, gScriptLibrary.mFunctions[arg].mName);
  1408. }
  1409. void print_calllib_two_byte(LLFILE *fp, U8 *buffer, S32 &offset, S32 tabs)
  1410. {
  1411. U16 arg;
  1412. lso_print_tabs(fp, tabs);
  1413. fprintf(fp, "[0x%X]\tCALLLIB_TWO_BYTE ", offset++);
  1414. arg = bytestream2u16(buffer, offset);
  1415. fprintf(fp, "%d (%s)\n", (U32)arg, gScriptLibrary.mFunctions[arg].mName);
  1416. }