aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/geneval.lua42
-rw-r--r--scripts/genvimvim.lua22
2 files changed, 48 insertions, 16 deletions
diff --git a/scripts/geneval.lua b/scripts/geneval.lua
new file mode 100644
index 0000000000..1f8a14d27b
--- /dev/null
+++ b/scripts/geneval.lua
@@ -0,0 +1,42 @@
+local nvimsrcdir = arg[1]
+local autodir = arg[2]
+
+if nvimsrcdir == '--help' then
+ print([[
+Usage:
+ lua geneval.lua src/nvim build/src/nvim/auto
+
+Will generate build/src/nvim/auto/funcs.generated.h with definition of functions
+static const array.
+]])
+ os.exit(0)
+end
+
+package.path = nvimsrcdir .. '/?.lua;' .. package.path
+
+local funcsfname = autodir .. '/funcs.generated.h'
+local funcsfile = io.open(funcsfname, 'w')
+
+local funcs = require('eval')
+
+local sorted_funcs = {}
+for name, def in pairs(funcs.funcs) do
+ def.name = name
+ def.args = def.args or 0
+ if type(def.args) == 'number' then
+ def.args = {def.args, def.args}
+ elseif #def.args == 1 then
+ def.args[2] = 'MAX_FUNC_ARGS'
+ end
+ def.func = def.func or ('f_' .. def.name)
+ sorted_funcs[#sorted_funcs + 1] = def
+end
+table.sort(sorted_funcs, function(a, b) return a.name < b.name end)
+
+funcsfile:write('static const VimLFuncDef functions[] = {\n')
+for _, def in ipairs(sorted_funcs) do
+ funcsfile:write((' { "%s", %s, %s, &%s },\n'):format(
+ def.name, def.args[1], def.args[2], def.func
+ ))
+end
+funcsfile:write('};\n')
diff --git a/scripts/genvimvim.lua b/scripts/genvimvim.lua
index 667af7be6c..729749a52f 100644
--- a/scripts/genvimvim.lua
+++ b/scripts/genvimvim.lua
@@ -23,6 +23,7 @@ end
local options = require('options')
local auevents = require('auevents')
local ex_cmds = require('ex_cmds')
+local eval = require('eval')
local cmd_kw = function(prev_cmd, cmd)
if not prev_cmd then
@@ -113,23 +114,12 @@ local vimfun_start = 'syn keyword vimFuncName contained '
w('\n\n' .. vimfun_start)
eval_fd = io.open(nvimsrcdir .. '/eval.c', 'r')
local started = 0
-for line in eval_fd:lines() do
- if line == '} functions[] =' then
- started = 1
- elseif started == 1 then
- assert (line == '{')
- started = 2
- elseif started == 2 then
- if line == '};' then
- break
- end
- local func_name = line:match('^ { "([%w_]+)",')
- if func_name then
- if lld.line_length > 850 then
- w('\n' .. vimfun_start)
- end
- w(' ' .. func_name)
+for name, def in pairs(eval.funcs) do
+ if name then
+ if lld.line_length > 850 then
+ w('\n' .. vimfun_start)
end
+ w(' ' .. name)
end
end
eval_fd:close()