m-schmoock / lcpp

A Lua C PreProcessor

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

match of macro argument name happens inside the identifier sometimes

ayourtch opened this issue · comments

Compiling this code, reduced from a real world include file:

#define _(t,n) typedef union n##t

_ (u8, 16);

#undef _

Results in output "typedef uniou16 16u8", the correct result should be "typedef union 16u8".

This diff takes care of the problem (although needs more testing, including here mostly for comments):

diff --git a/lcpp.lua b/lcpp.lua
index 9ac5088..4d1defb 100755
--- a/lcpp.lua
+++ b/lcpp.lua
@@ -1273,11 +1273,11 @@ local function parseFunction(state, input)
        for argname in argsstr:gmatch(IDENTIFIER) do
                noargs = noargs + 1
                -- avoid matching substring of another identifier (eg. attrib matches __attribute__ and replace it)
-               repl = repl:gsub("(#*)(%s*)("..argname..")([_%w]?)", function (s1, s2, s3, s4)
-                       if #s4 <= 0 then
+               repl = repl:gsub("(#*)(%s*)([_%w]?)("..argname..")([_%w]?)", function (s1, s2, s3, s4, s5)
+                       if (#s5 <= 0) and (#s3 <= 0) then
                                return (#s1 == 1) and ("\"$"..noargs.."\"") or (s1..s2.."$"..noargs)
                        else
-                               return s1..s2..s3..s4
+                               return s1..s2..s3..s4..s5
                        end
                end)
        end