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)

Reply via email to