sort-lines and renumber-lines added
This commit is contained in:
parent
3ef6c5db81
commit
c61b8dd47a
@ -145,6 +145,89 @@ local function poweron_message(pos)
|
|||||||
return "NanoBasic V" .. ver .. "\n" .. s .. "Ready.\n"
|
return "NanoBasic V" .. ver .. "\n" .. s .. "Ready.\n"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Lines have line numbers at the beginning, like: "10 PRINT "Hello World"
|
||||||
|
-- This function sorts the lines by the line numbers
|
||||||
|
local function sort_lines(code)
|
||||||
|
local lines = {}
|
||||||
|
local keys = {}
|
||||||
|
for line in code:gmatch("[^\r\n]+") do
|
||||||
|
local num = tonumber(line:match("^%s*(%d+)"))
|
||||||
|
if num then
|
||||||
|
lines[num] = line
|
||||||
|
keys[#keys + 1] = num
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(keys)
|
||||||
|
|
||||||
|
local sorted = {}
|
||||||
|
for i,num in ipairs(keys) do
|
||||||
|
sorted[i] = lines[num]
|
||||||
|
end
|
||||||
|
return table.concat(sorted, "\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function replace_all_goto_refs(lines, new_nums)
|
||||||
|
for num,line in pairs(lines) do
|
||||||
|
local goto_num = line:match("GOTO%s+(%d+)")
|
||||||
|
if goto_num then
|
||||||
|
local new_num = new_nums[goto_num]
|
||||||
|
if new_num then
|
||||||
|
lines[num] = line:gsub("GOTO%s+%d+", "GOTO " .. new_num)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
goto_num = line:match("GOSUB%s+(%d+)")
|
||||||
|
if goto_num then
|
||||||
|
local new_num = new_nums[goto_num]
|
||||||
|
if new_num then
|
||||||
|
lines[num] = line:gsub("GOSUB%s+%d+", "GOSUB " .. new_num)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local goto_num = line:match("goto%s+(%d+)")
|
||||||
|
if goto_num then
|
||||||
|
local new_num = new_nums[goto_num]
|
||||||
|
if new_num then
|
||||||
|
lines[num] = line:gsub("goto%s+%d+", "goto " .. new_num)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
goto_num = line:match("gosub%s+(%d+)")
|
||||||
|
if goto_num then
|
||||||
|
local new_num = new_nums[goto_num]
|
||||||
|
if new_num then
|
||||||
|
lines[num] = line:gsub("gosub%s+%d+", "gosub " .. new_num)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function renumber_lines(code)
|
||||||
|
local lines = {}
|
||||||
|
local keys = {}
|
||||||
|
local new_nums = {}
|
||||||
|
local num = 10
|
||||||
|
for line in code:gmatch("[^\r\n]+") do
|
||||||
|
local s = line:match("^%s*(%d+)")
|
||||||
|
if s then
|
||||||
|
lines[num] = line:sub(s:len() + 1)
|
||||||
|
new_nums[s] = num
|
||||||
|
keys[#keys + 1] = num
|
||||||
|
num = num + 10
|
||||||
|
else
|
||||||
|
lines[num] = line
|
||||||
|
keys[#keys + 1] = num
|
||||||
|
num = num + 10
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
replace_all_goto_refs(lines, new_nums)
|
||||||
|
|
||||||
|
local sorted = {}
|
||||||
|
for i,num in ipairs(keys) do
|
||||||
|
sorted[i] = num .. lines[num]
|
||||||
|
end
|
||||||
|
return table.concat(sorted, "\n")
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_node("techage:basic_terminal", {
|
minetest.register_node("techage:basic_terminal", {
|
||||||
description = S("TA3 Terminal"),
|
description = S("TA3 Terminal"),
|
||||||
tiles = {-- up, down, right, left, back, front
|
tiles = {-- up, down, right, left, back, front
|
||||||
@ -208,14 +291,13 @@ minetest.register_node("techage:basic_terminal", {
|
|||||||
|
|
||||||
on_timer = function(pos, elapsed)
|
on_timer = function(pos, elapsed)
|
||||||
local nvm = techage.get_nvm(pos)
|
local nvm = techage.get_nvm(pos)
|
||||||
print("on_timer", nvm.status)
|
--print("on_timer", nvm.status)
|
||||||
if (nvm.timeout or 0) > minetest.get_gametime() then
|
if (nvm.timeout or 0) > minetest.get_gametime() then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
if nvm.status == "running" then
|
if nvm.status == "running" then
|
||||||
local res = nanobasic.run(pos, 100)
|
local res = nanobasic.run(pos, 100)
|
||||||
print("on_timer2", res)
|
|
||||||
if res == nanobasic.NB_BUSY then
|
if res == nanobasic.NB_BUSY then
|
||||||
local text = nanobasic.get_screen_buffer(pos)
|
local text = nanobasic.get_screen_buffer(pos)
|
||||||
M(pos):set_string("formspec", formspec(pos, text))
|
M(pos):set_string("formspec", formspec(pos, text))
|
||||||
@ -359,7 +441,6 @@ end)
|
|||||||
-- num: cmd(num: node_num, num: cmnd, arr: payload)
|
-- num: cmd(num: node_num, num: cmnd, arr: payload)
|
||||||
register_ext_function("bcmd", {nanobasic.NB_NUM, nanobasic.NB_NUM, nanobasic.NB_ARR}, nanobasic.NB_NUM, function(pos, nvm)
|
register_ext_function("bcmd", {nanobasic.NB_NUM, nanobasic.NB_NUM, nanobasic.NB_ARR}, nanobasic.NB_NUM, function(pos, nvm)
|
||||||
local addr = nanobasic.pop_arr_addr(pos)
|
local addr = nanobasic.pop_arr_addr(pos)
|
||||||
print("bcmd", addr)
|
|
||||||
local payload = nanobasic.read_arr(pos, addr) or {}
|
local payload = nanobasic.read_arr(pos, addr) or {}
|
||||||
local cmnd = nanobasic.pop_num(pos) or 0
|
local cmnd = nanobasic.pop_num(pos) or 0
|
||||||
local num = nanobasic.pop_num(pos) or 0
|
local num = nanobasic.pop_num(pos) or 0
|
||||||
@ -367,7 +448,7 @@ register_ext_function("bcmd", {nanobasic.NB_NUM, nanobasic.NB_NUM, nanobasic.NB_
|
|||||||
local owner = M(pos):get_string("owner")
|
local owner = M(pos):get_string("owner")
|
||||||
if techage.not_protected(num, owner) then
|
if techage.not_protected(num, owner) then
|
||||||
techage.counting_add(owner, 1)
|
techage.counting_add(owner, 1)
|
||||||
local resp = techage.beduino_send_cmnd(own_num, dest_num, topic, payload)
|
local resp = techage.beduino_send_cmnd(own_num, num, cmnd, payload)
|
||||||
nanobasic.push_num(pos, resp)
|
nanobasic.push_num(pos, resp)
|
||||||
else
|
else
|
||||||
nanobasic.push_num(pos, 4)
|
nanobasic.push_num(pos, 4)
|
||||||
@ -378,7 +459,6 @@ end)
|
|||||||
-- num: breq(num: node_num, num: cmnd, arr: payload)
|
-- num: breq(num: node_num, num: cmnd, arr: payload)
|
||||||
register_ext_function("breq", {nanobasic.NB_NUM, nanobasic.NB_NUM, nanobasic.NB_ARR}, nanobasic.NB_NUM, function(pos, nvm)
|
register_ext_function("breq", {nanobasic.NB_NUM, nanobasic.NB_NUM, nanobasic.NB_ARR}, nanobasic.NB_NUM, function(pos, nvm)
|
||||||
local addr = nanobasic.pop_arr_addr(pos)
|
local addr = nanobasic.pop_arr_addr(pos)
|
||||||
print("bcmd", addr)
|
|
||||||
local payload = nanobasic.read_arr(pos, addr) or {}
|
local payload = nanobasic.read_arr(pos, addr) or {}
|
||||||
local cmnd = nanobasic.pop_num(pos) or 0
|
local cmnd = nanobasic.pop_num(pos) or 0
|
||||||
local num = nanobasic.pop_num(pos) or 0
|
local num = nanobasic.pop_num(pos) or 0
|
||||||
@ -402,7 +482,6 @@ end)
|
|||||||
-- str: breq(num: node_num, num: cmnd, arr: payload)
|
-- str: breq(num: node_num, num: cmnd, arr: payload)
|
||||||
register_ext_function("breq$", {nanobasic.NB_NUM, nanobasic.NB_NUM, nanobasic.NB_ARR}, nanobasic.NB_STR, function(pos, nvm)
|
register_ext_function("breq$", {nanobasic.NB_NUM, nanobasic.NB_NUM, nanobasic.NB_ARR}, nanobasic.NB_STR, function(pos, nvm)
|
||||||
local addr = nanobasic.pop_arr_addr(pos)
|
local addr = nanobasic.pop_arr_addr(pos)
|
||||||
print("bcmd", addr)
|
|
||||||
local payload = nanobasic.read_arr(pos, addr) or {}
|
local payload = nanobasic.read_arr(pos, addr) or {}
|
||||||
local cmnd = nanobasic.pop_num(pos) or 0
|
local cmnd = nanobasic.pop_num(pos) or 0
|
||||||
local num = nanobasic.pop_num(pos) or 0
|
local num = nanobasic.pop_num(pos) or 0
|
||||||
@ -489,7 +568,7 @@ register_ext_function("door", {nanobasic.NB_STR, nanobasic.NB_STR}, nanobasic.NB
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
-- str: iname(str: item_name)
|
-- str: iname(str: item_name)
|
||||||
register_ext_function("iname", {nanobasic.NB_STR}, nanobasic.NB_STR, function(pos, nvm)
|
register_ext_function("iname$", {nanobasic.NB_STR}, nanobasic.NB_STR, function(pos, nvm)
|
||||||
local item_name = nanobasic.pop_str(pos) or ""
|
local item_name = nanobasic.pop_str(pos) or ""
|
||||||
local item = minetest.registered_items[item_name]
|
local item = minetest.registered_items[item_name]
|
||||||
if item and item.description then
|
if item and item.description then
|
||||||
@ -512,13 +591,15 @@ register_action({"init", "stopped", "error", "break"}, "Edit", function(pos, nvm
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
register_action({"edit"}, "Save", function(pos, nvm, fields)
|
register_action({"edit"}, "Save", function(pos, nvm, fields)
|
||||||
M(pos):set_string("code", fields.code)
|
code = sort_lines(fields.code)
|
||||||
return fields.code
|
M(pos):set_string("code", code)
|
||||||
|
return code
|
||||||
end)
|
end)
|
||||||
|
|
||||||
register_action({"edit"}, "Renum", function(pos, nvm, fields)
|
register_action({"edit"}, "Renum", function(pos, nvm, fields)
|
||||||
-- TODO: renumber code
|
code = renumber_lines(fields.code)
|
||||||
return fields.code
|
M(pos):set_string("code", code)
|
||||||
|
return code
|
||||||
end)
|
end)
|
||||||
|
|
||||||
register_action({"edit"}, "Cancel", function(pos, nvm, fields)
|
register_action({"edit"}, "Cancel", function(pos, nvm, fields)
|
||||||
|
Loading…
Reference in New Issue
Block a user