PageRenderTime 55ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/Assets/LUA/KopiLua/lbaselib.cs

https://bitbucket.org/rusoaica/judgement-day-map-editor
C# | 643 lines | 595 code | 48 blank | 0 comment | 102 complexity | f57d3c0ba0ecc46b6d9a0da6ed64676b MD5 | raw file
  1. using System;
  2. namespace KopiLua
  3. {
  4. using LuaNumberType = System.Double;
  5. public partial class Lua
  6. {
  7. public const int CO_RUN = 0;
  8. public const int CO_SUS = 1;
  9. public const int CO_NOR = 2;
  10. public const int CO_DEAD = 3;
  11. private static readonly string[] _stat_names = { "running", "suspended", "normal", "dead" };
  12. private static int LuaBPrint(LuaState _l)
  13. {
  14. int _n = LuaGetTop(_l);
  15. int _i;
  16. LuaGetGlobal(_l, "tostring");
  17. for (_i = 1; _i <= _n; _i++)
  18. {
  19. CharPtr _s;
  20. LuaPushValue(_l, -1);
  21. LuaPushValue(_l, _i);
  22. LuaCall(_l, 1, 1);
  23. _s = LuaToString(_l, -1);
  24. if (_s == null)
  25. return LuaLError(_l, LUA_QL("tostring") + " must return a string to " + LUA_QL("print"));
  26. if (_i > 1) FPuts("\t", stdOut);
  27. FPuts(_s, stdOut);
  28. LuaPop(_l, 1);
  29. }
  30. Console.Write("\n", stdOut);
  31. return 0;
  32. }
  33. private static int LuaBToNumber(LuaState _l)
  34. {
  35. int _base_ = LuaLOptInt(_l, 2, 10);
  36. if (_base_ == 10)
  37. {
  38. LuaLCheckAny(_l, 1);
  39. if (LuaIsNumber(_l, 1) != 0)
  40. {
  41. LuaPushNumber(_l, LuaToNumber(_l, 1));
  42. return 1;
  43. }
  44. }
  45. else
  46. {
  47. CharPtr _s_1 = LuaLCheckString(_l, 1);
  48. CharPtr _s_2;
  49. ulong _n;
  50. LuaLArgCheck(_l, 2 <= _base_ && _base_ <= 36, 2, "base out of range");
  51. _n = StrToUl(_s_1, out _s_2, _base_);
  52. if (_s_1 != _s_2)
  53. {
  54. while (IsSpace((byte)(_s_2[0]))) _s_2 = _s_2.next();
  55. if (_s_2[0] == '\0')
  56. {
  57. LuaPushNumber(_l, (LuaNumberType)_n);
  58. return 1;
  59. }
  60. }
  61. }
  62. LuaPushNil(_l);
  63. return 1;
  64. }
  65. private static int LuaBError(LuaState _l)
  66. {
  67. int _level = LuaLOptInt(_l, 2, 1);
  68. LuaSetTop(_l, 1);
  69. if ((LuaIsString(_l, 1) != 0) && (_level > 0))
  70. {
  71. LuaLWhere(_l, _level);
  72. LuaPushValue(_l, 1);
  73. LuaConcat(_l, 2);
  74. }
  75. return LuaError(_l);
  76. }
  77. private static int LuaBGetMetatable(LuaState _l)
  78. {
  79. LuaLCheckAny(_l, 1);
  80. if (LuaGetMetatable(_l, 1) == 0)
  81. {
  82. LuaPushNil(_l);
  83. return 1;
  84. }
  85. LuaLGetMetafield(_l, 1, "__metatable");
  86. return 1;
  87. }
  88. private static int LuaBSetMetatable(LuaState _l)
  89. {
  90. int _t = LuaType(_l, 2);
  91. LuaLCheckType(_l, 1, LUA_TTABLE);
  92. LuaLArgCheck(_l, _t == LUA_TNIL || _t == LUA_TTABLE, 2, "nil or table expected");
  93. if (LuaLGetMetafield(_l, 1, "__metatable") != 0)
  94. LuaLError(_l, "cannot change a protected metatable");
  95. LuaSetTop(_l, 2);
  96. LuaSetMetatable(_l, 1);
  97. return 1;
  98. }
  99. private static void GetFunc(LuaState _l, int _opt)
  100. {
  101. if (LuaIsFunction(_l, 1))
  102. LuaPushValue(_l, 1);
  103. else
  104. {
  105. LuaDebug _ar = new LuaDebug();
  106. int _level = (_opt != 0) ? LuaLOptInt(_l, 1, 1) : LuaLCheckInt(_l, 1);
  107. LuaLArgCheck(_l, _level >= 0, 1, "level must be non-negative");
  108. if (LuaGetStack(_l, _level, ref _ar) == 0)
  109. LuaLArgError(_l, 1, "invalid level");
  110. LuaGetInfo(_l, "f", ref _ar);
  111. if (LuaIsNil(_l, -1))
  112. LuaLError(_l, "no function environment for tail call at level %d", _level);
  113. }
  114. }
  115. private static int LuaBGetFEnv(LuaState _l)
  116. {
  117. GetFunc(_l, 1);
  118. if (LuaIsCFunction(_l, -1))
  119. LuaPushValue(_l, LUA_GLOBALSINDEX);
  120. else
  121. LuaGetFEnv(_l, -1);
  122. return 1;
  123. }
  124. private static int LuaBSetFEnv(LuaState _l)
  125. {
  126. LuaLCheckType(_l, 2, LUA_TTABLE);
  127. GetFunc(_l, 0);
  128. LuaPushValue(_l, 2);
  129. if ((LuaIsNumber(_l, 1) != 0) && (LuaToNumber(_l, 1) == 0))
  130. {
  131. LuaPushThread(_l);
  132. LuaInsert(_l, -2);
  133. LuaSetFEnv(_l, -2);
  134. return 0;
  135. }
  136. else if (LuaIsCFunction(_l, -2) || LuaSetFEnv(_l, -2) == 0)
  137. LuaLError(_l, LUA_QL("setfenv") + " cannot change environment of given object");
  138. return 1;
  139. }
  140. private static int LuaBRawEqual(LuaState _l)
  141. {
  142. LuaLCheckAny(_l, 1);
  143. LuaLCheckAny(_l, 2);
  144. LuaPushBoolean(_l, LuaRawEqual(_l, 1, 2));
  145. return 1;
  146. }
  147. private static int LuaBRawGet(LuaState _l)
  148. {
  149. LuaLCheckType(_l, 1, LUA_TTABLE);
  150. LuaLCheckAny(_l, 2);
  151. LuaSetTop(_l, 2);
  152. LuaRawGet(_l, 1);
  153. return 1;
  154. }
  155. private static int LuaBRawSet(LuaState _l)
  156. {
  157. LuaLCheckType(_l, 1, LUA_TTABLE);
  158. LuaLCheckAny(_l, 2);
  159. LuaLCheckAny(_l, 3);
  160. LuaSetTop(_l, 3);
  161. LuaRawSet(_l, 1);
  162. return 1;
  163. }
  164. private static int LuaBGGInfo(LuaState _l)
  165. {
  166. LuaPushInteger(_l, LuaGetGCCount(_l));
  167. return 1;
  168. }
  169. public static readonly CharPtr[] opts = {"stop", "restart", "collect", "count", "step", "setpause", "setstepmul", null};
  170. public readonly static int[] optsnum = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL};
  171. private static int LuaBCollectGarbage(LuaState _l)
  172. {
  173. int _o = LuaLCheckOption(_l, 1, "collect", opts);
  174. int _ex = LuaLOptInt(_l, 2, 0);
  175. int _res = LuaGC(_l, optsnum[_o], _ex);
  176. switch (optsnum[_o])
  177. {
  178. case LUA_GCCOUNT:
  179. {
  180. int _b = LuaGC(_l, LUA_GCCOUNTB, 0);
  181. LuaPushNumber(_l, _res + ((LuaNumberType)_b / 1024));
  182. return 1;
  183. }
  184. case LUA_GCSTEP:
  185. {
  186. LuaPushBoolean(_l, _res);
  187. return 1;
  188. }
  189. default:
  190. {
  191. LuaPushNumber(_l, _res);
  192. return 1;
  193. }
  194. }
  195. }
  196. private static int LuaBType(LuaState _l)
  197. {
  198. LuaLCheckAny(_l, 1);
  199. LuaPushString(_l, LuaLTypeName(_l, 1));
  200. return 1;
  201. }
  202. private static int LuaBNext(LuaState _l)
  203. {
  204. LuaLCheckType(_l, 1, LUA_TTABLE);
  205. LuaSetTop(_l, 2);
  206. if (LuaNext(_l, 1) != 0)
  207. return 2;
  208. else
  209. {
  210. LuaPushNil(_l);
  211. return 1;
  212. }
  213. }
  214. private static int LuaBPairs(LuaState _l)
  215. {
  216. LuaLCheckType(_l, 1, LUA_TTABLE);
  217. LuaPushValue(_l, LuaUpValueIndex(1));
  218. LuaPushValue(_l, 1);
  219. LuaPushNil(_l);
  220. return 3;
  221. }
  222. private static int CheckPairsAux(LuaState _l)
  223. {
  224. int _i = LuaLCheckInt(_l, 2);
  225. LuaLCheckType(_l, 1, LUA_TTABLE);
  226. _i++;
  227. LuaPushInteger(_l, _i);
  228. LuaRawGetI(_l, 1, _i);
  229. return (LuaIsNil(_l, -1)) ? 0 : 2;
  230. }
  231. private static int LuaBIPairs(LuaState _l)
  232. {
  233. LuaLCheckType(_l, 1, LUA_TTABLE);
  234. LuaPushValue(_l, LuaUpValueIndex(1));
  235. LuaPushValue(_l, 1);
  236. LuaPushInteger(_l, 0);
  237. return 3;
  238. }
  239. private static int LoadAux(LuaState _l, int _status)
  240. {
  241. if (_status == 0)
  242. return 1;
  243. else
  244. {
  245. LuaPushNil(_l);
  246. LuaInsert(_l, -2);
  247. return 2;
  248. }
  249. }
  250. private static int LuaBLoadString(LuaState _l)
  251. {
  252. uint __l;
  253. CharPtr _s = LuaLCheckLString(_l, 1, out __l);
  254. CharPtr _chunk_name = LuaLOptString(_l, 2, _s);
  255. return LoadAux(_l, LuaLLoadBuffer(_l, _s, __l, _chunk_name));
  256. }
  257. private static int LuaBLoadFile(LuaState L)
  258. {
  259. CharPtr _f_name = LuaLOptString(L, 1, null);
  260. return LoadAux(L, LuaLLoadFile(L, _f_name));
  261. }
  262. private static CharPtr GenericReader(LuaState _l, object _ud, out uint _size)
  263. {
  264. LuaLCheckStack(_l, 2, "too many nested functions");
  265. LuaPushValue(_l, 1);
  266. LuaCall(_l, 0, 1);
  267. if (LuaIsNil(_l, -1))
  268. {
  269. _size = 0;
  270. return null;
  271. }
  272. else if (LuaIsString(_l, -1) != 0)
  273. {
  274. LuaReplace(_l, 3);
  275. return LuaToLString(_l, 3, out _size);
  276. }
  277. else
  278. {
  279. _size = 0;
  280. LuaLError(_l, "reader function must return a string");
  281. }
  282. return null;
  283. }
  284. private static int LuaBLoad(LuaState _l)
  285. {
  286. int _status;
  287. CharPtr _c_name = LuaLOptString(_l, 2, "=(load)");
  288. LuaLCheckType(_l, 1, LUA_TFUNCTION);
  289. LuaSetTop(_l, 3);
  290. _status = LuaLoad(_l, GenericReader, null, _c_name);
  291. return LoadAux(_l, _status);
  292. }
  293. private static int LuaBDoFile(LuaState _l)
  294. {
  295. CharPtr _f_name = LuaLOptString(_l, 1, null);
  296. int _n = LuaGetTop(_l);
  297. if (LuaLLoadFile(_l, _f_name) != 0) LuaError(_l);
  298. LuaCall(_l, 0, LUA_MULTRET);
  299. return LuaGetTop(_l) - _n;
  300. }
  301. private static int LuaBAssert(LuaState _l)
  302. {
  303. LuaLCheckAny(_l, 1);
  304. if (LuaToBoolean(_l, 1) == 0)
  305. return LuaLError(_l, "%s", LuaLOptString(_l, 2, "assertion failed!"));
  306. return LuaGetTop(_l);
  307. }
  308. private static int LuaBUnpack(LuaState _l)
  309. {
  310. int _i, _e, _n;
  311. LuaLCheckType(_l, 1, LUA_TTABLE);
  312. _i = LuaLOptInt(_l, 2, 1);
  313. _e = LuaLOptInteger(_l, LuaLCheckInt, 3, LuaLGetN(_l, 1));
  314. if (_i > _e) return 0;
  315. _n = _e - _i + 1;
  316. if (_n <= 0 || (LuaCheckStack(_l, _n) == 0))
  317. return LuaLError(_l, "too many results to unpack");
  318. LuaRawGetI(_l, 1, _i);
  319. while (_i++ < _e)
  320. LuaRawGetI(_l, 1, _i);
  321. return _n;
  322. }
  323. private static int LuaBSelect(LuaState _l)
  324. {
  325. int _n = LuaGetTop(_l);
  326. if (LuaType(_l, 1) == LUA_TSTRING && LuaToString(_l, 1)[0] == '#')
  327. {
  328. LuaPushInteger(_l, _n - 1);
  329. return 1;
  330. }
  331. else
  332. {
  333. int _i = LuaLCheckInt(_l, 1);
  334. if (_i < 0) _i = _n + _i;
  335. else if (_i > _n) _i = _n;
  336. LuaLArgCheck(_l, 1 <= _i, 1, "index out of range");
  337. return _n - _i;
  338. }
  339. }
  340. private static int LuaBPCall(LuaState _l)
  341. {
  342. int _status;
  343. LuaLCheckAny(_l, 1);
  344. _status = LuaPCall(_l, LuaGetTop(_l) - 1, LUA_MULTRET, 0);
  345. LuaPushBoolean(_l, (_status == 0) ? 1 : 0);
  346. LuaInsert(_l, 1);
  347. return LuaGetTop(_l);
  348. }
  349. private static int LuaBXPCall(LuaState _l)
  350. {
  351. int _status;
  352. LuaLCheckAny(_l, 2);
  353. LuaSetTop(_l, 2);
  354. LuaInsert(_l, 1);
  355. _status = LuaPCall(_l, 0, LUA_MULTRET, 1);
  356. LuaPushBoolean(_l, (_status == 0) ? 1 : 0);
  357. LuaReplace(_l, 1);
  358. return LuaGetTop(_l);
  359. }
  360. private static int LuaBToString(LuaState _l)
  361. {
  362. LuaLCheckAny(_l, 1);
  363. if (LuaLCallMeta(_l, 1, "__tostring") != 0)
  364. return 1;
  365. switch (LuaType(_l, 1))
  366. {
  367. case LUA_TNUMBER:
  368. LuaPushString(_l, LuaToString(_l, 1));
  369. break;
  370. case LUA_TSTRING:
  371. LuaPushValue(_l, 1);
  372. break;
  373. case LUA_TBOOLEAN:
  374. LuaPushString(_l, (LuaToBoolean(_l, 1) != 0 ? "true" : "false"));
  375. break;
  376. case LUA_TNIL:
  377. LuaPushLiteral(_l, "nil");
  378. break;
  379. default:
  380. LuaPushFString(_l, "%s: %p", LuaLTypeName(_l, 1), LuaToPointer(_l, 1));
  381. break;
  382. }
  383. return 1;
  384. }
  385. private static int LuaBNewProxy(LuaState _l)
  386. {
  387. LuaSetTop(_l, 1);
  388. LuaNewUserData(_l, 0);
  389. if (LuaToBoolean(_l, 1) == 0)
  390. return 1;
  391. else if (LuaIsBoolean(_l, 1))
  392. {
  393. LuaNewTable(_l);
  394. LuaPushValue(_l, -1);
  395. LuaPushBoolean(_l, 1);
  396. LuaRawSet(_l, LuaUpValueIndex(1));
  397. }
  398. else
  399. {
  400. int _valid_proxy = 0;
  401. if (LuaGetMetatable(_l, 1) != 0)
  402. {
  403. LuaRawGet(_l, LuaUpValueIndex(1));
  404. _valid_proxy = LuaToBoolean(_l, -1);
  405. LuaPop(_l, 1);
  406. }
  407. LuaLArgCheck(_l, _valid_proxy != 0, 1, "boolean or proxy expected");
  408. LuaGetMetatable(_l, 1);
  409. }
  410. LuaSetMetatable(_l, 2);
  411. return 1;
  412. }
  413. private readonly static LuaLReg[] _baseFuncs = {
  414. new LuaLReg("assert", LuaBAssert),
  415. new LuaLReg("collectgarbage", LuaBCollectGarbage),
  416. new LuaLReg("dofile", LuaBDoFile),
  417. new LuaLReg("error", LuaBError),
  418. new LuaLReg("gcinfo", LuaBGGInfo),
  419. new LuaLReg("getfenv", LuaBGetFEnv),
  420. new LuaLReg("getmetatable", LuaBGetMetatable),
  421. new LuaLReg("loadfile", LuaBLoadFile),
  422. new LuaLReg("load", LuaBLoad),
  423. new LuaLReg("loadstring", LuaBLoadString),
  424. new LuaLReg("next", LuaBNext),
  425. new LuaLReg("pcall", LuaBPCall),
  426. new LuaLReg("print", LuaBPrint),
  427. new LuaLReg("rawequal", LuaBRawEqual),
  428. new LuaLReg("rawget", LuaBRawGet),
  429. new LuaLReg("rawset", LuaBRawSet),
  430. new LuaLReg("select", LuaBSelect),
  431. new LuaLReg("setfenv", LuaBSetFEnv),
  432. new LuaLReg("setmetatable", LuaBSetMetatable),
  433. new LuaLReg("tonumber", LuaBToNumber),
  434. new LuaLReg("tostring", LuaBToString),
  435. new LuaLReg("type", LuaBType),
  436. new LuaLReg("unpack", LuaBUnpack),
  437. new LuaLReg("xpcall", LuaBXPCall),
  438. new LuaLReg(null, null)
  439. };
  440. private static int costatus(LuaState _l, LuaState _co)
  441. {
  442. if (_l == _co) return CO_RUN;
  443. switch (LuaStatus(_co))
  444. {
  445. case LUA_YIELD:
  446. return CO_SUS;
  447. case 0:
  448. {
  449. LuaDebug ar = new LuaDebug();
  450. if (LuaGetStack(_co, 0, ref ar) > 0)
  451. return CO_NOR;
  452. else if (LuaGetTop(_co) == 0)
  453. return CO_DEAD;
  454. else
  455. return CO_SUS;
  456. }
  457. default:
  458. return CO_DEAD;
  459. }
  460. }
  461. private static int LuaBCosStatus(LuaState _l)
  462. {
  463. LuaState _co = LuaToThread(_l, 1);
  464. LuaLArgCheck(_l, _co != null, 1, "coroutine expected");
  465. LuaPushString(_l, _stat_names[costatus(_l, _co)]);
  466. return 1;
  467. }
  468. private static int AuxResume(LuaState _l, LuaState _co, int _n_arg)
  469. {
  470. int _status = costatus(_l, _co);
  471. if (LuaCheckStack(_co, _n_arg) == 0)
  472. LuaLError(_l, "too many arguments to resume");
  473. if (_status != CO_SUS)
  474. {
  475. LuaPushFString(_l, "cannot resume %s coroutine", _stat_names[_status]);
  476. return -1;
  477. }
  478. LuaXMove(_l, _co, _n_arg);
  479. LuaSetLevel(_l, _co);
  480. _status = LuaResume(_co, _n_arg);
  481. if (_status == 0 || _status == LUA_YIELD)
  482. {
  483. int nres = LuaGetTop(_co);
  484. if (LuaCheckStack(_l, nres + 1) == 0)
  485. LuaLError(_l, "too many results to resume");
  486. LuaXMove(_co, _l, nres);
  487. return nres;
  488. }
  489. else
  490. {
  491. LuaXMove(_co, _l, 1);
  492. return -1;
  493. }
  494. }
  495. private static int LuaBCorResume(LuaState _l)
  496. {
  497. LuaState _co = LuaToThread(_l, 1);
  498. int _r;
  499. LuaLArgCheck(_l, _co != null, 1, "coroutine expected");
  500. _r = AuxResume(_l, _co, LuaGetTop(_l) - 1);
  501. if (_r < 0)
  502. {
  503. LuaPushBoolean(_l, 0);
  504. LuaInsert(_l, -2);
  505. return 2;
  506. }
  507. else
  508. {
  509. LuaPushBoolean(_l, 1);
  510. LuaInsert(_l, -(_r + 1));
  511. return _r + 1;
  512. }
  513. }
  514. private static int LuaBAuxWrap(LuaState _l)
  515. {
  516. LuaState co = LuaToThread(_l, LuaUpValueIndex(1));
  517. int _r = AuxResume(_l, co, LuaGetTop(_l));
  518. if (_r < 0)
  519. {
  520. if (LuaIsString(_l, -1) != 0)
  521. {
  522. LuaLWhere(_l, 1);
  523. LuaInsert(_l, -2);
  524. LuaConcat(_l, 2);
  525. }
  526. LuaError(_l);
  527. }
  528. return _r;
  529. }
  530. private static int LuaBCoCreate(LuaState _l)
  531. {
  532. LuaState _nl = LuaNewThread(_l);
  533. LuaLArgCheck(_l, LuaIsFunction(_l, 1) && !LuaIsCFunction(_l, 1), 1, "Lua function expected");
  534. LuaPushValue(_l, 1);
  535. LuaXMove(_l, _nl, 1);
  536. return 1;
  537. }
  538. private static int LuaBCoWrap(LuaState _l)
  539. {
  540. LuaBCoCreate(_l);
  541. LuaPushCClosure(_l, LuaBAuxWrap, 1);
  542. return 1;
  543. }
  544. private static int LuaBYield(LuaState _l)
  545. {
  546. return LuaYield(_l, LuaGetTop(_l));
  547. }
  548. private static int LuaBCoRunning(LuaState _l)
  549. {
  550. if (LuaPushThread(_l) != 0)
  551. LuaPushNil(_l);
  552. return 1;
  553. }
  554. private readonly static LuaLReg[] _co_funcs = {
  555. new LuaLReg("create", LuaBCoCreate),
  556. new LuaLReg("resume", LuaBCorResume),
  557. new LuaLReg("running", LuaBCoRunning),
  558. new LuaLReg("status", LuaBCosStatus),
  559. new LuaLReg("wrap", LuaBCoWrap),
  560. new LuaLReg("yield", LuaBYield),
  561. new LuaLReg(null, null)
  562. };
  563. private static void AuxOpen(LuaState _l, CharPtr _name, LuaNativeFunction _f, LuaNativeFunction _u)
  564. {
  565. LuaPushCFunction(_l, _u);
  566. LuaPushCClosure(_l, _f, 1);
  567. LuaSetField(_l, -2, _name);
  568. }
  569. private static void BaseOpen(LuaState L)
  570. {
  571. LuaPushValue(L, LUA_GLOBALSINDEX);
  572. LuaSetGlobal(L, "_G");
  573. LuaLRegister(L, "_G", _baseFuncs);
  574. LuaPushLiteral(L, LUA_VERSION);
  575. LuaSetGlobal(L, "_VERSION");
  576. AuxOpen(L, "ipairs", LuaBIPairs, CheckPairsAux);
  577. AuxOpen(L, "pairs", LuaBPairs, LuaBNext);
  578. LuaCreateTable(L, 0, 1);
  579. LuaPushValue(L, -1);
  580. LuaSetMetatable(L, -2);
  581. LuaPushLiteral(L, "kv");
  582. LuaSetField(L, -2, "__mode");
  583. LuaPushCClosure(L, LuaBNewProxy, 1);
  584. LuaSetGlobal(L, "newproxy");
  585. LuaPushThread(L);
  586. LuaSetField(L, LUA_REGISTRYINDEX, "main_state");
  587. }
  588. public static int LuaOpenBase(LuaState _l)
  589. {
  590. BaseOpen(_l);
  591. LuaLRegister(_l, LUA_COLIBNAME, _co_funcs);
  592. return 2;
  593. }
  594. }
  595. }