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)