On Wed, 29 Jun 2011, Ajay Panyala wrote: > Is it also possible to match partial expressions? > > For example I know only a part of an expression > that I want to match. > > xxx_knownPart_xxx
You can use regular expressions. You can see an example in the demos directory, in regexp.cocci. julia > Can a patch be written to match the above example? > > Thanks > Ajay > > On Wed, Jun 29, 2011 at 10:20 AM, Julia Lawall <[email protected]> wrote: > > > 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)
