Indeed, it's a clever idea.  Thanks! :)

julia


On Wed, 29 Jun 2011, Ajay Panyala wrote:

> Thanks much for the detailed response.
> I was able to get it to work using your (macro) example.
> 
> -Ajay
> 
> On Tue, Jun 28, 2011 at 5:23 PM, Håkon Løvdal <[email protected]> wrote:
> 
> > On 27 June 2011 16:21, Ajay Panyala <[email protected]> wrote:
> > > Hello
> > > Is something like the following possible.
> > >
> > > Original code :
> > > ...
> > > // some comment
> > > foo(x,y);
> > > .....
> > > foo(x,y)
> > > The code should be transformed after applying a patch
> > > such that only the occurrence of foo(...) with the comment
> > > above it should be transformed, i.e
> > > The code after the transformation should look like
> > > ...
> > > // some comment
> > > bar(x,y,z)
> > > ...
> > > foo(x,y)
> > > The second call to foo(..) should remain untouched.
> > >
> > > If possible, how should a patch be specified to handle this case.
> >
> > You can make the comment into a statement by letting it be the
> > argument(s) in a (dummy) macro. The following is a quick
> > test of conditionally changing printf into fprintf(stderr only when
> > preceded by a debug comment.
> >
> >
> > (hlovdal) localhost:/download/2011/06_jun/cocci>cat main.c
> > #include <stdio.h>
> >
> > int main(int argc, char *argv[])
> > {
> >        int i;
> >        // debug print
> >        printf("argc = %d\n", argc);
> >
> >        for (i=0; i<argc; i++) {
> >                printf("argv[i] = %s\n", argv[i]);
> >        }
> > }
> >
> > (hlovdal) localhost:/download/2011/06_jun/cocci>sed 's@\(// debug
> > print.*\)@COMMENT_MACRO("\1");@' main.c > tmp.c
> > (hlovdal) localhost:/download/2011/06_jun/cocci>diff -u main.c tmp.c
> > --- main.c      2011-06-28 22:45:12.883225594 +0200
> > +++ tmp.c       2011-06-28 23:07:44.849522682 +0200
> > @@ -3,7 +3,7 @@
> >  int main(int argc, char *argv[])
> >  {
> >        int i;
> > -       // debug print
> > +       COMMENT_MACRO("// debug print");
> >        printf("argc = %d\n", argc);
> >
> >        for (i=0; i<argc; i++) {
> > (hlovdal) localhost:/download/2011/06_jun/cocci>cat macro.h
> > #define COMMENT_MACRO(x)
> > (hlovdal) localhost:/download/2011/06_jun/cocci>cat
> > change_if_after_comment.cocci
> > @@
> > expression x, y;
> > @@
> > COMMENT_MACRO(...);
> > -printf(x, y);
> > +fprintf(stderr, x, y);
> > (hlovdal) localhost:/download/2011/06_jun/cocci>spatch -sp_file
> > change_if_after_comment.cocci -macro_file macro.h tmp.c
> > init_defs_builtins: /usr/share/coccinelle/standard.h
> > init_defs: macro.h
> > HANDLING: tmp.c
> > diff =
> > --- tmp.c       2011-06-28 23:07:44.849522682 +0200
> > +++ /tmp/cocci-output-620-e129f9-tmp.c  2011-06-28 23:07:53.848986434 +0200
> > @@ -4,7 +4,7 @@ int main(int argc, char *argv[])
> >  {
> >        int i;
> >        COMMENT_MACRO("// debug print");
> > -       printf("argc = %d\n", argc);
> > +       fprintf(stderr, "argc = %d\n", argc);
> >
> >        for (i=0; i<argc; i++) {
> >                printf("argv[i] = %s\n", argv[i]);
> > (hlovdal) localhost:/download/2011/06_jun/cocci>
> >
> >
> > The sed command will only match comments excactly, you might want to
> > match wider. To convert back from macro to comment run
> >
> > sed 's/COMMENT_MACRO("\(.*\)");/\1/' filename.c
> >
> >
> > BR Håkon Løvdal
> >
> 
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)

Reply via email to