That's not an expression but an identifier. Sorry for not being clear. By 'knownPart' I meant the portion of the expression that is known to me.
I will check out the regexps in wiki and the example from demos. Thanks for the pointers. Ajay On Wed, Jun 29, 2011 at 11:59 AM, Michael Stefaniuc <[email protected]>wrote: > 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 > > > > Can a patch be written to match the above example? > That's not an expression but an identifier. coccinelle supports regexps > for identifiers, it is in the documentation and on the wiki. > For other metavariables you'd have to loop them through a python or > ocaml rule, a python example is on the wiki too afair. > > bye > michael > > > 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)
