a basic test of c module
try to load .dll using .h header to supply definition signature
t.c
#include <stdio.h>
__declspec(dllexport) short add(short a, short b) {
return a + b;
}
__declspec(dllexport) long long sub(long long a, long long b) {
return a - b;
}
t.h
short
add(short a, short b) ;
long
long
sub
(long long
a,
long long b) ;
simple module crequire.lua:
t = {}
t['unsigned long long'] = 'L'
t['const wchar_t*'] = 'W'
t['unsigned short'] = 'S'
t['unsigned char'] = 'C'
t['unsigned long'] = 'J'
t['unsigned int'] = 'I'
t['const char*'] = 'Z'
t['long long'] = 'l'
t['uint32_t'] = 'I'
t['uint64_t'] = 'L'
t['wchar_t*'] = 'W'
t['uint16_t'] = 'S'
t['int16_t'] = 's'
t['int32_t'] = 'i'
t['int64_t'] = 'l'
t['double'] = 'd'
t['size_t'] = '#'
t['struct'] = '.'
t['char*'] = 'Z'
t['float'] = 'f'
t['short'] = 's'
t['union'] = 'u'
t['void*'] = 'p'
t['bool'] = 'B'
t['char'] = 'c'
t['long'] = 'j'
t['int'] = 'i'
trev = {}
for k,v in pairs(t) do
trev[v] = trev[v] and (trev[v]..', or '..k) or k
end
torder = {}
for k in pairs(t) do table.insert(torder,k) end
table.sort(torder, function(a,b) return #a>#b end)
function getdef(header, name)
header = header:gsub('%s+', ' ') -- also remove comment?
wordboundary = '%f[_%w]'
bracket = '%s-%b()'
a,b = header:find(wordboundary..name..bracket)
c = getbegin(header, b)
returndef = header:sub(c, a-1) print('returndef', returndef)
returntype = gettype(returndef)
d = header:find('%(', a)
arguments = header:sub(d+1, b-1)..','
prev=0
argutypest = {}
for e in arguments:gmatch('(),') do
argu = arguments:sub(prev+1, e)
argut = gettype(argu)
print(argu, argut)
argutypest[#argutypest+1] = gettype(argu)
prev=e
end
argutypes = table.concat(argutypest)
return '('..argutypes..')'..returntype
end
function gettype(s)
for _,k in ipairs(torder) do
if s:find(k) then return t[k] end
end
return ''
end
function getbegin(s, b)
-- begin at ;
for i = b-1,1,-1 do
if s:sub(i,i)==';' then b=i+1 break end end
if b>a then b=1 end
return b
end
function describe(s)
local a,b = s:find('%b()')
print'arguments:'
if b-a==1 then print' none'
else for i=1,b-a-1 do print('',i,trev[s:sub(a+i,a+i)]) end end
print'returns:'
if b==#s then print' none'
else print('',trev[s:sub(#s)]) end
end
function crequire(dllname, funcname)
mylib = cmodule.Library(dllname..'.dll')
header = io.open(dllname..'.h'):read'a'
def = getdef(header, funcname)
mylib[funcname] = def
print(funcname, def)
describe(def)
return mylib[funcname]
end
cmodule = require'c'
return crequire
and test in quickrt:
╭━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╮
│ QuickRT - Powerful REPL for LuaRT │
│ Copyright © 2025, Samir Tine │
╰━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╯
► crequire = require'crequire'
► add = crequire('t', 'add')
returndef short
short a, s
short b, s
add (ss)s
arguments:
1 int16_t, or short
2 int16_t, or short
returns:
int16_t, or short
► sub = crequire('t', 'sub')
returndef long long
long long a, l
long long b, l
sub (ll)l
arguments:
1 long long, or int64_t
2 long long, or int64_t
returns:
long long, or int64_t
► add(5,4)
9
► sub(5,4)
1
► sub(4,5)
4294967295
► c=require'c'
► c.longlong(sub(4,5)):tonumber()
0
► c.longlong(sub(5,4)):tonumber()
0
question,
uint32_t I or J ?
int32_t i or j ?
int B or i ?
or both are ok ?
is # size_t ?
I trid to set function return value to size_t, #
but it seems like # is not recognized
add(4,5)
>>> Unknown '#' signature character
and obviously difficulty lies in struct and union etc complcate types