[aspectc-user] Replace CPP-Makro with the Puma-Manipulator in the scanning phase

Stefan Hengelein stefan.hengelein at fau.de
Mon Mar 24 17:44:33 CET 2014


Hello there,

we're using the Puma-Tool for parsing .c files within our Project (
https://www4.cs.fau.de/Research/VAMOS/ ) at the University in
Erlangen.

I've now encountered a problem and i'm not quite sure what i did wrong
and if i did something wrong when using Puma.

what i want to do:

Replace
#if IS_ENABLED(CONFIG_FOO)
with
#if (defined(CONFIG_FOO) || defined(CONFIG_FOO_MODULE))

we thought, the easiest way to implement the replacement would be
after the scanning phase.

how i implemented it:

 Puma::ManipCommander mc;
 Puma::Token *s, *e, *prev;
[...]
if (!strcmp(s->text(), "IS_ENABLED")) {
                    prev = unit->prev(unit->prev(s));

                    Puma::Token *symbol = unit->next(unit->next(s));
                    e = unit->next(symbol);

                    std::string modsymboltext(symbol->text());
                    modsymboltext += "_MODULE";
                    Puma::Token *modsymbol = new
Puma::Token(Puma::TOK_ID, Puma::Token::pre_id, modsymboltext.c_str());

                    Puma::ErrorStream err;
                    Puma::CUnit enabled(err);

                    enabled << "(defined(" << *symbol << ") ||
defined(" << *modsymbol << "))" << Puma::endu;
                    mc.replace(s, e, enabled.first(), enabled.last());
                    mc.commit();

                    s = prev ? prev : unit->first();
}

s is the pointer to iterate over the Puma::Token s in the Puma::Unit
e points to the Token containing the closing brace of "IS_ENABLED(CONFIG_FOO)"

when i run "print_tokens(unit)" after the transformation, the code i
get is the code i wanted to have, but after parsing there is something
wrong with the token structure, i guess. At least i don't get the
right text after the "#if"s when i use the CPP-Syntax tree, to be
clear, it is empty. But just the part i inserted is missing,
everything after that directive seems to be there.

Did i use the ManipCommander wrong or do you have a clue what could
have gone wrong?

Thanks in advance,
Stefan



More information about the aspectc-user mailing list