aboutsummaryrefslogtreecommitdiff
path: root/scripts/genex_cmds.lua
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2014-08-21 10:07:46 -0400
committerJustin M. Keyes <justinkz@gmail.com>2014-08-21 10:07:46 -0400
commit51ae9c643744995c2d3b6a466b6ad2333e1cba8c (patch)
treef10ccdc877b0d2fd546dfd6debf7bd877835facd /scripts/genex_cmds.lua
parentfe706a9d1b368ae141a18949349c3382f0070ba9 (diff)
parentde58394f34a5e74e9c20027505ee1fd70deabfdd (diff)
downloadrneovim-51ae9c643744995c2d3b6a466b6ad2333e1cba8c.tar.gz
rneovim-51ae9c643744995c2d3b6a466b6ad2333e1cba8c.tar.bz2
rneovim-51ae9c643744995c2d3b6a466b6ad2333e1cba8c.zip
Merge pull request #840 from ZyX-I/generate-ex_cmds
Use lua generator in place of ex_cmds_defs header trick
Diffstat (limited to 'scripts/genex_cmds.lua')
-rw-r--r--scripts/genex_cmds.lua87
1 files changed, 87 insertions, 0 deletions
diff --git a/scripts/genex_cmds.lua b/scripts/genex_cmds.lua
new file mode 100644
index 0000000000..7fd258a6c3
--- /dev/null
+++ b/scripts/genex_cmds.lua
@@ -0,0 +1,87 @@
+local nvimsrcdir = arg[1]
+local includedir = arg[2]
+local autodir = arg[3]
+
+if nvimsrcdir == '--help' then
+ print ([[
+Usage:
+ lua genex_cmds.lua src/nvim build/include build/src/nvim/auto
+
+Will generate files build/include/ex_cmds_enum.generated.h with cmdidx_T
+enum and build/src/nvim/auto/ex_cmds_defs.generated.h with main Ex commands
+definitions.
+]])
+ os.exit(0)
+end
+
+package.path = nvimsrcdir .. '/?.lua;' .. package.path
+
+local enumfname = includedir .. '/ex_cmds_enum.generated.h'
+local defsfname = autodir .. '/ex_cmds_defs.generated.h'
+
+local enumfile = io.open(enumfname, 'w')
+local defsfile = io.open(defsfname, 'w')
+
+local defs = require('ex_cmds')
+local lastchar = nil
+
+local i
+local cmd
+local first = true
+local prevfirstchar = nil
+
+local byte_a = string.byte('a')
+local byte_z = string.byte('z')
+
+local cmdidxs = string.format([[
+static const cmdidx_T cmdidxs[%u] = {
+]], byte_z - byte_a + 2)
+
+enumfile:write([[
+typedef enum CMD_index {
+]])
+defsfile:write(string.format([[
+static CommandDefinition cmdnames[%u] = {
+]], #defs))
+for i, cmd in ipairs(defs) do
+ local enumname = cmd.enum or ('CMD_' .. cmd.command)
+ firstchar = string.byte(cmd.command)
+ if firstchar ~= prevfirstchar then
+ if (not prevfirstchar
+ or (byte_a <= firstchar and firstchar <= byte_z)
+ or (byte_a <= prevfirstchar and prevfirstchar <= byte_z)) then
+ if not first then
+ cmdidxs = cmdidxs .. ',\n'
+ end
+ cmdidxs = cmdidxs .. ' ' .. enumname
+ end
+ prevfirstchar = firstchar
+ end
+ if first then
+ first = false
+ else
+ defsfile:write(',\n')
+ end
+ enumfile:write(' ' .. enumname .. ',\n')
+ defsfile:write(string.format([[
+ [%s] = {
+ .cmd_name = (char_u *) "%s",
+ .cmd_func = &%s,
+ .cmd_argt = %uL
+ }]], enumname, cmd.command, cmd.func, cmd.flags))
+end
+defsfile:write([[
+
+};
+]])
+enumfile:write([[
+ CMD_SIZE,
+ CMD_USER = -1,
+ CMD_USER_BUF = -2
+} cmdidx_T;
+]])
+cmdidxs = cmdidxs .. [[
+
+};
+]]
+defsfile:write(cmdidxs)