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