package.lua 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. --Reimplement the Lua package library
  2. package = {}
  3. package.loaded = {}
  4. package.preload = {}
  5. package.searchers = {}
  6. package.path = "D:/OS/?.lua;D:/OS/?/init.lua;C:/?.lua;C:/?/init.lua;./?.lua;./?/init.lua"
  7. package.cpath = "" --It's not used
  8. package.config = "/\n;\n?\n!\n-"
  9. function package.loadlib() end --Just for compatibility
  10. function package.searchpath(name,path,sep,rep)
  11. if type(name) ~= "string" then return error("bad argument #1 to '?' (string expected, got "..type(name)..")") end
  12. if type(path) ~= "string" then return error("bad argument #2 to '?' (string expected, got "..type(path)..")") end
  13. local sep = tostring(sep or ".")
  14. local dirs, separator, replace = string.match(package.config,"(.-)\n(.-)\n(.-)\n")
  15. local rep = tostring(rep or dirs)
  16. --Escape magic characters
  17. sep = sep:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%1")
  18. rep = rep:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%1")
  19. separator = separator:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%1")
  20. replace = replace:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%1")
  21. name = name:gsub(sep,rep):gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%1")
  22. path = path:gsub(replace,name)
  23. local errmsg = ""
  24. if path:gsub(-1,-1) ~= ";" then path = path..";" end
  25. for p in string.gmatch(path,"(.-);") do
  26. local presolved = p
  27. if fs.exists(presolved) then
  28. return presolved
  29. else
  30. errmsg = "\nno file'"..presolved.."'"
  31. end
  32. end
  33. return nil, errmsg
  34. end
  35. --Create default searchers
  36. package.searchers[1] = function(modname, arg)
  37. local errmsg = ""
  38. if package.preload[modname] then
  39. if type(package.preload[modname]) ~= "function" then
  40. errmsg = "invalid field package.preload['"..modname.."']"
  41. end
  42. return package.preload[modname], arg or modname
  43. else
  44. errmsg = "\nno field package.preload['"..modname.."']"
  45. end
  46. return nil, errmsg
  47. end
  48. package.searchers[2] = function(modname,arg)
  49. local path, err = package.searchpath(modname,package.path)
  50. local errmsg = ""
  51. if path then
  52. local chunk, err = fs.load(path)
  53. if not chunk then errmsg = errmsg.."\nfailed to load: "..err else
  54. return chunk, arg or modname, path
  55. end
  56. end
  57. return nil, errmsg
  58. end
  59. function require(modname,arg)
  60. if type(modname) ~= "string" then return error("bad argument #1 to '?' (string expected, got "..type(modname)..")") end
  61. if package.loaded[modname] then return package.loaded[modname] end
  62. local path, err = package.searchpath(modname,package.path)
  63. if package.loaded[path] then return package.loaded[path] end
  64. local sn = 0 --Searcher number
  65. local errmsg = "module '"..modname.."' not found:"
  66. while true do
  67. sn = sn + 1
  68. if not package.searchers[sn] then break end
  69. local result, arg, newname = package.searchers[sn](modname,arg)
  70. if result then
  71. if newname then modname = newname end
  72. local ok, err = pcall(result,arg)
  73. if not ok then return error("Failed to load module: "..tostring(err)) end
  74. package.loaded[modname] = err
  75. return package.loaded[modname]
  76. else
  77. errmsg = errmsg..(arg or "")
  78. end
  79. end
  80. return error(errmsg)
  81. end