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)

Reply via email to