aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/generators/gen_keysets.lua
blob: b1c1f3e2d8b7da4b51ae25c09ce69c8c691f353f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
local nvimsrcdir = arg[1]
local shared_file = arg[2]
local funcs_file = arg[3]
local defs_file = arg[4]

_G.vim = loadfile(shared_file)()

if nvimsrcdir == '--help' then
  print([[
Usage:
  lua gen_keyset.lua TODOFIXUPDATETHIS

Will generate build/src/nvim/auto/keyset.generated.h with definition of functions
static const array.
]])
  os.exit(0)
end


package.path = nvimsrcdir .. '/?.lua;' .. package.path
local hashy = require'generators.hashy'

local funcspipe = io.open(funcs_file, 'wb')
local defspipe = io.open(defs_file, 'wb')

local keysets = require'api.keysets'

local keywords = {
  register = true;
  default = true;
}

local function sanitize(key)
  if keywords[key] then
    return key .. "_"
  end
  return key
end

for _, v in ipairs(keysets) do
  local name = v[1]
  local keys = v[2]
  local neworder, hashfun = hashy.hashy_hash(name, keys, function (idx)
    return name.."_table["..idx.."].str"
  end)

  defspipe:write("typedef struct {\n")
  for _, key in ipairs(neworder) do
    defspipe:write("  Object "..sanitize(key)..";\n")
  end
  defspipe:write("} KeyDict_"..name..";\n\n")

  defspipe:write("extern KeySetLink "..name.."_table[];\n")

  funcspipe:write("KeySetLink "..name.."_table[] = {\n")
  for _, key in ipairs(neworder) do
    funcspipe:write('  {"'..key..'", offsetof(KeyDict_'..name..", "..sanitize(key)..")},\n")
  end
    funcspipe:write('  {NULL, 0},\n')
  funcspipe:write("};\n\n")

  funcspipe:write(hashfun)

  funcspipe:write([[
Object *KeyDict_]]..name..[[_get_field(void *retval, const char *str, size_t len)
{
  int hash = ]]..name..[[_hash(str, len);
  if (hash == -1) {
    return NULL;
  }

  return (Object *)((char *)retval + ]]..name..[[_table[hash].ptr_off);
}

]])
  defspipe:write("#define api_free_keydict_"..name.."(x) api_free_keydict(x, "..name.."_table)\n")
end

funcspipe:close()
defspipe:close()