Merge branch 'master-MC1.7.10' of github.com:MightyPirates/OpenComputers into master-MC1.8.9

This commit is contained in:
Florian Nücke 2016-04-03 00:04:19 +02:00
commit 41a5f8cfbb
6 changed files with 106 additions and 82 deletions

View File

@ -279,11 +279,11 @@ local function test(m,p)
write(':', COLON_COLOR)
needs_line_num = nil
end
local p=m_only and '' or m.line:sub(last_index,(i or 0)-1)
local s=m_only and '' or m.line:sub(last_index,(i or 0)-1)
local g=i and m.line:sub(i,j) or ''
if i==1 then g=trim_front(g) elseif last_index==1 then p=trim_front(p) end
if j==slen then g=trim_back(g) elseif not i then p=trim_back(p) end
write(p)
if i==1 then g=trim_front(g) elseif last_index==1 then s=trim_front(s) end
if j==slen then g=trim_back(g) elseif not i then s=trim_back(s) end
write(s)
write(g, MATCH_COLOR)
empty_line = false
last_index = (j or slen)+1
@ -291,7 +291,7 @@ local function test(m,p)
write("\n")
empty_line = true
needs_filename, needs_line_num = include_filename, print_line_num
end
elseif p:find("^^") then break end
end
if not empty_line then write("\n") end
end

View File

@ -30,6 +30,7 @@ if #args == 0 and (io.stdin.tty or options.i) and not options.c then
local foreground = gpu.setForeground(0xFF0000)
term.write(sh.expand(os.getenv("PS1") or "$ "))
gpu.setForeground(foreground)
term.setCursorBlink(true)
local command = term.read(history, nil, sh.hintHandler)
if not command then
io.write("exit\n")

View File

@ -58,45 +58,18 @@ local function preloadSearcher(module)
end
end
local function delay_index(tbl,key)
local z = getmetatable(tbl)
local method = z.methods[tbl][key]
if method then
if not z.cache[tbl][key] then
local file = io.open(z.path,"r")
if file then
file:seek("set", method[1])
local loaded = load("return function"..file:read(method[2]), "=delayed-"..key,"t",z.env)
assert(loaded,"failed to load "..key)
z.cache[tbl][key] = loaded()
file:close()
--lazy_protect(key, z.cache[key])
local delay_data = {}
local delay_tools = setmetatable({},{__mode="v"})
package.delay_data = delay_data
function delay_data.__index(tbl,key)
local lookup = delay_tools.lookup or loadfile("/lib/tools/delayLookup.lua")
delay_tools.lookup = lookup
return lookup(delay_data, tbl, key)
end
end
return z.cache[tbl][key]
end
end
local function delay_newindex(tbl,key,value)
local z = getmetatable(tbl)
z.methods[tbl][key] = nil
rawset(tbl,key,value)
end
local function delay_pairs(tbl)
local set,k,v = {}
while true do
k,v = next(tbl,k)
if not k then break end
set[k] = v
end
local z = getmetatable(tbl)
for k in pairs(z.methods[tbl]) do
if not set[k] then
set[k] = function(...)return delay_index(tbl,k)(...)end
end
end
return pairs(set)
end
local weak_cache = setmetatable({},{__mode="v"})
delay_data.__pairs = delay_data.__index -- nil key acts like pairs
function delaySearcher(module)
if not delayed[module] then
return "\tno field package.delayed['" .. module .. "']"
@ -105,8 +78,9 @@ function delaySearcher(module)
if not filepath then
return reason
end
weak_cache.parser = weak_cache.parser or loadfile("/lib/tools/delayParse.lua")
local loader, reason = weak_cache.parser(filepath,delay_index,delay_newindex,delay_pairs)
local parser = delay_tools.parser or loadfile("/lib/tools/delayParse.lua")
delay_tools.parser = parser
local loader, reason = parser(filepath,delay_data)
return loader, reason
end

View File

@ -54,38 +54,52 @@ function term.isAvailable(w)
return w and not not (w.gpu and w.screen)
end
function term.internal.pull(input, c, off, p, ...)
local w=W()
function term.internal.pull(input, c, off, t, ...)
t=t or math.huge
if t < 0 then return end
local w,unpack=W(),table.unpack
local d,h,dx,dy,x,y=term.getViewport(w)
local out = (x<1 or x>d or y<1 or y>h)
if not w.blink or (not input and out) or type(p) == "number" then
return event.pull(p,...)
end
local gpu=w.gpu
if out then
if input and out then
input:move(0)
y=w.y
input:scroll()
end
x,y=w.x+dx,w.y+dy
c=c or {gpu.getBackground(),gpu.getForeground(),gpu.get(x,y)}
local gpu
if input or not out then
gpu=w.gpu
local sf,sb=gpu.setForeground,gpu.setBackground
c=c or {{gpu.getBackground()},{gpu.getForeground()},gpu.get(x,y)}
local c11,c12 = unpack(c[1])
local c21,c22 = unpack(c[2])
if not off then
gpu.setForeground(c[1])
gpu.setBackground(c[2])
sf(c11,c12)
sb(c21,c22)
end
gpu.set(x,y,c[3])
gpu.setForeground(c[2])
gpu.setBackground(c[1])
local a={pcall(event.pull,0.5,p,...)}
if #a>1 then
gpu.set(x,y,c[3])
return select(2,table.unpack(a))
end
return term.internal.pull(input,c,not off,p,...)
sb(c11,c12)
sf(c21,c22)
end
function term.pull(...)
return term.internal.pull(nil,nil,nil,...)
local a={pcall(event.pull,math.min(t,0.5),...)}
if #a>1 or t<.5 then
if gpu then
gpu.set(x,y,c[3])
end
return select(2,unpack(a))
end
local blinking = w.blink
if input then blinking = input.blink end
return term.internal.pull(input,c,blinking and not off,t-0.5,...)
end
function term.pull(p,...)
local a,t = {p,...}
if type(p) == "number" then t = table.remove(a,1) end
return term.internal.pull(nil,nil,nil,t,table.unpack(a))
end
function term.read(history,dobreak,hintHandler,pwchar,filter)
@ -202,10 +216,11 @@ function term.readKeyboard(ops)
local filter = ops.filter and function(i) return term.internal.filter(ops.filter,i) end or term.internal.nop
local pwchar = ops.pwchar and function(i) return term.internal.mask(ops.pwchar,i) end or term.internal.nop
local history,db,hints={list=ops,index=0},ops.dobreak,{handler=ops.hintHandler}
term.setCursorBlink(true)
local w=W()
local draw=io.stdin.tty and term.drawText or term.internal.nop
local input={w=w,promptx=w.x,prompty=w.y,index=0,data="",mask=pwchar}
input.blink = ops.blink
if input.blink == nil then input.blink = w.blink end
if ops.nowrap then
term.internal.build_horizontal_reader(input)
else
@ -350,6 +365,10 @@ function term.setCursorBlink(enabled)
W().blink=enabled
end
function term.getCursorBlink()
return W().blink
end
function term.bind(gpu, screen, kb, window)
window = window or W()
window.gpu = gpu or window.gpu
@ -480,7 +499,7 @@ function --[[@delayloaded-start@]] term.internal.tab(input,hints)
hints.cache.i=-1
end
local c=hints.cache
c.i=(c.i+1)%#c
c.i=(c.i+1)%math.max(#c,1)
local next=c[c.i+1]
if next then
local tail = unicode.wlen(input.data) - input.index - 1

View File

@ -0,0 +1,33 @@
local data,tbl,key = ...
local z = data[tbl]
if key then -- index
local method = z.methods[key]
local cache = z.cache[key]
if method and not cache then
local file = io.open(z.path,"r")
if file then
file:seek("set", method[1])
local loaded = load("return function"..file:read(method[2]), "=delayed-"..key,"t",z.env)
file:close()
assert(loaded,"failed to load "..key)
cache = loaded()
--lazy_protect(key, cache)
z.cache[key] = cache
end
end
return cache
else -- pairs
local set,k,v = {}
while true do
k,v = next(tbl,k)
if not k then break end
set[k] = v
end
for k in pairs(z.methods) do
if not set[k] then
set[k] = function(...)return tbl[k](...)end
end
end
return pairs(set)
end

View File

@ -1,4 +1,4 @@
local filepath,delay_index,delay_newindex,delay_pairs = ...
local filepath,delay_data = ...
local file, reason = io.open(filepath, "r")
if not file then
return reason
@ -45,23 +45,20 @@ local library, local_env = loader()
if library then
local_env = local_env or {}
local_env[lib_name] = library
local mt =
{
methods={},
cache={},
env=setmetatable(local_env, {__index=_G}),
path=filepath,
__pairs=delay_pairs,
__index=delay_index,
__newindex=delay_newindex,
}
local env = setmetatable(local_env, {__index=_G})
for path,pack in pairs(methods) do
local target = library
for name in path:gmatch("[^%.]+") do target = target[name] end
mt.methods[target]=pack
mt.cache[target]={}
setmetatable(target, mt)
delay_data[target] =
{
methods = pack,
cache = {},
env = env,
path = filepath
}
setmetatable(target, delay_data)
end
return function()return library end, filepath