OpenLibExtensions.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. using Lua.Standard.Basic;
  2. using Lua.Standard.Coroutines;
  3. using Lua.Standard.IO;
  4. using Lua.Standard.Mathematics;
  5. using Lua.Standard.Modules;
  6. using Lua.Standard.Table;
  7. namespace Lua.Standard;
  8. public static class OpenLibExtensions
  9. {
  10. static readonly LuaFunction[] baseFunctions = [
  11. AssertFunction.Instance,
  12. ErrorFunction.Instance,
  13. PrintFunction.Instance,
  14. RawGetFunction.Instance,
  15. RawSetFunction.Instance,
  16. RawEqualFunction.Instance,
  17. RawLenFunction.Instance,
  18. GetMetatableFunction.Instance,
  19. SetMetatableFunction.Instance,
  20. ToNumberFunction.Instance,
  21. ToStringFunction.Instance,
  22. CollectGarbageFunction.Instance,
  23. NextFunction.Instance,
  24. IPairsFunction.Instance,
  25. PairsFunction.Instance,
  26. Basic.TypeFunction.Instance,
  27. PCallFunction.Instance,
  28. XPCallFunction.Instance,
  29. DoFileFunction.Instance,
  30. LoadFileFunction.Instance,
  31. LoadFunction.Instance,
  32. SelectFunction.Instance,
  33. ];
  34. static readonly LuaFunction[] mathFunctions = [
  35. AbsFunction.Instance,
  36. AcosFunction.Instance,
  37. AsinFunction.Instance,
  38. Atan2Function.Instance,
  39. AtanFunction.Instance,
  40. CeilFunction.Instance,
  41. CosFunction.Instance,
  42. CoshFunction.Instance,
  43. DegFunction.Instance,
  44. ExpFunction.Instance,
  45. FloorFunction.Instance,
  46. FmodFunction.Instance,
  47. FrexpFunction.Instance,
  48. LdexpFunction.Instance,
  49. LogFunction.Instance,
  50. MaxFunction.Instance,
  51. MinFunction.Instance,
  52. ModfFunction.Instance,
  53. PowFunction.Instance,
  54. RadFunction.Instance,
  55. RandomFunction.Instance,
  56. RandomSeedFunction.Instance,
  57. SinFunction.Instance,
  58. SinhFunction.Instance,
  59. SqrtFunction.Instance,
  60. TanFunction.Instance,
  61. TanhFunction.Instance,
  62. ];
  63. static readonly LuaFunction[] tableFunctions = [
  64. PackFunction.Instance,
  65. UnpackFunction.Instance,
  66. RemoveFunction.Instance,
  67. ConcatFunction.Instance,
  68. InsertFunction.Instance,
  69. SortFunction.Instance,
  70. ];
  71. static readonly LuaFunction[] ioFunctions = [
  72. OpenFunction.Instance,
  73. CloseFunction.Instance,
  74. InputFunction.Instance,
  75. OutputFunction.Instance,
  76. WriteFunction.Instance,
  77. ReadFunction.Instance,
  78. LinesFunction.Instance,
  79. IO.TypeFunction.Instance,
  80. ];
  81. public static void OpenBasicLibrary(this LuaState state)
  82. {
  83. // basic
  84. state.Environment["_G"] = state.Environment;
  85. state.Environment["_VERSION"] = "Lua 5.2";
  86. foreach (var func in baseFunctions)
  87. {
  88. state.Environment[func.Name] = func;
  89. }
  90. // coroutine
  91. var coroutine = new LuaTable(0, 6);
  92. coroutine[CoroutineCreateFunction.FunctionName] = new CoroutineCreateFunction();
  93. coroutine[CoroutineResumeFunction.FunctionName] = new CoroutineResumeFunction();
  94. coroutine[CoroutineYieldFunction.FunctionName] = new CoroutineYieldFunction();
  95. coroutine[CoroutineStatusFunction.FunctionName] = new CoroutineStatusFunction();
  96. coroutine[CoroutineRunningFunction.FunctionName] = new CoroutineRunningFunction();
  97. coroutine[CoroutineWrapFunction.FunctionName] = new CoroutineWrapFunction();
  98. state.Environment["coroutine"] = coroutine;
  99. }
  100. public static void OpenMathLibrary(this LuaState state)
  101. {
  102. state.Environment[RandomFunction.RandomInstanceKey] = new LuaUserData<Random>(new Random());
  103. state.Environment["pi"] = Math.PI;
  104. state.Environment["huge"] = double.PositiveInfinity;
  105. var table = new LuaTable(0, mathFunctions.Length);
  106. foreach (var func in mathFunctions)
  107. {
  108. table[func.Name] = func;
  109. }
  110. state.Environment["math"] = table;
  111. }
  112. public static void OpenModuleLibrary(this LuaState state)
  113. {
  114. var package = new LuaTable(0, 1);
  115. package["loaded"] = new LuaTable();
  116. state.Environment["package"] = package;
  117. state.Environment[RequireFunction.Instance.Name] = RequireFunction.Instance;
  118. }
  119. public static void OpenTableLibrary(this LuaState state)
  120. {
  121. var table = new LuaTable(0, tableFunctions.Length);
  122. foreach (var func in tableFunctions)
  123. {
  124. table[func.Name] = func;
  125. }
  126. state.Environment["table"] = table;
  127. }
  128. public static void OpenIOLibrary(this LuaState state)
  129. {
  130. var io = new LuaTable(0, ioFunctions.Length);
  131. foreach (var func in ioFunctions)
  132. {
  133. io[func.Name] = func;
  134. }
  135. io["stdio"] = new FileHandle(Console.OpenStandardInput());
  136. io["stdout"] = new FileHandle(Console.OpenStandardOutput());
  137. io["stderr"] = new FileHandle(Console.OpenStandardError());
  138. state.Environment["io"] = io;
  139. }
  140. }