| Thread overview | |||||||
|---|---|---|---|---|---|---|---|
|
January 06, 2009 Off subject | ||||
|---|---|---|---|---|
| ||||
Hi,
sorry to ask my question here but since people are motivated by new language, source code, ... I thought it was a good place to ask my question about source code analysis.
I would like to know if there are some parsers/scripts that could parse some C/C++ language and that could insert printf in each function.
Actually I am trying to understand a huge program and debugging step by step would take me ages.
What I want is something like :
void myfunc(int aFoo)
{
...
}
I want a parser that could add
void myfunc(int aFoo)
{
fprintf(stderr, "myfunc(int aFoo)");
...
}
| ||||
January 06, 2009 Re: Off subject | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Vincent Richomme | Vincent Richomme wrote: > Hi, > > sorry to ask my question here but since people are motivated by new language, source code, ... I thought it was a good place to ask my question about source code analysis. > I would like to know if there are some parsers/scripts that could parse some C/C++ language and that could insert printf in each function. > > Actually I am trying to understand a huge program and debugging step by step would take me ages. > What I want is something like : > > void myfunc(int aFoo) > { > > ... > > } > > I want a parser that could add > > void myfunc(int aFoo) > { > fprintf(stderr, "myfunc(int aFoo)"); > ... > > } I'm sure you can do this with CDT (the Eclipse plugin for C/C++). The API is here: http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.cdt.doc.isv/reference/api/overview-summary.html I haven't worked with that API but more or less you'll need to: 1. Get an ITranslationUnit, which represents a source file. 2. From it, invoke getAST(). 3. Implement an IASTVisitor to traverse all the nodes and print them, with the exception of function bodies, where you'll add an pfritf. You could even make it a plugin and then just open the file in Eclipse, select an action from the menu and have it done for a whole project or a bunch of source files. | |||
January 07, 2009 Re: Off subject | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Vincent Richomme | Vincent Richomme Wrote:
> I would like to know if there are some parsers/scripts that could parse some C/C++ language and that could insert printf in each function.
One option would be to use a regular expression within a search and replace.
Just as a simple test I came up regexp that does seems do the trick:
Search string:
(^[_a-z0-9]+[ &*\t]+[_a-z0-9 &*\t]*[_a-z0-9]+[ \t]*[(]+.*[^;]+)(\n{\n)
Replace String:
\0fprintf(stderr, ("\1")
Any regexp enabled text editor should be able to handle the search and replace. It worked just fine in the Zeus IDE ;)
You could also use SED or AWK to do a batch mode regexp search and replace.
NOTE: The regexp was only tested for the function declaration that you posted, so it will almost certainly need to be tweaked for other variations of function definitions.
| |||
January 07, 2009 Re: Off subject | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jussi Jumppanen | Jussi Jumppanen a écrit :
> Vincent Richomme Wrote:
>
>> I would like to know if there are some parsers/scripts that could parse some C/C++ language and that could insert printf in each function.
>
> One option would be to use a regular expression within a search and replace.
>
> Just as a simple test I came up regexp that does seems do the trick:
>
> Search string:
> (^[_a-z0-9]+[ &*\t]+[_a-z0-9 &*\t]*[_a-z0-9]+[ \t]*[(]+.*[^;]+)(\n{\n)
>
>
> Replace String:
> \0fprintf(stderr, ("\1")
>
> Any regexp enabled text editor should be able to handle the search and
> replace. It worked just fine in the Zeus IDE ;)
>
> You could also use SED or AWK to do a batch mode regexp search and replace.
>
> NOTE: The regexp was only tested for the function declaration that you posted, so it will almost certainly need to be tweaked for other variations of function definitions.
>
Hul doesn't work because it matches some typedef struct like this :
typedef struct c_parser GTY(())
{
...
} c_parser;
| |||
January 08, 2009 Re: Off subject | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Vincent Richomme | Vincent Richomme Wrote: > Hul doesn't work because it matches some typedef struct like this : > > typedef struct c_parser GTY(()) > { > ... > } c_parser; That's what I meant when I said the regexp will almost certainly need to be tweaked ;) For example this new 'tweaked' regexp search string: (^[_a-z0-9]+[ &*\t]+[_a-z0-9 &*\t]*[_a-z0-9]+[ \t]*\({0,1}[^\]+.(.*[^;]+)(\n{\n) will distinguish bettween these two case: void myfunc(int aFoo) { ... } typedef struct c_parser GTY(()) { ... } c_parser; Obviously for each new case some extra tweaking of the repexp might be required. But if you used something like SED you can make the searching a hell of a lot smarter. SED allows you to define rules where by you can take the result of one search, run a second test against it and then accept or reject the result based on the result of this second test. http://www.zeusedit.com/forum/viewtopic.php?t=1229 Using this approach you could define rules to filter out these exceptions. | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply