lscript_readlso.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:48k
源码类别:

游戏引擎

开发平台:

C++ Builder

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