Skip to content

match of macro argument name happens inside the identifier sometimes #21

Open

Description

@ayourtch

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".

Activity

  1. ayourtch commented on Aug 17, 2016

    @ayourtch
    Author

    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
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions