1#!/usr/bin/env lua
2-- LuaAutoC - Automagically use C Functions and Structs with the Lua API
3-- https://github.com/orangeduck/LuaAutoC
4-- Daniel Holden - contact@theorangeduck.com
5-- Licensed under BSD
6
7-- Findall Function
8
9function findall(text, pattern)
10  local matches = {}
11  for word in string.gmatch(text, pattern) do
12    table.insert(matches, word)
13  end
14  return matches
15end
16
17-- String Split Function
18
19function string:split(sep)
20  local sep, fields = sep or ":", {}
21  local pattern = string.format("([^%s]+)", sep)
22  self:gsub(pattern, function(c) fields[#fields+1] = c end)
23  return fields
24end
25
26-- Check Arguments
27
28if #arg ~= 1 then
29  print('Usage: lua lautoc.lua <header.h>')
30  return
31end
32
33-- Open Header
34
35local file = io.open(arg[1], 'r')
36
37if file == nil then
38  print(string.format('Error: Cannot load file "%s"', arg[1]))
39  return
40end
41
42local text = file:read('*all')
43
44io.close(file)
45
46-- Remove all newlines
47
48local text = string.gsub(text, "\r", "")
49local text = string.gsub(text, "\n", "")
50
51-- Find all typedefs, structs, and functions
52
53typestrts = findall(text, "typedef struct {.-} %w-;")
54typeenums = findall(text, "typedef enum {.-} %w-;")
55funcs     = findall(text, "[%w%*]- [%w_]-%(.-%);")
56
57-- Output Typedef Enum Code
58
59for k,v in pairs(typeenums) do
60  local _, _, members, typename = string.find(v, "typedef enum {(.-)} (%w-);")
61
62  print(string.format("luaA_enum(%s);", typename))
63
64  for _, mem in pairs(members:split(",")) do
65    local _, _, name = string.find(mem, "(%w+)")
66    print(string.format("luaA_enum_value(%s, %s);", typename, name))
67  end
68
69  print("")
70end
71
72-- Output Typedef Struct Code
73
74for k,v in pairs(typestrts) do
75  local _, _, members, typename = string.find(v, "typedef struct {(.-)} (%w-);")
76
77  print(string.format("luaA_struct(%s);", typename))
78
79  for _, mem in pairs(members:split(";")) do
80    local meminfo = mem:split(" ")
81    print(string.format("luaA_struct_member(%s, %s, %s);", typename, meminfo[2], meminfo[1]))
82  end
83
84  print("")
85end
86
87-- Output Function Code
88
89for k,v in pairs(funcs) do
90  local _, _, typename, name, args = string.find(v, "([%w%*]-) ([%w_]-)%((.-)%);")
91
92  local argtypes = {}
93  for _, arg in pairs(args:split(",")) do
94    table.insert(argtypes, arg:split(" ")[1])
95  end
96
97  local fstring = string.format("luaA_function(%s, %s", name, typename)
98  for _, v in pairs(argtypes) do
99    local fstring = fstring .. string.format(", %s", v)
100  end
101  local fstring = fstring .. ");"
102
103  print(fstring)
104end
105
106