OpenLibsExtensions.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. using Lua.IO;
  2. using Lua.Runtime;
  3. using Lua.Standard.Internal;
  4. namespace Lua.Standard;
  5. public static class OpenLibsExtensions
  6. {
  7. public static void OpenBasicLibrary(this LuaState state)
  8. {
  9. state.Environment["_G"] = state.Environment;
  10. state.Environment["_VERSION"] = "Lua 5.2";
  11. foreach (var func in BasicLibrary.Instance.Functions)
  12. {
  13. state.Environment[func.Name] = func;
  14. }
  15. }
  16. public static void OpenBitwiseLibrary(this LuaState state)
  17. {
  18. var bit32 = new LuaTable(0, BitwiseLibrary.Instance.Functions.Length);
  19. foreach (var func in BitwiseLibrary.Instance.Functions)
  20. {
  21. bit32[func.Name] = func.Func;
  22. }
  23. state.Environment["bit32"] = bit32;
  24. state.LoadedModules["bit32"] = bit32;
  25. }
  26. public static void OpenCoroutineLibrary(this LuaState state)
  27. {
  28. var coroutine = new LuaTable(0, CoroutineLibrary.Instance.Functions.Length);
  29. foreach (var func in CoroutineLibrary.Instance.Functions)
  30. {
  31. coroutine[func.Name] = func.Func;
  32. }
  33. state.Environment["coroutine"] = coroutine;
  34. }
  35. public static void OpenIOLibrary(this LuaState state)
  36. {
  37. var io = new LuaTable(0, IOLibrary.Instance.Functions.Length);
  38. foreach (var func in IOLibrary.Instance.Functions)
  39. {
  40. io[func.Name] = func.Func;
  41. }
  42. var registry = state.Registry;
  43. var stdin = new LuaValue(new FileHandle(LuaFileOpenMode.Read, ConsoleHelper.OpenStandardInput()));
  44. var stdout = new LuaValue(new FileHandle(LuaFileOpenMode.Write, ConsoleHelper.OpenStandardOutput()));
  45. var stderr = new LuaValue(new FileHandle(LuaFileOpenMode.Write, ConsoleHelper.OpenStandardError()));
  46. registry["_IO_input"] = stdin;
  47. registry["_IO_output"] = stdout;
  48. io["stdin"] = stdin;
  49. io["stdout"] = stdout;
  50. io["stderr"] = stderr;
  51. state.Environment["io"] = io;
  52. state.LoadedModules["io"] = io;
  53. }
  54. public static void OpenMathLibrary(this LuaState state)
  55. {
  56. state.Environment[MathematicsLibrary.RandomInstanceKey] = new(new MathematicsLibrary.RandomUserData(new Random()));
  57. var math = new LuaTable(0, MathematicsLibrary.Instance.Functions.Length);
  58. foreach (var func in MathematicsLibrary.Instance.Functions)
  59. {
  60. math[func.Name] = func.Func;
  61. }
  62. math["pi"] = Math.PI;
  63. math["huge"] = double.PositiveInfinity;
  64. state.Environment["math"] = math;
  65. state.LoadedModules["math"] = math;
  66. }
  67. public static void OpenModuleLibrary(this LuaState state)
  68. {
  69. var package = new LuaTable(0, 8);
  70. package["loaded"] = state.LoadedModules;
  71. package["preload"] = state.PreloadModules;
  72. var moduleLibrary = ModuleLibrary.Instance;
  73. var searchers = new LuaTable();
  74. searchers[1] = new LuaFunction("preload", moduleLibrary.SearcherPreload);
  75. searchers[2] = new LuaFunction("searcher_Lua", moduleLibrary.SearcherLua);
  76. package["searchers"] = searchers;
  77. package["path"] = "?.lua";
  78. package["searchpath"] = moduleLibrary.SearchPathFunction;
  79. package["config"] = $"{Path.DirectorySeparatorChar}\n;\n?\n!\n-";
  80. state.Environment["package"] = package;
  81. state.Environment["require"] = moduleLibrary.RequireFunction;
  82. }
  83. public static void OpenOperatingSystemLibrary(this LuaState state)
  84. {
  85. var os = new LuaTable(0, OperatingSystemLibrary.Instance.Functions.Length);
  86. foreach (var func in OperatingSystemLibrary.Instance.Functions)
  87. {
  88. os[func.Name] = func.Func;
  89. }
  90. state.Environment["os"] = os;
  91. state.LoadedModules["os"] = os;
  92. }
  93. public static void OpenStringLibrary(this LuaState state)
  94. {
  95. var @string = new LuaTable(0, StringLibrary.Instance.Functions.Length);
  96. foreach (var func in StringLibrary.Instance.Functions)
  97. {
  98. @string[func.Name] = func.Func;
  99. }
  100. state.Environment["string"] = @string;
  101. state.LoadedModules["string"] = @string;
  102. // set __index
  103. var key = new LuaValue("");
  104. if (!state.TryGetMetatable(key, out var metatable))
  105. {
  106. metatable = new();
  107. state.SetMetatable(key, metatable);
  108. }
  109. metatable[Metamethods.Index] = new LuaFunction("index", (context, cancellationToken) =>
  110. {
  111. context.GetArgument<string>(0);
  112. var key = context.GetArgument(1);
  113. return new(context.Return(@string[key]));
  114. });
  115. }
  116. public static void OpenTableLibrary(this LuaState state)
  117. {
  118. var table = new LuaTable(0, TableLibrary.Instance.Functions.Length);
  119. foreach (var func in TableLibrary.Instance.Functions)
  120. {
  121. table[func.Name] = func.Func;
  122. }
  123. state.Environment["table"] = table;
  124. state.LoadedModules["table"] = table;
  125. }
  126. public static void OpenDebugLibrary(this LuaState state)
  127. {
  128. var debug = new LuaTable(0, DebugLibrary.Instance.Functions.Length);
  129. foreach (var func in DebugLibrary.Instance.Functions)
  130. {
  131. debug[func.Name] = func.Func;
  132. }
  133. state.Environment["debug"] = debug;
  134. state.LoadedModules["debug"] = debug;
  135. }
  136. public static void OpenStandardLibraries(this LuaState state)
  137. {
  138. state.OpenBasicLibrary();
  139. state.OpenBitwiseLibrary();
  140. state.OpenCoroutineLibrary();
  141. state.OpenIOLibrary();
  142. state.OpenMathLibrary();
  143. state.OpenModuleLibrary();
  144. state.OpenOperatingSystemLibrary();
  145. state.OpenStringLibrary();
  146. state.OpenTableLibrary();
  147. state.OpenDebugLibrary();
  148. }
  149. }