\chapter{Introduction} %src: cocci website, LWN article Coccinelle is a tool to help automate repetitive source-to-source style-preserving program transformations on C source code, like for instance to perform some refactorings. %coupling: readme.txt Coccinelle is presented as a command line tool called \spatch that takes as input the name of a file containing the specification of a program transformation, called a {\em semantic patch}, and a set of C files, and then performs the transformation on all those C files. %synopsis ? To make it easy to express those transformations, Coccinelle proposes a WYSISWYG approach where the C programmer can leverage the things he already knows: the C syntax and the patch syntax. Indeed, with Coccinelle transformations are written in specific language called SmPL, for Semantic Patch Language, which as the name suggests is very close to the syntax of a patch, but which does not work at a line level, than traditional patches do. but a more high level, or semantic level. Here is an example of a simple program transformation. To replace every calls to \verb+foo+ of any expression $x$ to a call to \verb+bar+, create a semantic patch file \verb+ex1.cocci+ (semantic patches usually ends with the \verb+.cocci+ filename extension) containing: \begin{verbatim} @@ expression x; @@ - foo(x) + bar(x) \end{verbatim} Then to ``apply'' the specified program transformation to a set of C files, simply do: \begin{verbatim} $ spatch -sp_file ex1.cocci *.c \end{verbatim} Coccinelle primarily targets ANSI C, and supports some GCC extensions. It has only partial support for K\&R C. K\&R function declarations are only recognized if the parameter declarations are indented. Furthermore, the parameter names are subsequently considered to be type names, due to confusion with function prototypes, in which a name by itself is indeed the name of a type. %command line: %can do inplace, or with git, cf chapter on developing ... %Other approaches %instead of %expressing the transformation on the internal representation %of a C frontend, for instance the abstract syntax tree %used internally by gcc, which would require for the user %to learn how to use this internal data structure, %if can find and transform, can also find, so semantic grep. %vs regexp %vs ast %features: %src: darcs manual %%% Local Variables: %%% mode: LaTeX %%% coding: utf-8 %%% TeX-PDF-mode: t %%% ispell-local-dictionary: "american" %%% End: