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)
