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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lscript_library.h
  3.  * @brief External library interface
  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. #ifndef LL_LSCRIPT_LIBRARY_H
  33. #define LL_LSCRIPT_LIBRARY_H
  34. #include "lscript_byteformat.h"
  35. #include "v3math.h"
  36. #include "llquaternion.h"
  37. #include "lluuid.h"
  38. #include "lscript_byteconvert.h"
  39. class LLScriptLibData;
  40. class LLScriptLibraryFunction
  41. {
  42. public:
  43. LLScriptLibraryFunction(F32 eu, F32 st, void (*exec_func)(LLScriptLibData *, LLScriptLibData *, const LLUUID &), const char *name, const char *ret_type, const char *args, BOOL god_only = FALSE);
  44. ~LLScriptLibraryFunction();
  45. F32  mEnergyUse;
  46. F32  mSleepTime;
  47. void (*mExecFunc)(LLScriptLibData *, LLScriptLibData *, const LLUUID &);
  48. const char *mName;
  49. const char *mReturnType;
  50. const char *mArgs;
  51. BOOL mGodOnly;
  52. };
  53. class LLScriptLibrary
  54. {
  55. public:
  56. LLScriptLibrary();
  57. ~LLScriptLibrary();
  58. void init();
  59. void addFunction(F32 eu, F32 st, void (*exec_func)(LLScriptLibData *, LLScriptLibData *, const LLUUID &), const char *name, const char *ret_type, const char *args, BOOL god_only = FALSE);
  60. void assignExec(const char *name, void (*exec_func)(LLScriptLibData *, LLScriptLibData *, const LLUUID &));
  61. std::vector<LLScriptLibraryFunction> mFunctions;
  62. };
  63. class LLScriptLibData
  64. {
  65. public:
  66. // TODO: Change this to a union
  67. LSCRIPTType mType;
  68. S32 mInteger;
  69. F32 mFP;
  70. char *mKey;
  71. char *mString;
  72. LLVector3 mVec;
  73. LLQuaternion mQuat;
  74. LLScriptLibData *mListp;
  75. friend bool operator<=(const LLScriptLibData &a, const LLScriptLibData &b)
  76. {
  77. if (a.mType == b.mType)
  78. {
  79. if (a.mType == LST_INTEGER)
  80. {
  81. return a.mInteger <= b.mInteger;
  82. }
  83. if (a.mType == LST_FLOATINGPOINT)
  84. {
  85. return a.mFP <= b.mFP;
  86. }
  87. if (a.mType == LST_STRING)
  88. {
  89. return strcmp(a.mString, b.mString) <= 0;
  90. }
  91. if (a.mType == LST_KEY)
  92. {
  93. return strcmp(a.mKey, b.mKey) <= 0;
  94. }
  95. if (a.mType == LST_VECTOR)
  96. {
  97. return a.mVec.magVecSquared() <= b.mVec.magVecSquared();
  98. }
  99. }
  100. return TRUE;
  101. }
  102. friend bool operator==(const LLScriptLibData &a, const LLScriptLibData &b)
  103. {
  104. if (a.mType == b.mType)
  105. {
  106. if (a.mType == LST_INTEGER)
  107. {
  108. return a.mInteger == b.mInteger;
  109. }
  110. if (a.mType == LST_FLOATINGPOINT)
  111. {
  112. return a.mFP == b.mFP;
  113. }
  114. if (a.mType == LST_STRING)
  115. {
  116. return !strcmp(a.mString, b.mString);
  117. }
  118. if (a.mType == LST_KEY)
  119. {
  120. return !strcmp(a.mKey, b.mKey);
  121. }
  122. if (a.mType == LST_VECTOR)
  123. {
  124. return a.mVec == b.mVec;
  125. }
  126. if (a.mType == LST_QUATERNION)
  127. {
  128. return a.mQuat == b.mQuat;
  129. }
  130. }
  131. return FALSE;
  132. }
  133. S32 getListLength() const
  134. {
  135. const LLScriptLibData *data = this;
  136. S32 retval = 0;
  137. while (data->mListp)
  138. {
  139. retval++;
  140. data = data->mListp;
  141. }
  142. return retval;
  143. }
  144. BOOL checkForMultipleLists()
  145. {
  146. LLScriptLibData *data = this;
  147. while (data->mListp)
  148. {
  149. data = data->mListp;
  150. if (data->mType == LST_LIST)
  151. return TRUE;
  152. }
  153. return FALSE;
  154. }
  155. S32  getSavedSize()
  156. {
  157. S32 size = 0;
  158. // mType
  159. size += 4;
  160. switch(mType)
  161. {
  162. case LST_INTEGER:
  163. size += 4;
  164. break;
  165. case LST_FLOATINGPOINT:
  166. size += 4;
  167. break;
  168. case LST_KEY:
  169. size += (S32)strlen(mKey) + 1; /*Flawfinder: ignore*/
  170. break;
  171. case LST_STRING:
  172. size += (S32)strlen(mString) + 1; /*Flawfinder: ignore*/
  173. break;
  174. case LST_LIST:
  175. break;
  176. case LST_VECTOR:
  177. size += 12;
  178. break;
  179. case LST_QUATERNION:
  180. size += 16;
  181. break;
  182. default:
  183. break;
  184. }
  185. return size;
  186. }
  187. S32  write2bytestream(U8 *dest)
  188. {
  189. S32 offset = 0;
  190. integer2bytestream(dest, offset, mType);
  191. switch(mType)
  192. {
  193. case LST_INTEGER:
  194. integer2bytestream(dest, offset, mInteger);
  195. break;
  196. case LST_FLOATINGPOINT:
  197. float2bytestream(dest, offset, mFP);
  198. break;
  199. case LST_KEY:
  200. char2bytestream(dest, offset, mKey);
  201. break;
  202. case LST_STRING:
  203. char2bytestream(dest, offset, mString);
  204. break;
  205. case LST_LIST:
  206. break;
  207. case LST_VECTOR:
  208. vector2bytestream(dest, offset, mVec);
  209. break;
  210. case LST_QUATERNION:
  211. quaternion2bytestream(dest, offset, mQuat);
  212. break;
  213. default:
  214. break;
  215. }
  216. return offset;
  217. }
  218. LLScriptLibData() : mType(LST_NULL), mInteger(0), mFP(0.f), mKey(NULL), mString(NULL), mVec(), mQuat(), mListp(NULL)
  219. {
  220. }
  221. LLScriptLibData(const LLScriptLibData &data) : mType(data.mType), mInteger(data.mInteger), mFP(data.mFP), mKey(NULL), mString(NULL), mVec(data.mVec), mQuat(data.mQuat), mListp(NULL)
  222. {
  223. if (data.mKey)
  224. {
  225. mKey = new char[strlen(data.mKey) + 1]; /* Flawfinder: ignore */
  226. if (mKey == NULL)
  227. {
  228. llerrs << "Memory Allocation Failed" << llendl;
  229. return;
  230. }
  231. strcpy(mKey, data.mKey); /* Flawfinder: ignore */
  232. }
  233. if (data.mString)
  234. {
  235. mString = new char[strlen(data.mString) + 1]; /* Flawfinder: ignore */
  236. if (mString == NULL)
  237. {
  238. llerrs << "Memory Allocation Failed" << llendl;
  239. return;
  240. }
  241. strcpy(mString, data.mString); /* Flawfinder: ignore */
  242. }
  243. }
  244. LLScriptLibData(U8 *src, S32 &offset) : mListp(NULL)
  245. {
  246. static char temp[TOP_OF_MEMORY]; /* Flawfinder: ignore */
  247. mType = (LSCRIPTType)bytestream2integer(src, offset);
  248. switch(mType)
  249. {
  250. case LST_INTEGER:
  251. mInteger = bytestream2integer(src, offset);
  252. break;
  253. case LST_FLOATINGPOINT:
  254. mFP = bytestream2float(src, offset);
  255. break;
  256. case LST_KEY:
  257. {
  258. bytestream2char(temp, src, offset, sizeof(temp));
  259. mKey = new char[strlen(temp) + 1]; /* Flawfinder: ignore */
  260. if (mKey == NULL)
  261. {
  262. llerrs << "Memory Allocation Failed" << llendl;
  263. return;
  264. }
  265. strcpy(mKey, temp); /* Flawfinder: ignore */
  266. }
  267. break;
  268. case LST_STRING:
  269. {
  270. bytestream2char(temp, src, offset, sizeof(temp));
  271. mString = new char[strlen(temp) + 1]; /* Flawfinder: ignore */
  272. if (mString == NULL)
  273. {
  274. llerrs << "Memory Allocation Failed" << llendl;
  275. return;
  276. }
  277. strcpy(mString, temp); /* Flawfinder: ignore */
  278. }
  279. break;
  280. case LST_LIST:
  281. break;
  282. case LST_VECTOR:
  283. bytestream2vector(mVec, src, offset);
  284. break;
  285. case LST_QUATERNION:
  286. bytestream2quaternion(mQuat, src, offset);
  287. break;
  288. default:
  289. break;
  290. }
  291. }
  292. void set(U8 *src, S32 &offset)
  293. {
  294. static char temp[TOP_OF_MEMORY]; /* Flawfinder: ignore */
  295. mType = (LSCRIPTType)bytestream2integer(src, offset);
  296. switch(mType)
  297. {
  298. case LST_INTEGER:
  299. mInteger = bytestream2integer(src, offset);
  300. break;
  301. case LST_FLOATINGPOINT:
  302. mFP = bytestream2float(src, offset);
  303. break;
  304. case LST_KEY:
  305. {
  306. bytestream2char(temp, src, offset, sizeof(temp));
  307. mKey = new char[strlen(temp) + 1]; /* Flawfinder: ignore */
  308. if (mKey == NULL)
  309. {
  310. llerrs << "Memory Allocation Failed" << llendl;
  311. return;
  312. }
  313. strcpy(mKey, temp); /* Flawfinder: ignore */
  314. }
  315. break;
  316. case LST_STRING:
  317. {
  318. bytestream2char(temp, src, offset, sizeof(temp));
  319. mString = new char[strlen(temp) + 1]; /* Flawfinder: ignore */
  320. if (mString == NULL)
  321. {
  322. llerrs << "Memory Allocation Failed" << llendl;
  323. return;
  324. }
  325. strcpy(mString, temp); /* Flawfinder: ignore */
  326. }
  327. break;
  328. case LST_LIST:
  329. break;
  330. case LST_VECTOR:
  331. bytestream2vector(mVec, src, offset);
  332. break;
  333. case LST_QUATERNION:
  334. bytestream2quaternion(mQuat, src, offset);
  335. break;
  336. default:
  337. break;
  338. }
  339. }
  340. void print(std::ostream &s, BOOL b_prepend_comma);
  341. void print_separator(std::ostream& ostr, BOOL b_prepend_sep, char* sep);
  342. void setFromCSV(const char *src)
  343. {
  344. mType = LST_STRING;
  345. mString = new char[strlen(src) + 1]; /* Flawfinder: ignore */
  346. if (mString == NULL)
  347. {
  348. llerrs << "Memory Allocation Failed" << llendl;
  349. return;
  350. }
  351. strcpy(mString, src); /* Flawfinder: ignore */
  352. }
  353. LLScriptLibData(S32 integer) : mType(LST_INTEGER), mInteger(integer), mFP(0.f), mKey(NULL), mString(NULL), mVec(), mQuat(), mListp(NULL)
  354. {
  355. }
  356. LLScriptLibData(F32 fp) : mType(LST_FLOATINGPOINT), mInteger(0), mFP(fp), mKey(NULL), mString(NULL), mVec(), mQuat(), mListp(NULL)
  357. {
  358. }
  359. LLScriptLibData(const LLUUID &id) : mType(LST_KEY), mInteger(0), mFP(0.f), mKey(NULL), mString(NULL), mVec(), mQuat(), mListp(NULL)
  360. {
  361. std::string idstr;
  362. id.toString(idstr);
  363. mKey = new char[idstr.length()+1];
  364. LLStringUtil::copy(mKey,idstr.c_str(),idstr.length()+1);
  365. }
  366. LLScriptLibData(const char *string) : mType(LST_STRING), mInteger(0), mFP(0.f), mKey(NULL), mString(NULL), mVec(), mQuat(), mListp(NULL)
  367. {
  368. if (!string)
  369. {
  370. mString = new char[1];
  371. mString[0] = 0;
  372. }
  373. else
  374. {
  375. mString = new char[strlen(string) + 1]; /* Flawfinder: ignore */
  376. if (mString == NULL)
  377. {
  378. llerrs << "Memory Allocation Failed" << llendl;
  379. return;
  380. }
  381. strcpy(mString, string); /* Flawfinder: ignore */
  382. }
  383. }
  384. LLScriptLibData(const LLVector3 &vec) : mType(LST_VECTOR), mInteger(0), mFP(0.f), mKey(NULL), mString(NULL), mVec(vec), mQuat(), mListp(NULL)
  385. {
  386. }
  387. LLScriptLibData(const LLQuaternion &quat) : mType(LST_QUATERNION), mInteger(0), mFP(0.f), mKey(NULL), mString(NULL), mVec(), mQuat(quat), mListp(NULL)
  388. {
  389. }
  390. ~LLScriptLibData()
  391. {
  392. delete mListp;
  393. delete [] mKey;
  394. delete [] mString;
  395. }
  396. };
  397. extern LLScriptLibrary gScriptLibrary;
  398. #endif