OpenLibsExtensions.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using Lua.Runtime;
  2. using Lua.Standard.Internal;
  3. namespace Lua.Standard;
  4. public static class OpenLibsExtensions
  5. {
  6. public static void OpenBasicLibrary(this LuaState state)
  7. {
  8. state.Environment["_G"] = state.Environment;
  9. state.Environment["_VERSION"] = "Lua 5.2";
  10. foreach (var func in BasicLibrary.Instance.Functions)
  11. {
  12. state.Environment[func.Name] = func;
  13. }
  14. }
  15. public static void OpenBitwiseLibrary(this LuaState state)
  16. {
  17. var bit32 = new LuaTable(0, BitwiseLibrary.Instance.Functions.Length);
  18. foreach (var func in BitwiseLibrary.Instance.Functions)
  19. {
  20. bit32[func.Name] = func;
  21. }
  22. state.Environment["bit32"] = bit32;
  23. state.LoadedModules["bit32"] = bit32;
  24. }
  25. public static void OpenCoroutineLibrary(this LuaState state)
  26. {
  27. var coroutine = new LuaTable(0, CoroutineLibrary.Instance.Functions.Length);
  28. foreach (var func in CoroutineLibrary.Instance.Functions)
  29. {
  30. coroutine[func.Name] = func;
  31. }
  32. state.Environment["coroutine"] = coroutine;
  33. }
  34. public static void OpenIOLibrary(this LuaState state)
  35. {
  36. var io = new LuaTable(0, IOLibrary.Instance.Functions.Length);
  37. foreach (var func in IOLibrary.Instance.Functions)
  38. {
  39. io[func.Name] = func;
  40. }
  41. io["stdio"] = new LuaValue(new FileHandle(ConsoleHelper.OpenStandardInput()));
  42. io["stdout"] = new LuaValue(new FileHandle(ConsoleHelper.OpenStandardOutput()));
  43. io["stderr"] = new LuaValue(new FileHandle(ConsoleHelper.OpenStandardError()));
  44. state.Environment["io"] = io;
  45. state.LoadedModules["io"] = io;
  46. }
  47. public static void OpenMathLibrary(this LuaState state)
  48. {
  49. state.Environment[MathematicsLibrary.RandomInstanceKey] = new(new MathematicsLibrary.RandomUserData(new Random()));
  50. var math = new LuaTable(0, MathematicsLibrary.Instance.Functions.Length);
  51. foreach (var func in MathematicsLibrary.Instance.Functions)
  52. {
  53. math[func.Name] = func;
  54. }
  55. math["pi"] = Math.PI;
  56. math["huge"] = double.PositiveInfinity;
  57. state.Environment["math"] = math;
  58. state.LoadedModules["math"] = math;
  59. }
  60. public static void OpenModuleLibrary(this LuaState state)
  61. {
  62. var package = new LuaTable();
  63. package["loaded"] = state.LoadedModules;
  64. state.Environment["package"] = package;
  65. state.Environment["require"] = ModuleLibrary.Instance.RequireFunction;
  66. }
  67. public static void OpenOperatingSystemLibrary(this LuaState state)
  68. {
  69. var os = new LuaTable(0, OperatingSystemLibrary.Instance.Functions.Length);
  70. foreach (var func in OperatingSystemLibrary.Instance.Functions)
  71. {
  72. os[func.Name] = func;
  73. }
  74. state.Environment["os"] = os;
  75. state.LoadedModules["os"] = os;
  76. }
  77. public static void OpenStringLibrary(this LuaState state)
  78. {
  79. var @string = new LuaTable(0, StringLibrary.Instance.Functions.Length);
  80. foreach (var func in StringLibrary.Instance.Functions)
  81. {
  82. @string[func.Name] = func;
  83. }
  84. state.Environment["string"] = @string;
  85. state.LoadedModules["string"] = @string;
  86. // set __index
  87. var key = new LuaValue("");
  88. if (!state.TryGetMetatable(key, out var metatable))
  89. {
  90. metatable = new();
  91. state.SetMetatable(key, metatable);
  92. }
  93. metatable[Metamethods.Index] = new LuaFunction("index", (context, buffer, cancellationToken) =>
  94. {
  95. context.GetArgument<string>(0);
  96. var key = context.GetArgument(1);
  97. buffer.Span[0] = @string[key];
  98. return new(1);
  99. });
  100. }
  101. public static void OpenTableLibrary(this LuaState state)
  102. {
  103. var table = new LuaTable(0, TableLibrary.Instance.Functions.Length);
  104. foreach (var func in TableLibrary.Instance.Functions)
  105. {
  106. table[func.Name] = func;
  107. }
  108. state.Environment["table"] = table;
  109. state.LoadedModules["table"] = table;
  110. }
  111. public static void OpenStandardLibraries(this LuaState state)
  112. {
  113. state.OpenBasicLibrary();
  114. state.OpenBitwiseLibrary();
  115. state.OpenCoroutineLibrary();
  116. state.OpenIOLibrary();
  117. state.OpenMathLibrary();
  118. state.OpenModuleLibrary();
  119. state.OpenOperatingSystemLibrary();
  120. state.OpenStringLibrary();
  121. state.OpenTableLibrary();
  122. }
  123. }