local function tokenize(str, delim)
result = {}
while true do
local cp = string.find(str, delim)
if not cp then
table.insert(result, str)
return result
end
table.insert(result, string.sub(str, 1, cp - 1))
str = string.sub(str, cp + 1)
end
end
local function expand_cstd_headers(hdrs)
if not hdrs[2] or hdrs[2] == "" then
print("error: please supply at least one header")
return
end
for i = 2, table.getn(hdrs) do
editor:AddText("#include <"..hdrs[i]..".h>\n")
end
end
local function expand_c_headers(hdrs)
if not hdrs[2] or hdrs[2] == "" then
print("error: please supply at least one header")
return
end
for i = 2, table.getn(hdrs) do
editor:AddText("#include \""..hdrs[i]..".h\"\n")
end
end
local function expand_c_main(offset)
local c_main = {}
table.insert(c_main, "int main(int argc, char* argv[])")
table.insert(c_main, "{")
table.insert(c_main, "\t")
table.insert(c_main, "")
table.insert(c_main, "\treturn 0;")
table.insert(c_main, "}")
editor:AddText(table.concat(c_main, "\n"))
editor:GotoPos(offset + 36)
end
local function expand_c_once(name, line)
if not name or name == "" then
print("error: please supply a header name")
return
end
local once = {}
local uname = string.upper(name)
table.insert(once, "#ifndef __"..uname.."_H__")
table.insert(once, "#define __"..uname.."_H__")
table.insert(once, "");
table.insert(once, "");
table.insert(once, "");
table.insert(once, "#endif /* __"..uname.."_H__ */")
editor:AddText(table.concat(once, "\n"))
editor:GotoLine(line + 3)
end
local function expand_bsd_license(author, year)
if not author or author == "" then
if props["author.full_name"] then
author = props["author.full_name"]
else
print("error: please supply the author's name")
return
end
end
local bsd = {}
table.insert(bsd, "/*")
if year == nil then
table.insert(bsd, " * Copyright (c) "..os.date("%Y").." "..author..". All rights reserved.")
else
table.insert(bsd, " * Copyright (c) "..year.." "..author..". All rights reserved.")
end
table.insert(bsd, " *")
table.insert(bsd, " * Redistribution and use in source and binary forms, with or without")
table.insert(bsd, " * modification, are permitted provided that the following conditions")
table.insert(bsd, " * are met:")
table.insert(bsd, " *")
table.insert(bsd, " * 1. Redistributions of source code must retain the above copyright")
table.insert(bsd, " * notice, this list of conditions and the following disclaimer.")
table.insert(bsd, " *")
table.insert(bsd, " * 2. Redistributions in binary form must reproduce the above copyright")
table.insert(bsd, " * notice, this list of conditions and the following disclaimer in the")
table.insert(bsd, " * documentation and/or other materials provided with the distribution.")
table.insert(bsd, " *")
table.insert(bsd, " * THIS SOFTWARE IS PROVIDED BY "..string.upper(author).." \"AS IS\'' AND")
table.insert(bsd, " * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE")
table.insert(bsd, " * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE")
table.insert(bsd, " * ARE DISCLAIMED. IN NO EVENT SHALL "..string.upper(author).." BE LIABLE")
table.insert(bsd, " * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL")
table.insert(bsd, " * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS")
table.insert(bsd, " * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)")
table.insert(bsd, " * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT")
table.insert(bsd, " * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY")
table.insert(bsd, " * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF")
table.insert(bsd, " * SUCH DAMAGE.")
table.insert(bsd, " */")
editor:AddText(table.concat(bsd, "\n"))
end
function expand()
local line = editor:LineFromPosition(editor.CurrentPos)
local from = editor:PositionFromLine(line)
local to = editor.CurrentPos
local sel = editor:textrange(from, to)
if not sel or sel == "" then
print("error: nothing to expand")
print("valid commands are:")
print("\tmain - C\'s main()")
print("\tstdinc,Header[,Header...] - Standard header files")
print("\tinc,Header[,Header...] - User header files")
print("\tonce,HeaderName - Header guard")
print("\tbsd,Author[,Date] - BSD copyright statement")
return
end
local args = tokenize(sel, ',')
editor:SetSel(from, to)
editor:ReplaceSel("")
if args[1] == "stdinc" then
expand_cstd_headers(args)
elseif args[1] == "inc" then
expand_c_headers(args)
elseif args[1] == "main" then
expand_c_main(from)
elseif args[1] == "once" then
expand_c_once(args[2], line)
elseif args[1] == "bsd" then
expand_bsd_license(args[2], args[3])
else
print("error: invalid command")
end
end
function hexify_number()
local sel = editor:GetSelText()
if not sel or sel == "" then
return
end
editor:ReplaceSel(string.format('0x%08x', tonumber(sel)))
end
function calculate()
local expr = editor:GetSelText()
if not expr or expr == "" then
return
end
local fn, unused = loadstring("return "..expr)
if not fn then
print("error: invalid expression") return
end
editor:ReplaceSel(tostring(fn()))
end