SHOW:
|
|
- or go back to the newest paste.
| 1 | - | local target = ... |
| 1 | + | --[[ this is an edit of something that WAS NOT MY IDEA. it's awesome though :) ]] |
| 2 | - | if not target then |
| 2 | + | |
| 3 | - | print("Usage: "..fs.getName(shell.getRunningProgram()).." [target]")
|
| 3 | + | local level,maxlevel=1,0 |
| 4 | - | return |
| 4 | + | local resume,pR=coroutine.resume,os.pullEventRaw |
| 5 | ||
| 6 | getUp=function() | |
| 7 | - | local lastDumped = nil |
| 7 | + | local at,lastFunc,fileName=1 |
| 8 | - | getfenv(parallel.waitForAny).os = setmetatable({pullEventRaw = function(...)
|
| 8 | + | while true do |
| 9 | - | local i = 2 |
| 9 | + | local ok,func=pcall(function() return setfenv(at,getfenv(at)) end) |
| 10 | - | while true do |
| 10 | + | local _,err=pcall(error,"err",at) |
| 11 | - | local success, result = pcall(function() |
| 11 | + | if ok then |
| 12 | - | local fn = setfenv(i, getfenv(i)) |
| 12 | + | lastFunc=func |
| 13 | - | return string.dump(fn) |
| 13 | + | fileName=err:match("(.-):")
|
| 14 | - | end) |
| 14 | + | else |
| 15 | - | i = i + 1 |
| 15 | + | return lastFunc,fileName |
| 16 | - | if success then |
| 16 | + | end |
| 17 | - | lastDumped = result |
| 17 | + | at=at+1 |
| 18 | - | else |
| 18 | + | end |
| 19 | - | if result:find("invalid level") then
|
| 19 | + | |
| 20 | - | break |
| 20 | + | |
| 21 | - | end |
| 21 | + | os.pullEventRaw=function(...) |
| 22 | - | end |
| 22 | + | if level>=maxlevel then |
| 23 | - | end |
| 23 | + | maxlevel=level |
| 24 | - | getfenv(parallel.waitForAny).os = nil |
| 24 | + | os.originator={getUp()}
|
| 25 | - | return coroutine.yield(...) |
| 25 | + | end |
| 26 | - | end}, {__index = os})
|
| 26 | + | level=level+1 |
| 27 | return coroutine.yield(...) | |
| 28 | - | os.queueEvent("fake-event")
|
| 28 | + | |
| 29 | - | os.pullEvent("fake-event")
|
| 29 | + | coroutine.resume=function(...) |
| 30 | level=level-1 | |
| 31 | - | getfenv(parallel.waitForAny).os = nil |
| 31 | + | return resume(...) |
| 32 | end | |
| 33 | - | if lastDumped then |
| 33 | + | |
| 34 | - | print("Writing bios file...")
|
| 34 | + | os.queueEvent("ohi")
|
| 35 | os.pullEventRaw() | |
| 36 | - | local handle = fs.open(target, "wb") |
| 36 | + | |
| 37 | - | for i=1,lastDumped:len() do |
| 37 | + | coroutine.resume=resume |
| 38 | - | handle.write(lastDumped:byte(i)) |
| 38 | + | os.pullEventRaw=pR |