Skip to content

Commit a6cf1d0

Browse files
committed
More work on ccapi.lua
1 parent 6e596ee commit a6cf1d0

File tree

1 file changed

+51
-11
lines changed

1 file changed

+51
-11
lines changed

ccapi.lua

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,37 @@ do -- table copy https://gist.github.com/SoniEx2/fc5d3614614e4e3fe131
5151
-- (or turn it into table.copy(table,deep) where deep is a boolean)
5252
shallowcopy,deepcopy=shallow,deep
5353
end
54-
54+
M.shallowcopy, M.deepcopy = shallowcopy, deepcopy
5555
local ccEnv = deepcopy(_G)
5656

57-
local function prepareEnv(ccEnv, eventQueue)
57+
-- Prepare a _G clone
58+
M.prepareEnv = function(ccEnv, eventQueue)
5859
local type,error,pcall,require,setfenv,getfenv,getmetatable = type,error,pcall,require,setfenv,getfenv,getmetatable
5960
local cyield = coroutine.yield
6061
local oldenv = getfenv()
6162

6263
-- make it so every new function has ccEnv as the env
6364
setfenv(1,ccEnv)
6465

65-
eventQueue.n = 0
66-
eventQueue.c = 1
66+
-- setup eventQueue
67+
eventQueue.count = 0
68+
eventQueue.current = 1
69+
function eventQueue:push(evt,p1,p2,p3,p4,p5)
70+
local newcount = self.count + 1
71+
self[newcount] = {evt, p1, p2, p3, p4, p5}
72+
self.count = newcount
73+
end
74+
function eventQueue:pop()
75+
if self.count < self.current then
76+
return nil
77+
else
78+
local current = self.current
79+
self.current = current + 1
80+
return self[current]
81+
end
82+
end
6783

84+
-- setup environment
6885
ccEnv.string.dump = nil
6986
ccEnv.debug = nil
7087
ccEnv.require = nil
@@ -89,10 +106,9 @@ local function prepareEnv(ccEnv, eventQueue)
89106

90107
ccEnv.os.pullEventRaw = cyield
91108

92-
ccEnv.os.queueEvent = function(n,a,b,c,d,e)
93-
local x = eventQueue.n
94-
eventQueue[x] = {n,a,b,c,d,e}
95-
eventQueue.n = x + 1
109+
ccEnv.os.queueEvent = function(evt,p1,p2,p3,p4,p5)
110+
if n == nil then error() end -- todo test this
111+
eventQueue:push(evt,p1,p2,p3,p4,p5)
96112
end
97113

98114
ccEnv.os.pullEvent = function(_evt)
@@ -108,7 +124,7 @@ local function prepareEnv(ccEnv, eventQueue)
108124

109125
if pcall(require,"socket") then
110126
-- enable HTTP API
111-
127+
print("ccapi doesn't support HTTP API yet")
112128
end
113129

114130
setfenv(1,oldenv)
@@ -117,9 +133,33 @@ end
117133
local eventQueue = {}
118134
prepareEnv(ccEnv, eventQueue)
119135

136+
local function scan(t, what, callback)
137+
local toScan = {t}
138+
while next(toScan) do
139+
local k,v = next(toScan)
140+
toScan[k] = nil
141+
if type(v) == "table" then
142+
for x,y in pairs(v) do
143+
if type(y) == what then
144+
y = callback(y)
145+
end
146+
if type(y) == "table" then
147+
table.insert(toScan, y)
148+
end
149+
v[x] = y
150+
end
151+
else
152+
error(string.format("Table expected, got %s (%s)", type(v), v))
153+
end
154+
end
155+
end
156+
120157
function M.runCC(func, env)
121-
setfenv(func, ccEnv)
122-
-- loop
158+
scan(env, "function", function(f)
159+
return setfenv(function(...) return f(...) end, env)
160+
end)
161+
setfenv(func, env)
162+
-- main loop
123163
while true do
124164

125165
end

0 commit comments

Comments
 (0)