summaryrefslogtreecommitdiff
path: root/Tools/LuaMacro/tests/cexport.lua
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-11-17 23:03:07 +0800
committerchai <chaifix@163.com>2021-11-17 23:03:07 +0800
commit27d6efb5f5a076f825fe2da1875e0cabaf02b4e7 (patch)
tree44f301110bc2ea742908ed92a78eba0803cd3b60 /Tools/LuaMacro/tests/cexport.lua
parentb34310c631989551054d456eb47aaab5ded266a4 (diff)
+ LuaMacro
Diffstat (limited to 'Tools/LuaMacro/tests/cexport.lua')
-rw-r--r--Tools/LuaMacro/tests/cexport.lua77
1 files changed, 77 insertions, 0 deletions
diff --git a/Tools/LuaMacro/tests/cexport.lua b/Tools/LuaMacro/tests/cexport.lua
new file mode 100644
index 0000000..cb20bd0
--- /dev/null
+++ b/Tools/LuaMacro/tests/cexport.lua
@@ -0,0 +1,77 @@
+local M = require 'macro'
+
+local cf,copy,null
+if package.config:sub(1,1) == '\\' then
+ cf = 'fc'; copy = 'copy'; null = ' > null'
+else
+ cf = 'diff'; copy = 'cp'; null = ' > /dev/null'
+end
+
+local f,hname,mname
+
+M.keyword_handler('BEGIN',function()
+ hname = M.filename:gsub('%.%a+$','')..'.h'
+ mname = hname:gsub('%.','_'):upper()
+ f = io.open(M.filename..'.h','w')
+ f:write('#ifndef ',mname,'\n')
+ f:write('#define ',mname,'\n')
+end)
+
+M.keyword_handler ('END',function()
+ f:write('#endif\n')
+ f:close()
+ local tmpf = M.filename..'.h'
+ if os.execute(cf..' '..hname..' '..tmpf..null) ~= 0 then
+ os.execute(copy..' '..tmpf..' '..hname..null)
+ end
+end)
+
+M.define('export',function(get)
+ local t,v = get:next()
+ local decl,out
+ if v == '{' then -- block!
+ decl = tostring(get:upto '}')
+ decl = M.substitute_tostring(decl)
+ f:write(decl,'\n')
+ else
+ decl = v .. ' ' .. tostring(get:upto '{')
+ decl = M.substitute_tostring(decl)
+ f:write(decl,';\n')
+ out = decl .. '{'
+ end
+ return out
+end)
+
+
+--[[
+
+Example of a with-statement:
+
+ with(MyType *,bonzo) {
+ .x = 2;
+ .y = 3;
+ with(SubType *,.data) {
+ .name = "hello";
+ .ids = my.ids;
+ printf("count %d\n",.count);
+ }
+ }
+
+
+M.define('with',function(get)
+ get:expecting '('
+ local args = get:list()
+ local T, expr = args[1],args[2]
+ get:expecting '{'
+ M.define_scoped('.',function()
+ local lt,lv = get:peek(-1,true) -- peek before the period...
+ if lt ~= 'iden' then
+ return '_var->'
+ else
+ return nil,true -- pass through
+ end
+ end)
+ return '{ ' .. tostring(T) .. ' _var = '..tostring(expr)..'; '
+end)
+
+]]